Как сделать 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 .

0
задан 2 May 2018 в 10:59
1 ответ

Выполнение дополнительных действий в 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 .

1
ответ дан 4 December 2019 в 15:58

Теги

Похожие вопросы