巧用 GRUB 实现系统环境的远程恢复

摘自: www.ibm.com  被阅读次数: 173


yangyi 于 2008-02-26 19:28:03 提供


2008 年 1 月 17 日

本文介绍了如何通过 Linux 的 GRUB 和 Ghost 实现 Linux 和 windows 系统的远程恢复。通过本文,您会了解到 Linux 和 Windows 的启动方式,他们的不同点和相同点,如何实现一个简单的自启动程序以及如何实现功能强大的远程恢复。

背景介绍和动机:

在产品的测试过程中,用户的很多操作都会造成系统的混乱,比如:

  • 频繁更换待测版本
  • 修改系统配置
  • 产品 bug 导致系统崩溃
  • 测试机被他人使用

为了解决这个问题,作为系统维护人员,首先想到的是做系统的备份与恢复。传统的备份还原技术只能基于本地,系统维护人员必须跑到机器前,通过一键恢复或者恢复盘进行恢复,费时费力。为此,我们对这种传统的备份恢复技术进行了改进,让系统维护人员不用离开座位,只要通过远程轻轻一点就可以自动实现系统的恢复。

商业上也有自动恢复的工具可以实现系统的自动远程恢复,但是有几个缺点:

  • 成本太高
  • 对 Linux 操作系统支持较少
  • 操作复杂,不宜操作

为了克服这些缺点,我们教大家如何利用 Linux 和 Windows 的引导程序来方便的实现一个依据远程的备份恢复技术, 它的主要优点有:

  • 成本低
  • 支持 Windows 和 Linux 操作系统
  • 灵活,操作简单




回页首


Linux 和 Windows 的引导过程

首先,我们谈到远程,就不能不谈谈系统的引导过程,否则大家大老远的怎么能知道我们的恢复程序都背着你干了些什么。Linux 和 Windows 的引导过程大概可以分成如下几部分依次执行:


图 1. Windows 和 Linux 通用引导过程
Windows 和 Linux 通用引导过程

加载 BIOS

BIOS(Basic Input/Output System,基本输入输出系统)全称是 ROM-BIOS,是只读存储器基本输入/输出系统的简写,它实际是一组被固化到电脑中,为电脑提供最低级最直接的硬件控制的程序,它是连通软件程序和硬件设备之间的枢纽,通俗地说,BIOS 是硬件与软件程序之间的一个“转换器”或者说是接口(虽然它本身也只是一个程序),负责解决硬件的即时要求,并按软件对硬件的操作要求具体执行。

BIOS 芯片是主板上一块长方型或正方型芯片,BIOS 中主要存放:

  • 自诊断程序:通过读取 CMOS RAM 中的内容识别硬件配置,并对其进行自检和初始化;
  • CMOS 设置程序:引导过程中,用特殊热键启动,进行设置后,存入 CMOS RAM 中;
  • 系统自举装载程序:在自检成功后将磁盘相对0道0扇区上的引导程序装入内存,让其运行以装入 DOS 系统;
  • 主要 I/O 设备的驱动程序和中断服务;

从功能上看,BIOS 分为三个部分:

  • 自检及初始化程序;
  • 硬件中断处理;
  • 程序服务请求;

在自检及初始化程序又分成

  • 加电自检;
  • 初始化;
  • 引导程序;

最后一个部分是引导程序,功能是引导操作系统。BIOS 先从软盘或硬盘的开始扇区读取引导记录,如果没有找到,则会在显示器上显示没有引导设备,如果找到引导记录会把电脑的控制权转给引导记录,由引导记录把操作系统装入电脑,在电脑启动成功后, BIOS 的这部分任务就完成了。

第一阶段引导

MBR 是 Main Boot Record 的缩写,它是物理第1硬盘第0柱第0头第1扇区,其主要作用是引导机器读取更为复杂的引导程序。除了那些可以从非物理设备引导的机器,任何一个 PC 都无法从物理第一硬盘的{0,0,1}以外的任何一个扇区启动。

因为一般硬盘一个扇区只有512K,不能容纳系统的整个引导程序,所以操作系统厂商只将系统引导程序位置(主引导分区)放入 MBR 中,由主引导程序加载主引导分区的引导程序,进去第二阶段引导。

第二阶段引导

第二阶段引导是系统特定的引导程序,不能系统有不同的引导程序。下面我们区分 Linux 和Windows 来说。

就 Linux 来说,一般新版的 Linux 系统用的最多要数 GNU GRUB 了。GNU GRUB 是一个多重操作系统启动管理器。GNU GRUB 是由GRUB(GRand Unified Bootloader)派生而来。GRUB 最初由 Erich Stefan Boleyn 设计和应用。

  1. GRUB 的安装

