admin管理员组

文章数量:1531792

实验室一台Intel服务器上安装了3个子系统: windows, Ubuntu LINUX 和 Ubuntu Wubi 伪LINUX系统。Linux系统下安装了hadoop集群。这几天实验室服务器重装了Windows 7(Win7),结果LINUX启动菜单项全部丢失。只能进入Win7,无法进入Linux hadoop。
由于是两个Ubuntu Linux系统启动菜单项丢失,所以 恢复起来麻烦了很多。最后的恢复竟然如此简单:easybcd + linux命令(grub-mkconfig -o grub.cfg)。
难度大一点的方法是: 安装grub4dos在C:\盘,然后编辑启动菜单menu.lst。可参照menu.lst样本,修改下。这是个可行的方法。或者 安装 grub2win在C:\盘,然后编辑C:\grub\grub.cfg。menu.lst是grub 1的配置文件,grub.cfg是grub 2的配置文件。有一个比较大的命令差别,grub 1的分区号从0开始。例如:(hd0,8)是第一块硬盘(hd0)的9号分区,等价于 grub 2 的 (hd0,msdos9)或(hd0,9)。
grub4dos与Grub2Win是一个将Linux下的GNU GRUB启动引导程序移植到dos和windows的一个分支,是一个大幅度提高了软件和硬件兼容性的启动引导程序。后面再说。
安装了多操作系统(Win,Linux)的电脑启动时候,会出现启动菜单项,这个菜单项是由引导器加载的。
Windows的引导器是 ntloader(WinNT,Win2K,XP), bootmgr(Win7)。
Linux的引导器Lilo, grub, grub2。Lilo是远古时代的主流引导器,现在是grub2时代了。
其他Unix(Solaris, AIX, HP-UX, IRIX, SCO UNIX等)各有法宝引导系统。
grub 是一个来自GNU项目的多操作系统启动程序。允许用户在计算机启动时选择希望运行的操作系统。grub 可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
grub比较中立,可引导启动Windows与Linux。
磁盘分区情况: -------------------------------------------------- C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: | -------------------------------------------------- 第一主分区安装Win7,第二(Swap)、第三(Linux / ext4类型)主分区安装 ubuntu Linux(kernel 3.5), 剩下三个分区D:/E:/F:是Win7逻辑分区。
其中,E:\ubuntu\用wubi安装了第2个Ubuntu Linux系统(kernel 3.2)。这其实是一个伪Linux系统,linux被安装在Win7 NTFS盘内。当进入伪linux后,E:\ubuntu\disks\root.disk被加载为/分区,swap.disk被加载为交换分区,即虚存。
一、假若我的Ubuntu 伪Linux安装在E:\ubuntu, 如何恢复?
1. 最简单的方法如下(easybcd): (1)拷贝 E:/ubuntu/winboot/下的 wubidr和wubidr.mbr文件拷到C:\ 这2个文件是 ubuntu wubi引导ubuntu linux的引导器。
(2)添加Win7启动菜单项 Ubuntu Linux: easybcd 是一个方便的 Windows7 的启动菜单编辑器程序,Win7 自带的是 bcdedit指令, 在命令提示符窗口 操作比较麻烦: ========================================================= a. 创建菜单项, 得到菜单项id: bcdedit /create /d "Ubuntu Linux" /application bootsector
会有回显,类似如下格式: 项 {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} 成功创建。 5aaafed3-e895-11e2-a7a0-80bcca81b8b7 是我的菜单项 id。
b. 设置菜单项内容: bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} device partition=E: bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} path \ubuntu\winboot\wubildr.mbr bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} description "Ubuntu Linux" bcdedit /displayorder {id} /addlast
这里,wubildr.mbr 是Ubuntu wubi引导器。新加的菜单项放在最后一条(/addlast)。
(上述bcdedit命令必须以管理员身份执行,否则报错) (太复杂了。改用如下的easybcd) =========================================================
安装easybcd 中文版,添加多个启动菜单项(grub,grub2),图形操作,完全傻瓜式,无需键入 bededit 指令去添加。上述bcdedit指令太复杂,用easybcd吧。一次添加2个Ubuntu的启动菜单。

