LXC容器内Arch Linux升级systemd网络丢失恢复方法

07/28/2018

Kaijia一般使用Arch Linux在容器内运行一些万年(比一个红帽发行周期还长)不需要手动维护、且每次升级都不需要人工干预的软件,比如memcached,一次安装完成配置后只需设置pacman自动更新即可不必再次登录。不过最近Kaijia的Arch Linux容器却意外在重启后纷纷丢失了网络。Kaijia查阅了systemd的日志和错误报告,发现networkd组件在238版本中引入了一项变动使得在容器内网络设备无法完成配置,从而导致了容器内系统在下次重启时无法联网。当然问题发现后,随之而来的是如何将systemd恢复到正常的版本。

在无网络的情况下,首先需要在Host主机上访问Arch Linux Archive下载无错误的systemd旧版本:

然后将安装包复制进容器中,使用ZFS或直接挂载在Host目录(rootfs)时可以将文件直接复制到Host主机对应的文件夹内(例如/rpool/data//var/lib/lxc/容器名称/rootfs/),但使用LVM或者RAW文件时则会相对麻烦,需要使用lxc-attach通过管道传入文件:

然后才可在安装旧版本systemd并重启:

完成重启后网络即会恢复正常连接。同时,下次升级系统时pacman仍会升级systemd,在此问题被LXC或systemd维护者修复前(目前239版本仍未修复),可以每次升级时都避免升级问题组件: