Problema ao configurar um contêiner LXC de espaço do usuário

6

Várias noites, eu já tentei fazer com que uma instalação do LXC trabalhasse com contêineres de espaço do usuário. Como vai ser um novo servidor, eu não me importo (ainda) muito com distribuição e lançamento, então eu tentei o Debian 7 + 8 e o Ubuntu 14.04 e 15.04 como host e o Ubuntu 15.04 e o Debian 8 como guest. Todos eles têm seus problemas. O resumo:

Debian 7.8 : lxc-create: Este comando deve ser executado como root (ambos convidados)

Debian 8.0 : lxc-create: Operação não permitida (ambos convidados)

Ubuntu 14.04 com Ubuntu 15.04 guest : lxc-start: chamada para cgmanager_create_sync falhou: pedido inválido / O contêiner falhou ao iniciar.

Ubuntu 14.04 com o Debian 8 guest : lxc-create: ERRO: Não foi possível encontrar uma imagem correspondente.

Ubuntu 15.04 : lxc-start: chamada para cgmanager_move_pid_sync falha: pedido inválido / O contêiner falhou ao iniciar. (ambos convidados)

Eu segui o tutorial link e link , e eles não parecem ser tão complicados.

Eu escrevi um script para tornar o teste reproduzível (para ser executado como root em um live cd recém-inicializado). Alguém pode me dizer o que há de errado com isso?

#!/bin/sh


# need to be run as root

set -x

echo "==== SYSTEM INFO & INSTALL ===="

lsb_release -a

uname -a

apt-get update
apt-get install -y lxc
apt-get clean

lxc-checkconfig
ifconfig
brctl show

adduser testuser

cat /etc/subuid /etc/subgid

cat >/etc/lxc/lxc-usernet <<.e
# USERNAME TYPE BRIDGE COUNT
testuser veth lxcbr0 2
.e

sudo -u testuser -i mkdir -p .config/lxc

sudo -u testuser -i tee .config/lxc/default.conf <<.e
lxc.id_map = u 0 $(grep testuser /etc/subuid | cut -d: -f2) 65536
lxc.id_map = g 0 $(grep testuser /etc/subgid | cut -d: -f2) 65536

lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx
.e
cat /home/testuser/.config/lxc/default.conf

echo "==== TEST UBUNTU VIVID GUEST ===="

sudo -u testuser -i lxc-create -t download -n vivid1 -- -d ubuntu -r utopic -a amd64
#You just created an Ubuntu container (release=trusty, arch=amd64, variant=default)

#sudo -u testuser -i lxc-start -n vivid1 -d
#read press_enter_key_when_quit

if [ $? -eq 0 ]; then
  rm /tmp/log
  sudo -u testuser -i lxc-start -n vivid1 -l debug --logfile /tmp/log
  cat /tmp/log
fi

echo "==== TEST DEBIAN JESSIE GUEST ===="

sudo -u testuser -i lxc-create -t download -n jessie1 -- -d debian -r jessie -a amd64
#You just created an Ubuntu container (release=trusty, arch=amd64, variant=default)

#sudo -u testuser -i lxc-start -n jessie1 -d
#read press_enter_key_when_quit

if [ $? -eq 0 ]; then
  rm /tmp/log
  sudo -u testuser -i lxc-start -n jessie1 -l debug --logfile /tmp/log
  cat /tmp/log
fi

echo "==== END OF SCRIPT ===="

No pastebin, postei a saída do console de todas essas máquinas:

Atualizar

Eu tentei mais com o Ubuntu 15.04 como host. Eu encontrei o link do relatório de erros que tem um problema semelhante, mas não o mesmo. Mas o journalctl revelou problemas com o cgmanager:

May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/blkio/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/cpu/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/cpuset/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/devices/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/freezer/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/hugetlb/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/memory/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/net_cls/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/perf_event/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/none,name=systemd/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/blkio/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/blkio/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/cpu/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/cpu/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/cpuset/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/cpuset/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/devices/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/devices/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/freezer/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/freezer/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/hugetlb/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/hugetlb/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/memory/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/memory/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/net_cls/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/net_cls/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/perf_event/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/perf_event/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/none,name=systemd/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/none,name=systemd/user.slice/user-999.slice/session-c1.scope/lxc/jessie1

Atualização 2

Eu tentei mais: eu instalei o Ubuntu confiável e vívido em duas máquinas virtuais e instalei todas as atualizações nelas. Então eu testei ambos uma vez com o pacote lxc original e uma vez com os do ppa diário lxc. O resultado é sempre o mesmo erro mostrado acima.

    
por Daniel Alder 14.05.2015 / 22:35

1 resposta

6

Eureka! Ainda não terminei, mas consegui pela primeira vez iniciar um contêiner. Há algumas coisas que deram errado e descobri que há muitas pessoas com problemas semelhantes. Aqui está um pequeno guia de solução de problemas:

Distribuição / Repositórios

Por causa do feedback mais positivo, decidi começar com um sistema Debian Ubuntu 14.04 debootstrapped. Isso significa que o sistema original não é maior que apenas alguns 100M e não contém muitos pacotes. Eu usei atualizações e fontes de pacotes de segurança e o lpa diário do ppa. Aqui está meu /etc/apt/sources.list:

