Как запустить Chromium в LXD контейнере

При установке я буду опираться на почти официальное руководство:
LXC 1.0: GUI in containers [9/10]

Создание контейнера

$ lxc image info ubuntu:

$ lxc launch ubuntu: chromium-container
или
$ lxc init ubuntu: chromium-container

$ lxc info chromium-container

UID mappings

Про отображение идентификаторов:

UID MAPPINGS
A container can be started in a private user namespace with user and group id mappings. For instance, you can map userid 0 in the container to userid 200000 on the host. The root user in the container will be privileged in the container, but unprivileged on the host. Normally a system container will want a range of ids, so you would map, for instance, user and group ids 0 through 20,000 in the container to the ids 200,000 through 220,000.
lxc.id_map
    Four values must be provided. First a character, either 'u', or 'g', to specify whether user or group ids are being mapped. Next is the first userid as seen in the user namespace of the container. Next is the userid as seen on the host. Finally, a range indicating the number of consecutive ids to map.

источник


На Ubuntu пользователь с UID=1000 создаётся во время установки и имеет административный (sudo) доступ:
cat /etc/passwd|grep 1000

Обычно Linux начинает создавать обычных пользователей начиная с UID 1000.


Сначала посмотрим на файлы /etc/subuid и /etc/subgid
Можно почитать про формат файла subuid.

https://linuxcontainers.org/ru/lxd/try-it/

root@tryit-funny:~# cat /etc/subuid                                                                                                                              
lxd:100000:65536                                                                                                                                                 
root:100000:65536                                                                                                                                                
ubuntu:165536:65536                                                                                                                                              
real:231072:65536                                                                                                                                                
root@tryit-funny:~# cat /etc/subgid                                                                                                                              
lxd:100000:65536                                                                                                                                                 
root:100000:65536                                                                                                                                                
ubuntu:165536:65536                                                                                                                                              
real:231072:65536                                                                                                                                                

На моей тестовой системе:

$ cat /etc/subuid
devtype:100000:65536
lxd:165536:65536
root:165536:65536
$ cat /etc/subgid
devtype:100000:65536
lxd:165536:65536
root:165536:65536

Записи lxd и root добавились после установки LXD. А до установки была только одна запись на текущего пользователя.

Внутри моего контейнера на тестовой системе:

$ lxc exec chromium-container -- /bin/bash
root@chromium-container:~# cat /etc/subuid
lxd:100000:65536
root:100000:65536
ubuntu:165536:65536
root@chromium-container:~# cat /etc/subgid
lxd:100000:65536
root:100000:65536
ubuntu:165536:65536

В принципе аналогично тому, что есть на demo-версии.

Если посмотреть /var/log/lxd/chromium-container/lxc.conf на моей тестовой системе то там можно увидеть:

lxc.id_map = u 0 165536 65536
lxc.id_map = g 0 165536 65536


Что соответствует файлам /etc/subuid и /etc/subgid на моей тестовой системе.


Посмотрим еще вывод id на демо-сервере:
root@tryit-oriented:~# id                                                                                                                                        
uid=0(root) gid=0(root) groups=0(root)                                                                                                                           

На моей тестовой системе:
uid=1000(devtype) gid=130(lxd) groups=130(lxd),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare),1000(devtype)

Внутри контейнера на моей тестовой системе:
root@chromium-container:~# id
uid=0(root) gid=0(root) groups=0(root)


Т.е. если Stéphane Graber меняет это:

lxc.id_map = u 0 100000 65536
lxc.id_map = g 0 100000 65536


на это:

lxc.id_map = u 0 100000 1000
lxc.id_map = g 0 100000 1000
lxc.id_map = u 1000 1000 1
lxc.id_map = g 1000 1000 1
lxc.id_map = u 1001 101001 64535
lxc.id_map = g 1001 101001 64535


То по аналогии мне для моего контейнера нужно вот это:

lxc.id_map = u 0 165536 1000
lxc.id_map = g 0 165536 1000
lxc.id_map = u 1000 1000 1
lxc.id_map = g 1000 1000 1
lxc.id_map = u 1001 166537 64535
lxc.id_map = g 1001 166537 64535

Полезно знать:
The first blank line should clear any map that was already set (in this case by LXD itself).

Можно было бы загнать этот конфиг в какой-нибудь файл, например, input, а далее сделать так:
cat input | lxc config set container-name raw.lxc -
Но есть способ лучше:
$ lxc config set chromium-container raw.idmap 'both 1000 1000'
$ lxc config show chromium-container

Про опцию both смотрите тут: https://github.com/lxc/lxd/blob/master/doc/userns-idmap.md
Если интересны еще всякие другие конфигурации: https://github.com/lxc/lxd/blob/master/doc/configuration.md

И еще вот что:
On standard Ubuntu hosts, the uid of the first user is 1000. Now, we need to allow LXD to remap to remap this id; you’ll need an additional entry for root to do this:
$ echo 'root:1000:1' | sudo tee -a /etc/subuid /etc/subgid


Монтирование девайсов


$ nano input

lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir


$ cat input | lxc config set chromium-container raw.lxc -

Установка браузера Chromium внутри контейнера

lxc start chromium-container
lxc exec chromium-container -- umount /tmp/.X11-unix
lxc exec chromium-container -- apt-get update
lxc exec chromium-container -- apt-get dist-upgrade -y
lxc exec chromium-container -- apt-get install wget ubuntu-artwork dmz-cursor-theme ca-certificates pulseaudio -y
lxc exec chromium-container -- apt-get install chromium-browser
lxc exec chromium-container -- apt-get -f install -y
lxc exec chromium-container -- sudo -u ubuntu mkdir -p /home/ubuntu/.pulse/
echo "disable-shm=yes" | lxc exec chromium-container -- sudo -u ubuntu tee /home/ubuntu/.pulse/client.conf
lxc stop chromium-container

$ sudo chown -R 1000:1000 /var/lib/lxd/containers/chromium-container/rootfs/home/ubuntu

Запуск браузера Chromium из контейнера


lxc exec --env DISPLAY=$DISPLAY chromium-container -- sudo -u ubuntu -i chromium-browser




--