一般 Linux 操作系统安装后会默认安装 GRUB,当然,你也可以自己安装,在操作系统的安装程序中都可以找到。


清单 1. 如何安装 grub 包
                
[root@localhost ~]# rpm -ivh grub*.rpm

  1. 操作 MBR

如前所说,操作系统必须将系统引导程序的位置写入 MBR,否则主引导程序将无法定为到系统引导程序的位置。因此在安装好 GRUB 后,我们要做的工作就是确定系统引导程序的位置,通过 GRUB 将其写入 MBR。


清单 2. 如何将 GRUB 写入 MBR
                
[root@localhost ~]# grub-install /dev/had

  1. GRUB 的配置文件 menu.lst

GRUB 有一个非常非常重要的配置文件,那就是 menu.list,它的默认位置/boot/grub/menu.list。


清单 3. menu.list 的内容
                

default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux AS (2.6.9-42.ELsmp)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.9-42.ELsmp ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.9-42.ELsmp.img
title Red Hat Enterprise Linux AS-up (2.6.9-42.EL)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.9-42.EL ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.9-42.EL.img
title Windows
    rootnoverify (hd0,1)
    chainloader (hd0,1)+1

其中:default=0 代表默认启动第一个系统,在 menu.lst 文件中,按照 title 的先后区分,依次标号为0,1,2。在本例中,默认的引导系统为 Red Hat Enterprise Linux AS (2.6.9-42.ELsmp)。

timeout=5 代表在5秒之后启动默认的操作系统。用户可以在5秒内自由选择需要引导的系统。

Splashimage 指出开机画面的文件所存放的路径和文件名。

Hiddenmenu 表示隐藏GRUB的启动菜单,直接进入由 default 庙宇的操作系统中去,为一可选项。

Title 表示在 GRUB 启动菜单里的名字。

对 linux 而言,

root(hda,0)是针对 linux 而言,代表 /boot 所在的磁盘位置。Hd 代表硬盘类型为 IDE 硬盘,(hd0,0) 代表该第一块硬盘的第一个分区。

kernel /boot/vmlinuz-2.6.9-42.ELsmp 是指 linux 内核文件的绝对路径。root=LABEL=/ 来表示Linux 的根所处的分区。LABEL=/ 这是硬盘分区格式化为相应文件系统后所加的标签。

initrd /boot/initrd-2.6.9-42.EL.img 代表在在 linux 内核启动前,boot loader 会将 /boot/initrd-2.6.9-42.EL.img 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。

对 windows 而言:

root (hd0,1) 这是指第一个硬盘上第二个分区

chainloader (hd0,1)+1 装入一个扇区的数据然后把引导权交给它。

对 windows 而言,其主要的配置文件是 C:\boot.ini 文件,这个文件是个系统隐藏文件,用户必须经过设置才能可见,主要步骤是:工具文件夹选项查看选择“显示所有文件和文件夹”并且不选择“隐藏受保护的操作系统文件(推荐)”。


图 2. 文件夹选项
文件夹选项

或者用户可以通过下面的步骤来编辑:

1、右键单击我的电脑,然后单击属性。或在控制面板中,启动性能和维护工具,然后单击系统。

2、在高级选项卡中,单击"启动和故障恢复"下的设置。

3、在系统启动下,单击编辑。

如果你拥有 Windows XP 操作系统,那么你可以用“系统配置实用程序”来更方便的编辑“BOOT.INI”文件。具体做法是:打开“开始”菜单,点击“运行”命令,再在弹出的文本框中输入“msconfig”点击“确定”后就会弹出“系统配置实用程序”,再点击“BOOT.INI”选项卡,就会出现如图所示的界面。在这里,我们可以很方便地设置文件。


图 3. 系统配置实用程序

下表就是 boot.ini 文件的基本内容:


清单 4. boot.ini 的内容
                
[boot loader]
timeout=3
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="IBM Client for e-business Windows XP v2.04" 
/noexecute=optin /fastdetect
C:\CMDCONS\BOOTSECT.DAT

其中:

1、系统加载部分([boot loader])

“timeout=”就是设定开机时系统引导菜单显示的时间,超过设定值则自动加载下面“default=”指定的操作系统。默认值是30,单位为秒。我们可以在这里面设定等待时间的长短。如果将其设为“0”那么就是不显示系统引导菜单。

“default=”则是设定默认引导的操作系统。而等号后面的操作系统必须是已经在“[operating systems] ”中存在的。如果想默认为加载另外的操作系统,我们可以参看“[operating systems] ”中的操作系统列表,然后把想要加载的操作系统按照格式写到“default=”后面就可以了。

2、操作系统部分([operating systems])

