У меня установлена 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 не соблюдает зависимости.
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
.