Это продолжение бывший вопрос о 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
Проблема в том, что я, конечно, не хочу создавать новый initrd для каждого обновления ядра Ubuntu.
Итак, помимо настройки скриптов вручную, есть ли другой способ заставить initrd монтировать дополнительные файловые системы, такие как /home
? Что-то вроде параметров ядра, предоставленных во время запуска, возможно, некоторые хуки, которые можно запустить с помощью специальных файлов в /
или такой?
Мне показалось интересным следующее:
if read_fstab_entry /usr; then
log_begin_msg "Mounting /usr file system"
mountfs /usr
log_end_msg
fi
Если я правильно понимаю, это распознает дополнительные точки монтирования, такие как /usr
уже. Но я не мог найти что-то подобное для /home
.
Выполнить дополнительные действия в initrd так же просто, как написать сценарий оболочки (если быть точным, оболочку busybox), поскольку initramfs-tools поддерживает хуки / плагины.
В вашем случае создайте скрипт в /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-tools.8.