这部分里定义了所有可以引导的操作系统,比如 IBM Client for e-business Windows XP v2.04,“multi(0)disk(0)rdisk(0)partition(1)\WINDOWS”为,在0号非SCSI设备上的第0号磁盘上的第一个分区里面的“WINDOWS”目录下可以找到能够启动的操作系统。

/FASTDETECT:对于 Win2000 启动时,它使系统不检查串行口和并行口。

/noexecute=opti:表示启用 DEP(系统数据执行保护)





回页首


动手制作一个可自动恢复的小系统

实现自动恢复的步骤包括:

1)有一个引导系统引导起计算机,并能识别出所需的资源,如硬盘。

2)这个引导系统自动运行 ghost 工具,将备份的镜像文件恢复到指定磁盘分区,并重新启动系统。

提到引导系统,DOS 启动盘是目前我们最常用的 DOS 工具,附带的一些外部命令和工具会帮助你解决很多问题,我们将采用的DOS版本为 WIN98SE 附带的 DOS7.1。引导系统有了, 配合上 ghost 工具,使用自动批处理在系统启动时自动调用 ghost 实现自动恢复。到此,一切似乎已经都实现了。但是,其他问题出现了。将被恢复的计算机不在操作者身边时,怎么实现用这个做好的系统引导起计算机?对于已经投入使用的系统,怎样方便容易的装上这个系统,并且不影响正常系统的使用?

下面,我们将要动手制作的这个可实现自动恢复的小系统就可以解决上面的问题。

首先,制作一个 DOS 启动盘,并将其制作成 IMG 文件。如果你有可引导的 DOS IMG 文件,可跳过此步骤。使用 Windows98 制作启动盘的过程,不再叙述,请参阅相关文档。有了启动盘,通过 WinImage 工具就能得到可引导的 IMG 文件,我们给其命名为 boot.img。存放到一个文件夹中,例如 fogon。WinImage 是一个制作、修改 IMG 文件的有力工具,简单易用。运行制作精灵向导工具,可以将 Win98 启动盘另存为 boot.img 文件。

然后,修改 boot.img 文件中的 automatic.bat 文件,增加命令行 call mainpoint.bat。保存boot.img 文件。

这里的 ghost2c.bat 文件是一个存放在文件夹 fogon 中的文件,其内容根据需要以后再进行编辑。这样处理的好处是,img 文件以后就可以不用再被编辑修改了。如果有新的需求,比如运行其他程序时,只需将该程序至于 fogon 文件夹下,并修改 ghost2c.bat 文件就可以了。


清单 5. ghost2c.bat 的内容
                
ghost11.exe -clone,mode=pload,src=c:\ghost\winxpsp2.GHO:1,dst=1:1 -fx -sure –rb

接着,将 ghost 工具拷贝到 fogon 文件夹下,并修改 mainpoint.bat。增加命令行。关于 ghost的命令行使用方法和参数说明,请查询相关文档,这里不做详述。

至此,自动恢复的核心部分已经完成,下面要做的是整合 GRUB,使这个系统具备同时适应Linux 和 windows 两种平台的启动。这里采用的是 GRUB4DOS,是对 GNU GRUB Lagecy 二次开发的一个开源项目,你可以在 http://grub4dos.sourceforge.net/wiki/ 得到更多的信息。 GRUB4DOS 具备一大特色功能,即可将软盘镜像或硬盘镜像甚至某个硬盘分区虚拟成软驱或硬盘,进而运行其中的操作系统(DOS、win98),类似于以前流行的“虚拟软驱”(vfloppy),但功能要强得多。

最后,从 GRUB4DOS 中取出 GRLDR、GRLDER.mbr 和 grub 等文件放入文件夹 fogon。新建文件 MENU.LST,填写内容如下:


清单 6. MENU.LST 的内容
                
timeout 0
default 0
title fogon GHOST
map --mem /fogon/boot.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
boot


这段代码的作用是,在 GRUB 引导时,加载 BOOT.IMG 文件。这样我们制做的自动 GHOST恢复系统就能启动了。

现在,具备启动功能的一个完整的小系统就完成了(系统结构如下)。应用时,我们只需将文件夹 fogon 拷贝到目标计算机的启动分区外的任意分区,结合实际操作系统的情况稍作配置即可。有关针对特定系统的具体配置,将在下一段落详述。


图 4. Fogon 文件结构图
Fogon 文件结构图

下面介绍各个文件的作用:

1、grub 文件夹下的 menu.lst 文件内容如下:


清单 7. grub 文件夹下的 menu.lst 文件内容
                
default 0
timeout 0
title Fogon Recovery
kernel (hd0,0)/boot/fogon/grub/grub.exe
boot

这个文件最终会替换 linux 系统的 menu.lst 文件,在 linux 系统启动时,grub 先读取这个文件的内容,调用 fogon 系统中的 grub.exe,从而使 fogon 系统运行起来。

