
편집: 문제는 내 umask가 기본값인 022가 아닌 027로 설정되어 있다는 것입니다. 자세한 내용은 아래를 참조하세요.
LXC와 관련하여 발생 후 시스템 전반에 걸쳐 나타나는 어리둥절한 문제를 경험하고 있습니다.
LXC 컨테이너를 시작/중지할 때 때때로 시작 또는 중지가 무기한 중단되는 경우가 있습니다. 시작 시 이런 일이 발생하면 컨테이너의 init
프로세스가 실행 중이지만 kill -9
. 컨테이너는 온라인 상태가 되지 않으며 프로세스를 종료하는 유일한 방법은 시스템을 재부팅하는 것입니다.
문제는 시스템이 더 이상 재부팅되지 않는다는 것입니다. 이 문제와 동시에 를 실행할 때 문제가 발견되었는데 update-initramfs
, 이 문제도 무기한 중단됩니다. 이것을 찾은 후:
https://unix.stackexchange.com/questions/428001/update-initramfs-hangs-on-debian-stretchsync
나는 실제로 명령(유틸리티와 시스템 호출 모두)이 중단되어 LXC가 작동하지 않고 update-initramfs
중단되고 시스템 종료가 중단된다는 결론을 내렸습니다 ( sync
파일 시스템을 마운트 해제하기 전에 수행해야 함). 문제가 발생하면 sync
명령줄에서 (유틸리티)를 호출하면 지속적으로 무기한 중단됩니다. 실행을 시도했지만 strace
커널 호출에 들어갈 때 추적이 종료되어 더 이상 디버깅할 수 없습니다. 나는 다음을 사용하여 캐시를 모니터링했습니다.이것하지만 <100kB 범위에 머물고 있습니다.
파일 시스템과 관련된 것을 고려하면 sync
LXC가 일부 파일 시스템을 처리하는 방식에 문제가 있을 것으로 예상됩니다. LXC를 사용하지 않는 또 다른 동일한 서버가 있는데 출력을 비교한 후 mount
해당 서버에 없는 파일 시스템을 마운트 해제했지만 소용이 없었습니다. sync
계속 걸려있습니다.
이제 LXC를 건드리지 않고 클린 부팅으로sync
언제나작동하고 계속 작동합니다. 이러한 이유와 다른 문제가 발생하지 않는다는 사실로 인해 실제 I/O 문제는 없다고 확신합니다. 또한 컨테이너가 성공적으로 시작되면 아무런 문제가 없는 것 같습니다.
나는 이 문제에 관해 인터넷을 광범위하게 샅샅이 뒤졌지만 성공하지 못했습니다.
커널 4.19.0-0.bpo.4-amd64가 포함된 Debian 9(안정)의 LXC 2.0.7-2+deb9u2(다른 최근 커널에서도 발생했지만), raid1의 경우 SSD 2개, /
raid5의 경우 HDD 3개( mdadm)의 경우 /home
. 게스트는 권한이 없는 컨테이너로 실행되는 Debian 9(stretch) 또는 10(buster)입니다.범위를 다음으로 좁힌 것 같습니다. 권한 있는 컨테이너에서는 문제가 발생하지 않았습니다.
게스트 컨테이너 구성 예시:
# Template used to create this container: /usr/share/lxc/templates/lxc-download
# Distribution configuration
lxc.include = /usr/share/lxc/config/debian.common.conf
lxc.include = /usr/share/lxc/config/debian.userns.conf
lxc.arch = linux64
# Container specific configuration
lxc.id_map = u 0 200000 100000
lxc.id_map = g 0 200000 100000
# Network configuration
#lxc.network.type = empty
lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:e9:4a:e7
lxc.rootfs = /var/lib/lxc/somename/rootfs
lxc.rootfs.backend = dir
lxc.utsname = somename
# Mounts
lxc.mount.entry = /var/lib/lxc/temp mnt/temp none bind 0 0
및 subuid/gid 매핑:
# cat /etc/s*id
root:100000:1000000000
root:100000:1000000000
컨테이너 생성, 시작 및 중지 실패 예시:
# lxc-create -n test -t download
...
Distribution: debian
Release: stretch
Architecture: amd64
Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs
---
You just created a Debian stretch amd64 (20190522_05:24) container.
# lxc-ls -f
NAME STATE AUTOSTART GROUPS IPV4 IPV6
test STOPPED 0 - - -
# lxc-start -n test
# lxc-ls -f
NAME STATE AUTOSTART GROUPS IPV4 IPV6
test RUNNING 0 - - -
# lxc-attach -n test
root@test:/# ls -alh /
total 68K
drwxr-xr-x 21 root root 4.0K May 22 05:26 .
drwxr-xr-x 21 root root 4.0K May 22 05:26 ..
drwxr-xr-x 2 root root 4.0K May 22 05:26 bin
drwxr-xr-x 2 root root 4.0K Mar 28 09:12 boot
drwxr-xr-x 4 root root 400 May 22 09:26 dev
drwxr-xr-x 42 root root 4.0K May 22 09:24 etc
drwxr-xr-x 2 root root 4.0K Mar 28 09:12 home
drwxr-xr-x 9 root root 4.0K May 22 05:25 lib
drwxr-xr-x 2 root root 4.0K May 22 05:25 lib64
drwxr-xr-x 2 root root 4.0K May 22 05:25 media
drwxr-xr-x 2 root root 4.0K May 22 05:25 mnt
drwxr-xr-x 2 root root 4.0K May 22 05:25 opt
dr-xr-xr-x 225 nobody nogroup 0 May 22 09:26 proc
drwx------ 2 root root 4.0K May 22 05:25 root
drwxr-xr-x 3 root root 60 May 22 09:26 run
drwxr-xr-x 2 root root 4.0K May 22 05:26 sbin
drwxr-xr-x 2 root root 4.0K May 22 05:25 srv
dr-xr-xr-x 13 nobody nogroup 0 May 19 17:07 sys
drwxrwxrwt 2 root root 4.0K May 22 05:25 tmp
drwxr-xr-x 10 root root 4.0K May 22 05:25 usr
drwxr-xr-x 11 root root 4.0K May 22 05:25 var
root@test:/# exit
# lxc-ls -f
NAME STATE AUTOSTART GROUPS IPV4 IPV6
debian_buster STOPPED 0 - - -
rtorrent STOPPED 0 - - -
test RUNNING 0 - - -
# lxc-stop -n test
^C
# lxc-stop -n test
... continues to hang ...
# ^C
# sync
^C^C^Z^X^C^Z^X^C^Z^C^Z^X^C
... won't die.
답변1
알고 보니 문제는 기본 umask보다 덜 허용적인 umask였습니다. 데비안의 기본값은 022인데 .bashrc
보안상의 이유로 사용자 계정을 027로 변경했습니다 . su
루트가 되기 위해 사용하면 모든 lxc-*
명령이 umask 027로 실행되도록 이 umask가 복사됩니다. 그러나 이로 인해 LXC에 알려진 문제가 발생하며 어떤 이유로 아직 해결되지 않았습니다(적어도 Debian 패키지에서는? ).
umask를 변경(세션 중 또는 수정하여 .bashrc
)하면 이미 가지고 있던 컨테이너를 정상적으로 실행할 수 있습니다.
자원:
https://github.com/lxc/lxc/issues/2277(이것이 동일한 문제인지 확실하지 않음)