deb http://de.archive.ubuntu.com/ubuntu trusty main
deb http://de.archive.ubuntu.com/ubuntu trusty-updates main
deb http://security.ubuntu.com/ubuntu trusty-security main

deb http://ppa.launchpad.net/ubuntu-lxc/daily/ubuntu trusty main 

Instalação

Em muitos tutoriais, fóruns e relatórios de bugs, encontrei listas de pacotes que precisam ser instalados. Eu não tenho certeza ainda quais desses são importantes, mas aqui está a lista do que eu finalmente instalei (a partir de um sistema 14.04 debootstrapped):

apt-get install bridge-utils cgmanager cloud-image-utils debootstrap distro-info \
  distro-info-data euca2ools fuse libaio1 libapparmor1 libcap2 liblxc1 \
  libpam-systemd librados2 libseccomp2 libselinux1 libselinux1 lxc python3-lxc \
  python-distro-info

Novamente: esta lista provavelmente é mais longa que o necessário. Aqui está o que é realmente importante:

  • libpam-systemd: esta biblioteca é importante para as permissões corretas do cgroup. Não vi nenhuma mensagem de erro, mas sem ela o arquivo /proc/self/cgroup parecia com 8:blkio:/ etc. em vez de 8:hugetlb:/user/1000.user/1.session
  • fuse: Eu li que é importante para o lxcfs (eu diria que é um bug que o pacote lxcfs não depende dele)
  • lxc: o pacote mais importante e o suficiente se você usar somente contêineres sem privilégios
  • cgmanager: Ainda estou aprendendo sobre sua função. Btw: o PPA lxc atualmente fornece ambos os pacotes cgmanager-utils (0.27) e cgmanager (0.30). O cgmanager está em conflito com o cgmanager-utils (& lt; & lt; 0.30-1), o que significa que os dois pacotes do mesmo repositório não são compatíveis (possivelmente um erro ). Eu escolhi o cgmanager.

Configuração

Eu tentei muitas dicas de todos os lugares, então ainda não sei o que é importante. Mas aproximadamente eu apenas corri o script da questão. Aproximadamente, é sobre esses arquivos:

  • / etc / subuid
  • / etc / subgid
  • / etc / lxc / lxc-usernet
  • ~ / .config / lxc / default.conf

A única coisa adicional que fiz foi a seguinte, porque encontrei a linha em muitos tópicos:

chmod +x /home/testuser/.local/share

Login como usuário

Agora, a coisa mais importante que eu ainda não entendi, mas que arruinou todas as minhas experiências de base de script: Não faça login usando su ou sudo!

Eu demonstro:

root@1404-lxc-test:~# tail -1 /proc/self/cgroup
2:blkio:/user/0.user/1.session
# this is expected. I am root.

root@1404-lxc-test:~# sudo -u testuser -i tail -1 /proc/self/cgroup
2:blkio:/user/0.user/1.session
# here I used sudo to switch user

root@1404-lxc-test:~# su - testuser
testuser@1404-lxc-test:~$ tail -1 /proc/self/cgroup
2:blkio:/user/0.user/1.session
# at least here I expected the correct settings

testuser@1404-lxc-test:~$ exit
root@1404-lxc-test:~# exit

$ ssh testuser@1404-lxc-test
testuser@1404-lxc-test's password: 
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-53-generic x86_64)

testuser@1404-lxc-test:~$ tail -1 /proc/self/cgroup
2:blkio:/user/1000.user/2.session
# now it's correct

Eu ainda não sei o motivo, mas ele deve estar conectado com a libpam-systemd. Obviamente, su e sudo ignoram o PAM

E, finalmente, não esqueça de usar os comandos lxc-xxx quando estiver logado como usuário. Eles falharão se você fizer isso como raiz (porque os contêineres de espaço do usuário são armazenados em .local/share/lxc/ em vez de /var/lib/lxc/

Solução de problemas

Esses comandos foram muito úteis para mim:

  • journalctl (em lançamentos baseados em upstart): Revelou problemas com o cgmanager
  • /proc/self/cgroup
  • lxc-start usando opções -l debug --logfile logfilename.txt

Deixe-me saber o que mais é importante. Eu acho que a comunidade precisa disso.

Créditos

Graças aos seguintes tutoriais:

E para esses relatórios de bugs e tópicos do fórum:

Aviso de isenção

Eu escrevi este texto após o primeiro teste bem-sucedido. Mas eu fiz tantas coisas que algumas dessas etapas provavelmente não são necessárias. Vou verificar novamente tudo em um novo sistema em breve.

Atualizar

Todos os itens acima foram feitos com o Ubuntu Trust 14.04 LTS. Agora, acabei de testar o Ubuntu astuto. Até agora eu posso dizer:

  • Tudo o que você precisa instalar em cima de um sistema básico de bootstrap: apt-get install lxc bridge-utils
  • Nenhum espelhamento externo é necessário. Use o lxc fornecido pelo Ubuntu
  • Eu não toquei mais do que os arquivos a seguir no meu novo sistema: /etc/subuid , /etc/subgid , /etc/lxc/lxc-usernet , além disso, criei um usuário e preenchai sua página inicial
  • Conclusão: muito mais fácil, muito mais estável. Para mim é o primeiro lançamento que realmente funciona.

(Wily agora está em versão beta e será lançado em 22 de outubro de 2015)

    
por Daniel Alder 01.09.2015 / 22:30

Tags