在引导时启动用户级系统单元

确保您已完成中描述的步骤 初始设置页面 在开始本教程之前。

在本教程中,我们将为非特权用户设置一个用户级别的系统单元。在某些情况下,启动用户级 系统D单位 而无需登录。例如,您可能希望启动提供网络服务的容器或运行HPC作业。对于此设置,我们将向Butane配置添加以下内容:

  • 一种用户级SYSTEM D单元: /home/sleeper/.config/systemd/user/linger-example.service

  • 将其启用为用户级别的系统D服务。

设置系统D单元

在本例中,我们将为用户启动一个系统服务 sleeper 。首先,让我们创建一个用户:

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

这还将为 sleeper 用户。然后,我们可以添加system d单位:

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

可以在Butane配置中直接启用系统服务,但目前必须手动启用用户级服务:

variant: fcos
version: 1.4.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

最后,我们为system d用户级实例设置了Lending,这样它就可以在引导时直接启动并保持运行:

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

写入Butane配置并转换为Ignition

最终的Butane配置,存储在 user.bu ,将是:

variant: fcos
version: 1.4.0
passwd:
  users:
    - name: core
      ssh_authorized_keys:
        - ssh-rsa ...
    - name: sleeper
storage:
  directories:
    - path: /home/sleeper/.config/systemd/user/default.target.wants
      mode: 0744
      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: 0755
      contents:
        inline: |
          [Unit]
          Description=A systemd user unit demo
          After=network-online.target
          Wants=network-online.target
          [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 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

然后,我们可以验证该单元是否已在休眠系统d用户实例下启动:

$ ssh core@192.168.x.y
[core@localhost ~]$ sudo machinectl shell sleeper@
[sleeper@localhost ~]$ systemctl --user status
● localhost
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: Sat 2021-02-20 11:11:53 UTC; 57s ago
   CGroup: /user.slice/user-1001.slice/user@1001.service
           ├─init.scope
           │ ├─2110 /usr/lib/systemd/systemd --user
           │ └─2112 (sd-pam)
           └─linger-example.service
             └─2119 /usr/bin/sleep infinity
[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; vendor preset: disabled)
     Active: active (running) since Sat 2021-02-20 11:11:53 UTC; 1min 5s ago
   Main PID: 2119 (sleep)
     CGroup: /user.slice/user-1001.slice/user@1001.service/linger-example.service
             └─2119 /usr/bin/sleep infinity

Feb 20 11:11:53 localhost systemd[2110]: Started A systemd user unit demo.

清理

然后,您可以删除该实例。首先,通过按断开与串行控制台的连接 CTRL + ] 然后摧毁机器:

病毒摧毁fcos 未定义病毒—​删除所有存储fcos

您现在可以继续进行 下一教程