我的目标是创建一个系统,其中根文件系统的主要部分存储在只读 SD 卡上,可写部分位于设置为 rw 的 SSD 上。这样做是为了防止根文件系统被篡改和损坏,并使更新和其他维护成为交换预配置 SD 卡的情况。我使用的是 Ubuntu 14.04 LTS。
我很高兴通过常规分区和挂载来处理 /home、/var 等,但处理 /etc 时就变得棘手得多。我知道 /etc 的某些部分必须是可写的,例如 mtab,并且我也知道 /etc 在启动期间会被访问。我觉得让 /etc 的某些部分在启动之间保留也是明智之举。
我倾向于仅在 /etc 上使用 overlayfs,而 upperdir 仅包含我想要保留的文件。任何只需要从 /etc 读取的内容都将来自 lowerdir。upperdir 将可用新文件写入,尽管这些文件只有在白名单中标识的情况下才会在启动时保留。脚本应在关机时运行,以将这些文件从 upperdir 复制到白名单,并在启动后(或必要时在启动过程中)直接执行相反的操作。
编辑
白名单旨在阻止任何新文件写入 upperdir 并在启动期间保留。我也将使用权限来管理这一点。
这是实现我想要的结果的好方法吗?我应该注意哪些问题?
我已经阅读过使用 mount --bind 的方法,但知道它有自己的问题,我也知道将 /etc/mtab 符号链接到 /proc/mounts/ 的方法,并且对这种方法也持谨慎态度。
任何帮助都将不胜感激,我在论坛上阅读了很多资料,并通过常规网络搜索,发现关于实现 overlayfs 的详细信息确实非常少。如果我把事情复杂化了,或者有更好的方法,请随时告诉我。这也是我的第一个问题,所以请多多包涵!!
编辑
我意识到我提出的问题有点模糊,基于观点,所以我想我可以重新措辞我的问题。
除了联合安装之外,还有其他有用的方法来设置这种系统吗?
答案1
aufs(最终的 UnionFS)已经过时了,而 overlayfs 是 Ubuntu 中针对此问题的新解决方案。脚本对于我来说,overlayfs 在 14.04.1 上运行顺畅
因此你需要将脚本复制/etc/initramfs-tools/scripts/init-bottom/root-ro
到
#make the script executable
cmdod 755 /etc/initramfs-tools/scripts/init-bottom/root-ro
#add the module overlayfs to initramfs
echo overlayfs >> /etc/initramfs-tools/modules
#update initramfs
update-initramfs -u
update-grub
重启尝试一下。然后输入mount
,你应该有输出:
overlayfs-root 开启/类型 overlayfs (rw)
你会找到/mnt/root-rw和/mnt/root-ro“下层”和“上层”目录图层你的 overlayfs。
您还可以为 grub 菜单添加无需 overlayfs 即可加载的功能:
echo overlayfs >> /etc/initramfs-tools/modules
cp root-ro /etc/initramfs-tools/scripts/init-bottom/root-ro
chmod 755 cp /etc/initramfs-tools/scripts/init-bottom/root-ro
#########################GRUB#########################
cat /etc/grub.d/10_linux|sed s/'linux_entry "${OS}" "${version}" simple'/'linux_entry "RW: ${OS}" "${version}" simple'/ |sed s/'"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"'/'"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} disable-root-ro=true"'/ >/etc/grub.d/11_custom
sed -i.orig -e \
"/{GRUB_DISABLE_RECOVERY}\" != \"xtrue\" ]; then/s/^.*$/ \
if [ 0 ]; then/" \
/etc/grub.d/11_custom
sed -i.orig -e \
"/in_submenu=:/s/^.*$/ \
/" \
/etc/grub.d/11_custom
sed -i.orig -e \
"/\"Previous Linux versions/s/^.*$/ \
if [ 0 ]; then/" \
/etc/grub.d/11_custom
rm /etc/grub.d/11_custom.orig
#########################GRUB#########################
chmod 777 /etc/grub.d/11_custom
答案2
我已经实施了这个系统一段时间了,目前一切似乎都进展顺利。可能意味着它即将崩溃!
使用 Overlayfs 创建联合文件系统似乎是一个可行的解决方案,尽管我还没有解决启动时启动脚本的问题!不过,有很多关于如何完成这一部分过程的文档。
@Rinzwind 上面发布的链接是一个非常明智的指南,在这里重复一下;http://www.logicsupply.com/blog/2009/01/27/how-to-build-a-read-only-linux-system/