问题
我的占美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过程中发生了什么吧。运行以下命令
1 2 |
strace -f -r -ttt 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
的版本号
1 2 3 |
# /lib/systemd/systemd-udevd —V 245.4-4ubuntu3.17 |
输出是245.4,即守护进程的版本号是245.4。看到这个版本号,我突然有点觉得不太对劲。这与udevadm的版本号不一致啊。是不是由于udevadm和udevd的版本号不一致,导致了问题?
于是我赶紧看了下udevadm的路径,发现在/bin/udevadm。接着看看,是不是旁边还有一个。。。我赶紧输入了以下命令
1 2 3 |
# ls /bin/udevadm* udevadm udevadm.upgrade |
我了个大去。赶紧看了下,udevadm.upgrade的版本号是245。那事情就搞清楚了。我给小服务器升级ubuntu 20.04版本的时候,好像是在它还没有退出平滑升级的时候。在升级中,可能提示是否覆盖,我选择了保留两个版本的文件。后来也没注意。
解决
接下来就比较好办了。使用udevadm.upgrade覆盖掉udevadm,然后重新生成了initramfs,重启机器,启动速度马上恢复到1分钟以内了。问题解决。