Запускаем GUI приложения в LXC, еще и со звуком
Собственно сабж
За основу поста, взят этот пост. Но 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
Должны появиться часики.
glxgears
у меня тоже заработали. Показывали 60 fps.
Звук
Для работы звука, на хосте нужно разрешить доступ по сети, к локальным устройствам.
Делается это, через установку paprefs
, далее вкладка Network Server / [x] Enable network
access to local sound devices
.
$ sudo apt install 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
.
Если образ больше не нужен, то его нужно отключить от контейнера, иначе контейнер