LXC容器内Arch Linux升级systemd网络丢失恢复方法
Kaijia一般使用Arch Linux在容器内运行一些万年(比一个红帽发行周期还长)不需要手动维护、且每次升级都不需要人工干预的软件,比如memcached,一次安装完成配置后只需设置pacman自动更新即可不必再次登录。不过最近Kaijia的Arch Linux容器却意外在重启后纷纷丢失了网络。Kaijia查阅了systemd的日志和错误报告,发现networkd组件在238版本中引入了一项变动使得在容器内网络设备无法完成配置,从而导致了容器内系统在下次重启时无法联网。当然问题发现后,随之而来的是如何将systemd恢复到正常的版本。
在无网络的情况下,首先需要在Host主机上访问Arch Linux Archive下载无错误的systemd旧版本:
1 2 |
wget https://archive.archlinux.org/packages/s/systemd/systemd-237.64-1-x86_64.pkg.tar.xz wget https://archive.archlinux.org/packages/s/systemd-sysvcompat/systemd-sysvcompat-237.64-1-x86_64.pkg.tar.xz |
然后将安装包复制进容器中,使用ZFS或直接挂载在Host目录(rootfs)时可以将文件直接复制到Host主机对应的文件夹内(例如/rpool/data/或/var/lib/lxc/容器名称/rootfs/),但使用LVM或者RAW文件时则会相对麻烦,需要使用lxc-attach通过管道传入文件:
1 2 |
cat systemd-237.64-1-x86_64.pkg.tar.xz | lxc-attach -n 容器名称 -- /bin/sh -c "cat > /tmp/systemd-237.64-1-x86_64.pkg.tar.xz" cat systemd-sysvcompat-237.64-1-x86_64.pkg.tar.xz | lxc-attach -n 容器名称 -- /bin/sh -c "cat > /tmp/systemd-sysvcompat-237.64-1-x86_64.pkg.tar.xz" |
然后才可在安装旧版本systemd并重启:
1 2 |
lxc-attach -n 容器名称 -- /bin/sh -c "pacman -U /tmp/systemd-237.64-1-x86_64.pkg.tar.xz /tmp/systemd-sysvcompat-237.64-1-x86_64.pkg.tar.xz" lxc-attach -n 容器名称 -- /bin/sh -c "reboot" |
完成重启后网络即会恢复正常连接。同时,下次升级系统时pacman仍会升级systemd,在此问题被LXC或systemd维护者修复前(目前239版本仍未修复),可以每次升级时都避免升级问题组件:
1 |
pacman -Syu --ignore=systemd --ignore=systemd-sysvcompat |
评论