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

Привязать маунта к systemd-nspawn

Я играю с systemd-nspawn и пытаюсь включить контейнер при загрузке с помощью bind-mount. Я pacstraped и инициализировал систему и может запустить ее из командной строки следующим образом:

$ sudo /usr/bin/systemd-nspawn --quiet --boot --link-journal=try-guest --network-veth -U --settings=override --machine=jekyll --bind-ro /home/xyz/Documents/jekyll:/home/jekyll/site --private-users=off

и мой bind-mount появляется без проблем. Когда я, однако,

$ sudo cp /usr/lib/systemd/system/systemd-nspawn@.service /etc/systemd/system/machines.target.wants/systemd-nspawn@jekyll.service

и заменить ExecStart строка в служебном файле с

ExecStart=/usr/bin/systemd-nspawn --quiet --boot --link-journal=try-guest --network-veth -U --settings=override --machine=%i --bind-ro /home/xyz/Documents/jekyll:/home/jekyll/site --private-users=off

а затем сделать

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-nspawn@jekyll

Крепления для привязки нет. Может кто подскажет, как заставить это работать?

Когда вы запускаете эту команду ...

sudo systemctl restart systemd-nspawn@jekyll

... systemd не увидит ваш измененный файл модуля в /etc/systemd/system/machines.target.wants/. Systemd ищет файлы модулей только в /lib/systemd/system, /etc/systemd/system, и /run/systemd/system. Файлы в каталогах вроде /etc/systemd/system/<sometarget>.wants предназначены для символических ссылок на один из этих каталогов.

Если вы хотите запустить свою службу с измененным ExecStart директиве вам не нужно ничего копировать. Просто запустите (как root):

systemctl edit systemd-nspawn@jekyll.service

В появившемся редакторе добавьте следующий контент:

[Service]
ExecStart=
ExecStart=/usr/bin/systemd-nspawn --quiet --boot --link-journal=try-guest \
  --network-veth -U --settings=override --machine=%i \
  --bind-ro /home/xyz/Documents/jekyll:/home/jekyll/site \
  --private-users=off

Это создаст файл /etc/systemd/system/systemd-nspawn@jekyll.d/override.conf который будет объединен с файлом стандартного модуля при запуске службы, и ваше монтирование привязки должно быть доступно.


Чтобы компьютер запускался при загрузке, просто запустите:

systemctl enable systemd-nspawn@jekyll

Чтобы ответить на вопрос в комментарии:

Большая часть информации здесь взята из Справочная страница systemd.unit. Секция "Путь загрузки файла модуля"предоставляет подробную информацию о том, как Systemd находит файлы модулей.

Использование дополнительных файлов для переопределения частей файла модуля описано в разделе "Описание" раздел:

Наряду с модульным файлом foo.service может существовать «вставной» каталог foo.service.d /. Все файлы с расширением ".conf" из этого каталога будут проанализированы после анализа самого файла модуля. Это полезно для изменения или добавления настроек конфигурации для модуля без необходимости изменять файлы модуля. Добавляемые файлы должны содержать соответствующие заголовки разделов. Для экземпляров модулей эта логика сначала будет искать подкаталог экземпляра «.d /» (например, «foo@bar.service.d/») и читать его файлы «.conf», а затем подкаталог шаблона «.d /». (например, "foo @ .service.d /") и файлы ".conf" там. Более того, для имен юнитов, содержащих тире («-»), также ищется набор каталогов, сгенерированный путем усечения имени юнита после всех тире. В частности, для единицы с именем foo-bar-baz.service ищется не только обычный подкаталог foo-bar-baz.service.d /, но также и foo-bar-.service.d /, и foo-.service. .d /. Это полезно для определения общих всплывающих окон для набора связанных модулей, имена которых начинаются с общего префикса. Эта схема особенно полезна для модулей mount, automount и slice, чья систематическая структура именования построена вокруг тире в качестве разделителей компонентов. Обратите внимание, что файлы с одинаковыми именами, расположенные ниже по иерархии префиксов, переопределяют файлы, расположенные дальше, т.е. foo-bar-.service.d / 10-override.conf переопределяет foo-.service.d / 10-override.conf.

То, что нам нужно очистить ExecStart перед его установкой (то есть то, что нам нужно ExecStart= перед ссылкой, задающей конфигурацию) взято из раздела примеров:

Обратите внимание, что для вставляемых файлов, если кто-то хочет удалить записи из параметра, который анализируется как список (и не является зависимостью), например AssertPathExists = (или, например, ExecStart = в служебных единицах), необходимо сначала очистить список перед повторным добавлением всех записей, кроме той, которую нужно удалить. Зависимости (после = и т. Д.) Нельзя сбросить до пустого списка, поэтому зависимости можно добавлять только в раскрывающихся списках. Если вы хотите удалить зависимости, вам нужно переопределить весь модуль.

Использование systemctl edit для создания (или редактирования) файла переопределения происходит из страница руководства systemctl.

Вместо того, чтобы возиться с настройками в служебном файле, проще (с точки зрения дизайна) поместить его конфигурация в /etc/systemd/nspawn/ - в файл с именем контейнера с расширением с префиксом точки nspawn.

Связать маунтов можно было дать там в [Files] раздел:

[Files]
BindReadOnly=…

Изменение этих настроек приведет к не требовать daemon-reloadвступает в силу.