Собственно сабж

За основу поста, взят этот пост. Но GUI, у меня, сразу не взлетел, как и звук. Пришлось гуглить. Как оказалось, для Arch (Manjaro), нужные немного другие настройки Х-ов. Звук в итоге тоже заработал. Подробности ниже.

Подготовка

Для начала, созданим и настроим, новый контейнер.

$ lxc launch ubuntu:x guiapps
$ lxs shell

lxc shell это алиас из перд. поста lxc alias add shell "exec @ARGS@ -- su -l ubuntu". Он подключается к выбранному контейнеру и логинится под юзером ubuntu. Это пользователь по умолчанию в Ubuntu Linux. (Заметка) Надо будет переделать этот alias чтобы можно было передавать имя пользователя.

Внутри конейнера, устанавливаем след. пакеты.

ubuntu@guiapps:~$ sudo apt update
ubuntu@guiapps:~$ sudo apt install x11-apps
ubuntu@guiapps:~$ sudo apt install mesa-utils
ubuntu@guiapps:~$ sudo apt install alsa-utils
ubuntu@guiapps:~$ sudo apt install pulseaudio
ubuntu@guiapps:~$ exit

В оригинальном посте, не было устновки pulseaudio. Но без этого пакета, у меня не работал звук. Про pulseaduio нашел в комментах к посту.

Далее нужно спроецировать ID пользователя хоста (текущего пользователя) в контейнер. Делается это, как показано ниже. Более подробная информация, есть в оригинальном посте.

$ echo "root:$UID:1" | sudo tee -a /etc/subuid /etc/subgid
$ lxc config set guiapps raw.idmap "both $UID 1000"
$ lxc restart guiapps

Настройка графики

Пробрасываем Unix-сокет X сервера, в контейнер.

$ lxc config device add guiapps X0 disk path=/tmp/.X11-unix/X0 source=/tmp/.X11-unix/X0

Update 29.06.2024
Для Wayland, нужно пробрасывать X1:

  xwayland_socket:
    bind: container
    connect: unix:@/tmp/.X11-unix/X1
    listen: unix:@/tmp/.X11-unix/X1
    security.gid: "1000"
    security.uid: "1000"
    type: proxy

Далее нужно пробросить в контейнер, файл авторизации для подключения к Х серверу (может это и не так называется). В оригинальном посте, это делается след. командой.

$ lxc config device add guiapps Xauthority disk path=/home/ubuntu/.Xauthority source=${XAUTHORITY}

Но у меня это не заработало - контейнер не мог подключиться к X серверу, хоста. Ругался на протокол. На помощь пришел гугол: reddit, stackoverflow, arch.wiki. В итоге мне помогло следущее.

$ XAUTH=/tmp/guiapps_xauth
$ xauth nextract - "$DISPLAY" | sed -e 's/^..../ffff/' | xauth -f "$XAUTH" nmerge -
$ lxc config device add guiapps Xauthority disk path=/home/ubuntu/.Xauthority source=${XAUTH}

Update 29.06.2024
Для Wayland, проброс печенек-авторизации, заработал только с shift=true:

  Xauthority:
    path: /home/ubuntu/.Xauthority
    shift: "true"
    source: /tmp/guiaps_xauth
    type: disk

Update 08.01.2025
Откатился обратно на ядро 5.15 и контейнер перестал запускаться с такой вот ошибкой: idmapping abilities are required but aren't supported on system.
Как выяснилось, все дело в поддержки shiftfs ядром.
Решение ишибки заключалось в комментировании shift: "true" в настройках контейнера:

sudo lxc config edit guiaps
  Xauthority:
    path: /home/ubuntu/.Xauthority
#    shift: "true"
    source: /tmp/guiaps_xauth
    type: disk

Далее включаем аппаратное ускорение графики в контейнере.

$ lxc config device add guiapps mygpu gpu
$ lxc config device set guiapps mygpu uid 1000
$ lxc config device set guiapps mygpu gid 1000

Задаем экран и пробуем.

$ echo $DISPLAY
:0
$ lxc shell
ubuntu@guiapps:~$ echo "export DISPLAY=:0" >> ~/.profile 
ubuntu@guiapps:~$ source .profile
ubuntu@guiapps:~$ xclock

Должны появиться часики.
xclock

glxgears у меня тоже заработали. Показывали 60 fps.
glxgears

Звук

Для работы звука, на хосте нужно разрешить доступ по сети, к локальным устройствам. Делается это, через установку paprefs, далее вкладка Network Server / [x] Enable network access to local sound devices.

$ sudo apt install paprefs
$ paprefs

paprefs

Далее нужно в контейнере указать адрес сервера PulseAduio и пробросить куки для него.

$ lxc shell
ubuntu@guiapps:~$ echo export PULSE_SERVER="tcp:`ip route show 0/0 | awk '{print $3}'`" >> ~/.profile
ubuntu@guiapps:~$ mkdir -p ~/.config/pulse/
ubuntu@guiapps:~$ echo export PULSE_COOKIE=/home/ubuntu/.config/pulse/cookie >> ~/.profile
ubuntu@guiapps:~$ exit
$ lxc config device add guiapps PACookie disk path=/home/ubuntu/.config/pulse/cookie source=/home/${USER}/.config/pulse/cookie

Уточнение. На хосте, надо открыть порт 4713/tcp для PulseAudio.

Пробуем звук.

$ lxc shell
ubuntu@pulseaudio:~$ speaker-test -Dpulse -c6 -twav

P.S. Если что-то не заработало, можно попробовать перезапустить контейнер.

$ lxc restart guiapps

P.P.S. Еще одна статья, от автора оригинального поста. В этом посту, автор использует профили, для более быстрой настройки контейнера.

Update 07.01.2025

Подключение образа диска (CD).

Для установки некоторых игр, нужно монтировать образ диска. В linux для этого есть отличная утилита - cdemu.

Но есть проблема с использованием этой утилиты внутри LXC. Точно не помню уже, но связана она кажется с разрешениями на подключения loop-девайсов или других устройств, внутри контейнера.

Так вот, для решения этой проблемы, образ можно подгрузить на хосте:

cdemu load 0 path/to/img

Далее нужно пробросить образ в контейнер:

sudo lxc config device add guiaps cdrom disk readonly=true path=/mnt/cdrom source=/dev/sr0

После этой команды, образ будет доступен внутри контейнера: /mnt/cdrom.

Выгрузить образ, можно командой:

cdemu unload 0

Главное не забыть, отключить образ от контейнера, чтобы он потом не ругался при запуске:

sudo lxc config device remove guiaps cdrom

Посмотреть список загруженных образов - cdemu status.

Если образ больше не нужен, то его нужно отключить от контейнера, иначе контейнер