如何让Ubuntu 16.04的initrd除了挂载/之外还自动挂载/home?

如何让Ubuntu 16.04的initrd除了挂载/之外还自动挂载/home?

这是对前一个问题关于 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

如果我理解正确的话,这会识别额外的挂载点,就像/usralready 一样。但我找不到类似的东西/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

相关内容