사용자 컨테이너를 시작하지 못했습니다. 이유를 찾는 방법은 무엇입니까?

사용자 컨테이너를 시작하지 못했습니다. 이유를 찾는 방법은 무엇입니까?

다음 명령줄을 사용하여 Ubuntu 14.04에서 사용자(권한 없는) LXC 컨테이너를 생성하는 경우:

lxc-create -n test1 -t download -- -d $(lsb_release -si|tr 'A-Z' 'a-z') -r $(lsb_release -sc) -a $(dpkg --print-architecture)

그리고 (생성된 구성 파일을 건드리지 않고) 다음을 사용하여 시작해보세요.

lxc-start -n test1 -l DEBUG

실패합니다. 로그 파일에는 다음이 표시됩니다.

lxc-start 1420149317.700 INFO     lxc_start_ui - using rcfile /home/user/.local/share/lxc/test1/config
lxc-start 1420149317.700 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type u nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type g nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 WARN     lxc_log - lxc_log_init called with log already initialized
lxc-start 1420149317.701 INFO     lxc_lsm - LSM security driver AppArmor
lxc-start 1420149317.701 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/2' (5/6)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/7' (7/8)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/8' (9/10)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/10' (11/12)
lxc-start 1420149317.702 INFO     lxc_conf - tty's configured
lxc-start 1420149317.702 DEBUG    lxc_start - sigchild handler set
lxc-start 1420149317.702 DEBUG    lxc_console - opening /dev/tty for console peer
lxc-start 1420149317.702 DEBUG    lxc_console - using '/dev/tty' as console
lxc-start 1420149317.702 DEBUG    lxc_console - 14946 got SIGWINCH fd 17
lxc-start 1420149317.702 DEBUG    lxc_console - set winsz dstfd:14 cols:118 rows:61
lxc-start 1420149317.905 INFO     lxc_start - 'test1' is initialized
lxc-start 1420149317.906 DEBUG    lxc_start - Not dropping cap_sys_boot or watching utmp
lxc-start 1420149317.906 INFO     lxc_start - Cloning a new user namespace
lxc-start 1420149317.906 INFO     lxc_cgroup - cgroup driver cgmanager initing for test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - call to cgmanager_create_sync failed: invalid request
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Failed to create hugetlb:test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Error creating cgroup hugetlb:test1
lxc-start 1420149317.907 INFO     lxc_cgmanager - cgroup removal attempt: hugetlb:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: perf_event:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: blkio:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: freezer:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: devices:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: memory:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpuacct:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpu:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: cpuset:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: name=systemd:test1 did not exist
lxc-start 1420149317.910 ERROR    lxc_start - failed creating cgroups
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start - failed to spawn 'test1'
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start_ui - The container failed to start.
lxc-start 1420149317.910 ERROR    lxc_start_ui - Additional information can be obtained by setting the --logfile and --logpriority options.

이제 여기에 두 가지 오류가 표시됩니다. 후자는 아마도 전자의 결과일 것입니다.

lxc_start - cgroup을 생성하지 못했습니다.

그러나 나는 /sys/fs/cgroup그것이 설치되어 있음을 봅니다.

$ mount|grep cgr
none on /sys/fs/cgroup type tmpfs (rw)

그리고 cgmanager다음을 설치하세요:

$ dpkg -l|awk '$1 ~ /^ii$/ && /cgmanager/ {print $2 " " $3 " " $4}'
cgmanager 0.24-0ubuntu7 amd64
libcgmanager0:amd64 0.24-0ubuntu7 amd64

참고: 내 호스트는 여전히 기본적으로 upstart.

질문이 있는 경우 커널 지원 cgroups:

$ grep CGROUP /boot/config-$(uname -r)
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=m
CONFIG_NETPRIO_CGROUP=m

참고: 내 호스트는 여전히 기본적으로 upstart.

답변1

놀랍게도 이것이 우분투만의 특징이라는 것이 밝혀졌습니다.


이유

문제: 커널이 cgroups활성화되어(를 사용하여 확인 grep CGROUP /boot/config-$(uname -r)) cgmanager실행 중이지만 내 사용자에게 특정한 cgroup이 없습니다. 다음을 통해 확인할 수 있습니다:

$ 고양이/proc/self/cgroup
11: 거대하다:/
10: 공연 이벤트: /
9:BLKIO://
8: 냉동고: /
7:장치:/
6: 메모리:/
5: CPUAcct://
4:CPU:/
3: 이름=시스템:/
2:CPU 그룹:/

모든 관련 줄에 UID가 제공되면 괜찮지만 cgroup이 정의되지 않은 경우 각 줄의 두 번째 콜론 뒤에 슬래시가 표시됩니다.

내 질문은 권한이 없는 컨테이너를 시작하는 것과 관련이 있습니다. 권한 있는 컨테이너를 시작할 수 있습니다.

내 문제는 다음과 관련이 있는 것으로 나타났습니다.lxc-users메일링 리스트에 있는 이 주제.

치료

이는 Ubuntu 14.04의 upstart기본값 이며 가 아닙니다 systemd. 따라서 systemdUbuntu 기반 배포판에 설치되는 일부 구성 요소는 기본적으로 설치되지 않습니다.

