须要手工安装GRUB主要有两种情况:

Linux系统原本不是使用GRUB作为引导程序而如今想要使用GRUB来作为引导程序;

MBR中的引导程序被覆盖,须要在MBR中重新安装GRUB,如先安装了Linux系统,后安装了Windows系统。

下边,我们分别介绍这两种情况怎样手工安装GRUB引导程序。

系统中没有GRUB,须要手工安装

我们先来讲第一种情况,就是Linux系统中没有安装GRUB,我们须要重新安装GRUB;或则准备把不是启动分区的某个分区弄成启动分区。例如我的系统中新建了一个分区/dev/sdb1,并挂载到了/tdisk/目录上,我们查看一下新构建的分区,命令如下:

[root@linuxcool~]#df

文件系统1K-块已用可用已用%挂载点

/dev/sda319923216341210%/

tmpfs31267203126720%/dev/shm

/dev/sda11983372635916173815%/boot

/dev/sdb120713846863218975284%/tdisk

这个分区是我手工构建的,其实不是系统的默认启动分区(系统默认启动分区是/boot分区)。我们用这个分区模拟一个不是采用GRUB作为默认引导程序的Linux硬碟,在这个分区中手工安装GRUB引导程序。也就是说,这个实验成功后,/boot分区可以启动系统sogou pinyin linux,/tdisk分区也可以启动系统。

具体安装步骤如下:

1)使用grul-install命令在要启动的分区中安装GRUB相关文件

在/boot分区中有一个/boot/grub/目录,这个目录中保存的就是GRUB的相关文件(如文件系统的Stage1.5文件)。我们查看一下/boot分区中的这个目录,如下:

[root@linuxcool~]#ls/boot/grub/

device.mapffs_stage1_5jfs_stage1_5reiserfs_stage1_5stage2

xfs_stage1_5e2fs_stage1_5grub.confmenu.lstsplash.xpm.gz

ufs2_stage1_5fat_stage1_5iso9660_stage1_5minix_stage1_5stage1

vstafs_stage1_5

然而在/tdisk目录中并不存在这种文件,所以第一步就是要在/tdisk目录中安装这种GRUB相关文件linux setup命令安装,具体采用grub-install命令。这个命令的格式如下:

[root@linuxcool~]#grub-install[选项]设备文件名

选项:

-root-directory=DIR:DIR为实际目录,也就是手工指定GRUB相关文件的安装目录;

【例1】命令标准格式。

[root@linuxcool~]#gmb-install/dev/sda

#由于默认GRUB就是安装到/dev/sda中的,所以不须要指定--root-directory选项

我们须要把GRUB安装到/tdisk分区,所以须要执行以下命令:

[root@linuxcool~]#grub-install--root-directory=/tdisk/dev/sdb1

#把GRUB安装至/tdisk分区

ProbingdevicestoguessBIOSdrives.Thismaytakealongtime.

Installationfinished.Noerrorreported.

Thisisthecontentsofthedevicemap/tdisk/boot/grub/device.map.

Checkifthisiscorrectornot.Ifanyofthelinesisincorrect,

fixitandre-rnnthescript'grub-install'.

(fd0)/dev/fd0

(hd0)/dev/sda

(hd1)/dev/sdb

#说明安装的设备文件名

查看一下:

[root@linuxcool~]#ll/tdisk/boot/grub/

总药量272

-rw-r--r--.1rootroot455月2223:51device.map

命令安装linux系统_linux setup命令安装_命令安装软件

-rw-r--r--.1rootroot133925月2223:51e2fs_stage1_5

-rw-r--r--.1rootroot126325月2223:51fat_stage1_5

-rw-r--r--.1rootroot117605月2223:51ffs_stage1_5

-rw-r--r--.1rootroot117685月2223:51iso9660_stage1_5

-rw-r--r--.1rootroot132805月2223:51jfs_stage1_5

-rw-r--r--.1rootroot119685月2223:51minix_stage1_5

-rw-r--r--.1rootroot144245月2223:51reiserfs_stage1_5

-rw-r--r--.1rootroot5125月2223:51stage1

-rw-r--r--.1rootroot1259845月2223:51stage2

-rw-r--r--.1rootroot120365月2223:51ufs2_stage1_5

-rw-r--r--.1rootroot113765月2223:51vstafs_stage1_5

-rw-r--r--.1rootroot139765月2223:51xfs_stage1_5

GRUB的相关文件早已安装到/tdisk/boot/grub/目录中。其实,这种文件还是须要GRUB的配置文件来读取的。你们注意到了吗?/tdisk/boot/grub/目录中没有grub.conf或menu.lst配置文件,这种配置文件还是须要依赖/boot/grub/目录的。

注意,假若系统中没有grul-install命令,则说明没有GRUB软件,这时可以源码包安装,也可以RPM包安装。RPM包的安装命令如下:

[root@linuxcool~]#rpm-ivh/mnt/cdrom/Packages/grub-0.97-77.el6.i686.rpm

2)更改GRUB的配置文件

在我们的实验中,GRUB是早已安装好的,所以可以直接更改/boot/grub/gmb.conf配置文件。但若果是没有安装过GRUB的Linux系统手工安装GURB,就须要自己完善GRUB配置文件了。这么我们更改/boot/grub/grub.conf配置文件如下:

[root@linuxcool~]#vi/boot/gmb/grub.conf

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

titleCentOS(2.6.32-279.el6.i686)

root(hd0,0)

kemel/vmlinuz-2.6.32-279.el6.i686ro

root=UUID=b9a7a1a8-767f-4a87-8a2ba535edb362c9rd_NO_LUKS

