在树霉派一类开发板上使用 Live 系统

现在 SD 卡价格高企,不得不考虑节约使用的问题。楼主一直使用 ARM 开发板充当家用服务器,几年时间内已经损坏了好几块 SD 卡。也采取过 ramlog 等减少写入的措施,但效果不明显。最近发现可以将普通系统制作成 Live 系统使用,这样所有的写入都在内存里,不必担心 SD 卡寿命问题了

第一步当然是配置好系统,把需要的服务装好。这一步一定要考虑周全一些,因为做好了 squashfs 就不方便修改了

第二步安装 live-boot 这个包,它会自动修改 initrd 文件

接下来我们看一看 live-boot 的手册 https://manpages.debian.org/stretch/live-boot-doc/live-boot.7.en.html

live-boot 是用内核参数控制的。要让系统以 live 方式启动,首先要添加参数 boot-live

添加内核参数的方法嘛当然跟你使用的开发板有关。比如树霉派是用一个txt文件。uboot是修改boot.cmd再编译成boot.scr

其次是使用的联合文件系统类型。用参数 union= 控制。这里需要注意两点。第一是你的开发板使用的内核支持哪种文件系统。例如,overlayfs需要3.18以上的主线内核,但有些开发板的BSP内核也backport了overlayfs。
第二是debian 8和debian 9的语法不一样。debian 8 是union=aufs|unionfs|overlayfs 即带"fs"字样,而debian 9 不能带。具体手册上有说明

改好内核参数之后,就可以制作squash文件系统了。把SD卡从开发板上拿下来,插到其它电脑上。

先安装squashfs-tools,它提供必要的工具 mksquashfs

把SD卡挂载到某个目录上,例如 /mnt

然后使用命令 mksquashfs /mnt filesystem.squashfs 将位于 /mnt 的SD卡内容打包成 squashfs

把做好的squashfs文件放到SD卡根目录的"live"文件夹下:

mkdir /mnt/live
cp filesystem.squashfs /mnt/live

到这里其实已经可以启动了。这时根目录下的文件夹除了/boot 和/live 都可以删掉。个人习惯不删,以后在修改系统时可以节省一步解包squashfs

有几个坑要注意以下

  1. 如果你在 /etc/network/interfaces配置了静态ip,会失效。live-boot会在联合文件系统的表层覆盖掉这个文件。要禁用这个特性,需要用内核参数 ip= (等于号后面是空的,不要写东西)

  2. debian 8的live boot创建initrd时可能会有问题。如果遇到无法启动的情况,需要自己解包initramfs修改 scripts/init-bottom/udev,把 mount -n -o move /dev ${rootmnt}/dev 改成 mount -n --move /dev ${rootmnt}/dev

  3. 以后如果要修改系统,需要解包squashfs,修改后再重新打包。squashfs没法以rw方式挂载

手册里还提到一些其它可能有用的参数

  1. toram
    如果内存够大 启动时可以把镜像复制到内存。这样可以性能大幅提升。因为很多开发板运行性能瓶颈是sd卡

  2. persistence
    可以把对文件系统的修改保存到其它分区或文件。这里只要任意一个分区的卷标是"persistence" 或镜像文件名是“persistence”都会被自动搜索到并使用。如果是镜像文件 需要放在某分区的根目录下。