之前在《openSUSE Tumbleweed (Linux Kernel 3.10)安装Nvidia 显卡驱动》后面记录了openSUSE 引导的修复方法,今天将工作笔记本Windows 7 重装后,也需要修复原来的Ubuntu 引导,在修复过程中遇到不少问题,所以还是一如既往地写下本文作为备忘了。 习惯来说,在安装Windows7时,无论是32位还是64位,都独自分出一个512M的活动分区来存放启动管理器,因为这样不会那么容易导致在重装某一系统时格式化系统目录会完全丢失原来的引导信息。因为破坏了笔记本的分区表,Ubuntu 13.04 是首先通过刻入内存卡的live CD 再安装的,整个硬盘的分区也是在live cd下完成,但不是很熟悉linux 分区是对活动分区的处理,也不知道安装时到底有没有讲引导信息写入那个512M的分区,所以重启后无法进入系统,可能遗留了什么。 使用unetbootin 刻录了ubuntu 13.04 的镜像到TF卡,启动至live cd后,执行grub 的安装:

sudo mount /dev/sda7 /mnt
sudo mount /dev/sda8 /mnt/boot
sudo grub-install –boot-directory=/mnt /dev/sda

结果在最后一步“sudo grub-install –boot-directory=/mnt /dev/sda”中报错,具体就是个32 sector?这个有点困惑了,重启后进入grub 的维护界面,于是乎希望通过以下方式启动硬盘的ubuntu:

set root=(hd0,7)
set prefix=(hd0,8)/grub
insmod (hd0,8)/grub/i386-pc/normal.mod
normal

可是在“insmod (hd0,8)/grub/i386-pc/normal.mod”时,amd64的ubuntu是没有i386-pc这个目录的,normal.mod文件存放在x86_64-efi中,本以为“insmod (hd0,8)/grub/x86_64-efi/normal.mod”是正确的方法,结果报错。 常规修复无解,只能在live cd中通过安装boot-repair修复之。 然后继续通过Win PE安装装Windows7后,这个时候貌似windows 将其引导写入了MBR,启动管理器也是win7自带的,所以就需要重新修复Ubuntu 的引导了。 很奇怪,Win7 的bcdedit 在增加了GRUB4DOS 的启动项后重启就失效了,不知道是不是对那个512M的活动分区处理不正确的或者是上面的boot-repair原因,为了保护该分区,当时没有隐藏该分区,而是直接删除了卷标,因为在DiskGenius隐藏该分区或者取消该分区的隐藏都会导致分区表的变更,担心会导致以后Ubuntu的启动会被破坏,所以就仅仅是通过删除卷标来保护该分区,同时在Windows 下管理该分区也仅需要加上卷标就可以了,虽然DiskGenius也是可以直接操作这些分区的文件。 既然无法手动通过bcdedit 正确修改系统的引导信息,那就只能找工具了,easybcd是个不错的玩意,但很奇怪的是easybcd读取系统的bcd信息与bcdedit获取出来的是完全一致的,当然通过bcdedit 添加的启动项也在重启后莫名其妙地失效了。不过easybcd有个不错的功能,可以手动选择bcd文件进行编辑,那就直接加载那个放在512M活动分区的bcd文件了,路径:/boot/bcd,此时读取出来的启动信息仅有Windows 7一项,应该是正常了。随便添加一个GRUB 启动项,重启后在启动选择界面也显示出来了。后来干脆那512M的活动分区加上卷标,再阅读GRUB4DOS的README文档,手动通过bcdedit 创建了“GRUB 4 DOS”的启动项,相关文件也就是grldr grldr.mbr menu.lst一起放置在512M活动分区中,menu.lst 也在原基础上添加上Ubuntu 13.04 live CD 的相关信息:

title Install Ubuntu root (hd0,2) kernel (hd0,2)/Fuying/OS/linux/ubuntu/vmlinuz boot=casper iso-scan/filename=/Fuying/OS/linux/ubuntu/ubuntu-13.04-desktop-amd64.iso ro quiet splash locale=zh_CN.UTF-8 initrd (hd0,2)/Fuying/OS/linux/ubuntu/initrd.lz

具体这个 (hd0,2) 可以在GRUB 4 DOS 中,进入grub> 随便输入:root (hd0, 然后按tab键来查看所有分区信息。 很奇怪的是硬盘启动Ubuntu 13.04 live cd 会死在initramfs,百科后得知可能是硬件的各方面问题,估计无解,唯有将Grub 写入内存卡(穷~没有U盘,拿个TF卡代替了),同样加入grldr grldr.mbr menu.lst ubuntu-13.04-desktop-amd64.iso 文件及修改了menu.lst,这样才可以正常进入Ubuntu Live CD。 进入了desktop ,剩下的工作就干脆很多了。 gnome-terminal 执行:

sudo mount /dev/sda7 /mnt
sudo mount /dev/sda8 /mnt/boot
sudo grub-install –boot-directory=/mnt /dev/sda

因为在安装Ubuntu时,使用了boot 分区,所以上面需要同时挂载/boot 但是不能使用update-grub,可能是在live cd中的缘故,重启后意料之中地进入了grub 维护界面,然后开始进入硬盘中的ubuntu:

set root=(hd0,7)
set prefix=(hd0,8)/grub
insmod (hd0,8)/grub/i386-pc/normal.mod
normal

这里很奇怪,因为是64位的ubuntu,上面提到,与32位“insmod (hd0,8)/grub/i386-pc/normal.mod”不同的是64位为“insmod (hd0,8)/grub/x86_64-efi/normal.mod”,但这个时候却变成了i386-pc,所以执行过程无报错,并且熟悉的grub2 引导界面出现了,或许是boot-repair作了更改。进入ubuntu后执行update-grub ,所有工作完成。

Comments

2013-08-05