2013-08-05
重装Windows7或重置MBR后修复Ubuntu的Grub2引导

之前在《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 ,所有工作完成。

Read More

2013-07-13
openSUSE Tumbleweed (Linux Kernel 3.10)安装Nvidia 显卡驱动

之前在《万恶的Windows 7 卡LOGO 及安全模式停顿在CLASSPNP.SYS 的侦错过程》中解决了Windows 7 的\Windows\system32\drivers\classpnp.sys 问题,最后是把openSUSE 的启动项给弄掉了,结果需要重新修复。经过一番折腾,终于是较为完美地解决了,谁知openSUSUE 无法进入桌面,表现的错误为:

X server died during startup. X server for display :0f cannot be started, session disable.

可能是某此使用的过程中,Tumbleweed 再次更新了kernel,结果没及时重新执行Nvidia 驱动的重新安装。本以为一切都像以前那样简单,事实上在重新安装Nvidia 的驱动时出现了错误:

ERROR: Unable to build the NVIDIA kernel module. ERROR: Installation has failed. Please see the file ‘/var/log/nvidia-installer.log’ for details. You may find suggestions on fixing installation problems in the README available on the Linux driver download page at www.nvidia.com.

查看日志:

cat /var/log/nvidia-installer.log

提示我尝试通过下面的步骤来解决:

cd /usr/src/linux
make oldconfig
make prepare

结果在make prepare 的时候出现错误,于是把kernel-source 给安装上去:

sudo zypper in kernel-source

然后make prepare 顺利通过了。重复执行Nvidia 显卡驱动的安装:

cd /usr/local/src
sh NVIDIA-Linux-x86_64-319.32.run

结果问题一样。无法,Google 之,发现这是Nvidia 驱动无法支持最新的linux 3.10 内核,所以安装过程出错!需要通过patch给驱动程序打补丁!

参考:

因为我的显卡为GT 520M,所以使用的最新Nvidia 驱动程序为NVIDIA-Linux-x86_64-319.32.run。补丁文件取自《Building nvidia driver on kernel 3.9.0》及《Mailinglist Archive: opensuse-factory (667 mails)》,文件名为:pastie-7942599.diff。然后给此驱动程序patch 上补丁:

  • 解压NVIDIA 驱动程序
  • patch -p1 <$PATCHFILE
  • 安装驱动程序

sh NVIDIA-Linux-x86_64-325.08.run –extract-only
patch -p1 <$PATCHFILE
./nvidia-installer

至此在linux 3.10 内核上安装NVIDIA 显卡驱动程序顺利完成,不过在中途依然提示一错误:

File ‘/usr/lib64/xorg/modules/extensions/libglx.so’ is not a symbolic link.

但我无视之。重启,机器正常使用中。附上操作系统信息:

ying@linux-uwkx:~> uname -r 3.10.0-16.g3dcd746-desktop

ying@linux-uwkx:~> cat /etc/issue Welcome to openSUSE 12.3 “Dartmouth” - Kernel \r (\l).

ying@linux-uwkx:~> cat /etc/lsb-release LSB_VERSION=”core-2.0-noarch:core-3.2-noarch:core-4.0-noarch:core-2.0-x86_64:core-3.2-x86_64:core-4.0-x86_64”


顺便记录下启动修复的过程:

重要工具:grub4dos-0.4.3 阅读GRUB4DOS and Windows Vista bcdedit 的使用说明,加入名称为“GRUB for DOS”的启动项,menu.lst 相关内容为:

title Install OpenSUSE root (hd0,5) kernel /OS/linux/opensuse/linux vga=791 initrd /OS/linux/opensuse/initrd boot

解压openSUSE-12.3-DVD-x86_64.iso 至一fat32 分区,即上面的(hd0,5) 中,文件夹名称为opensuse。 准备工作完成,重启计算机,启动进入“GRUB for DOS”,选择“Install OpenSUSE”,其实就是一个openSUSE 的硬盘安装操作! 进入后,出现三个选项,大概意思为:

  • 安装或者升级openSUSE
  • 启动已经安装的系统
  • 修复模式

当时选择启动已经安装的系统,发现在启动的过程中无法扫描 / root 分区的信息,错误为:

fsck failed with error code 4

估计是在《解决万恶的Windows 7 卡LOGO 及安全模式停顿在CLASSPNP.SYS 》修复硬盘坏道时变更了磁盘信息,而选择“启动已安装的系统”,根分区已经挂载,所以fsck 不能执行,所以自动修复失效(那个修复模式,需要登陆?却提示密码错误?不会使用) 修复思路就是卸载/,然后使用fsck修复 选择“安装或者升级openSUSE”,安装介质当然就是Hard Device(又忘了名字?),输入上面准备在(hd0,5) 中的opensuse 文件夹,进入openSUSE 的安装引导,结果花屏,继续无视,ctl+atl+fx 进入Terminal,用fdisk 及mount 找到root 分区,执行fsck 修复! 完成! 启动openSUSE,安装grub 至mbr?并更新启动信息写入/boot/grub2/grub.cfg

grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg

输出:

ying@linux-uwkx:~> sudo /usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg root’s password: Generating grub.cfg … Found theme: /boot/grub2/themes/openSUSE/theme.txt Found linux image: /boot/vmlinuz-3.10.0-16.g3dcd746-desktop Found initrd image: /boot/initrd-3.10.0-16.g3dcd746-desktop No volume groups found Found Windows 7 (loader) on /dev/sda1 done

终于,电脑的整体修复工作彻底Over!!这次真是幸好有Google 及 openSUSE Forum & NVIDIA Developer Forms 的各位朋友!另外,一些资源也必须通过代理才能取得,感谢GAE 《Linux下用goagent使用Google GAE代理》。

Read More