Я установил сервер 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 в отношении подтомов. Но он либо не работает, либо не может справиться с дополнительной точкой монтирования.
Так в чем именно проблема? Спасибо!
RequiresMountsFor=
, а затем запускает ваши службы;Правильный ответ на мой вопрос: /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