我正在尝试更新自定义 initramfs init 脚本以将 squashfs 映像安装为根文件系统。我一直在测试以只读方式将挤压图像安装到循环设备,以读写方式将另一个空文件安装到另一个循环设备,并使用设备映射器创建 ro 循环设备的 rw 快照。
我已经用我的测试脚本做到了这一点(以 root 身份运行):
mkdir /tmp/squash_rw
dev=$(losetup -f)
losetup -r $dev /mcp_fs.sqsh
ovl=/overlay
newdevname=overlay
size=$(blockdev --getsz "$dev")
loop=$(losetup -f --show -- "$ovl")
printf '%s\n' "0 $size snapshot $dev $loop P 8" | dmsetup create "$newdevname"
然后,我使用 touch 来测试新设备是否安装为 rw,但出现错误并提示它是只读设备。
# touch /tmp/squash_rw/test
touch: cannot touch '/tmp/squash_rw/test': Read-only file system
我使用的是gentoo发行版和Linux内核3.10.6,其中包含设备映射器和squashfs模块。许多参考文献建议使用 dracut initramfs,但我正在尝试让供应商提供的初始化脚本正常工作。
我已经被困在这个问题上几天了,非常感谢任何人可以提供的帮助。
经过继续研究和实验,我正在制作的 devmapper 设备似乎假定了第一个设备的文件系统正在合并在一起。如果我使用squashfs设备,则devmapper设备是只读的,如果我使用rw映像,则devmapper设备是rw,但安装时不包含squash文件中的内容。