Запуск пользовательского модуля systemd при загрузке

Выполните все шаги, описанные в странице начальной настройки, прежде чем начинать этот учебник. Убедитесь, что вы создали файл ssh-key.pub в соответствии с инструкциями, приведёнными в предварительных требованиях к учебнику. Мы будем использовать этот ключ в файле конфигурации Butane, который собираемся написать.

В этом руководстве мы настроим пользовательский модуль systemd для непривилегированного пользователя. Бывают случаи, когда полезно запустить пользовательский модуль systemd без необходимости входа в систему. Например, вы можете захотеть запустить контейнер, предоставляющий сетевой сервис, или запустить задание HPC. Для этой настройки мы добавим следующее в конфигурацию Butane:

  • Пользовательский модуль systemd: /home/sleeper/.config/systemd/user/linger-example.service.

  • Включить его как пользовательскую службу systemd.

Настройка модуля systemd

В этом примере мы запустим службу systemd для пользователя sleeper. Сначала создадим пользователя:

variant: fcos
version: 1.7.0
passwd:
  users:
    - name: sleeper

Это также создаст домашний каталог для пользователя sleeper. Затем мы можем добавить модуль systemd:

variant: fcos
version: 1.7.0
storage:
  files:
    - path: /home/sleeper/.config/systemd/user/linger-example.service
      mode: 0644
      contents:
        inline: |
          [Unit]
          Description=A systemd user unit demo
          [Service]
          ExecStart=/usr/bin/sleep infinity
      user:
        name: sleeper
      group:
        name: sleeper

Системные службы можно включать непосредственно в конфигурациях Butane, но пользовательские службы пока приходится включать вручную:

variant: fcos
version: 1.7.0
storage:
  directories:
    - path: /home/sleeper/.config/systemd/user/default.target.wants
      mode: 0755
      user:
        name: sleeper
      group:
        name: sleeper
  links:
    - path: /home/sleeper/.config/systemd/user/default.target.wants/linger-example.service
      user:
        name: sleeper
      group:
        name: sleeper
      target: /home/sleeper/.config/systemd/user/linger-example.service
      hard: false

Мы настраиваем lingering для пользовательского экземпляра systemd, чтобы он запускался непосредственно при загрузке и продолжал работать:

variant: fcos
version: 1.7.0
storage:
  files:
    - path: /var/lib/systemd/linger/sleeper
      mode: 0644

Поскольку следующие каталоги ещё не существуют, нам придётся создать их, чтобы указать Ignition установить правильного владельца и разрешения:

variant: fcos
version: 1.7.0
storage:
  directories:
    - path: /home/sleeper/.config
      mode: 0755
      user:
        name: sleeper
      group:
        name: sleeper
    - path: /home/sleeper/.config/systemd
      mode: 0755
      user:
        name: sleeper
      group:
        name: sleeper
    - path: /home/sleeper/.config/systemd/user
      mode: 0755
      user:
        name: sleeper
      group:
        name: sleeper
    - path: /home/sleeper/.config/systemd/user/default.target.wants
      mode: 0755
      user:
        name: sleeper
      group:
        name: sleeper

Написание конфигурации Butane и преобразование в Ignition

Итоговая конфигурация Butane, сохранённая в user.bu, будет следующей:

variant: fcos
version: 1.7.0
passwd:
  users:
    - name: core
      ssh_authorized_keys_local:
        - ssh-key.pub
    - name: sleeper
storage:
  directories:
    - path: /home/sleeper/.config
      mode: 0755
      user:
        name: sleeper
      group:
        name: sleeper
    - path: /home/sleeper/.config/systemd
      mode: 0755
      user:
        name: sleeper
      group:
        name: sleeper
    - path: /home/sleeper/.config/systemd/user
      mode: 0755
      user:
        name: sleeper
      group:
        name: sleeper
    - path: /home/sleeper/.config/systemd/user/default.target.wants
      mode: 0755
      user:
        name: sleeper
      group:
        name: sleeper
  files:
    - path: /var/lib/systemd/linger/sleeper
      mode: 0644
    - path: /home/sleeper/.config/systemd/user/linger-example.service
      mode: 0644
      contents:
        inline: |
          [Unit]
          Description=A systemd user unit demo
          [Service]
          ExecStart=/usr/bin/sleep infinity
      user:
        name: sleeper
      group:
        name: sleeper
  links:
    - path: /home/sleeper/.config/systemd/user/default.target.wants/linger-example.service
      user:
        name: sleeper
      group:
        name: sleeper
      target: /home/sleeper/.config/systemd/user/linger-example.service
      hard: false

Эту конфигурацию можно преобразовать в Ignition:

butane --pretty --strict --files-dir=./ user.bu --output user.ign

Тестирование

Как и раньше, мы будем использовать следующее для загрузки экземпляра:

# Setup the correct SELinux label to allow access to the config
chcon --verbose --type svirt_home_t user.ign

# Start a Fedora CoreOS virtual machine
virt-install --name=fcos --vcpus=2 --ram=2048 --os-variant=fedora-coreos-stable \
    --import --network=bridge=virbr0 --graphics=none \
    --qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${PWD}/user.ign" \
    --disk="size=20,backing_store=${PWD}/fedora-coreos.qcow2"

Затем мы можем убедиться, что модуль был запущен в пользовательском экземпляре systemd sleeper:

[core@localhost ~]$ sudo machinectl shell sleeper@
Connected to the local host. Press ^] three times within 1s to exit session.
[sleeper@localhost ~]$ systemctl --user status
● localhost.localdomain
    State: running
    Units: 157 loaded (incl. loaded aliases)
     Jobs: 0 queued
   Failed: 0 units
    Since: Thu 2023-08-03 18:31:27 UTC; 23s ago
  systemd: 253.4-1.fc38
   CGroup: /user.slice/user-1001.slice/user@1001.service
           ├─app.slice
           │ └─linger-example.service
           │   └─1589 /usr/bin/sleep infinity
           └─init.scope
             ├─1489 /usr/lib/systemd/systemd --user
             └─1496 "(sd-pam)"
[sleeper@localhost ~]$ systemctl --user status linger-example.service
● linger-example.service - A systemd user unit demo
     Loaded: loaded (/var/home/sleeper/.config/systemd/user/linger-example.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/user/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Thu 2023-08-03 18:31:27 UTC; 38s ago
   Main PID: 1589 (sleep)
      Tasks: 1 (limit: 2238)
     Memory: 224.0K
        CPU: 1ms
     CGroup: /user.slice/user-1001.slice/user@1001.service/app.slice/linger-example.service
             └─1589 /usr/bin/sleep infinity

Aug 03 18:31:27 localhost.localdomain systemd[1489]: Started linger-example.service - A systemd user unit demo.

Очистка

Затем вы можете выключить экземпляр. Сначала отключитесь от последовательной консоли, нажав CTRL + ], а затем уничтожьте машину:

virsh destroy fcos
virsh undefine --remove-all-storage fcos

Теперь вы можете перейти к следующему руководству.