KEYBOARDTYPE=pcKEYTABLE=usrd_NO_MDcrashkemel=auto

LANG=zh_CN.UTF-8rd_NO_LVMrd_NO_DMrhgbquiet

initrd/initramfs-2.6.32-279.el6.i686.imgtitleCentOStdisk#给自己这个启动分区起个名子吧

root(hd1,0)

#注意启动分区的位置是/dev/sdb1,也就是/tdisk目录

chainloader+1

#使用当前分区所在的启动磁道启动系统

在titleCentOStdisk段中不能指定内核镜像和initramfs虚拟文件系统,由于在/tdisk/boot/目录中只有grub目录,而没有内核镜像文件和initramfs虚拟文件系统的镜像文件,所以须要通过chainloader来调用启动磁道。

3)安装GRUB到/dev/sdb1分区的启动磁道中

刚才通过GRUB配置文件中的chainloader来调用启动磁道,而且/dev/sdb1这个分区是新构建的,它的启动磁道中并没有GRUB程序。所以最后一步就是要在/dev/sdb1分区的启动磁道中安装GRUB。这时就要借助GRUB交互模式了,如下:

[root@linuxcoolboot]#grub

#启动步入GRUB交互模式

grub>root(hd0,0)

root(hd0,0)

Filesystemtypeisext2fs,partitiontype0x83

#设定GRUB的主目录,这儿只能是(hd0,0),由于内核和虚拟文件系统安装在/dev/sdal中,也就是/boot分区中

grub>find/boot/gnab/stagel

find/boot/grub/stagel(hd1,0)

命令安装软件_linux setup命令安装_命令安装linux系统

#查询一下Stage1安装的分区

#似乎有一点问题嵌入式linux驱动程序设计从入门到精通,我们在/boot和/tdisk分区中都安装了GRUB,只见到了/tdisk分区

grub>find/gcub/stagel

find/grub/stagel(hd0,0)

#只有这样就能看见/boot分区中的Stage1。由于/boot分区是一个单独分区。里面能看见是由于/tdisk才是分区,而/boot/grub/只是/tdisk分区中的目录

grub>find/vmlinuz-2.6.32-279.el6.1686

find/vmlinuz-2.6.32-279.el6.i686(hd0,0)

#才能查到内核位置。注意不能通过/boot/vmlinuz-2.6.32-279.el6.i686查询,还是由于/boot是单独分区。并且此次/tdisk分区中没有内核

grub>setup(hd1,0)

setup(hd1,0)

Checkingif”/boot/grub/stagel”exists…no

Checkingif”/grub/stagel”exists…yes

Checkingif”/grub/stage2″exists…yes

Checkingif”/grub/e2fs_stage1_5″exists…yes

Running”embed/grub/e2fs_stage1_5(hd1,0)”…failed(thisisnotfatal)

Running”embed/grub/e2fs_stage1_5(hd0,0)”…failed(thisisnotfatal)

Running”install/grub/stageld(hd1,0)/grub/stage2p/grub/grub.conf”…

succeeded

Done

#在/tdisk分区的启动磁道中安装GRUB吧。其实有两个failed,但这只是两个文件系统的Stage1.5文件没有安装,并不影响

grub>quit

#退出GRUB交互界面

linux setup命令安装_命令安装linux系统_命令安装软件

这时GRUB安装完成了,可以重新启动试验一下了。重启后可以见到图1所示的界面。

图1GRUB界面

其实/tdisk分区中并没有真正的内核,所以最终还是要靠/boot分区启动。若果是多内核并存的,就可以真正启动了。

总结一下,在Linux系统中安装GRUBlinux setup命令安装,或则在新分区中安装GRUB的步骤如下:

须要在Linux系统的指定分区中安装GRUB的相关文件。这是通过grub-stall命令实现的。

须要根据要求更改GRUB的配置文件,也就是/boot/gmb/grub.conf。

须要在分区的启动磁道中安装GRUB,这是通过grub命令的交互模式实现的。

MBR中的GRUB被覆盖,须要重新安装GRUB

这些情况最常见的就是先安装了Linux系统,后安装了Windows系统,造成MBR中的GRUB被覆盖。而Windows系统的启动引导程序又不能辨识Linux系统,进而造成Linux系统不能正常启动。

这些情况解决上去比第一种要简单得多,由于不须要安装GRUB的相关文件和更改GRUB的配置文件,也就是第一种情况的第一步和第二步不须要执行,由于这是早已安装和更改好的。只须要执行第三步,覆盖MBR中的启动引导程序即可。

然而这儿的问题是,应当在哪些地方启动GRUB的交互模式呢?第一种情况是,我们是在Linux的命令行中执行grub命令,来启动GRUB交互模式。第二种情况是早已不能正常启动Linux系统了,其实也就没有Linux的命令行了。在这些情况下,我们须要先借助Linux的光碟修补模式,使用光碟来启动Linux,步入Linux的命令行,再指定grub命令。Linux的光碟修补模式将在后续章节中介绍。

我们先假定早已步入了光碟修补模式中的Linux命令行,这么只需执行如下命令即可:

sh-4.1#grub

#启动GRUB交互界面。注意到了吗?提示符不一样了,那是由于系统是从光碟启动的,所以环境变量没有生效

gmb>root(hd0.0)

#同样须要设置GRUB的主目录

grub>setup(hd0)

#直接把GRUB安装到MBR中,所以不须要指定分区

grub>quit

#退出

重启系统以后,就可以发觉熟悉的GRUB界面又回去了。这些安装GRUB的方法要比第一种情况简单,由于这并不是全装,仅仅是覆盖安装而已。

Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复