问题由来
如题,按照公司规定,节前需关机断电。节后启动虚拟机,未正常启动成功,进入了紧急救援模式(emergency模式)。极可能由节前强制断电关机导致,但并不能确定一定是该原因;后面,随着定位深入,发现是是因为/usr/lib/下所有的文件均丢失导致的。
报错信息:
blk_update_request: I/O error, dev fd0, sector 0
you might want to save “/run/initramfs/rdsosreport.txt“ to a USB stick or /boot
after mounting them and attach it to a bug report
Starting Switch Root...
Failed to switch root: Specified switch root path '/sysroot' does not seem to be an OS tree. os-release file is missing.
initrd-switch-root.service: Main process exited, code=exited, status=1/FAILURE
initrd-switch-root.service: Failed with result 'exit-code'.
Failed to start Switch Root.
问题定位
系统启动后进入紧急救援模式,在console窗口打印信息大致如上(未截图)。看到这些信息后,被I/O error
给误导了【误导一】,认为是磁盘文件或者分区出现了异常。沿着上面的思路,我做了如下操作:
- 虚拟机做快照,避免修复失败导致无法挽回;
- 挂载ISO文件,修改引导DVD启动,进入到修复模式;
- 强制修复了根分区:xfs_repair -L /dev/mapper/centos-root;
- 重启:问题未解决。
/dev/fd0属于软盘设备,通过查看虚机配置,并没有该设备【误导二】。接着做了如下操作:
- 删除了/dev/fd0设备;
- 备份并重新生成grub.cfg:grub-mkconfig -o /boot/grub/grub.cfg
在重新生成grub.cfg时,报错了:未找到/etc/os-release文件。这和进入紧急模式打印的日志相符:Failed to switch root: Specified switch root path '/sysroot' does not seem to be an OS tree. os-release file is missing.
我擦~~难道一个os-release文件还能导致系统启动失败?还真能!
此时,如果单单将/etc/os-release补齐,系统则可以正常引导启动,不再进入emergency模式,但是会卡死!
进一步定位发现/mnt/sysimage/usr/lib/下是空的。因为/etc/os-release只是/usr/lib/os-release文件的软链接。(很难说该目录下的文件丢失是因为断电强制关机导致的,这也太齐整了。但,排除人为原因后,断电丢失的可能性很大)。
问题解决
- cp -a /usr/lib/* /mnt/sysimage/usr/lib/
- 退出救援模式,重启系统,正常启动了。
但是,此时ssh启动失败,说是没找到/etc/sysconfig/sshd环境变量文件;补齐该文件之后,服务仍然无法正常启动,所以果断重装了openssh-server。
- 通过yum reinstall openss-server重装;
- 上述无法重装,则需卸载后重新install(离线或在线)。
其实,到这里基本上已经将系统救回来了。但是,身子仍然比较虚。可以通过yum upgrade将系统以及软件包都升级一下。这样以来,系统则基本脱胎换骨,焕发新机了。