Объяснение systemd, что /var является символической ссылкой на /home/var

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

При такой конфигурации необходимо сообщить systemd, что любой модуль, которому требуется что-либо в /var не может быть начато до /home установлен. Тот, который я знаю, чтобы быть сломанным (поскольку он пытается получить доступ к файлу в /var/lib очень рано в последовательности загрузки) systemd-random-seed.service, но может легко быть любое количество других, которых я еще не заметил.

Каков наилучший способ настроить общее правило, что "все, что-то нужно от /var не может быть начато до /home смонтирован "? Я приму ответ формы" добавить Requires= а также After= директивы для каждого отдельного файла модуля, затронутые ", только если вы можете продемонстрировать, что нет лучшей альтернативы.

Версия systemd, в настоящее время нестабильная в Debian, - 224.

2 ответа

Решение

Что ж, init не может действительно знать, какие именно файлы нужны данной службе, поэтому "этот сервис использует /var", в любом случае, где-то еще нужно объявить.

Конечно, это должны делать разработчики и упаковщики, а не вы. Например, вышеупомянутый systemd-random-seed.service уже есть все необходимые зависимости:

$ systemctl cat systemd-random-seed
# /usr/lib/systemd/system/systemd-random-seed.service
# Этот файл является частью systemd.
...
DefaultDependencies= нет
RequiresMountsFor=/ вар / Библиотека / Systemd / случайные семена...

Таким образом, в вашем случае, "превосходной альтернативой" является использование связующего монтирования вместо символической ссылки. Это естественным образом подключится к зависимостям юнитов systemd.mount, в то же время предоставляя идентичные функциональные возможности символической ссылке.

То есть, если у вас есть крепление на /var, то все единицы, которые уже зависят от var.mount будет автоматически (косвенно) зависеть от home.mount,

# / etc / fstab
/ home / var / var none bind 0 0

(Если это не приемлемо, возможно, компиляция пользовательской версии systemd со взломанной зависимостью будет лучше соответствовать вашим "требованиям".)


Если некоторые из ваших модулей.service не имеют надлежащих зависимостей, есть еще один вариант - вы можете включить /var в автомонтирование с использованием поддержки autofs4 systemd.

При использовании автомонтирования любой процесс, пытающийся получить доступ к файлам в / var, будет блокироваться до тех пор, пока файловая система не будет смонтирована. Таким образом, глобальная "зависимость" создается без необходимости редактирования отдельных сервисных единиц.

Для этого добавьте x-systemd.automount вариант в фстаб. (Или, если вы предпочитаете var.mount через fstab, затем создайте соответствующий var.automount также.)

# / etc / fstab
/ home / var / var none bind, x-systemd.automount 0 0

Конечно, это снова требует, чтобы /var быть привязкой, а не символической ссылкой.

Спустя более года с версией systemd (229), поставляемой сейчас с ubuntu 16.04, в fstab есть поддержка для монтирования зависимостей, подобного этой.

так что это так же просто, как сделать это.

# /etc/fstab
home/var /var x-systemd.requires=/home,x-systemd.automount,none bind 0 0

получил идею из этого поста https://copyninja.info/blog/systemd_automount_entry.html

Другие вопросы по тегам