- Boot to the LiveCD Desktop (Ubuntu 9.10 or Ubuntu 10.04).
- Open a terminal – Applications, Accessories, Terminal.
- Determine your normal system partition – (the switch is a lowercase “L”) sudo fdisk -l
- If you aren’t sure, rundf -Th. Look for the correct disk size and ext3 or ext4 format.
- Mount your normal system partition:
- Substitute the correct partition: sda1, sdb5, etc.
sudo mount /dev/sdXX /mnt # Example: sudo mount /dev/sda1 /mnt
- Only if you have a separate boot partition:
- sdYY is the /boot partition designation (examply sdb3)
- sudo mount /dev/sdYY /mnt/boot
- Mount devices:sudo mount --bind /dev/ /mnt/dev
- To ensure that only the grub utilities from the LiveCD get executed, mount /usrsudo mount --bind /usr/ /mnt/usr
- mount proc filesystemsudo mount --bind /proc/ /mnt/proc
- Chroot into your normal system device:sudo chroot /mnt
- If there is no /boot/grub/grub.cfg or it’s not correct, create one usingupdate-grub
- Reinstall GRUB 2:
- Substitute the correct device – sda, sdb, etc. Do not specify a partition number.
grub-install /dev/sdX
- Verify the install (use the correct device, for example sda. Do not specify a partition): sudo grub-install --recheck /dev/sdX
- Exit chroot: CTRL-D on keyboard
- Unmount devices:sudo umount /mnt/dev
- If you mounted a separate /boot partition:sudo umount /mnt/boot
- Unmount last device:sudo umount /mnt
- Reboot.reboot
Post-Restoration Commands
Once the user can boot to a working system, try to determine why the system failed to boot. The following commands may prove useful in locating and/or fixing the problem.
To refresh the available devices and settings in /boot/grub/grub.cfg
- sudo update-grub
To look for the bootloader location.
- grub-probe -t device /boot/grub
To install GRUB 2 to the sdX partition’s MBR (sda, sdb, etc.)
- sudo grub-install /dev/sdX
To recheck the installation. (sda, sdb, etc.) sudo grub-install --recheck /dev/sdX
Please check the following link for further details.
https://help.ubuntu.com/community/Grub2#Reinstalling%20GRUB%202
之前在安装Ubuntu 9.10的时候,听说Ubuntu 9.10 采用了新的ext4 文件系统,于是就在安装时选择了,结果大部分的grub4dos版本都比较老,并不支持这个文件系统,网上也有人说最新的0.4.4版本好像是支持,但是都太过于复杂,不太适合于大多数人,弄不好还有可能使Windows 7无法引导,网上也有使用这个的方法,喜欢研究的朋友可以搞一下,写出来大家也一起分享一下。在网上也找了一些关于Ubuntu 9.04以前版本和Windows 7共存的方法,但是Ubuntu 9.10采用的grub是新版本的 grub2[启动时显示是1.97 beta],所以之前的方法已经不适用了。
相信安装过Ubuntu 9.10的朋友都有LiveCD的安装光盘,我们今天就用Ubuntu 9.10的LiveCD的来修复grub2的引导。启动Ubuntu 9.10光盘,选择LiveCD模式,进入之后选择进入终端,先在终端输入如下命令:
sudo fdisk -l (注意是小写的L,不是数字的1,此步用于确定电脑中安装 Ubuntu 9.10的所在分区的位置,输入以后会输出类似如下信息,找到ID为83的那行,记住/dev/sdaX的情况,比如本人的电脑是/dev /sda7,以下就以此为例,你自己的请加以更改)
Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x624aa2e0
Device Boot Start End Blocks Id System
/dev/sda1 * 1 1388 11149078+ 7 HPFS/NTFS
/dev/sda2 1389 3825 19575202+ 7 HPFS/NTFS
/dev/sda3 3826 9729 47423880 f W95 Ext'd (LBA)
/dev/sda5 3826 5851 16273813+ b W95 FAT32
/dev/sda6 5852 8323 19856308+ b W95 FAT32
/dev/sda7 8324 9598 10241406 83 Linux
/dev/sda8 9599 9729 1052226 82 Linux swap / Solaris
然后再输入
sudo -i (此步用于得到root权限,无需输入密码,方便以下操作)
接着输入mkdir /media/tempdir (这里用于创建一个文件夹tempdir,用于挂载刚才的sda7,此文件夹名称你可以依个人爱好而定,没有太多要求)
再输入 mount /dev/sda7 /media/tempdir (将sda7挂载于tempdir文件夹下)
下面进入了本次恢复最为关键和激动人心的时刻,在终端输入以下命令:
grub-install --root-directory=/media/tempdir /dev/sda (本步骤用于来重新安装grub2到硬盘的主引导记录【MBR】里面,十分关键!)
输入以后如果出现“Installation finished.No Error Reported.”字符的时候,就表示操作成功了。但是现在只成功的一半,还有以下操作才能够完全成功。
这时重新启动你的电脑,就能看到grub2的引导界面了,但是这时只能用来引导Ubuntu 9.10,还暂时无法引导Windows 7,这时选择进入Ubuntu 9.10,再找到并启动终端,在终端输入如下命令:
sudo update-grub2
按照提示输入密码,如果顺利的话,会出现如下类似语句,那就表示成功了。
grub.cfg ...
Found Debian background: moreblue-orbit-grub.png
Found linux image: /boot/vmlinuz-2.6.31-15-generic
Found initrd image: /boot/initrd.img-2.6.31-15-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Windows 7 (loader) on /dev/sda1
done
如果没有出现以上类似语句的话,那就在新立得里面搜索grub,可以安装带有Ubuntu标志的那个grub-pc,安装之后,再输入sudo update-grub2更新一下grub2就可以了。
Grub2配置详解(转)
一、grub.cfg详解(红色为说明) grub.cfg 默认为只读,要修改前先设为可写 sudo chmod +w /boot/grub/grub.cfg set default=0 #默认为0 insmod jpeg #添加jpg支持,如要使用png或tga文件做背景,加上 insmod png或insmod tga insmod ext2 #除了用作启动的分区外,其他分区格式可在menu底下再添加 set root=(hd0,7) #设定root分区 search --no-floppy --fs-uuid --set f255285a-5ad4-4eb8-93f5-4f767190d3b3 #设定uuid=****的分区为root,和上句重复,可删除 # 以下为终端配置 if loadfont /usr/share/grub/unicode.pf2 ; then #设置终端字体,unicode.pf2支持中文显示 set gfxmode=640x480 #设置分辨率,默认为 640x480,可用800x600,1024x768,建议跟你想设定的图片大小一致 insmod gfxterm #插入模块 gfxterm,支持中文显 示,它还支持 24 位图像 insmod vbe #插入 vbe 模块,GRUB 2 引入很多模块的东西,要使用它,需要在这里加入 if terminal_output gfxterm ; then true ; else # For backward compatibility with versions of terminal.mod that don't # understand terminal_output terminal gfxterm #设置 GRUB 2 终端为 gfxterm fi fi set timeout=10 background_image (hd0,7)/boot/images/1.jpg #设置背景图片 ### END /etc/grub.d/00_header ### ### BEGIN /etc/grub.d/05_debian_theme ### set menu_color_normal=white/black set menu_color_highlight=cyan/black #这两行为 Debian 下的菜单颜色设置,如果默认的话,你会发现背景完全被蓝色挡住了,你需要修改 blue 为 black,这样背景就会出现 ### END /etc/grub.d/05_debian_theme ### # 10_linux 为自动添加的当前root分区linux引导项 ### BEGIN /etc/grub.d/10_linux ### #菜单项,要包括 menuentry 双引号" " 和大括号 { }才完整,否则不显示菜单 menuentry "Ubuntu, Linux 2.6.31-9-386" { insmod ext2 set root=(hd0,7) search --no-floppy --fs-uuid --set f255285a-5ad4-4eb8-93f5-4f767190d3b3 #这句与set root=(hd0,7)重复,可删除 linux /boot/vmlinuz-2.6.31-9-386 root=UUID=f255285a-5ad4-4eb8-93f5-4f767190d3b3 ro quite splash #不喜欢看到一长串的, roo=UUID=***可用root=/dev/sda7代替 initrd /boot/initrd.img-2.6.31-9-386 } ### END /etc/grub.d/10_linux ### ### BEGIN /etc/grub.d/20_memtest86+ ### menuentry "Memory test (memtest86+)" { linux16 /boot/memtest86+.bin } ### END /etc/grub.d/20_memtest86+ ### # 自动添加存在于其他分区的系统引导项 ### BEGIN /etc/grub.d/30_os-prober ### #windows 启动菜单 menuentry "Windows Vista (loader) (on /dev/sda1)" { insmod ntfs #windows格式为ntfs,或为fat32改为 insmod fat set root=(hd0,1) search --no-floppy --fs-uuid --set ece067d2e067a196 #可删除 #grub2比较先进的地方就是如果发现windows启动是通过ntldr 引导的,定为2000/xp/2003,会在这加上 drivemap -s (hd0) ${root} ,作用相当于grub的map,可正常启动非第一硬盘的xp/2003系统。 chainloader +1 } # 查找到其他分区上的linux系统并自动添加 menuentry "Ubuntu karmic (development branch) (9.10) (on /dev/sda3)" { insmod ext2 set root=(hd0,3) search --no-floppy --fs-uuid --set 4d893970-0685-44ed-86b3-1de45b2db84a linux /boot/vmlinuz-2.6.31-9-generic root=/dev/sda3 initrd /boot/initrd.img-2.6.31-9-generic } #若存在macos会自动在这里添加。 ### END /etc/grub.d/30_os-prober ### # 以下为手动添加的菜单项 ### BEGIN /etc/grub.d/40_custom ### menuentry "CDLinux"{ set root=(hd0,8) linux /CDlinux/bzImage root=/dev/ram0 vga=791 CDL_LANG=zh_CN.UTF-8 initrd /CDlinux/initrd } ### END /etc/grub.d/40_custom ### # 手动添加时,硬盘编号从0开始(hd0),主分区编号从1开始(hd0,1),逻辑分区从5开始(hd0,5) 二、grub2终端部分命令介绍 在出现选择菜单时,按C进入终端命令行模式,按E进入当前菜单项编辑模式(和grub一样),编辑中按Ctrl + C退出,按Ctrl + X 以编辑内容启动。 1. help 查看命令用法,显示所有可用命令 help search search 命令用法 2. ls 列出当前的所有设备。如 (hd0) (hd0,1) (hd0,5) (hd1) (hd1,1) (hd1,2) ....... ls -l 详细列出当前的所有设备。对于分区,会显示其label及uuid。 ls / 列出当前设为root的分区下的文件 ls (hd1,1)/ 列出(hd1,1)分区下文件 3. search search -f /ntldr 列出根目录里包含ntldr文件的分区,返回为分区号 search -l LINUX 搜索label是LINUX的分区。 search --set -f /ntldr 搜索根目录包含ntldr文件的分区并设为root,注意如果多外分区含有ntldr文件,set 失去作用。 4. loopback loopback命令可用于建立回放设备,如 loopback lo0 (hd1,1)/abc.iso 可以使用lo0设备来访问abc.iso里的内容,比如说,可以从abc.iso里的软盘映像中启动 loopback lo0 (hd1,1)/aa.iso linux (lo0)/memdisk initrd (lo0)/abc.img 要删除某一回放设备,可以使用-d参数: loopback -d lo0 5. set 使用set可以设置变量的值 set root= set timeout= 需要调用变量的值时,使用${AA},如set root=(hd1,1) 则${root}=(hd1,1) 6. pager 分页显示。 set pager=1 满页时暂停,按space继续 set pager=0 取消分页 7. linux linux取代grub中的kernel 三、 单linux系统或 硬盘安装时iso放在C盘,umount /isodevice引起的误认为单系统 不能出现菜单项的几种处理方法。 1. 开机自检后时按几下shift键,可调出菜单项 2. sudo update-grub 重建grub.cfg,会发现新的系统而改写grub.cfg,一般能出现菜单项。 3.如第二种方法不能解决,直接修改grub.cfg 把在### BEGIN /etc/grub.d/30_os-prober 中的这一段 if keystatus; then if keystatus --shift; then set timeout=-1 else set timeout=0 fi else if sleep$verbose --interruptible 3 ; then set timeout=0 fi fi 删除或修改三处set timeout=<大于0> 四、双硬盘双系统 Grub Loading时间过长的解决方案 grub2的boot.img设定root的uuid从第一分区开始搜索分区的/boot/grub下的模块并加载, 如果linux分区处于第二硬盘甚至第三硬盘,会导致搜索时间过长而,出现菜单时间会长达10多秒。 对双(多)硬盘的情况建议把grub安装在ubuntu所在硬盘的mbr上,/boot分区或 / 分区 尽量靠前,并设该硬盘为启动盘,会大大缩短启动时间。 五、grub2几种修复方法 1. 双系统重装windows造成grub2被改写的修复 方法一 grub4dos0.4.4 在Windows启动项上加上grub4dos启动(不多说了,看置顶贴),重启选择进入grub,在命令行下输入(/boot单独分区的去掉 /boot) 代码: grub>find --set-root /boot/grub/core.img grub>kernel /boot/grub/core.img grub>boot 进入grub2菜单,进入系统后再执行 代码: sudo grub-install /dev/sd? 方法二 进入Livecd 后修复(感谢billbear) 引用: sudo -i mount 你的根分区 /mnt mount 你的/boot 分区 /mnt/boot #如果有的话 #挂载你其他的分区,如果有的话 # 重建grub到sda的mbr grub-install --root-directory=/mnt /dev/sda 2. 由于root分区uuid改变造成的不能正常启动,只能进入grub rescue模式的修复 代码: grub rescue>set grub rescue>prefix=(hd?,?)/grub grub rescue>root=hd?,? grub rescue>set root=hd?,? grub rescue>set prefix=(hd?,?)/boot/grub grub rescue>set grub rescue>root=hd?,? grub rescue>prefix=(hd?,?)/boot/grub grub rescue>insmod /boot/grub/normal.mod grub rescue>normal 这时就可以调出 /boot/grub/grub.cfg,修改相应uuid, 改到命令行下 grub>insmod /boot/grub/linux.mod grub>set root=hd?,? grub>linux /boot/vmlinuz-*** root=/dev/sd?? grub>initrd /boot/initrg.img-**** 进入系统 hd?,? 是grub文件所在分区 sda? 是/分区。 3. grub模块和配置文件grub.cfg受损无法启动时修复 Livcd启动进入试用 引用: sudo -i mount 你的根分区 /mnt mount 你的/boot 分区 /mnt/boot #如果有的话 # 挂载你其他的分区,如果有的话 # 重建grub到sda的mbr grub-install --root-directory=/mnt /dev/sda # 重建grub.cfg mount --bind /proc /mnt/proc mount --bind /dev /mnt/dev mount --bind /sys /mnt/sys chroot /mnt update-grub umount /mnt/sys umount /mnt/dev umount /mnt/proc 六、 一些补充说明 1. chainloader grub2将支持 chainloader /file 的用法。 目前支持的文件只有 grub2 的 boot.img 和 grub4dos 的grldr 和 grub.exe。希望正式版能支持 ntldr bootmgr peldr 等文件。 2. drivemap drivemap 兼容 grub 的 map,主要用于只能从 (hd0) 引导启动的系统如 win2000 xp 2003,可以象 map 用法一样如: menuentry "Windows XP" { insmod ntfs drivemap (hd0) (hd1) drivemap (hd1) (hd0) set root=(hd1,1) chainloader +1 } 实际上 drivemap 有了更方便的用法: menuentry "Windows XP" { insmod ntfs set root=(hd1,1) drivemap -s (hd0) ${root} chainloader +1 } 3. grub2 引导软盘img镜像启动 比如要加载(hd1,1)根目录下的 a.img 镜像,先把 memdisk 从 memdisk.gz 中解压出来,用法是: linux (hd1,1)/memdisk #镜像文件超过2.88M要加上 c=* h=* s=* initrd (hd1,1)/a.img boot 现在有bug,加载memdisk会自动重启,beta2还没修正。