Вопрос или проблема
В качестве раздела данных у меня есть многодисковая файловая система btrfs. Мой корневой диск – ext4
Fstab:
UUID=290624c6-6b95-41fd-94a1-923ebca64b83 / ext4 rw,relatime,data=ordered 0 1
/dev/sdc /mnt/btrfs btrfs rw,relatime,compress-force=zlib,autodefrag 0 0
Когда я загружаю машину, она ждет 1м30с с сообщением
A start job is running for dev-sdc.device
А затем
Dependency failed for /mnt/btrfs
Когда я вхожу в систему, я могу выполнить
mount /mnt/btrfs
systemctl default
И это будет работать. Система загрузится нормально.
Сначала я подумал, что мне нужно что-то сделать с хуком mkinitcpio, но на этой странице говорится:
Пакет mkinitcpio по умолчанию в Arch содержит стандартный хук btrfs, который достаточен для поддержки многодисковых (RAID) систем. Кроме того, ядро способно загрузить одноустройственный корень btrfs без какого-либо хука
Так что все должно работать из коробки.
Почему это не работает и что мне нужно сделать, чтобы это исправить?
Два комментария. Во-первых, попробуйте монтировать по метке или UUID вместо устройства. Имена устройств иногда могут меняться.
В противном случае, btrfs
требуется вызов btrfs device scan
перед тем, как он узнает о файловых системах btrfs
на вашем компьютере. Я ожидал, что arch
справится с этим, но по какой-то причине это не сработало, пока я не создал файл службы для этого и не поместил его в /etc/systemd/system/local-fs-pre.target.wants/btrfs-dev-scan.service
:
[Unit]
Description=Btrfs scan devices
Before=local-fs-pre.target
DefaultDependencies=false
[Service]
Type=oneshot
ExecStart=/usr/bin/btrfs device scan
[Install]
WantedBy=local-fs-pre.target
DefaultDependencies=false
необходимо, иначе это нарушает загрузку. (Пользователи не Arch могут иметь btrfs
, расположенный в /sbin
вместо /usr/bin
)
Это должно обрабатываться хуком btrfs
(я понял это немного позже), но все же возможно, что с ним есть проблема.
Однако у вас может быть какая-то другая проблема. Сообщение Dependency failed
указывает, что какая-то ранее нужная служба не запустилась. Я не знаю, что это может быть, вам следует проверить ваш journalctl -b
и поискать жалобы на зависимости, обычно указывается, что именно отсутствует. Или, по крайней мере, вы получите цепочку зависимостей, которые не удались – возможно, что неудачи зависимостей распространяются…
Вы также можете сгенерировать systemd-analyze plot > boot.svg
и проверить последовательность, что именно загрузилось в каком порядке. Вы можете догадаться по этому, что именно пошло не так – кто ждал кого? И что говорит systemctl --failed
?
Существует хук для mkinitcpio
, который можно включить, чтобы гарантировать, что
btrfs device scan
будет выполнен во время загрузки до монтирования корневой файловой системы.
Вы можете включить этот хук, изменив /etc/mkinitcpio.conf
, найдите строку HOOKS
и добавьте btrfs
перед udev
.
После изменения обязательно перегенерируйте initramfs с помощью mkinitcpio -p linux
Арч Вики действительно рекомендует использовать хук udev
, однако у меня была такая же проблема, и она была исправлена таким образом.
Ответ или решение
Проблема заключается в том, что Arch Linux не монтирует массив Btrfs при загрузке системы. Давайте разберем основные моменты и предложим последовательность действий для решения этой задачи.
1. Проблематичная конфигурация
В системе используется файловая система Btrfs на несколько дисков для хранения данных, тогда как корневая файловая система представляет собой ext4. В fstab
указано следующее:
UUID=290624c6-6b95-41fd-94a1-923ebca64b83 / ext4 rw,relatime,data=ordered 0 1
/dev/sdc /mnt/btrfs btrfs rw,relatime,compress-force=zlib,autodefrag 0 0
При загрузке система тормозит с сообщением:
A start job is running for dev-sdc.device
и следом:
Dependency failed for /mnt/btrfs
Затем после входа в систему можно вручную выполнить:
mount /mnt/btrfs
systemctl default
2. Потенциальные решения
Монтирование по UUID или Label
Во-первых, следует использовать монтирование по UUID или метке (Label), а не по названию устройства, поскольку имена устройств могут меняться от одной загрузки к другой. Обновите /etc/fstab
:
UUID=<uuid_of_your_btrfs> /mnt/btrfs btrfs rw,relatime,compress-force=zlib,autodefrag 0 0
Сканирование устройств Btrfs
Некоторые пользователи Arch сообщают, что для корректного распознавания файловых систем Btrfs требуется выполнить команду btrfs device scan
. Создайте специальный системный сервис, который выполнит этот скан до монтирования:
Создайте файл /etc/systemd/system/btrfs-dev-scan.service
:
[Unit]
Description=Btrfs scan devices
Before=local-fs-pre.target
DefaultDependencies=false
[Service]
Type=oneshot
ExecStart=/usr/bin/btrfs device scan
[Install]
WantedBy=local-fs-pre.target
Активируйте и запустите сервис:
sudo systemctl enable btrfs-dev-scan.service
Настройка mkinitcpio
Добавьте hook для Btrfs в свой файл /etc/mkinitcpio.conf
. В строке HOOKS
добавьте btrfs
перед udev
:
HOOKS=(base btrfs udev ...)
Сконфигурируйте заново initramfs:
sudo mkinitcpio -p linux
3. Диагностика
Для определения, какие зависимости не запускаются вовремя, используйте:
journalctl -b
для отображения списка ошибок и предупреждений.systemd-analyze plot > boot.svg
для визуализации последовательности загрузки.systemctl --failed
для проверки списка неудачных сервисов.
Эти шаги помогут получить представление о том, какой сервис не запускается вовремя и от чего зависит цепочка неисправностей.
Заключение
Эта серия шагов позволит вам исправить ситуацию, когда Btrfs массив не монтируется при загрузке. Применение этих решений должно обеспечить корректную работу системы и автоматическое монтирование файловой системы при старте Arch Linux.