LXD / LXC + Xpra
Сабж
Узрел на одном сайте в интернете, и еще на
одном,
что делиться Х-ами, как это сделано в одном из постов,
не очень безопасно. Все потому, что любое приложение может делать снимки экрана / запись,
без твоего ведому...
Наверно на Waylend такого нет,
а на виндах ваших и подавно. Но я не проверял.
Xpra
Собственно для этого, Илон Маск и придумал Xpra.
On X11, it is also known as screen for X11: it allows you to run programs,
usually on a remote host, direct their display to your local machine, and then
to disconnect from these programs and reconnect from the same or another
machine, without losing any state.
Почти
Подключиться к Xpra
можно по ssh
,tcp
,unix socket
и наверно еще
как-то. В этом посте будет про подключение по unix socket
. У меня получалось
подключаться по всем вышеуказанным способам, кроме “еще как-то”. Но так как
lxc-контейнер, будет запущен на локальной машине, то unix socket
должен быть
самым быстрым (замеры не замерял).
Пишут, что Xpra
умеет еще и звук передавать. Но у меня не получилось
настроить. Для звука, буду использовать PulseAudio
.
Для подключения по unix socket
, нужно этот сокет пробросить из контейнера на
хост. Т.к. unix socket
это файл,
то достаточно этот файл сделать общим между контейнером и хостом.
Про настройку шары (общей директории) и PulseAudio
есть в пред.
постах[1][2].
Погнали
Запускаем контейнер и ставим в нем Xpra
(тянет за собой много
зависимостей).
$ lxc start c1
$ lxc shell c1
ubuntu@c1:~$ sudo apt-get install xpra xterm mesa-utils
xterm
и mesa-utils
пригодятся позже.
Запускаем Xpra
с трансляцией / соединением через unix socket
, с указанием
где создавать сокет. В нашем случаем, создаем сокет в шаре (общей директории).
ubuntu@c1:~$ xpra start --start=xterm --socket-dir=/home/ubuntu/share/
Так же пожно запустить, как показано ниже. Тогда при закрытии xterm
, Xpra
сама закроет сессию.
ubuntu@c1:~$ xpra start --exit-with-children --start=child=xterm --socket-dir=/home/ubuntu/share/
Посмотреть список запущенных сессий, можно командой xpra list
. Для остановки
сесий, есть команда stop <session>
. xpra stop
останавливает все сессии.
Далее, на хосте, выполняем команду.
$ cd container_shared_dir
$ xpra attach socket:c1-0
Где container_shared_dir
- общая директория (шара), а c1-0
- созданный
сокет (с1 - имя хоста контейнера, 0 - номер экрана). Имя сокета может быть другим.
Должно появится окно инициализаци Xpra client
, а следом окно xterm
контейнера. Для тестов, запускал glxgears
и смотрел видео на mpv
. Все
работало нормально, без тормозов. Игры не пробовал.
P.S. XRDP
Нашел интересный
пост на
редите,
про вариант с xrdp
. Пробовать не стал. Смысл здесь в том, что в контейнер
ставится легкое окружение рабочего стола (Desktop Environment) LXDE / LXQT, а далее:
$ sudo apt install xrdp
$ sudo apt install xorgxrdp
$ sudo apt install xrdp-pulseaudio-installer
Заинтересовал пакет xrdp-pulseaudio-installer
. Т.е. звук тоже должен быть.
По началу думал что даже легкий DE, будет большим, но сам пакет xpra
тянет за
собой кучу зависимостей. Так что теперь вариант с DE мне видится нормальным.