附录

附录

我需要一个能提供以下功能的 Linux 发行版:

  • 在 Raspberry Pi 上运行
  • 能够可靠地承受断电(例如通过只读文件系统)

我找到了一些关于如何将常规 Linux 发行版更改为只读模式的文档。我希望已经有一个专为在嵌入式环境中运行而设计的发行版。

我不需要很多软件包或驱动程序,只要足以让 Pi 使用 USB/以太网即可。我不需要任何 GUI 界面或任何东西,这只会运行用 C 语言编写的自定义服务。

有谁知道适合的发行版吗?

答案1

大多数嵌入式系统使用定制的内核。一个可以实现这一点的工具是构建根,一组用于构建 GNU gcc 工具链的脚本、代替(庞大的)GNU libc 的 uClibc 库、Linux 内核、BusyBox 和其他用于嵌入式主板根文件系统的实用程序/软件包。RaspberryPi 是一个相对较新的主板,因此 Buildroot 对它的支持仍在开发中,但显然有一个项目另一个项目个人工作随着 RP 制造的不断增加和分销的不断改善,可能还会有更多。

使用 Buildroot,您可以构建 Linux 内核和根文件系统,正如您在问题中描述的那样。根据您的 Internet 连接速度和开发 PC 的功能,您可能在 1 到 4 个多小时内获得二进制文件。缺点是生成的二进制文件未经测试,也不保证能够成功启动和执行。系统控制台是调试启动顺序的必需工具。请参阅我的答案如何在没有显示器的情况下通过以太网/wifi 访问我的迷你电脑(RaspberryPi / MK802 / Mele A1000 / VIA APC)? 但考虑到 RaspberryPi 的设计初衷是无法用砖砌成,这个缺点不应该成为构建自定义内核和 RFS 的障碍。

关于“断电后仍能存活”:正确选择文件系统通常可以缓解这种担忧。从经验来看,MTD 设备层加上日志文件系统(例如 jffs2)已证明非常可靠。对于近乎绝对的保护,可以使用 initramfs ramfs(不是固定大小的 ramdisk),无需切换到 R/W 文件系统。

附录

关于 Buildroot 功能的 30 张幻灯片介绍如下这里
最后(#27)提到了一些用于构建嵌入式系统的类似和替代工具。

答案2

TinyCoreLinux默认情况下是只读的(持久性是可选的): http://www.tinycorelinux.net/ports.html

答案3

我有一个带控制台访问权限的 Seagate Dockstar,我在上面安装了 Debian squeeze。作为让它以只读根运行的起点,我使用了这篇优秀的文章1Jeff Doozan 编写。基本策略是创建一个脚本,每次启动时,将必要的可写目录挂载为 tmpfs。我引用了 Jeff Doozan 编写的脚本2这里(向 Jeff 致敬!)

#!/bin/bash
DIRS="/tmp /var/log /var/run /var/lock /var/tmp /var/lib/urandom /var/lib/dhcp /etc/network/run"
for DIR in $DIRS; do
  echo "Mounting $DIR as tmpfs"
  mount -n -t tmpfs tmpfs $DIR
  if [ -d "$DIR-saved" ]; then
    echo "Restoring $DIR-saved to $DIR"
    tar -C "$DIR-saved" -cf - ./ | tar -C "$DIR" -xpf -
  fi
done

echo "nameserver 4.2.2.1" > /var/tmp/resolv.conf
touch /var/lib/dhcp/dhcpd.leases

exec /sbin/init

将上述代码保存为名为/sbin/init-ro在目标 rootfs 上并使其可执行。

chmod 755 /sbin/init-ro

为了在启动时使用此脚本,你必须对系统 rootfs 进行一些准备(全部引自 Jeff 的脚本2(适应$ROOT您挂载的rootfs的实际位置)。

# Configure dhcp-client to write resolv.conf to /tmp instead of /etc
sed -i 's/\/etc\/resolv.conf/\/var\/tmp\/resolv.conf/' $ROOT/sbin/dhclient-script > /dev/null 2>&1
rm $ROOT/etc/resolv.conf
ln -s /var/tmp/resolv.conf $ROOT/etc/resolv.conf


# make /etc/network/run/ a symlink to /tmp/network/
rm -rf $ROOT/etc/network/run
ln -s /var/tmp/network $ROOT/etc/network/run


# Fixes from http://wiki.debian.org/ReadonlyRoot

rm $ROOT/etc/blkid.tab  > /dev/null 2>&1
ln -s /dev/null $ROOT/etc/blkid.tab

rm $ROOT/etc/mtab  > /dev/null 2>&1
ln -s /proc/mounts $ROOT/etc/mtab

rm $ROOT/etc/rcS.d/S12udev-mtab

rm -rf $ROOT/var/log/*

像上面一样准备好 rootfs 后,你可以在 /etc/fstab 中以只读方式挂载 rootfs(替换扩展2使用你正在使用的文件系统,或者直接使用根文件系统反而)。

/dev/root  /                 ext2  noatime,ro   0 1

最后,您必须将以下内容附加到内核参数中(即/boot/cmdline.txt在 Raspi 上)以便在实际/sbin/init. (以下只是一个例子根延迟参数。必须附加到行中的重要部分命令行init=/sbin/init-ro。)

root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro

但请注意,对于任何需要在 rootfs 上进行写访问的软件,您必须安装适当的 tmpfs 位置或写入外部存储器。

答案4

如果我没记错的话,只读文件系统不会“保护” SD 卡。我在客户那里运行了 10 个 Pi(其中一半的当前正常运行时间超过 80 天),那里的电源不像您期望/想要的那样稳定。我花了一段时间才找到可以让 Pi 运行超过几天的电源(额定电流为 3A 的廉价充电器和额定电流为 2.3A 的“昂贵”iPad 充电器),在此之前,我遇到过各种 SD 损坏问题,包括一个仅以只读方式使用的 SD 损坏问题(如果我没记错的话)。

我的问题现在基本已经解决(因为有了新供应),但对于未来的项目,我正在考虑做一个 NFS 根文件系统。已经有很多关于这个的教程,主要是围绕普通的 Pi fs 映像来解决问题,但做一个最小的 debootstrap 并将其更改为 NFS 上的只读根文件系统相当容易。将它与 Pi 的 uboot 和智能 uboot 脚本配对,您的 SD 卡将只包含几兆的 RPi 固件、uboot 映像和 uboot 脚本。

相关内容