2、文件 fogon.bat 的内容如下:


清单 8. fogon.bat 的内容
                

@echo off
@cls
@echo.
@echo.
@echo.
@echo ----------------------------------------------------------------
@echo.
@echo * Fogon Recovery (v0.1  dwe-ivt-qa team reserved)     
@echo.
@echo * WARNING!!!
@echo.
@echo * Script will recovery you system, all data in disk c: will be lost.
@echo.
@echo * Are you sure to recovery (Y/N)?
@echo -----------------------------------------------------------------
@choice /c:YN /N
@if errorlevel==2 goto M_QUIT
@if errorlevel==1 goto M_GHOST
:M_GHOST
@call recovery.bat
:M_QUIT

这是 windows 环境中,运行 fogon 的入口,它会提示用户,系统将会完全被恢复,系统盘的数据会全部丢失,想继续,按键Y,否则按键N,退出。

3、文件 fogon.img 是我们前面创建的系统镜像文件。

4、文件 fogon.sh 的内容如下:


清单 9. fogon.sh 的内容
                
#!/bin/sh
cp -rf ../fogon /boot
cp /boot/fogon/grub/menu.lst /boot/grub/
cp /boot/fogon/menu.lst /
init 6

这是 linux 系统中,运行 fogon 的入口。它会将 fogon 要用到的文件临时拷贝至系统的boot 文件夹下,并替换系统文件夹 /boot/menu.lst 文件。然后,从新启动机器。

5、文件 recovery.bat 文件的内容如下:


清单 10. recovery.bat 的内容
                
@echo off
@rd /s /q c:\fogon
@mkdir c:\fogon
@xcopy .\*.* c:\fogon /y
@attrib -s -h -r c:\boot.ini
@copy c:\fogon\boot.ini c:\  /y
@attrib +s +h +r c:\boot.ini
@copy c:\fogon\menu.lst c:\ /y
@copy c:\fogon\grldr c:\ /y
@shutdown -r -f -t 1

该文件在 windows 环境生效,负责部署 fogon 到系统中,临时替换系统的启动文件,在系统启动后,调起 fogon 的 grub 程序,从而运行 fogon 系统。

6、文件 ghost2c.bat 是 fogon 系统中配置 ghost 的镜像源,及目的分区的文件,内容如下:


清单 11. ghost2c.bat 的内容
                

ghost11.exe -clone,mode=pload,src=c:\xxxx.GHO:1,dst=1:1 -fx -sure –rb

其中,ghost11.exe 是 ghost 应用程序的 v11.0版。Src=c:\xxx.gho 是镜像源文件, dst=1:1 是指目标盘及分区。这两项内容在部署到 linux 或 windows 环境中时,是根据情况设定值的。

7、文件 menu.lst 的内容及作用,参见前文。

8、文件 grldr,是 fogon 的 grub 程序需要的文件,其来源参见前文。

现在,具备启动功能的一个完整的小系统就完成了。应用时,我们只需将文件夹 fogon 拷贝到目标计算机的启动分区外的任意分区,结合实际操作系统的情况稍作配置即可。有关针对特定系统的具体配置,将在下一段落详述。





回页首


实现 Linux 系统的远程恢复

在 linux 系统中,创建一个 fat32 分区,拷贝 fogon 文件夹到此分区。运行 ghost 程序,备份 linux 系统并保存镜像文件至该分区。修改 ghost2c.bat 文件内容,


清单 12. ghost2c.bat 的内容
                
ghost11.exe -clone,mode=pload,src=c:\xxxx.GHO:1,dst=0:1 -fx -sure –rb

其中 xxxx.GHO,是前一步,创建 ghost 镜像的名字。dst=0:1,第一个数字指示是第几块硬盘,第二个数字指示是第几个分区。根据不同系统的不同情况,修改这两个数字。

此时,万事俱备。如果想恢复系统,那么运新 fogon.sh 吧。几分钟后,你的系统就能干净如初。





回页首


总结

本文介绍了 windows 和 linux 的启动过程,GRUB 工具,以及如何利用 GRUB 和 GHOST实现系统的自动恢复。同时,也希望 fogon 这个小小工具,可以使大家的测试环境得到更好的优化。






回页首


下载

描述名字大小下载方法
本文用到的示例代码fogon.zip580KBHTTP
关于下载方法的信息


作者简介

朱彬,从事多年软件测试工作,现负责 DB2 数据仓库产品的安装测试。


王富国,从事多年软件测试工作,现负责 DB2 数据仓库产品的安装测试。




原文链接: http://www.ibm.com/developerworks/cn/linux/l-cn-remrec/index.html