이 외에도 cgmanager내 질문에 표시된 오류를 해결하려면 두 개의 패키지를 설치해야 했습니다: cgroup-binlibpam-systemd. 솔직히 전자가 꼭 필요한지 100% 확신할 수는 없으므로 생략하고 여기에 의견을 남겨도 됩니다.

패키지를 설치하고 재부팅하면 id -u출력에 UID( , 여기서는 1000)가 표시됩니다.

$ 고양이/proc/self/cgroup
11:hugetlb:/user/1000.user/1.session
10:perf_event:/user/1000.user/1.session
9:blkio:/user/1000.user/1.session
8: 냉동고:/user/1000.user/1.session
7: 장치:/user/1000.user/1.session
6: 메모리:/user/1000.user/1.session
5:cpuacct:/user/1000.user/1.session
4:cpu:/user/1000.user/1.session
3: 이름=systemd:/user/1000.user/1.session
2: CPU 세트:/user/1000.user/1.session

이후 게스트 컨테이너를 시작하려고 할 때 오류가 발생합니다(간단하게 정리됨).

lxc-start 1420160065.383 정보 lxc_cgroup - test1에 대한 cgroup 드라이버 cgmanager 초기화 중
lxc-start 1420160065.419 오류 lxc_start - 구성된 네트워크를 생성할 수 없습니다.
lxc-start 1420160065.446 오류 lxc_start - 'test1'을 생성할 수 없습니다.
lxc-start 1420160065.451 오류 lxc_start_ui - 컨테이너 시작에 실패했습니다.

아직 성공하지는 못했지만 성공에 한걸음 더 가까워졌습니다.

위에 링크된 lxc-users스레드에서는 , 및 /etc/systemd/logind.conf3개의 컨트롤러가 언급되지 않았음을 지적합니다 . 나에게는 마지막 하나만 빠졌습니다. 단, 로그인 세션이 생성되면 변경 사항이 적용되므로 변경 후 다시 로그인해야 합니다.net_clsnet_priodebug

LXC 작성자 중 한 명이 작성한 이 블로그 게시물은 다음 단계를 제공합니다.

사용자는 uid 0으로 새 사용자 네임스페이스를 생성하고 해당 네임스페이스에 바인딩된 리소스에 대한 일부 루트 권한을 가질 수 있지만 분명히 호스트에 대한 추가 권한은 부여되지 않습니다.

그 중 하나는 새 네트워크 장치를 생성하거나 호스트의 브리지 구성을 변경하는 것입니다. 이 문제를 해결하기 위해 우리는 LXC 1.0의 유일한 SETUID 바이너리 부분이며 간단한 작업을 수행하는 "lxc-user-nic"라는 도구를 작성했습니다. 구성 파일을 구문 분석하고 해당 내용을 기반으로 사용자를 위한 네트워크 장치를 생성하고 연결합니다. 남용을 방지하기 위해 사용자가 요청할 수 있는 장치 수와 사용자가 추가할 수 있는 브리지를 제한할 수 있습니다.

예를 들면 내 자신의 /etc/lxc/lxc-usernet 파일이 있습니다:

stgraber veth lxcbr0 10

이는 사용자 "stgraber"가 최대 10개의 veth 유형 장치를 생성하고 이를 lxcbr0이라는 브리지에 추가할 수 있음을 나타냅니다.

커널의 사용자 네임스페이스와 setuid 도구에서 제공하는 기능 사이에는 대부분의 배포판을 권한 없는 방식으로 실행하는 데 필요한 모든 것이 있습니다.

사용자에게 sudo권한이 있고 Bash를 사용하는 경우 다음 명령을 사용하십시오.

echo "$(whoami) veth lxcbr0 10"|sudo tee -a /etc/lxc/lxc-usernet

그리고 유형( veth)이 컨테이너 구성의 유형과 일치하는지, 브리지( lxcbr0)가 구성 및 시작되었는지 확인하세요.

이제 또 다른 오류 세트가 발생합니다.

lxc-start 1420192192.775 정보 lxc_start - 새 사용자 네임스페이스 복제
lxc-start 1420192192.775 정보 lxc_cgroup - test1에 대한 cgroup 드라이버 cgmanager 초기화 중
lxc-start 1420192192.923 참고 lxc_start - 새 사용자 네임스페이스에서 gid/uid 0으로 전환합니다.
lxc-start 1420192192.923 오류 lxc_start - 권한 거부됨 - /home/user에 액세스할 수 없습니다. "x" 액세스 권한을 부여하거나 컨테이너 루트에 ACL을 추가하세요.
lxc-start 1420192192.923 오류 lxc_sync - 잘못된 시퀀스 번호 1. 2개 예상
lxc-start 1420192192.954 오류 lxc_start - 'test1'을 생성할 수 없습니다.
lxc-start 1420192192.959 오류 lxc_start_ui - 컨테이너 시작에 실패했습니다.

좋습니다. 이 문제는 해결할 수 있습니다.다른 lxc-users스레드첫 번째 스레드와 동일한 주인공이 길을 닦습니다.

현재 빠른 테스트가 sudo chmod -R o+X $HOME필요하지만 ACL도 실행 가능한 옵션입니다. YMMV.

관련 정보