Вторичный пул не будет импортирован при загрузке

У меня установлена ​​Ubuntu 19.10, которая изначально была настроена с EXT4, но я перешел на root на ZFS, вольно следуя инструкциям на https://github.com/zfsonlinux/zfs/wiki/Ubuntu- 18.04-Корень на ZFS .

У меня было множество проблем с установкой, которых у меня не было с PopOS или Arch, когда я устанавливал их с помощью ZFS (например, я не мог использовать / var как смонтированный набор данных).

Моя единственная оставшаяся проблема заключается в том, что у меня есть второй жесткий диск, также ZFS, который я пытаюсь автоматически импортировать при загрузке системы. И система, и этот дополнительный жесткий диск используют LUKS. Я правильно настроил cryptsetup, чтобы дополнительный жесткий диск расшифровывался одновременно с вводом пароля для корневой системы.

Пул не импортировался из кеш-файла (несмотря на то, что он был настроен на запуск после cryptsetup), что, по-видимому, является еще одной ошибкой, упоминаемой мной в AskUbuntu. Затем я настраиваю службу systemd для импорта пула точно так же, как в приведенных выше инструкциях рекомендуется создать службу для импорта пула загрузки.

Проблема в том, что я не могу запустить службу в нужное время, поэтому при импорте пула всегда происходит сбой, когда ZFS сообщает, что пул не существует. Кажется, я не могу заставить systemd запустить службу в нужное время.В приведенном ниже файле я заметил, что служба определенно запускается после завершения cryptsetup, поэтому я не знаю, почему ZFS не может найти пул. Странно то, что это первая служба, запускаемая после завершения cryptsetup. Я заметил в какой-то момент некоторые журналы systemd, в которых указывается, что зависимость cryptsetup была выброшена из-за цикла зависимостей, но я давно не видел этой ошибки и не уверен, что могло ее вызвать.

Итак, вопрос - как мне заставить это работать? Есть ли что-то очевидное в systemd, чего мне не хватает?

Вот служебный файл, который я использую.

[Unit]
DefaultDependencies=no
Requires=zfs-load-module.service
After=systemd-udev-settle.service
After=zfs-load-module.service
After=cryptsetup.target
Before=zfs-import-scan.service
Before=zfs-import-cache.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/sleep 3
ExecStart=/sbin/zpool import -N zfsmedia

[Install]
WantedBy=zfs-import.target

Без ExecStartPre это никогда не сработает. Система загружается без установки пула. С ExecStartPre он работает примерно 50/50. Я не пробовал большую задержку. Я также попытался добавить After = fs-remount-rw.service, но безрезультатно. Если я удалю строки Before =, система неожиданно перейдет в аварийную оболочку, при этом половина системных наборов данных не будет смонтирована (у меня также был этот симптом много раз, когда я пытался получить root-права на ZFS).

После неудачной попытки импорта при загрузке я могу ввести "zpool import zfsmedia" после загрузки, и все работает нормально. Похоже, что это просто неправильное время для модуля systemd, и я не могу понять, как это исправить, или что делать, если проблема в том, что systemd не соблюдает зависимости.

0
задан 12 January 2020 в 17:47

1 ответ

TL; DR - рабочий systemd сервис ниже!

Спасибо за публикацию, так как у меня была точно такая же проблема, также с использованием корневого каталога ZFS на Ubuntu 19.10.

Я ДУМАЮ , что происходит при загрузке корневого каталога ZFS, выполняется специальный сценарий initrd zfs , который отличается от стандартных сценариев zfs-import в ] /etc/init.d и игнорирует некоторые стандартные конфигурации из / etc / default / zfs . Я не нашел этот точный файл где-либо еще в основной системе. Впрочем, я тоже расстроился и перестал копать дальше.

Поскольку я видел ваш пост, я решил взглянуть на systemd для монтирования zpool, но в качестве отправной точки я использовал предоставляемую Ubuntu службу zfs systemd.

Я проверил службу zfs-import-cache ... которая, очевидно, не работала для меня, но решил, что она даст подсказки об относительных зависимостях. Затем я использовал это, чтобы создать свой собственный сервис.

systemctl cat zfs-import-cache > /etc/systemd/system/zfs-import-datastore.service
# edit as needed (see below)
systemctl daemon-reload
systemctl enable zfs-import-datastore

Полученная служба:

# /etc/systemd/system/zfs-import-datastore.service
[Unit]
Description=Import ZFS pool - datastore
Documentation=man:zpool(8)
DefaultDependencies=no
Requires=systemd-udev-settle.service
Requires=zfs-load-module.service
After=systemd-udev-settle.service
After=zfs-load-module.service
After=cryptsetup.target
After=systemd-remount-fs.service
After=zfs-import-cache.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/zpool import datastore

[Install]
WantedBy=zfs-import.target

С этой службой моя система Ubuntu 19.10 загружается без ошибок и автоматически импортирует хранилище данных zpool в дополнение к bpool и rpool .

2
ответ дан 13 February 2020 в 03:50

Другие вопросы по тегам:

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