二、恢复了一个linux,假若还想恢复第二个linux呢? 或者,我想看看系统是怎么写启动菜单项的(grub menu.lst或grub2 grub.cfg)?
grub 工作目录是 /boot/grub
在linux下执行: grub-mkconfig -o grub.cfg 该命令会自动侦测系统的其他linux系统,加入菜单项, -o 生成grub菜单文件。
当然,先把原先的grub.cfg备份一份: cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak grub-mkconfig -o /boot/grub/grub.cfg
重启系统,发现多了几个菜单。
其关键的菜单项是怎么写的?对于书写你的 grub menu.lst(grub4dos menu.lst) 或 grub2 grub.cfg有帮助。
1. 我的Ubuntu 伪Linux 安装在E:\ubuntu(kernel 3.2) E:盘是Win7 NTFS格式。该伪linux如何工作?首先,linux会把root.disk文件加载为根分区(/ ext4格式)。就像加载iso光盘一样(loopback)。
E:\ubuntu\disk\root.disk 怎么能找到呢?- 通过 分区卷标Label 或者 文件号uuid 找到。如:我的E:盘 Label是 DataLab, uuid是 6CE8A383E8A34A62, grub分区是 (hd0,msdos7)。第一个硬盘hd0的第七个分区msdos7。 磁盘分区情况: -------------------------------------------------- C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: | -------------------------------------------------- msdos1msdos5 msdos9 msdos6msdos7msdos8 这是我的 分区。你的呢?
search 查询语句语法: search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy] name
search --fs-uuid 6CE8A383E8A34A62 或者 search --label DataLab
--set root 意思是设置查询起点/
--no-floppy 表示不去检索软驱。
分区不记得了,咋办?一个个去试探。进入grub命令行。 insmod ntfs# 安装win ntfs模块 ls# 查看所有硬盘和分区 ls (hd0,x)/# x是安装linux分区号, msdosx也行 ls (hd0,7)/# 查看7号分区文件,msdos7也行 ls (hd0,7)# 查看7号分区: uuid, lable
找到了你的ubuntu linux?是的: (hd0,7)。hd0表示第一块硬盘。 set root=(hd0,7)# 7 是 ubuntu分区号, 我的E:盘 search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 #这里的 uuid是 E:盘的 uuid = 6CE8A383E8A34A62
有童鞋问,干嘛不直接说 E:盘?set root=E:?E:盘是Windows的标记,Unix或Linux没有这一说。就像武汉人说吃早餐为:过早,其他地方可不懂什么是过早了。广东人说 喝早茶。可不是吃早餐就喝一点茶水喔^_^
我的电脑里,(hd0,7) 就是 第一块硬盘的E:盘。当然,这台入门级服务器只有一块sata硬盘。
### 设置启动菜单项 /etc/grub.d/10_lupin ### # 这里面是 grub命令喔 insmod part_msdos insmod ntfs set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7 initrd /boot/initrd.img-3.2.0-29-generic-pae
loopback loop0 /ubuntu/disks/root.disk 是加载 e:\ubuntu\disks\root.disk文件。就像iso光盘镜像一样加载。
注意:unix/linux是没有盘符的(e:), 盘符e:是windows的标记。目录分隔符也不同,unix/linux是/, windows是\。
set root=(loop0)# 重设root 加载后 作为 linux系统的/根分区。就像C:\(windows)。
linux /boot/vmlinuz-3.2.0 ... 加载内核vmlinuz initrd /boot/initrd.img-3.2.0 ... 加载初始化ramdisk
这里,比较有趣的是(加载内核,指定根分区): (就像我的Win7指定C:盘是系统启动盘,C:\是Win7系统根\分区) linux /boot/vmlinuz-3.2.0 ... root=UUID=6CE8A383E8A34A62 ...
通常是: linux /boot/vmlinuz-3.2.0 ... root=/dev/sda7 ...
有点晕?我画图说明: 磁盘分区情况: -------------------------------------------------- C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: | -------------------------------------------------- msdos1msdos5 msdos9 msdos6msdos7msdos8 这是我的 分区。 Windows是用盘符C: D: E: F:指定每个win分区,无法标记linux分区。
linux用符号表示分区设备(sda - scsi硬盘, hda - ide硬盘): C:- sda1 D: - sda6 E: - sda7, uuid = 6CE8A383E8A34A62 F:- sda8 Swap交换分区 - sda5 Linux分区 - sda9
grub用(hdn,x)符号表示分区设备: C:- (hd0,1) D: - (hd0,6) E: - (hd0,7), uuid = 6CE8A383E8A34A62 F:- (hd0,8) Swap交换分区 - (hd0,5) Linux分区 - (hd0,9) 上述,这是我的 分区。
当遇到故障,进入grub命令行,无法启动时,可输入上述命令: insmod part_msdos insmod ntfs set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7 initrd /boot/initrd.img-3.2.0-29-generic-pae boot
回车后 可以进入linux系统了,修复grub引导文件: update-grub2 reboot
或者 生成新的 正确的 grub.cfg。 当然,先把原先的grub.cfg备份一份: cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak grub-mkconfig -o /boot/grub/grub.cfg
重启系统,发现多了几个菜单。
再看下 分区下安装linux的情况。 ### 设置启动菜单项 /etc/grub.d/30_os-prober ### # 这里面是 grub命令喔 insmod part_msdos insmod ext2 set root='(hd0,msdos9)' search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff initrd /boot/initrd.img-3.5.0-26-generic
其中 有一句也可改写为: linux /boot/vmlinuz-3.5.0-26-generic root=/dev/sda9 ro quiet splash $vt_handoff

