声明
笔者最近意外的发现 笔者的个人网站 http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明。
郑重声明:这篇记录《ubuntu系统之难》转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=677
前言
心中再次想起那句话,既然自己选择了这样做,就要准备好承受做这件事的一切代价。
一次错误的记忆和操作,使得整个boot分区被删除。
一次无意的撤销操作,使得系统依赖错误。
正文
背景
先说说背景吧。
我的电脑安装了三个系统: ubuntu12.04, ubuntu14.04 和 centOS。
其中 ubuntu12.04 是我一直使用的系统,上次装完这个系统使用时长至少一年了吧。
ubuntu14.04 这个系统我把windows删除的时候,使用这个系统覆盖的。
centOS安装也有半年了。
现在我的ubuntu12.04这个系统的磁盘不足了,于是我想删除其它两个系统。
于是我做了一个U盘版的GParted软件。
查看分区情况
sda1 是主分区(以前是windows7,现实在 ubuntu14.04了)。 sda3是我的D盘,ntfs格式。 sda4是一个ext4格式分区(boot分区)。 sda5是一个swap分区。 sda6是一个ext4格式的分区(ubuntu 12.04 分区) sda7是一个ext4格式的分区(Home分区)。 sda8是一个swap分区。 sda9是一个ext4格式的分区(centOS系统)。 sda10是一个swap分区
第一次误操作
看到这些分区,我想起一件事,当时安装 ubuntu14.04的时候,为了系统的安全,我把boot,home和根分开了,分了三个分区。
于是我就果断的把sda8和sda4删了,后来想交换分区也没算什么用,于是把三个交换分区也删了。对于home分区,我想再看看到底是不是,毕竟里面可能有重要的文件。
于是关机重启,然后出现了久违的 grub rescue 错误。
新的grub错误
第一行有个错误
/grub/i386pc/normal.mod not found.
还好,以前我遇到这个错误好多次,于是找到曾经的记录http://tiankonguse.com/record/record.php?id=194。
但是执行到 insmod /boot/grub/normal.mod 时竟然提示找不到 normal.mod。
还好,我尝试使用 insmod normal 试试,竟然成功了,原来现在的系统,改成 /boot/grub/i386-pc/normal.mod 了。
然后我兴高采烈的执行 normal 命令。
但是执行后,提示
error symbol 'grub_term_highlight_color' not found。
怎么会这样呢?
于是使用360搜索一下。
找到这个论坛(http://forum.ubuntu.org.cn/viewtopic.php?t=458570).
说是系统的一个 bug, 需要使用 live 系统重装 grub2 .
我做了一个ubuntu 系统的U盘。
然后把U盘里的boot复制到我的那个 ubuntu 12.04 系统。
开机后还是 grub rescue, 然后使用上面的方法后竟然进去到U盘系统了。
原来grub还没有更新。
然后更新的时候提示下面错误:
ubuntu@ubuntu:~$ sudo update-grub /usr/sbin/grub-probe: error: failed to get canonical path of /cow. ubuntu@ubuntu:~$ sudo grub-install /dev/sda Path `/boot/grub' is not readable by GRUB on boot. Installation is impossible. Aborting.
然后我在ubuntu的一个论坛上找到一个方法(http://askubuntu.com/questions/197833/recovering-from-grub-rescue-crash)
核心命令时
sudo mount /dev/sdXY /mnt sudo grub-install --root-directory=/mnt /dev/sdX Where /dev/sdX is the disk where Ubuntu is installed, and /dev/sdXY is the partition on the disk where Ubuntu is installed. In other words, /dev/sdXY contains /boot and so on. Use fdisk -l to verify the Ubuntu installation location.
但是我执行的时候,提示
ubuntu@ubuntu:~$ sudo mount /dev/sda /mnt mount: /dev/sda already mounted or /mnt busy
在bug论坛看到各种解决方法,大家可以去看看(https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1289977)。
sudo fdisk -l And find your Ubuntu partition (should be /dev/sda1 if it is the first partition) sudo mount /dev/sda1 /mnt sudo mount --bind /sys /mnt/sys sudo mount --bind /proc /mnt/proc sudo mount --bind /dev /mnt/dev sudo chroot /mnt Now reinstall Grub2 sudo apt-get install --reinstall grub2
blkid 查看各个分区的UUID
此时我突然意识到一个问题,我这是U盘,不是 live 系统,里面的文件自然不全了。
于是我尝试先修复另一个系统,结果可以了。
然后进入那个系统,把boot目录全部拷贝过去。
重启选择这个系统,竟然进入的是新的系统。
手动设置分区
此时我意识到一个问题,我的这个旧的系统有三个分区:根分区, boot 分区, home 分区。
那一定有一个地方来储存这三个分区在那里储存,还真找到了。
执行这个命令
tiankonguse@tiankonguse:~$ sudo vi /etc/fstab
可以看到分区的挂载点
下面的是我修复完的内容
# /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # ## / was on /dev/sda1 during installation UUID=65a7fc16-a481-4f77-97b6-59731143f930 / ext4 errors=remount-ro 0 1 # swap was on /dev/sda12 during installation #UUID=7b08a45e-34f2-4ea2-900e-579c5a3bddca none swap sw 0 0 # swap was on /dev/sda6 during installation #UUID=99d228d4-f996-4970-ba48-f6950e3a0b69 none swap sw 0 0 # /home was on /dev/sda7 during installation UUID=aef790b3-32e8-4060-8542-bafeedcbac98 /home ext4 defaults 0 2
关于 UUID 可以使用上面提到的blkid来查询
tiankonguse@tiankonguse:~$ sudo blkid /dev/sda1: UUID="65a7fc16-a481-4f77-97b6-59731143f930" TYPE="ext4" /dev/sda5: LABEL="E" UUID="3816A47016A43134" TYPE="ntfs" /dev/sda6: UUID="aef790b3-32e8-4060-8542-bafeedcbac98" TYPE="ext4"
配置为自己需要的,旧的系统的home目录就挂到新的系统上去了。
按照这个方法,我把旧的系统挂载的/mnt上后,修改 /mnt/etc/fstab的内容,修改对应的项。
然后执行
sudo update-grub2
然后重启竟然好了。
好吧,最起码现在我可以进去 ubuntu12.10 系统了。
新系统的问题
等等,不是ubuntu12.04 系统吗?怎么变成 ubuntu12.10 了。
好吧,背景介绍不完整。
起初是 ubuntu12.04 系统,删除分区之前的那段时间,我使用命令行升级了一下,本以为会升级到 ubuntu14.04 的,谁知只是升级到 ubuntu12.10 了。
那个 grub 新问题也是这个新系统导致的。
进入新系统,第一感觉是好不爽。
分辨率竟然比较大,电脑竟然很卡。
好吧,我再次升级,应该会升级为 ubuntu13.04 吧。
于是我再次执行升级命令。
取消系统升级的问题
网速还是很给力的,需要的文件包很快就下载完了,但是安装的时候好慢好慢,记得我从 ubuntu12.04 升到 ubuntu12.10 用了好几个小时的,现在又中午了,于是我残忍的把那个窗口关闭了。
然后我关闭电脑睡午觉。
一觉醒来,电脑不能进入桌面了,登陆后屏幕一片黑,只有一个鼠标。
然后我使用 ctrl + alt + F1 进入终端,还好可以登陆。悲剧的是我执行了几条清理命令。
sudo apt-get autoremove sudo apt-get autoclean
再然后就出现了大量依赖的问题,幸好我之前有三篇关于依赖的记录。
安装软件时依赖冲突的万能解决方案
源的问题:下列的软件包有不能满足的依赖关系
各种解决方法:软件包没有被完全安装或卸载问题
按照那个方法依次尝试,都是失败。
然后我就尝试手动安装没有的依赖包。
于是先把错误信息导向文件
tiankonguse@tiankonguse:~$ sudo apt-get -f install > error 2>&1
然后找一台电脑,在 packages.ubuntu.com 上搜对应的包,然后存在U盘上。
然后用下面命令安装
sudo dpkg -i *.deb
对于依赖版本不对的,我就在 /var/lib/dpkg/status 把它们的版本修改为合适的值。
最后竟然提示没错了。
然后我升级一下安装了几个文件,终于可以进去桌面了。
回头是岸
实际上这个时候已经是第二天了。
我突然问自己,为什么执着与这个旧的系统,我有一个新的 ubuntu14.04 系统, 而且可以把 home 目录挂过来,我还想要什么呢?
我心里默默的说因为我安装了很多软件。
好吧,于是执行
dpkg --get-selections > installed-software.log
然后进入新的系统,果断的把旧的系统卸载了。
然后恢复备份
sudo dpkg --set-selections < ~/installed-software.log && apt-get dselect-upgrade
然后更新源,发现提示 NO_PUBKEY 。
然后找到对应的方法
简单的说只需要三步,假设key是C2518248EEA14886。
sudo gpg --keyserver keyserver.ubuntu.com --recv C2518248EEA14886 sudo gpg --export --armor C2518248EEA14886 | sudo apt-key add - sudo apt-get update
然后我倒入包的时候,竟然要卸载一些文件,我赶紧看看 installed-software.log ,发现有些是 deinstall , 于是我使用vi的替换替换了
:%s/deinstall/install/
导入的时候还提示
dpkg: warning: package not in database at line 1086: lynx
然后我在这里找到了方法
sudo apt-get install dselect $ sudo dselect -> Update -> Install