ການເລີ່ມເຮັດວຽກ systemd unit ໃນລະດັບຜູ້ໃຊ້ເມື່ອເປີດເຄື່ອງ

ເຮັດທຸກຂັ້ນຕອນທີ່ໄດ້ອະທິບາຍໄວ້ໃນ ໜ້າການຕັ້ງຄ່າເບື້ອງຕົ້ນ ກ່ອນທີ່ຈະເລີ່ມບົດຮຽນນີ້. ໃຫ້ແນ່ໃຈວ່າທ່ານໄດ້ສ້າງໄຟລ໌ ssh-key.pub ຕາມຄຳແນະນຳທີ່ໃຫ້ໄວ້ໃນ ເງື່ອນໄຂເບື້ອງຕົ້ນ ສຳລັບບົດຮຽນນີ້. ພວກເຮົາຈະໃຊ້ຄີ (key) ນີ້ໃນໄຟລ໌ການຕັ້ງຄ່າ Butane ທີ່ພວກເຮົາກຳລັງຈະຂຽນ.

ໃນບົດຮຽນນີ້, ພວກເຮົາຈະຕັ້ງຄ່າ systemd unit ໃນລະດັບຜູ້ໃຊ້ສຳລັບຜູ້ໃຊ້ທີ່ບໍ່ມີສິດພິເສດ (unprivileged user). ບາງຄັ້ງມັນກໍເປັນປະໂຫຍດທີ່ຈະເລີ່ມເຮັດວຽກ systemd unit ໃນລະດັບຜູ້ໃຊ້ໂດຍບໍ່ຈຳເປັນຕ້ອງເຂົ້າສູ່ລະບົບ. ຕົວຢ່າງ: ທ່ານອາດຈະຕ້ອງການເລີ່ມຄອນເທນເນີ (container) ທີ່ໃຫ້ບໍລິການເຄືອຂ່າຍ ຫຼື ຣັນ (run) ວຽກ HPC. ສຳລັບການຕັ້ງຄ່ານີ້, ພວກເຮົາຈະເພີ່ມສິ່ງຕໍ່ໄປນີ້ເຂົ້າໃນການຕັ້ງຄ່າ Butane:

  • systemd unit ໃນລະດັບຜູ້ໃຊ້: /home/sleeper/.config/systemd/user/linger-example.service.

  • ເປີດໃຊ້ງານມັນໃຫ້ເປັນບໍລິການ systemd ໃນລະດັບຜູ້ໃຊ້.

ການຕັ້ງຄ່າ systemd unit

ໃນຕົວຢ່າງນີ້, ພວກເຮົາຈະເລີ່ມບໍລິການ systemd ສຳລັບຜູ້ໃຊ້ sleeper. ທຳອິດ, ໃຫ້ພວກເຮົາສ້າງຜູ້ໃຊ້ຂຶ້ນມາ:

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

ສິ່ງນີ້ຈະສ້າງໄດເຣັກທໍຣີຫຼັກ (home directory) ສຳລັບຜູ້ໃຊ້ sleeper ນຳອີກ. ຈາກນັ້ນພວກເຮົາສາມາດເພີ່ມ systemd unit ເຂົ້າໄປ:

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 ສຳລັບ instance ຂອງ 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

ການທົດສອບ

ຄືກັນກັບກ່ອນໜ້ານີ້ ພວກເຮົາຈະໃຊ້ສິ່ງຕໍ່ໄປນີ້ເພື່ອບູດ (boot) instance:

# ຕັ້ງຄ່າ SELinux label ໃຫ້ຖືກຕ້ອງເພື່ອອະນຸຍາດໃຫ້ເຂົ້າເຖິງການຕັ້ງຄ່າ
chcon --verbose --type svirt_home_t user.ign

# ເລີ່ມເຄື່ອງສະເໝືອນ (virtual machine) 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"

ຈາກນັ້ນພວກເຮົາສາມາດກວດສອບໄດ້ວ່າ unit ໄດ້ຖືກເລີ່ມເຮັດວຽກພາຍໃຕ້ instance ຂອງຜູ້ໃຊ້ 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.

ການລຶບລ້າງຂໍ້ມູນ

ຈາກນັ້ນທ່ານສາມາດປິດ instance ລົງໄດ້. ທຳອິດ, ໃຫ້ຕັດການເຊື່ອມຕໍ່ຈາກ serial console ໂດຍການກົດ CTRL + ] ແລະ ຈາກນັ້ນທຳລາຍ (destroy) ເຄື່ອງ:

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

ຕອນນີ້ທ່ານສາມາດດຳເນີນການຕໍ່ໃນ ບົດຮຽນຖັດໄປ.