弄清楚了吗?
那么,如果用grub4dos(windows版本的grub),先把grub4dos安装于C:\下,简单。然后修改 C:\menu.lst,也不难了(Win7 bootmgr作主引导器): default 0 timeout 10
title Ubuntu hadoop AS (3.5.0-23-generic) set root='(hd0,msdos9)' search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff initrd /boot/initrd.img-3.5.0-26-generic
title Ubuntu hadoop AS (3.2.0-29-generic) set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7 initrd /boot/initrd.img-3.2.0-29-generic-pae
grub2使用grub.cfg替代 grub menu.lst。但会用menu.lst的符号链接(类似Win7的快捷方式)指向grub.cfg。



实验室一台Intel服务器上安装了3个子系统: windows, Ubuntu LINUX 和 Ubuntu Wubi 伪LINUX系统。Linux系统下安装了hadoop集群。这几天实验室服务器重装了Windows 7(Win7),结果LINUX启动菜单项全部丢失。只能进入Win7,无法进入Linux hadoop。
由于是两个Ubuntu Linux系统启动菜单项丢失,所以 恢复起来麻烦了很多。最后的恢复竟然如此简单:easybcd + linux命令(grub-mkconfig -o grub.cfg)。
难度大一点的方法是: 安装grub4dos在C:\盘,然后编辑启动菜单menu.lst。可参照menu.lst样本,修改下。这是个可行的方法。或者 安装 grub2win在C:\盘,然后编辑C:\grub2\grub.cfg。menu.lst是grub 1的配置文件,grub.cfg是grub 2的配置文件。有一个比较大的命令差别,grub 1的分区号从0开始。例如:(hd0,8)是第一块硬盘(hd0)的9号分区,等价于 grub 2 的 (hd0,msdos9)或(hd0,9)。
grub4dos是一个将Linux下的GNU GRUB启动引导程序移植到dos和windows的一个分支,是一个大幅度提高了软件和硬件兼容性的启动引导程序。后面再说。
安装了多操作系统(Win,Linux)的电脑启动时候,会出现启动菜单项,这个菜单项是由引导器加载的。
Windows的引导器是 ntloader(WinNT,Win2K,XP), bootmgr(Win7)。
Linux的引导器Lilo, grub, grub2。Lilo是远古时代的主流引导器,现在是grub2时代了。
其他Unix(Solaris, AIX, HP-UX, IRIX, SCO UNIX等)各有法宝引导系统。
grub 是一个来自GNU项目的多操作系统启动程序。允许用户在计算机启动时选择希望运行的操作系统。grub 可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
grub比较中立,可引导启动Windows与Linux。
磁盘分区情况: -------------------------------------------------- C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: | -------------------------------------------------- 第一主分区安装Win7,第二(Swap)、第三(Linux / ext4类型)主分区安装 ubuntu Linux(kernel 3.5), 剩下三个分区D:/E:/F:是Win7逻辑分区。
其中,E:\ubuntu\用wubi安装了第2个Ubuntu Linux系统(kernel 3.2)。这其实是一个伪Linux系统,linux被安装在Win7 NTFS盘内。当进入伪linux后,E:\ubuntu\disks\root.disk被加载为/分区,swap.disk被加载为交换分区,即虚存。
一、假若我的Ubuntu 伪Linux安装在E:\ubuntu, 如何恢复?
1. 最简单的方法如下(easybcd): (1)拷贝 E:/ubuntu/winboot/下的 wubidr和wubidr.mbr文件拷到C:\ 这2个文件是 ubuntu wubi引导ubuntu linux的引导器。
(2)添加Win7启动菜单项 Ubuntu Linux: easybcd 是一个方便的 Windows7 的启动菜单编辑器程序,Win7 自带的是 bcdedit指令, 在命令提示符窗口 操作比较麻烦: ========================================================= a. 创建菜单项, 得到菜单项id: bcdedit /create /d "Ubuntu Linux" /application bootsector
会有回显,类似如下格式: 项 {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} 成功创建。 5aaafed3-e895-11e2-a7a0-80bcca81b8b7 是我的菜单项 id。
b. 设置菜单项内容: bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} device partition=E: bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} path \ubuntu\winboot\wubildr.mbr bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} description "Ubuntu Linux" bcdedit /displayorder {id} /addlast
这里,wubildr.mbr 是Ubuntu wubi引导器。新加的菜单项放在最后一条(/addlast)。
(上述bcdedit命令必须以管理员身份执行,否则报错) (太复杂了。改用如下的easybcd) =========================================================
安装easybcd 中文版,添加多个启动菜单项(grub,grub2),图形操作,完全傻瓜式,无需键入 bededit 指令去添加。上述bcdedit指令太复杂,用easybcd吧。一次添加2个Ubuntu的启动菜单。

