我需要一个Linux发行版,它将给我以下内容:
- 在Raspberry Pi上运行
- 可以可靠地承受掉电(例如通过只读文件系统)
我已经能够找到有关如何将常规Linux发行版更改为只读模式的一些文档。我希望已经有一个发行版可以在嵌入式环境中运行。
我不需要很多软件包或驱动程序,只需要让Pi与USB /以太网一起工作即可。我不需要任何GUI界面或任何东西,这将只运行用C内置的自定义服务。
有人知道合适的发行版吗?
我需要一个Linux发行版,它将给我以下内容:
我已经能够找到有关如何将常规Linux发行版更改为只读模式的一些文档。我希望已经有一个发行版可以在嵌入式环境中运行。
我不需要很多软件包或驱动程序,只需要让Pi与USB /以太网一起工作即可。我不需要任何GUI界面或任何东西,这将只运行用C内置的自定义服务。
有人知道合适的发行版吗?
Answers:
大多数嵌入式系统使用定制的内核。其中一个工具是Buildroot,它是构建GNU gcc工具链的一组脚本,代替(巨大的)GNU libc的uClibc库,Linux内核,BusyBox以及嵌入式板根文件系统的其他实用程序/软件包。RaspberryPi是一个相对较新的开发板,因此仍在Buildroot中对其进行支持,但显然有一个项目,另一个项目和个人的工作。随着RP制造的增加和分销的改善,可能还会有更多。
使用Buildroot,您可以完全按照问题中的描述构建Linux内核和根文件系统。根据您的Internet连接速度和开发PC的功能,您可能会在1到4个小时以上获得二进制文件。不利的一面是,未测试生成的二进制文件,也不保证它们成功启动和执行。必须使用系统控制台来调试引导顺序。请参阅我的答案,如何在没有监视器的情况下如何通过以太网/ wifi访问我的小型PC(RaspberryPi / MK802 / Mele A1000 / VIAPC)? 但是考虑到RaspberryPi的设计是坚不可摧的,因此不利之处不应该阻止构建自定义内核和RFS。
关于“生存掉电”:正确选择文件系统通常可以减轻这种担忧。从经验来看,MTD设备层加上日志文件系统(例如jffs2)已经非常强大。对于几乎绝对的保护,有一些initramfs使用ramfs
(而不是固定大小的ramdisk),而没有切换到R / W文件系统。
上Buildroot里面的功能A 30滑动的介绍是这里
在结束(#27)有几个相似和备用工具来构建的嵌入式系统提。
TinyCoreLinux默认为只读(持久性为可选):http : //www.tinycorelinux.net/ports.html
拥有可访问控制台的Seagate Dockstar之后,我在其上安装了Debian squeeze。作为使它在只读根目录上运行的起点,我使用了Jeff Doozan撰写的出色文章1。基本策略包括创建一个脚本,该脚本在每次引导时将必要的可写目录挂载为tmpfs。我在这里引用了Jeff 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
将以上几行另存为在目标rootfs上名为/ sbin / init-ro的脚本,并使其可执行。
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(将ext2替换为您正在使用的文件系统,或者仅使用rootfs)。
/dev/root / ext2 noatime,ro 0 1
最后,为了在实际的/ sbin / init之前运行脚本,必须将以下内容附加到内核参数中(即,在Raspi上的/boot/cmdline.txt中)。(以下只是root和rootdelay参数的示例。必须附加到cmdline.txt中的行的重要部分是。)init=/sbin/init-ro
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
但是请注意,对于需要对rootfs进行写访问的任何软件,您都必须安装适当的tmpfs位置或写入外部存储。
我的2美分,为Pi提供可靠的电池备份要比使用只读OS容易得多(最终更好)。当然,这意味着您将需要一些非常基础的电子知识(我的意思是BASIC;我们正在谈论3-4个组件)。这个家伙只用了几个就花了很多钱:https://raspberrypi.stackexchange.com/questions/1360/how-do-i-build-a-ups-like-battery-backup-system
如果执行此操作,请勿使用LiPo。NiCad是您想要的。LiPo无法持续充电。您已被警告。
另外,根据我的经验,您似乎很担心这是一个非常小的问题。我一直在打我的Linux机器,当我不被打扰时,突然的计划外关机是理所当然的事情。如果禁用日志,那么您甚至很少会抱怨这样做。
要禁用所有日志,您可以将以下行添加为/etc/rsyslog.conf中的第一条规则:
*.* ~
即使出现问题,在下一次扫描磁盘时,也有99.9999%的时间(在我的个人经验中,我的意思是每次都表示)会解决该问题。发生这种情况的时间主要取决于天气,操作系统会注意到您所做的事情(奇怪的是,它通常不会这么做)。由于Pi使用SD卡,因此我想这在Pi上发生的次数要比在PC上发生的次数少。
如果我没有记错的话,只读文件系统将不会“保护” SD卡。我有一个客户正在运行10个Pi(当前正常运行时间超过80天,其中有一半),其电源并没有您期望/想要的稳定。花了我一段时间才能找到电源(实际上,Pi的运行时间超过几天,而额定电流为3A的廉价充电器和额定电流为2.3A的“昂贵” iPad充电器),在此之前我遇到了各种SD损坏问题,包括仅用于只读IIRC的一个。
我的问题现在大部分已经解决了(因为有了新的耗材),但是对于将来的项目,我正在研究使用NFS根文件系统。已经有很多关于此的教程,主要围绕正常的Pi fs映像进行解决,但是进行最小的debootstrap并将其更改为基于NFS的只读根文件系统相当容易。将其与用于Pi的uboot和智能uboot脚本配对,您的SD卡将仅包含价值几兆的RPi固件,uboot映像和uboot脚本。
我听说过有关Puppy Linux的好消息。尽管我必须承认我还没有尝试过。
可以设置为不写回SD卡。
raspberrypi.org的下载页面提供了四个图像:
这是默认情况下唯一的只读文件(但是可以根据需要更改):
希望其中之一可以满足您的需求。