编辑:问题是我的 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://github.com/lxc/lxc/issues/2277(不确定这是否是同一个问题)