这是对前一个问题关于 systemd、BTRFS/home
作为单独的子卷以及 systemd 的以下限制,我想解决:
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
already 一样。但我找不到类似的东西/home
。
答案1
由于 initramfs-tools 支持钩子/插件,因此在 initrd 中执行额外的操作就像编写 shell 脚本(准确地说是 busybox shell)一样简单。
对于您的情况,请创建一个/etc/initramfs-tools/scripts/local-bottom/mount-home
如下所示的脚本:
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
# Mount /home
mount /dev/disk/by-uuid/1234567890 ${rootmnt}/home
注意:local-bottom
在 rootfs 挂载后运行。目标 rootfs 在 中组装${rootmnt}
。
然后你就可以update-initramfs
更新你的 initrd 了。每个内核包更新都会包含你的自定义脚本。
有关更多文档,请参阅initramfs 工具.8。