解决Ubuntu 20.04外置块设备mdraid+lvm启动缓慢问题

问题

我的占美1037U小主机,使用两块希捷的USB3.0 4T 2.5寸机械磁盘组成了一套软RAID1存储系统。但是问题在于,自从之前升级到Ubuntu 20.04之后,莫名其妙的启动时间就长达10~15分钟。这该如何解决?

排查

首先是在systemd和kernel启动日志上进行排查。增加了内核启动参数systemd.log_level=debug,去掉quite splash

通过systemd-analyze查看,ifupdown-pre.service耗时较长,达到2分钟。另外在内核启动过程中看到,lvm模块启动的时候,也会卡住两次,每次3分钟。还有网卡启动时,会卡住2分钟。

接下来从ifupdown-pre.service开始看起,查看/lib/systemd/system/ifupdown-pre.service,拆解其中的命令,其中udevadm settle会持续卡住。

针对启动内核initramfs中卡住的问题,其中/usr/share/initramfs-tools/scripts/init-bottom中的lvm2文件,其中也包含udevadm settle --timeout 120

看来问题找到了,就是udevadm settle卡住造成的

那为什么udevadm settle会卡住呢?

我们看看udevadm settle过程中发生了什么吧。运行以下命令

原始输出当时忘记截图了,但关键在于,看到udevadm在建立了到/run/udev/control的unix socket后,发送了udev-229.....的信息,然后再epoll,就一直卡住没有等到任何回复了。发送的这个信息,udev-229部分应当是版本号。

搜索了一下,正常情况下,udevadm发送事件,systemd-udev会收到,然后做出反馈。那接下来看看systemd-udev那边的状况吧。使用systemctl status udev查看,发现一切正常。然后我具体看了下,systemd-udev的二进制运行时在/lib/systemd/systemd-udevd。看了下/lib/systemd/systemd-udevd的版本号

输出是245.4,即守护进程的版本号是245.4。看到这个版本号,我突然有点觉得不太对劲。这与udevadm的版本号不一致啊。是不是由于udevadm和udevd的版本号不一致,导致了问题?

于是我赶紧看了下udevadm的路径,发现在/bin/udevadm。接着看看,是不是旁边还有一个。。。我赶紧输入了以下命令

我了个大去。赶紧看了下,udevadm.upgrade的版本号是245。那事情就搞清楚了。我给小服务器升级ubuntu 20.04版本的时候,好像是在它还没有退出平滑升级的时候。在升级中,可能提示是否覆盖,我选择了保留两个版本的文件。后来也没注意。

解决

接下来就比较好办了。使用udevadm.upgrade覆盖掉udevadm,然后重新生成了initramfs,重启机器,启动速度马上恢复到1分钟以内了。问题解决。

发表评论

为防机器,验证码请直接输入4个数字1

*