ubuntu出现"/dev/disk/by-uuid/xxxxxxxxx does not exist. Dropping to a shell "的恢复之路

1 问题现象及恢复尝试 我的ubuntu server14.04升级/降级之后,开机启动异常,提示:

ALERT! /dev/disk/by-uuid/xxxxxxxxx does not exist. Dropping to a shell
initramfs: |
上网搜国内解决办法基本是通过修改grub的启动参数来修复,这种修复是假设ubuntu启动时间太快导致无法识别到启动盘,通过增加启动延时和直接用启动盘的设备节点来识别启动盘而不是用uuid
你可以试一下自己的情况是不是这种问题导致的,在进入ubuntu启动菜单时输入e进入编辑状态,在linux那一行把root设置为启动盘设备节点就好了,比如root=/dev/sda1,同时可以在linux那一行增加延时参数如 rootdelay=120,然后按ctrl+x启动就好,这时候如果能进入系统的话就需要去修改/etc/default/grub下的参数
GRUB_CMDLINE_LINUX="rootdelay=120"

之后通过update-grub更新grub配置,之后就可以恢复正常了
备注:如果是修改grub参数能解决的,基本在启动菜单输入e进行编辑修改相关参数之后就能正常启动。如果修改这些参数之后依然无法正常启动,那就不要在这方面浪费时间了,肯定是其他问题导致的。
2 问题解决及恢复步骤 我这边遇到的情况是在进入initramfs之后键盘根本无法动弹,用Google搜索到国外论坛说是有可能启动的initrd.img被破坏了(其实有可能是升级之后跟现有内核版本不兼容),论坛有介绍了如何恢复initrd.img的方法,但是我没有采用,他是使用重新去生成的方式来产生initrd.img,这可能跟我现有服务器内核版本还是不兼容,我这边采取的办法是把原来备份的boot分区的initrd.img直接替换为现有根文件系统下boot目录的下对应initrd.img,替换完之后系统就能正常启动了,但是又遇到一个问题是到快到登录界面时一直闪黑屏。
【ubuntu出现"/dev/disk/by-uuid/xxxxxxxxx does not exist. Dropping to a shell "的恢复之路】这边说一下我的恢复步骤:
(1)用之前安装ubuntu server的安装光盘进行恢复,当然如果你用的是U盘安装的话会麻烦一点,我这边用的就是U盘安装(制作好启动盘后,还要把原始的安装镜像放到U盘根目录,我这里的是ubuntu.ISO)。
(2)服务器插入U盘设置成从U盘启动,进入resuce模式
(3)一路默认直到提醒你找不到光盘,解决的方式是跳到菜单目录的shell菜单去执行(我的U盘设备节点是/dev/sdc4)
umount /cdrom mount /dev/sdac4 /mnt mount /mnt/ubuntu.ISO /cdrom exit

(4)继续往下安装,遇到不能设置的(比如时钟),可以直接跳到下一个菜单
(5)把根文件系统和备份的boot分区分别挂在上来,我这边的是
mount /dev/sda2 / mount /dev/sda1 /mnt

sda2是我这边服务器的根文件系统,sda1是我boot的备份分区
(6)确认/boot目录下的initrd.img文件是否最近有被修改过
通过diff和备份分区的initrd.img对比一下确认内容不一样了,于是用备份分区的initrd.img
进行替换恢复
(7)重启之后确实已经能正常启动了,但到登录界面时一直闪黑屏
原因应该是xserver自动选用的显卡驱动不对
我这边解决的方式比较粗暴也比较笨,直接把不需要的驱动一个个卸载掉,下面命令可以查看现有安装的显卡驱动
dpkg --get-selections | grep xserver-xorg-video

我的显卡是Matrox公司的G200eR2,因此我把nvidia相关的驱动全部卸载完,重启之后就正常了
apt-get purge nvidia-*

备注:为什么initrd.img被破坏了,系统就无法启动,因为initrd.img是在内核加载之前被加载到内存中的,完成初始根文件系统的挂载,关键驱动模块的加载,之后用来完成内核解压缩,硬盘检测等,如果initrd.img文件被破坏了,内核根本就起不来。
后记 修复的过程很费时,这都是在为前期服务器搭建时欠缺考虑买单。值得我花一些时间思考一下防止问题再发生及发生时该怎么去处理。如果需要搭建一台共用的linux开发服务器我觉得需要考虑下面一些因素:
  • 服务器所选用的操作系统及其版本一定要稳定。要选用一些稳定的服务器操作系统及版本,ubuntu用做服务器还是太不稳定了,经常会因为升级/降级软件导致系统挂掉。
  • 要有快速恢复工作的机制。因为服务器通常好几个人在用,如果没有快速恢复的机制,通常,会导致服务器挂掉之后,很多人无法连到服务器工作。一个比较简单的方式是预装两个系统一个工作系统,一个临时系统(分区可以设小一点),当工作系统挂掉之后,可以配置从临时系统启动,在把需要的分区挂载到临时系统,这样就可以快速让服务器快速恢复到可用状态。之后就可以花时间在慢慢修复工作系统。
  • 做最坏的打算。当你的系统无法恢复时,你需要重装时怎么办,提前规划,让重装之后的现场重建所花的时间最少。怎么提前规划,做好分区,及分区重定向到根文件系统的合适目录,重装之后只通过一些脚本就可以恢复到正常的工作状态。我觉的可以有下面这些分区:boot备份分区,根文件系统分区(工作状态),临时根文件系统分区(临时状态),用户目录分区,数据分区(文档资料),代码仓库分区(比如git代码仓库),软件安装分区(自己安装软件,可以是二进制文件,文档,库,配置信息等,系统重装之后只需配置环境参数就可以工作了,而不用全部重装),备份分区(比如可以备份系统的增量配置数据)
  • 做好备份。主要是对系统的一些关键文件/目录进行备份,最好是增量备份。我觉得至少要备份的是/etc目录,/root目录,其他用户目录下的一些隐藏文件/目录(即以"."开始命名的也可以考虑进行备份)。这样当出现问题,或者重装之后就可以利用这些备份的数据进行快速恢复。

    推荐阅读