Назад | Перейти на главную страницу

Почему systemd не может найти служебные файлы в субтоме BTRFS в корневой файловой системе BTRFS?

Я установил сервер Ubuntu 16.04 LTS с использованием BTRFS и получил следующую настройку в соответствии с /etc/fstab:

# <file system> <mount point>   <type>  <options>  <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=0841ef72-e9d4-45ca-af22-a403783859c6 /        btrfs   noatime,nodiratime,subvol=@ 0     1

# /home was on /dev/sda1 during installation
UUID=0841ef72-e9d4-45ca-af22-a403783859c6 /home    btrfs   noatime,nodiratime,subvol=@home 0 2

Для меня это имеет смысл, но привело к проблемам с моей systemd-setup. Я храню программное обеспечение для разных клиентов в /home и некоторые из них предоставляют демонов, которые должны запускаться автоматически во время загрузки системы с помощью systemd. Примерно так:

/home/customer/someDaemon/cust_some_daemon.service

Это можно легко развернуть в systemd, используя systemctl enable ... с абсолютным путем выше. Мне не нужно вручную копировать или связывать вещи, systemd все обрабатывает, systemctl enable ... просто успешно, и ссылки создаются должным образом.

Что не работает, так это запуск этих служб во время загрузки, systemd дает сбой для всех этих служб с сообщением, что он больше не может найти связанные файлы. Если я не использую /home но храните эти файлы в / напрямую или удалить @home чтобы больше не быть дополнительным подтомом, все работает как положено.

В предложении документы для enable:

Файловая система, в которой расположены связанные файлы модулей, должна быть доступна при запуске systemd (например, все, что находится под / home или / var, запрещено, если эти каталоги не расположены в корневой файловой системе).

Мне непонятно, какое именно ограничение в данном случае: это использование самого отдельного подобома или это потому, что его нужно было дополнительно смонтировать? / необходимо смонтировать, и он тоже является подтомом, но, очевидно, поддерживается. Я ожидал, что systemd хотя бы поддерживает несколько подобтомов в пределах некоторой общей корневой файловой системы или пула, особенно из-за динамической природы BTRFS и ZFS в отношении подтомов. Но он либо не работает, либо не может справиться с дополнительной точкой монтирования.

Так в чем именно проблема? Спасибо!

  1. Создайте службу в корневом томе, для которой требуется смонтированный домашний том с RequiresMountsFor=, а затем запускает ваши службы;
  2. Сделайте сервис пользователь сервис, который запускается при входе пользователя в систему. Подробнее об этом.

Правильный ответ на мой вопрос: /home монтируется systemd после того, как он начал работать, и поэтому он не может разрешить ссылки на /home во время запуска самого systemd. Цель этих ссылок станет доступной только позже. OTOH / монтируется initrd, systemd обнаруживает, что он уже полностью доступен и работает при запуске. Это не имеет ничего общего с BTRFS или субтомами, только с тем, что монтируется и кем.

Престижность @atype для объяснение, но мне не нравятся другие ответы, в которых основное внимание уделяется в основном неправильным обходным путям проблемы. Я хотел бы получить ответ, действительно сосредоточенный на моем вопросе и объясняющий основную проблему. Если @atype изменит свой ответ включить, например, мое объяснение, я с радостью предоставлю ему кредиты.

В файле модуля укажите, что у вас есть зависимость от точек монтирования, отличных от корневой файловой системы, и systemd будет ждать с запуском ваших служб, пока они не будут смонтированы:

Рассмотрим, например:

  • RequiresMountsFor= Принимает список абсолютных путей, разделенных пробелами. Автоматически добавляет зависимости типа Requires= и After= для всех модулей монтирования, необходимых для доступа по указанному пути.

Или добавьте зависимость от local-fs.target который отвечает за монтирование всех локальных файловых систем из /etc/fstab у которых есть ярлык auto например:

  • Requires=local-fs.target
  • After=local-fs.target