二、恢复了一个linux,假若还想恢复第二个linux呢? 或者,我想看看系统是怎么写启动菜单项的(grub menu.lst或grub2 grub.cfg)?
grub 工作目录是 /boot/grub
在linux下执行: grub-mkconfig -o grub.cfg 该命令会自动侦测系统的其他linux系统,加入菜单项, -o 生成grub菜单文件。
当然,先把原先的grub.cfg备份一份: cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak grub-mkconfig -o /boot/grub/grub.cfg
重启系统,发现多了几个菜单。
其关键的菜单项是怎么写的?对于书写你的 grub menu.lst(grub4dos menu.lst) 或 grub2 grub.cfg有帮助。
1. 我的Ubuntu 伪Linux 安装在E:\ubuntu(kernel 3.2) E:盘是Win7 NTFS格式。该伪linux如何工作?首先,linux会把root.disk文件加载为根分区(/ ext4格式)。就像加载iso光盘一样(loopback)。
E:\ubuntu\disk\root.disk 怎么能找到呢?- 通过 分区卷标Label 或者 文件号uuid 找到。如:我的E:盘 Label是 DataLab, uuid是 6CE8A383E8A34A62, grub分区是 (hd0,msdos7)。第一个硬盘hd0的第七个分区msdos7。 磁盘分区情况: -------------------------------------------------- C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: | -------------------------------------------------- msdos1msdos5 msdos9 msdos6msdos7msdos8 这是我的 分区。你的呢?
search 查询语句语法: search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy] name
search --fs-uuid 6CE8A383E8A34A62 或者 search --label DataLab
--set root 意思是设置查询起点/
--no-floppy 表示不去检索软驱。
分区不记得了,咋办?一个个去试探。进入grub命令行。 insmod ntfs# 安装win ntfs模块 ls# 查看所有硬盘和分区 ls (hd0,x)/# x是安装linux分区号, msdosx也行 ls (hd0,7)/# 查看7号分区文件,msdos7也行 ls (hd0,7)# 查看7号分区: uuid, lable
找到了你的ubuntu linux?是的: (hd0,7)。hd0表示第一块硬盘。 set root=(hd0,7)# 7 是 ubuntu分区号, 我的E:盘 search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 #这里的 uuid是 E:盘的 uuid = 6CE8A383E8A34A62
有童鞋问,干嘛不直接说 E:盘?set root=E:?E:盘是Windows的标记,Unix或Linux没有这一说。就像武汉人说吃早餐为:过早,其他地方可不懂什么是过早了。广东人说 喝早茶。可不是吃早餐就喝一点茶水喔^_^
我的电脑里,(hd0,7) 就是 第一块硬盘的E:盘。当然,这台入门级服务器只有一块sata硬盘。
### 设置启动菜单项 /etc/grub.d/10_lupin ### # 这里面是 grub命令喔 insmod part_msdos insmod ntfs set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7 initrd /boot/initrd.img-3.2.0-29-generic-pae
loopback loop0 /ubuntu/disks/root.disk 是加载 e:\ubuntu\disks\root.disk文件。就像iso光盘镜像一样加载。
注意:unix/linux是没有盘符的(e:), 盘符e:是windows的标记。目录分隔符也不同,unix/linux是/, windows是\。
set root=(loop0)# 重设root 加载后 作为 linux系统的/根分区。就像C:\(windows)。
linux /boot/vmlinuz-3.2.0 ... 加载内核vmlinuz initrd /boot/initrd.img-3.2.0 ... 加载初始化ramdisk
这里,比较有趣的是(加载内核,指定根分区): (就像我的Win7指定C:盘是系统启动盘,C:\是Win7系统根\分区) linux /boot/vmlinuz-3.2.0 ... root=UUID=6CE8A383E8A34A62 ...
通常是: linux /boot/vmlinuz-3.2.0 ... root=/dev/sda7 ...
有点晕?我画图说明: 磁盘分区情况: -------------------------------------------------- C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: | -------------------------------------------------- msdos1msdos5 msdos9 msdos6msdos7msdos8 这是我的 分区。 Windows是用盘符C: D: E: F:指定每个win分区,无法标记linux分区。
linux用符号表示分区设备(sda - scsi硬盘, hda - ide硬盘): C:- sda1 D: - sda6 E: - sda7, uuid = 6CE8A383E8A34A62 F:- sda8 Swap交换分区 - sda5 Linux分区 - sda9
grub用(hdn,x)符号表示分区设备: C:- (hd0,1) D: - (hd0,6) E: - (hd0,7), uuid = 6CE8A383E8A34A62 F:- (hd0,8) Swap交换分区 - (hd0,5) Linux分区 - (hd0,9) 上述,这是我的 分区。
当遇到故障,进入grub命令行,无法启动时,可输入上述命令: insmod part_msdos insmod ntfs set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7 initrd /boot/initrd.img-3.2.0-29-generic-pae boot
回车后 可以进入linux系统了,修复grub引导文件: update-grub2 reboot
或者 生成新的 正确的 grub.cfg。 当然,先把原先的grub.cfg备份一份: cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak grub-mkconfig -o /boot/grub/grub.cfg
重启系统,发现多了几个菜单。
再看下 分区下安装linux的情况。 ### 设置启动菜单项 /etc/grub.d/30_os-prober ### # 这里面是 grub命令喔 insmod part_msdos insmod ext2 set root='(hd0,msdos9)' search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff initrd /boot/initrd.img-3.5.0-26-generic
其中 有一句也可改写为: linux /boot/vmlinuz-3.5.0-26-generic root=/dev/sda9 ro quiet splash $vt_handoff

