周末我心血来潮,用Ailurus清理了Ubuntu的系统垃圾内容。其中一项是清理“未使用的kernel”,清理完成后一切正常,我就洗洗睡了。
悲催的是:第二天再开机时,竟然发现grub启动菜单里面所有Ubuntu相关的启动项,除了memory test,其它项都没有了!也就是说,Ailurus清理无用kernel时,竟然把当前使用的kernel也当成无用的kernel给清理了,晕!
我google了一下,遇到这个问题的不只我一个人,这里有人使用Ailurus也遇到了相同的问题。所不同的是:他是在刚删除之后就发现了,没有重启,则还可以在当前已经启动的系统下,再进行一些补救操作,解决问题,有兴趣的同学可以参考该文的做法。但是我已经重启了,没有内核文件就无法进入Ubuntu系统,补救操作也就无从谈起。
我先是尝试用bootable Ubuntu desktop image进入系统,但是这样启动是无法加载硬盘上已有分区的,我猜修改”/etc/fstab”可能有戏,但是即使这样加载分区成功,我还得至少做这样几件事情:
将kernel文件复制到硬盘分区上正确的位置(apt-get/dpkg肯定是用不了了,只能手工完成,这样做可能还有别的问题:不用dpkg安装,那么就无法使用系统的包管理,指不定以后还会出什么问题);
修改grub配置,加入kernel相关的启动项。
想来想去这样搞不太现实,只有重装了。在重装步骤中选择分区的时候,由于我原来安装的时候是把”/home”目录放在一个单独分区上,则这次重装时,我选择将”/home”分区放在原来的那个分区并且不对该分区进行格式化,而加载”/“的另一个分区选择进行格式化。
这样安装完成之后(大概花了十分钟),重启系统登录之后,我惊喜地发现:启动之后的桌面主题和桌面内容和重装之前一模一样,”home”目录里面的内容也什么都没有少(重装步骤中选择用户名的时候,我选择了和重装之前同样的用户名,则”/home/xxx”目录路径和原来完全一致)。看来Ubuntu的安装足够智能,或者说足够简单:只要home目录的内容不变就可以和原来一模一样。
当然,除了home目录的内容不变之外,其它”/“路径所在分区的内容都被重新安装了,我之前安装的软件中,除了Ubuntu默认自带的都没有了,不过这个问题很好解决,用万能的”apt-get/add-apt-repository”就可以全部搞定。
这次经历让我有几点体会:
将”/home”目录挂载到一个单独的分区是一项最佳实践,它能保证你在系统崩溃的时候,用户的所有数据不会损失;
将所有用户的文件都当放在”/home”目录下也是unix-like操作系统的一项最佳实践,这样无疑让数据的备份和恢复都异常简单;
再次显示了”apt-get”的强大。要安装任何软件,记住它的名字就可以了,这应该是已经简单到不能再简单了吧!
从这些地方可以看出,POSIX文件系统目录结构虽然看着貌似呆板,但是这么做是有原因的;命令行虽然看着老土,但是它的好处是不可替代的。历经时间考验的软件设计原则,一定有它存在的道理。
另外,关于Ailurus误删除当前kernel的这个问题,造成的原因可能是因为我最近升级了内存。我机器的内存最近从2GB变成了4GB,为了让32位 Ubuntu能够识别大于2.8GB的内存,我安装了linux kernel with pae(Physical Address Extension,具体情况可以参考我之前写的这篇文章) feature。我相当怀疑Ailurus之所以误把当前使用的kernel当成没有的kernel,和我这次操作有关,因为之前我多次使用过Ailurus的清理无用kernel的这个功能,都没有任何问题。