Menjalankan unit systemd tingkat pengguna saat boot

Complete all the steps described in the initial setup page before starting this tutorial. Make sure you have created the file ssh-key.pub following the instructions provided in the prerequisites for the tutorial. We will use this key in the Butane configuration file that we are about to write.

Dalam tutorial ini, kita akan menyiapkan unit systemd tingkat pengguna untuk pengguna tanpa hak istimewa. Ada kalanya bermanfaat untuk menjalankan unit systemd tingkat pengguna tanpa harus masuk terlebih dahulu. Misalnya, Anda mungkin ingin menjalankan kontainer yang menyediakan layanan jaringan atau menjalankan pekerjaan HPC. Untuk pengaturan ini, kita akan menambahkan hal berikut ke konfigurasi Butane:

  • Unit systemd tingkat pengguna: /home/sleeper/.config/systemd/user/linger-example.service.

  • Aktifkan unit tersebut sebagai layanan systemd tingkat pengguna.

Menyiapkan unit systemd

Dalam contoh ini, kita akan menjalankan layanan systemd untuk pengguna sleeper. Pertama, mari buat pengguna tersebut:

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

Ini juga akan membuat direktori home untuk pengguna sleeper. Kemudian kita dapat menambahkan unit systemd:

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

Layanan sistem dapat langsung diaktifkan dalam konfigurasi Butane, tetapi layanan tingkat pengguna saat ini harus diaktifkan secara manual:

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

Kita mengatur “lingering” untuk instance systemd tingkat pengguna agar dapat dimulai langsung saat boot dan tetap berjalan:

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

Karena direktori berikut belum ada, kita harus membuatnya agar Ignition dapat menetapkan kepemilikan dan izin yang benar:

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

Menulis konfig Butane dan mengonversi ke Ignition

Konfigurasi Butane akhir, yang disimpan dalam user.bu, akan seperti berikut:

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=Demo unit systemd tingkat pengguna
          [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

Konfigurasi ini dapat dikonversi menjadi Ignition:

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

Pengujian

Seperti sebelumnya, kita akan menggunakan perintah berikut untuk menjalankan instance:

# Atur label SELinux yang benar untuk mengizinkan akses ke konfigurasi
chcon --verbose --type svirt_home_t user.ign

# Jalankan mesin virtual Fedora CoreOS
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"

Selanjutnya kita dapat memverifikasi bahwa unit telah dijalankan di bawah instance systemd pengguna sleeper:

[core@localhost ~]$ sudo machinectl shell sleeper@
Terhubung ke host lokal. Tekan ^] tiga kali dalam 1 detik untuk keluar dari sesi.
[sleeper@localhost ~]$ systemctl --user status
● localhost.localdomain
    State: running
    Units: 157 loaded (termasuk alias yang dimuat)
     Jobs: 0 queued
   Failed: 0 units
    Since: Kam 2023-08-03 18:31:27 UTC; 23 detik yang lalu
  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 - Demo unit systemd tingkat pengguna
     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) sejak Kam 2023-08-03 18:31:27 UTC; 38 detik yang lalu
   Main PID: 1589 (sleep)
      Tasks: 1 (batas: 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

03 Agu 18:31:27 localhost.localdomain systemd: Memulai linger-example.service - Demo unit systemd tingkat pengguna.

Pembersihan

Anda kemudian dapat mematikan instance tersebut. Pertama, putuskan sambungan dari konsol serial dengan menekan CTRL + ], lalu hancurkan mesin tersebut:

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

Sekarang Anda dapat melanjutkan ke tutorial berikutnya.