弄清楚了吗?
那么,如果用grub4dos(windows版本的grub),先把grub4dos安装于C:\下,简单。然后修改 C:\menu.lst,或者,安装 grub2Win于C:\下,修改C:\grub2\grub.cfg,也不难了(Win7 bootmgr作主引导器 如下是grub2 语法): default 0 timeout 10
title Ubuntu hadoop AS (3.5.0-23-generic) set root='(hd0,msdos9)' search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff initrd /boot/initrd.img-3.5.0-26-generic
title Ubuntu hadoop AS (3.2.0-29-generic) set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7 initrd /boot/initrd.img-3.2.0-29-generic-pae
grub2使用grub.cfg替代 grub menu.lst。但会用menu.lst的符号链接(类似Win7的快捷方式)指向grub.cfg。
实验室一台Intel服务器上安装了3个子系统: windows, Ubuntu LINUX 和 Ubuntu Wubi 伪LINUX系统。Linux系统下安装了hadoop集群。这几天实验室服务器重装了Windows 7(Win7),结果LINUX启动菜单项全部丢失。只能进入Win7,无法进入Linux hadoop。
由于是两个Ubuntu Linux系统启动菜单项丢失,所以 恢复起来麻烦了很多。最后的恢复竟然如此简单:easybcd + linux命令(grub-mkconfig -o grub.cfg)。
难度大一点的方法是: 安装grub4dos在C:\盘,然后编辑启动菜单menu.lst。可参照menu.lst样本,修改下。这是个可行的方法。或者 安装 grub2win在C:\盘,然后编辑C:\grub2\grub.cfg。menu.lst是grub 1的配置文件,grub.cfg是grub 2的配置文件。有一个比较大的命令差别,grub 1的分区号从0开始。例如:(hd0,8)是第一块硬盘(hd0)的9号分区,等价于 grub 2 的 (hd0,msdos9)或(hd0,9)。
grub4dos是一个将Linux下的GNU GRUB启动引导程序移植到dos和windows的一个分支,是一个大幅度提高了软件和硬件兼容性的启动引导程序。后面再说。
安装了多操作系统(Win,Linux)的电脑启动时候,会出现启动菜单项,这个菜单项是由引导器加载的。
Windows的引导器是 ntloader(WinNT,Win2K,XP), bootmgr(Win7)。
Linux的引导器Lilo, grub, grub2。Lilo是远古时代的主流引导器,现在是grub2时代了。
其他Unix(Solaris, AIX, HP-UX, IRIX, SCO UNIX等)各有法宝引导系统。
grub 是一个来自GNU项目的多操作系统启动程序。允许用户在计算机启动时选择希望运行的操作系统。grub 可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
grub比较中立,可引导启动Windows与Linux。
磁盘分区情况: -------------------------------------------------- C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: | -------------------------------------------------- 第一主分区安装Win7,第二(Swap)、第三(Linux / ext4类型)主分区安装 ubuntu Linux(kernel 3.5), 剩下三个分区D:/E:/F:是Win7逻辑分区。
其中,E:\ubuntu\用wubi安装了第2个Ubuntu Linux系统(kernel 3.2)。这其实是一个伪Linux系统,linux被安装在Win7 NTFS盘内。当进入伪linux后,E:\ubuntu\disks\root.disk被加载为/分区,swap.disk被加载为交换分区,即虚存。
一、假若我的Ubuntu 伪Linux安装在E:\ubuntu, 如何恢复?
1. 最简单的方法如下(easybcd): (1)拷贝 E:/ubuntu/winboot/下的 wubidr和wubidr.mbr文件拷到C:\ 这2个文件是 ubuntu wubi引导ubuntu linux的引导器。
(2)添加Win7启动菜单项 Ubuntu Linux: easybcd 是一个方便的 Windows7 的启动菜单编辑器程序,Win7 自带的是 bcdedit指令, 在命令提示符窗口 操作比较麻烦: ========================================================= a. 创建菜单项, 得到菜单项id: bcdedit /create /d "Ubuntu Linux" /application bootsector
会有回显,类似如下格式: 项 {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} 成功创建。 5aaafed3-e895-11e2-a7a0-80bcca81b8b7 是我的菜单项 id。
b. 设置菜单项内容: bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} device partition=E: bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} path \ubuntu\winboot\wubildr.mbr bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} description "Ubuntu Linux" bcdedit /displayorder {id} /addlast
这里,wubildr.mbr 是Ubuntu wubi引导器。新加的菜单项放在最后一条(/addlast)。
(上述bcdedit命令必须以管理员身份执行,否则报错) (太复杂了。改用如下的easybcd) =========================================================
安装easybcd 中文版,添加多个启动菜单项(grub,grub2),图形操作,完全傻瓜式,无需键入 bededit 指令去添加。上述bcdedit指令太复杂,用easybcd吧。一次添加2个Ubuntu的启动菜单。

