如果在 LXC 容器中运行 Ubuntu/Debian,有时候会碰到登陆缓慢卡住的情况,尤其是跨架构的容器,需要很久才登陆成功:

  1. 使用 lxc-attach xxxx 后,使用 su user 切换用户时,卡住;
  2. 直接使用 ssh user@10.0.3.xxx,输入完用户名密码后,卡住;

卡住之后,系统负载上升,检查会发现容器的 systemd 进程 CPU 占用很高,需要很久才正常,然后登陆成功。同样,关闭 LXC 容器时,命令也会等待很久。

解决办法可以参考 Fix Debian 11 bullseye slow SSH login and sudo on LXC Proxmox

  1. 在容器中运行 systemctl mask systemd-logind
  2. 在容器中运行 pam-auth-update 然后取消选择 Register user sessions in the systemd control group hierarchy,即可。或者直接运行 pam-auth-update --remove systemd.

具体原因倒不是特别清晰,这种现象特别影响效率。

LXC 容器无法 DHCP 获取到 IP

如果 LXC 容器已经使用 DHCP 获取 IP, 但是启动后无法正常获取 IP,则可以通过这种方法解决:

  • 临时方案:在宿主系统运行 ethtool -K vethXXXX tx offethtool -K lxcbrXXX tx off,命令需要 root 权限,该命令会关闭 LXC 虚拟网卡的校验功能。
  • 永久方案:使用 udev 规则来自动处理校验关闭,创建文件 /etc/udev/rules.d/90-lxc-net.rules:
1
2
ACTION=="add",SUBSYSTEM=="net",KERNEL=="veth*", RUN+="/usr/sbin/ethtool -K $env{INTERFACE} tx off"
ACTION=="add",SUBSYSTEM=="net",KERNEL=="lxcbr*",RUN+="/usr/sbin/ethtool -K $env{INTERFACE} tx off"

这种现象原因是,虚拟网卡一般不需要在 IP 包中附加校验,但是 DHCP 工具目前会主动校验数据包,造成检验失败,DHCP 握手失败。