При установке я буду опираться на почти официальное руководство:
LXC 1.0: GUI in containers [9/10]
$ lxc launch ubuntu: chromium-container
или
$ lxc init ubuntu: chromium-container
$ lxc info chromium-container
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/
На моей тестовой системе:
Записи lxd и root добавились после установки LXD. А до установки была только одна запись на текущего пользователя.
Внутри моего контейнера на тестовой системе:
В принципе аналогично тому, что есть на 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 на демо-сервере:
На моей тестовой системе:
Внутри контейнера на моей тестовой системе:
Т.е. если 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 -
$ sudo chown -R 1000:1000 /var/lib/lxd/containers/chromium-container/rootfs/home/ubuntu
--
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
--
- [lxc-users] uid range not allowed
- Run Accelerated GUI apps in LXC containers
- Configuring Sound on Linux/Pulse Audio/Testing