Incus 容器运行图形程序

项目配置 #

# incus project set user-1000 restricted.devices.proxy=allow
# incus project set user-1000 restricted.devices.disk.paths=/home/king,/run/user/1000

基础配置 #

$ incus profile create debian13
$ incus profile edit debian13
config:
  boot.autostart: "false"
devices:
  eth0:
    name: eth0
    network: incusbr-1000
    type: nic
  root:
    path: /
    pool: default
    type: disk
  gpu:
    type: gpu
  wayland-socket:
    connect: unix:/run/user/1000/wayland-1
    listen: unix:/mnt/wayland-1
    type: proxy
    bind: instance
    mode: "0700"
    uid: "1000"
    gid: "1000"
    security.gid: "1000"
    security.uid: "1000"
  pipewire-0:
    connect: unix:/run/user/1000/pipewire-0
    listen: unix:/mnt/pipewire-0
    type: proxy
    bind: instance
    mode: "0700"
    uid: "1000"
    gid: "1000"
    security.gid: "1000"
    security.uid: "1000"
  pulse-native:
    connect: unix:/run/user/1000/pulse/native
    listen: unix:/mnt/pulse-native
    type: proxy
    bind: instance
    mode: "0700"
    uid: "1000"
    gid: "1000"
    security.gid: "1000"
    security.uid: "1000"

创建容器:

$ incus launch images:debian/13 my-debian13 -p debian13

容器内配置:

$ incus exec my-debian13 -- bash

[创建用户]
root@my-debian13:/# useradd -m -s /usr/bin/bash -u 1000 king

[配置时区]
root@my-debian13:/# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

[环境变量]
root@my-debian13:/# cat << EOF | tee /root/.bash_profile /home/king/.bash_profile
export WAYLAND_DISPLAY=wayland-1
export PIPEWIRE_REMOTE=unix:/mnt/pipewire-0
export PULSE_SERVER=unix:/mnt/pulse-native
if [[ -e /mnt/wayland-1 && ! -e /run/user/\$(id -u)/wayland-1 ]]; then
    ln -sf /mnt/wayland-1 /run/user/\$(id -u)/
fi
EOF

[配置软件源]
root@my-debian13:/# cat << EOF > /etc/apt/sources.list.d/debian.sources
Types: deb
URIs: http://mirrors4.tuna.tsinghua.edu.cn/debian
Suites: trixie trixie-updates trixie-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb
URIs: http://mirrors4.tuna.tsinghua.edu.cn/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF

[更新并安装应用]
root@my-debian13:/# apt update
root@my-debian13:/# apt install pciutils mesa-utils pipewire-audio fonts-dejavu fonts-wqy-microhei
root@my-debian13:/# apt install firefox-esr foot

测试:

$ incus restart my-debian13
$ incus exec my-debian13 -- su - root -c firefox
$ incus exec my-debian13 -- su - king -c firefox

使用 cloud-init #

$ incus profile create debian13-cloud
$ incus profile edit debian13-cloud
config:
  cloud-init.vendor-data: |
    #cloud-config
    users:
      - name: king
        uid: 1000
        shell: /usr/bin/bash
    timezone: Asia/Shanghai
    write_files:
      - path: /etc/profile.d/gui-init.sh
        permissions: '0755'
        content: |
          export WAYLAND_DISPLAY=wayland-1
          export PIPEWIRE_REMOTE=unix:/mnt/pipewire-0
          export PULSE_SERVER=unix:/mnt/pulse-native
          if [[ -e /mnt/wayland-1 && ! -e /run/user/$(id -u)/wayland-1 ]]; then
              ln -sf /mnt/wayland-1 /run/user/$(id -u)/
          fi
      - path: /etc/apt/sources.list.d/debian.sources
        permissions: '0644'
        content: |
          URIs: http://mirrors4.tuna.tsinghua.edu.cn/debian
          Suites: trixie trixie-updates trixie-backports
          Components: main contrib non-free non-free-firmware
          Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
          Types: deb
          URIs: http://mirrors4.tuna.tsinghua.edu.cn/debian-security
          Suites: trixie-security
          Components: main contrib non-free non-free-firmware
          Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
    runcmd:
      - apt update
      - apt install -y pciutils mesa-utils pipewire-audio fonts-dejavu fonts-wqy-microhei firefox-esr foot

创建容器:

$ incus launch images:debian/13/cloud my-debian13-cloud -p debian13 -p debian13-cloud

查看 cloud-init 日志:

$ incus exec my-debian13-cloud -- tail -f /var/log/cloud-init-output.log

查看 cloud-init 运行状态:

$ incus exec my-debian13-cloud -- cloud-init status --long
status: done
extended_status: done
boot_status_code: enabled-by-generator
last_update: Thu, 01 Jan 1970 00:00:46 +0000
detail: DataSourceNoCloud [seed=/var/lib/cloud/seed/nocloud-net]
errors: []
recoverable_errors: {}

测试:

$ incus restart my-debian13-cloud
$ incus exec my-debian13-cloud -- su - root -c firefox
$ incus exec my-debian13-cloud -- su - king -c firefox