Назад | Перейти на главную страницу

Как сделать так, чтобы initrd в Ubuntu 16.04 монтировал / 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

Проблема в том, что я, конечно, не хочу создавать новый 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.