XB1系统崩溃怎么修复系统

1625人阅读
实验室一台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硬盘):
E: - sda7, uuid = 6CE8A383E8A34A62
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
回车后 可以进入linux系统了,修复grub引导文件:
update-grub2
或者 生成新的 正确的 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-4ec
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4ec 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作主引导器):
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-4ec
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4ec 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硬盘):
E: - sda7, uuid = 6CE8A383E8A34A62
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
回车后 可以进入linux系统了,修复grub引导文件:
update-grub2
或者 生成新的 正确的 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-4ec
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4ec 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 语法):
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-4ec
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4ec 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硬盘):
E: - sda7, uuid = 6CE8A383E8A34A62
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
回车后 可以进入linux系统了,修复grub引导文件:
update-grub2
或者 生成新的 正确的 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-4ec
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4ec 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 语法):
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-4ec
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4ec 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。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:262345次
积分:3765
积分:3765
排名:第4165名
原创:105篇
转载:66篇
评论:63条
(1)(1)(1)(2)(5)(2)(3)(5)(6)(3)(1)(9)(2)(1)(2)(2)(1)(4)(1)(3)(3)(3)(3)(3)(4)(5)(2)(1)(1)(1)(3)(2)(1)(3)(6)(1)(64)(7)(2)(1)}

我要回帖

更多关于 系统损坏怎么修复 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信