二、恢复了一个linux,假若还想恢复第二个linux呢? 或者,我想看看系统是怎么写启动菜单项的(grub menu.lst或grub2 grub.cfg)?
grub 工作目录是 /boot/grub
在linux下执行: grub-mkconfig -o grub.cfg 该命令会自动侦测系统的其他linux系统,加入菜单项, -o 生成grub菜单文件。
当然,先把原先的grub.cfg备份一份: cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak grub-mkconfig -o /boot/grub/grub.cfg
重启系统,发现多了几个菜单。
其关键的菜单项是怎么写的?对于书写你的 grub menu.lst(grub4dos menu.lst) 或 grub2 grub.cfg有帮助。
1. 我的Ubuntu 伪Linux 安装在E:\ubuntu(kernel 3.2) E:盘是Win7 NTFS格式。该伪linux如何工作?首先,linux会把root.disk文件加载为根分区(/ ext4格式)。就像加载iso光盘一样(loopback)。
E:\ubuntu\disk\root.disk 怎么能找到呢?- 通过 分区卷标Label 或者 文件号uuid 找到。如:我的E:盘 Label是 DataLab, uuid是 6CE8A383E8A34A62, grub分区是 (hd0,msdos7)。第一个硬盘hd0的第七个分区msdos7。 磁盘分区情况: -------------------------------------------------- C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: | -------------------------------------------------- msdos1msdos5 msdos9 msdos6msdos7msdos8 这是我的 分区。你的呢?
search 查询语句语法: search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy] name
search --fs-uuid 6CE8A383E8A34A62 或者 search --label DataLab
--set root 意思是设置查询起点/
--no-floppy 表示不去检索软驱。
分区不记得了,咋办?一个个去试探。进入grub命令行。 insmod ntfs# 安装win ntfs模块 ls# 查看所有硬盘和分区 ls (hd0,x)/# x是安装linux分区号, msdosx也行 ls (hd0,7)/# 查看7号分区文件,msdos7也行 ls (hd0,7)# 查看7号分区: uuid, lable
找到了你的ubuntu linux?是的: (hd0,7)。hd0表示第一块硬盘。 set root=(hd0,7)# 7 是 ubuntu分区号, 我的E:盘 search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 #这里的 uuid是 E:盘的 uuid = 6CE8A383E8A34A62
有童鞋问,干嘛不直接说 E:盘?set root=E:?E:盘是Windows的标记,Unix或Linux没有这一说。就像武汉人说吃早餐为:过早,其他地方可不懂什么是过早了。广东人说 喝早茶。可不是吃早餐就喝一点茶水喔^_^
我的电脑里,(hd0,7) 就是 第一块硬盘的E:盘。当然,这台入门级服务器只有一块sata硬盘。
### 设置启动菜单项 /etc/grub.d/10_lupin ### # 这里面是 grub命令喔 insmod part_msdos insmod ntfs set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7 initrd /boot/initrd.img-3.2.0-29-generic-pae
loopback loop0 /ubuntu/disks/root.disk 是加载 e:\ubuntu\disks\root.disk文件。就像iso光盘镜像一样加载。
注意:unix/linux是没有盘符的(e:), 盘符e:是windows的标记。目录分隔符也不同,unix/linux是/, windows是\。
set root=(loop0)# 重设root 加载后 作为 linux系统的/根分区。就像C:\(windows)。
linux /boot/vmlinuz-3.2.0 ... 加载内核vmlinuz initrd /boot/initrd.img-3.2.0 ... 加载初始化ramdisk
这里,比较有趣的是(加载内核,指定根分区): (就像我的Win7指定C:盘是系统启动盘,C:\是Win7系统根\分区) linux /boot/vmlinuz-3.2.0 ... root=UUID=6CE8A383E8A34A62 ...
通常是: linux /boot/vmlinuz-3.2.0 ... root=/dev/sda7 ...
有点晕?我画图说明: 磁盘分区情况: -------------------------------------------------- C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: | -------------------------------------------------- msdos1msdos5 msdos9 msdos6msdos7msdos8 这是我的 分区。 Windows是用盘符C: D: E: F:指定每个win分区,无法标记linux分区。
linux用符号表示分区设备(sda - scsi硬盘, hda - ide硬盘): C:- sda1 D: - sda6 E: - sda7, uuid = 6CE8A383E8A34A62 F:- sda8 Swap交换分区 - sda5 Linux分区 - sda9
grub用(hdn,x)符号表示分区设备: C:- (hd0,1) D: - (hd0,6) E: - (hd0,7), uuid = 6CE8A383E8A34A62 F:- (hd0,8) Swap交换分区 - (hd0,5) Linux分区 - (hd0,9) 上述,这是我的 分区。
当遇到故障,进入grub命令行,无法启动时,可输入上述命令: insmod part_msdos insmod ntfs set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7 initrd /boot/initrd.img-3.2.0-29-generic-pae boot
回车后 可以进入linux系统了,修复grub引导文件: update-grub2 reboot
或者 生成新的 正确的 grub.cfg。 当然,先把原先的grub.cfg备份一份: cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak grub-mkconfig -o /boot/grub/grub.cfg
重启系统,发现多了几个菜单。
再看下 分区下安装linux的情况。 ### 设置启动菜单项 /etc/grub.d/30_os-prober ### # 这里面是 grub命令喔 insmod part_msdos insmod ext2 set root='(hd0,msdos9)' search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff initrd /boot/initrd.img-3.5.0-26-generic
其中 有一句也可改写为: linux /boot/vmlinuz-3.5.0-26-generic root=/dev/sda9 ro quiet splash $vt_handoff

弄清楚了吗?
那么,如果用grub4dos(windows版本的grub),先把grub4dos安装于C:\下,简单。然后修改 C:\menu.lst,或者,安装 grub2Win于C:\下,修改C:\grub2\grub.cfg,也不难了(Win7 bootmgr作主引导器 如下是grub2 语法): default 0 timeout 10
title Ubuntu hadoop AS (3.5.0-23-generic) set root='(hd0,msdos9)' search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff initrd /boot/initrd.img-3.5.0-26-generic
title Ubuntu hadoop AS (3.2.0-29-generic) set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7 initrd /boot/initrd.img-3.2.0-29-generic-pae
grub2使用grub.cfg替代 grub menu.lst。但会用menu.lst的符号链接(类似Win7的快捷方式)指向grub.cfg。

本文标签: 重装启动项终极版系统Linux