У меня установлен Debian 10 (Buster), и я добавил ZFS из Backports. У меня есть 4 iSCSI-LUN, которые я использую как диски для ZFS. Каждый LUN имеет отдельный zpool.
Пока что установка ZFS работает. Но система нестабильна после перезагрузки. Иногда после перезагрузки все тома ZFS восстанавливаются и монтируются правильно, иногда - нет. Я думаю, что это происходит, потому что ZFS не ждет завершения iSCSI.
Я пробовал:
/etc/systemd/system/zfs-import-cache.d/after-open-iscsi.conf
[Unit]
After=open-iscsi.service
BindsTo=open-iscsi.service
systemd-analysis critical-chain zfs-import-cache.service
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.
zfs-import-cache.service +1.602s
└─open-iscsi.service @2min 1.033s +286ms
└─iscsid.service @538ms +72ms
└─network-online.target @536ms
└─ifup@eth0.service @2min 846ms
└─apparmor.service @2min 748ms +83ms
└─local-fs.target @2min 745ms
└─exports-kanzlei.mount @2min 3.039s
└─local-fs-pre.target @569ms
└─keyboard-setup.service @350ms +216ms
└─systemd-journald.socket @347ms
└─system.slice @297ms
└─-.slice @297ms
Это не решает моих проблем. Вероятно, материал iSCSI не готов, но уже активирован системой, поэтому ZFS не находит свои устройства.
В настоящее время единственный очень грязный обходной путь состоит в том, чтобы, кроме некоторых правил, в /etc/rc.local:
systemctl start zfs-import-cache.service
systemctl start zfs-mount.service
systemctl start zfs-share.service
systemctl start zfs-zed.service
zfs mount -a
Это работает, но мне нужно чистое решение.
Чего я действительно не понимаю и что сводит меня с ума, так это то, что в Debian действительно существуют /etc/init.d/scriptname, а также файлы модулей systemd. Какой из них используется? sysvinit или systemd? Почему оба предусмотрены? Какие из них лучше?
Итак, в настоящее время я чувствую, что у меня здесь нестабильный процесс загрузки.
Спасибо за любую помощь; -)
Рекомендуемый способ сделать это, вероятно, использовать правило udev
, но я недостаточно хорошо знаю udev
.
Это мой текущий обходной путь (пожалуйста, скажите мне, как сделать лучше):
Создайте службу для дискового устройства iSCSI, на котором вам нужно ждать (/dev/sdb1
, в моем случае):
$ sudo EDITOR=vim systemctl edit --force --full dev-sdb1.service
В определении сервиса сделайте так, чтобы ZFS зависела от него.
В определении сервиса заставьте его ждать, пока устройство станет доступным.
3 — сложная часть. Вот что у меня есть:
[Unit]
Description="Monitor the existence of /dev/sdb1"
Before=zfs-import-cache.service
# Requires=dev-sdb1.device
# After=dev-sdb1.device
# I thought this would wait for the device to become available.
# It doesn't, and there appears to be no way to actually do so.
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'while [ ! -e /dev/sdb1 ]; do sleep 10; done'
# pathetic
[Install]
WantedBy=multi-user.target
RequiredBy=zfs-import-cache.service
Очевидно, было бы лучше сделать это без сценария оболочки для опроса устройства. Прочитав документацию, касающуюся модулей устройств, и ответы на следующие вопросы Stack Exchange:
и проверили, что dev-sdb1.device
существует после загрузки, я ожидал, что просто смогу заставить zfs-import-cache.service
ждать /dev/sdb1
, добавив правила
After=dev-sdb1.device
Requires=dev-sdb1.device
к его определению. Это не работает; он скажет, что служба не удалась с результатом «зависимость»
, что бы это ни значило. Я предполагаю, что dev-sdb1.device
еще не существует, systemd
не знает, что оно будет создано в ближайшее время, и я не могу найти директиву, чтобы сказать: «просто подождите ".
Альтернативные подходы:
udev
, соответствующее /dev/sdb
или /dev/sdb1
(если возможно), чтобы явно сделать его устройство доступным. Я не пробовал это; Я не понимаю, почему это может помочь (блок устройства уже создается), и я не знаю, как выяснить, будет ли это иметь какие-либо другие последствия для инициализации устройства и в результате что-нибудь сломается.