这是关于 systemd、BTRFS、作为单独的子卷以及我想解决的 systemd 的以下限制的前一个问题的后续行动:/home
当 systemd 启动时,链接单元文件所在的文件系统必须是可访问的(例如,不允许 /home 或 /var 下的任何内容,除非这些目录位于根文件系统上)。
/home
由 systemd 正确挂载,但包含 systemd 应该在引导期间启动的服务文件,但它不起作用。/etc/fstab
如下所示:
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
UUID=0841ef72-e9d4-45ca-af22-a403783859c6 / btrfs noatime,nodiratime,subvol=@ 0 1
# /home was on /dev/sda1 during installation
UUID=0841ef72-e9d4-45ca-af22-a403783859c6 /home btrfs noatime,nodiratime,subvol=@home 0 2
由于 initrd 是一个包含大量脚本的压缩档案,理论上可以解压(gzip -dc /.../initrd.gz | cpio -id
),更改一些脚本并额外挂载/home
。我已经在一个名为的文件中找到了以下代码,该文件init
似乎负责安装/
. 遵循这些函数调用揭示了fstab
等的解析逻辑。
maybe_break mount
log_begin_msg "Mounting root file system"
# Always load local and nfs (since these might be needed for /etc or
# /usr, irrespective of the boot script used to mount the rootfs).
. /scripts/local
. /scripts/nfs
. /scripts/${BOOT}
parse_numeric ${ROOT}
maybe_break mountroot
mount_top
mount_premount
mountroot
log_end_msg
问题是我当然不想为 Ubuntu 的每个内核更新构建一个新的 initrd。
因此,除了手动自定义脚本之外,还有其他方法可以让 initrd 挂载其他文件系统/home
吗?像在启动期间提供的内核参数之类的东西,也许一些钩子可以使用特殊文件/
等触发?
我发现以下内容很有趣:
if read_fstab_entry /usr; then
log_begin_msg "Mounting /usr file system"
mountfs /usr
log_end_msg
fi
如果我理解正确,这会识别出额外的挂载点/usr
。但我找不到类似的东西/home
。
因为 initramfs-tools 支持钩子/插件,所以在 initrd 中做额外的事情就像编写 shell 脚本(准确地说是busybox shell)一样简单。
在您的情况下,创建一个
/etc/initramfs-tools/scripts/local-bottom/mount-home
如下所示的脚本:注意:
local-bottom
在安装 rootfs 后运行。目标 rootfs 组装在${rootmnt}
.然后你可以
update-initramfs
更新你的initrd。然后,每个内核包更新都将包含您的自定义脚本。有关更多文档,请查看initramfs-tools.8的手册页。