설정하려고 하는데권한이 없는 LXC 컨테이너그리고 매번 실패합니다. 나는 가이드의 모든 관련 단계를 따랐다고 생각합니다.
일반 사용자는 권한이 없는 컨테이너를 만들 수 있습니다.
$ sysctl kernel.unprivileged_userns_clone kernel.unprivileged_userns_clone = 1
제어 그룹 PAM 모듈이 활성화되었습니다.
$ grep -F pam_cgfs.so /etc/pam.d/system-login session optional pam_cgfs.so -c freezer,memory,name=systemd,unified
UID 및 GID 매핑을 설정합니다.
$ cat /etc/lxc/default.conf lxc.idmap = u 0 100000 65536 lxc.idmap = g 0 100000 65536 lxc.net.0.type = veth lxc.net.0.link = lxcbr0 lxc.net.0.flags = up lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx $ cat /etc/subuid root:100000:65536 $ cat /etc/subgid root:100000:65536
네트워크가 설정되었습니다:
$ grep --invert-match --regexp='^#' --regexp='^$' /etc/default/lxc-net USE_LXC_BRIDGE="true" LXC_BRIDGE="lxcbr0" LXC_ADDR="10.0.3.1" LXC_NETMASK="255.255.255.0" LXC_NETWORK="10.0.3.0/24" LXC_DHCP_RANGE="10.0.3.2,10.0.3.254" LXC_DHCP_MAX="253"
서비스가 좋아 보입니다.
$ systemctl status --lines=0 --no-pager lxc.service lxc-net.service ● lxc.service - LXC Container Initialization and Autoboot Code Loaded: loaded (/usr/lib/systemd/system/lxc.service; disabled; vendor preset: disabled) Active: active (exited) since Fri 2019-03-08 15:31:47 NZDT; 40min ago Docs: man:lxc-autostart man:lxc Main PID: 4147 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 4915) Memory: 0B CGroup: /system.slice/lxc.service ● lxc-net.service - LXC network bridge setup Loaded: loaded (/usr/lib/systemd/system/lxc-net.service; enabled; vendor preset: disabled) Active: active (exited) since Fri 2019-03-08 15:31:45 NZDT; 40min ago Main PID: 4099 (code=exited, status=0/SUCCESS) Tasks: 1 (limit: 4915) Memory: 8.4M CGroup: /system.slice/lxc-net.service └─4121 dnsmasq -u dnsmasq --strict-order --bind-interfaces --pid-file=/run/lxc/dnsm…
- 패키지가 최신 상태이고 방금 재부팅했습니다.
그럼에도 불구하고 컨테이너를 만들 수 없습니다.
$ lxc-create -n test -t download
lxc-create: test: parse.c: lxc_file_for_each_line_mmap: 100 No such file or directory - Failed to open file "/home/user/.config/lxc/default.conf"
lxc-create: test: conf.c: chown_mapped_root: 3179 No uid mapping for container root
lxc-create: test: lxccontainer.c: do_storage_create: 1310 Error chowning "/home/user/.local/share/lxc/test/rootfs" to container root
lxc-create: test: conf.c: suggest_default_idmap: 4801 You do not have subuids or subgids allocated
lxc-create: test: conf.c: suggest_default_idmap: 4802 Unprivileged containers require subuids and subgids
lxc-create: test: lxccontainer.c: do_lxcapi_create: 1891 Failed to create (none) storage for test
lxc-create: test: tools/lxc_create.c: main: 327 Failed to create container test
이 설정에 명백한 문제가 있습니까?~/.config/lxc/default.conf는 링크된 기사에 언급되지 않았으며 왜 할당된 subuid 및 subgid가 없다고 말하는지 이해할 수 없습니다.
추가 정보:
- 루트로 실행하면
lxc-create
작동하지만 이는 명시적으로 일반 사용자로 컨테이너를 생성하는 것에 관한 것입니다. cp /etc/lxc/default.conf ~/.config/lxc/default.conf
구성 파일에 대한 불만 사항을 제거하지만 다음 메시지가 표시됩니다.lxc-create: 재생 시간: conf.c: chown_mapped_root: 3279 lxc-usernsexec 실패: 해당 파일 또는 디렉터리 없음 - tty를 열 수 없음 해당 파일 또는 디렉터리 없음 - tt를 열 수 없음
답변1
이것은 새로운 프로젝트입니까, 아니면 옵션이 있습니까? LXC 대신 LXD를 사용하는 것은 어떨까요? 사용하기가 더 쉽고 동일한 목적을 달성할 수 있습니다. lxc를 사용하기 시작했는데 비특권 컨테이너를 실행하는 데 관심이 있어서 빠르게 전환했는데, 이는 LXC에서는 쉽지 않지만 LXD에서는 기본입니다.
시작하려면 여기를 살펴보세요. https://discuss.linuxcontainers.org/t/comparing-lxd-vs-lxc/24
마지막으로 설치/사용한 지 몇 달이 지났지만 설치 참고 사항은 다음과 같습니다.
LXD는 매우 빠르게 발전하고 있으므로 Ubuntu 사용자는 PPA를 사용하는 것이 좋습니다.
# add-apt-repository ppa:ubuntu-lxc/lxd-stable
# apt-get update
# apt-get dist-upgrade
# apt-get install lxd
이 패키지는 로컬 Unix 소켓을 통해 lxd와 통신할 수 있는 모든 사용자를 포함하는 새로운 "lxd" 그룹을 생성합니다. "admin" 및 "sudoers" 그룹의 모든 구성원이 자동으로 추가됩니다. 사용자가 이러한 그룹 중 하나의 구성원이 아닌 경우 사용자를 그룹에 수동으로 추가해야 합니다 lxd
.
그룹 멤버십은 로그인 시에만 적용되므로 사용자 세션을 닫았다가 다시 열거나 newgrp lxd
lxd와 상호 작용하려는 쉘에서 명령을 사용해야 합니다.
newgrp lxd
https://blog.ubuntu.com/2015/03/20/installing-lxd-and-the-command-line-tool 2018/10/22
내가 아는 한, 가상 머신에서 LXD를 실행할 수도 있으므로 작업 중인 시스템을 엉망으로 만들지 않고도 빠르게 시험해 볼 수 있습니다.
귀하가 요청한 질문에 대한 정확한 답변은 아니지만 유용한 옵션이 되었기를 바랍니다.
답변2
이 게시물이 오래된 게시물이라는 것을 알고 있지만 최근에 동일한 문제가 발생하여 다음과 같은 구체적인 오류를 따라 해결했습니다.
lxc-create: my-container: conf.c: suggest_default_idmap: 4738 You must either run as root, or define uid mappings
lxc-create: my-container: conf.c: suggest_default_idmap: 4739 To pass uid mappings to lxc-create, you could create
lxc-create: my-container: conf.c: suggest_default_idmap: 4740 ~/.config/lxc/default.conf:
lxc-create: my-container: conf.c: suggest_default_idmap: 4741 lxc.include = /etc/lxc/default.conf
lxc-create: my-container: conf.c: suggest_default_idmap: 4742 lxc.idmap = u 0 100000 65536
lxc-create: my-container: conf.c: suggest_default_idmap: 4743 lxc.idmap = g 0 100000 65536
lxc-create: my-container: lxccontainer.c: do_lxcapi_create: 1869 Failed to create (none) storage for my-container
lxc-create: my-container: tools/lxc_create.c: main: 327 Failed to create container my-container
매우 간단한 수정 사항은 다음과 같습니다.
mkdir -p ~/.config/lxc
touch ~/.config/lxc/default.conf
echo "lxc.include = /etc/lxc/default.conf" >> ~/.config/lxc/default.conf
echo "lxc.idmap = u 0 100000 65536" >> ~/.config/lxc/default.conf
echo "lxc.idmap = g 0 100000 65536" >> ~/.config/lxc/default.conf
사용자 및 그룹 ID를 업데이트하는 것을 잊지 마세요.
또한 오류가 발생하는 경우 다음 사항에 유의하세요.
Setting up the GPG keyring
ERROR: Unable to fetch GPG key from keyserver
바로 이것 때문에:https://github.com/lxc/lxc/issues/3068
이 문제를 해결하려면 -- --keyserver hkp://p80.pool.sks-keyservers.net:80
다음과 같이 create 명령 끝에 추가하면 됩니다.
lxc-create -t download -n my-container -- --keyserver hkp://p80.pool.sks-keyservers.net:80
이것이 당신에게 최소한 도움이 되지 않는다면, 이것이 다른 사람에게 도움이 되기를 바랍니다.
답변3
클래식 LXC 컨테이너 권한을 비권한으로 변환하는 간단한 스크립트를 작성했습니다.
루트 사용자에 대한 두 번째 UID - GID(subuid guid)를 설정합니다.
usermod --add-subuids 1258512-1324047 root
usermod --add-subgids 1258512-1324047 root
하위 설정을 위한 대체 매뉴얼(UID-GID):
echo "root:1258512:65536" >> /etc/subuid
echo "root:1258512:65536" >> /etc/subgid
권한이 없는 컨테이너 디렉터리에 대한 권한 설정 참고: 모든 UID 및 GID에는 루트 하위(uid-gid)의 오프셋이 추가되어 있습니다.
subUid=$(grep root /etc/subuid | cut -d: -f2 | head -1) for i in $(find /var/lib/lxc/nameofcontainer/ -print) do
## Get numeric owner of current file/dir
actProp=$(stat -c '%u:%g' "$i")
actPropUid=$(echo ${actProp} | cut -d: -f1)
actPropGid=$(echo ${actProp} | cut -d: -f2)
## Calculed shifted owner
newUid=$(( $actPropUid + $subUid ))
newGid=$(( $actPropGid + $subUid ))
## set new owner
if [ $actPropUid -lt 65536 ] ; then
chown ${newUid}:${newGid} "$i"
fi done
chown ${subUid}:${subUid} /var/lib/lxc/nameofcontainer/
/var/lib/lxc/nameofcontainer/config에서 권한 없는 시작 옵션을 설정합니다:
echo "lxc.include = /usr/share/lxc/config/debian.userns.conf" >> /var/lib/lxc/${CT}/config
echo "lxc.idmap = u 0 $subUid 65536" >> /var/lib/lxc/${CT}/config
echo "lxc.idmap = g 0 $subUid 65536" >> /var/lib/lxc/${CT}/config
사용자 네임스페이스 활성화:
echo "kernel.unprivileged_userns_clone=1" > /etc/sysctl.d/80-lxc-userns.conf
sysctl --system
AppArmor LXC의 기본 구성을 업데이트합니다.
cat <<EOF >> /etc/lxc/default.conf
lxc.apparmor.allow_incomplete = 1
EOF
cgroup 커널 기능을 활성화합니다. /etc/default/grub을 편집합니다.
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
도착하다:
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1 quiet"
자세한 내용은 다음과 같습니다. https://github.com/lucapicio/LXC_to_Unprivileged/blob/main/convert.sh
Readme 파일에서 필요한 모든 정보를 찾을 수 있습니다.