LXC 启动/停止挂起,文件系统同步挂起

LXC 启动/停止挂起,文件系统同步挂起

编辑:问题是我的 umask 设置为 027 而不是默认值 022。详情见下文。

我遇到了与 LXC 有关的一系列令人困惑的问题,这些问题发生后会在整个系统中显现出来。

启动/停止 LXC 容器时,启动或停止偶尔会无限期挂起。当启动时发生这种情况时,容器的init进程正在运行但无法终止,即使使用 也无法kill -9终止。容器永远不会上线,结束进程的唯一方法是重启系统。

问题是,系统也不会再重新启动。在出现此问题的同时,我注意到运行时也存在一个问题update-initramfs,该问题也会无限期挂起。发现此问题后: https://unix.stackexchange.com/questions/428001/update-initramfs-hangs-on-debian-stretch 我得出的结论是,该sync命令(实用程序和系统调用)确实挂起了,导致 LXC 无法工作、update-initramfs挂起,并且系统关闭挂起(sync在卸载文件系统之前应该这样做)。一旦出现问题,sync从命令行调用(实用程序)将持续挂起。我尝试运行它,strace但跟踪在进入内核调用时结束,我无法进一步调试。我使用以下工具监视了缓存但它只是徘徊在<100kB范围内。

考虑到sync与文件系统有关,我估计 LXC 处理某些文件系统的方式有问题。我有另一台不使用 LXC 的相同服务器,在比较输出后,mount我卸载了该服务器上不存在的文件系统,但无济于事。sync继续挂起。

现在,在干净启动的情况下,不要触碰 LXC,sync 总是可以正常工作,并且继续正常工作。由于这个原因以及我没有看到其他问题,我确信没有实际的 I/O 问题。此外,当容器成功启动时,它似乎没有任何问题。

关于这个问题,我在互联网上搜索了很久,但毫无结果。

Debian 9 (稳定版) 上的 LXC 2.0.7-2+deb9u2 带有内核 4.19.0-0.bpo.4-amd64(尽管其他最近的内核也出现过这种情况),其中 raid1 中有 2 个 SSD,/raid5 (mdadm) 中有 3 个 HDD /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 不够宽松。Debian 的默认值是 022,.bashrc出于安全原因,我已将用户帐户中的默认值更改为 027。使用su成为 root 后,此 umask 将被复制,以便所有lxc-*命令都以 umask 027 执行。然而,这会导致 LXC 的一个已知问题,出于某种原因,该问题仍未得到修复(至少在 Debian 软件包中尚未修复?)。

更改 umask(在会话中或通过修改.bashrc)允许我运行我已经拥有的容器。

资源:

https://discuss.linuxcontainers.org/t/cannot-stop-unprivileged-container-not-even-kill-9-its-systemd-process-on-host/1079

https://github.com/lxc/lxc/issues/2277(不确定这是否是同一个问题)

https://github.com/lxc/lxc/issues/1403

https://bugs.launchpad.net/ubuntu/+source/lxc/+bug/1642767

相关内容