Arch не монтирует массив btrfs при загрузке.

Вопрос или проблема

В качестве раздела данных у меня есть многодисковая файловая система 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.

Оцените материал
Добавить комментарий

Капча загружается...