本章第一节就已经讲过,BIOS 在进行完成系统检测之后,就会找到第一个可以启动的设备,并读取该设备的 MBR(主引导记录)以及加载 MBR 中的 boot loader(启动引导程序),这个启动引导程序可以具有菜单功能、直接加载核心文件以及控制权移交的功能等。
另外我们还知道,系统必须要借助启动引导程序,才能加载内核,那么问题来了,MBR 只是占据整个设备的第一个扇区中,其大小也就只有 446 字节而已,但启动引导程序功能这么强大,光程序代码即配置数据就肯定不止 446 字节,是怎么安装的吗?
是这样的,Linux 系统将启动引导程序的程序代码运行与配置数据加载分为以下 2 个阶段:
其中,与 GRUB(启动引导程序)相关的配置文件,都放置在 /boot/grub 目录中。我们来看看这个目录下到底有哪些文件。
[root@localhost ~]# cd /boot/grub/
[root@localhost grub]# ll -h
总用量274K
-rw-r--r--. 1 root root 63 4月 10 21:49 device.map
#GRUB中硬盘的设备文件名与系统的设备文件名的对应文件
-rw-r--r--. 1 root root 14K 4月 10 21:49 e2fs_stage1_5 #ext2/ext3文件系统的Stage 1.5文件
-rw-r--r--. 1 root root 13K 4月 10 21:49 fat_stage1_5
#FAT文件系统的Stage 1文件
-rw-r--r--. 1 root root 12K 4月 10 21:49 ffs_stage1_5
#FFS文件系统的Stage 1.5文件
-rw-------.1 root root 737 4月 10 21:49 grub.conf
#GRUB的配置文件
-rw-r--r--. 1 root root 12K 4 月 10 21:49 iso9660_stage1_5
#iso9660文件系统的Stage 1.5文件
-rw-r--r--. 1 root root 13K 4月 10 21:49 jfs_stage1_5
#JFS文件系统的Stage 1.5文件
Irwxrwxrwx. 1 root root 11 4月 10 21:49 menu.lst ->./grub.conf
#GRUB的配置文件。和grub.conf是软链接,所以两个文件修改哪一个都可以
-rw-r--r--. 1 root root 12K 4 月 10 21:49 minix_stage1_5
#MINIX文件系统的Stage 1.5文件
-rw-r--r--. 1 root root 15K 4 月 10 21:49 reiserfs_stage1_5
#ReiserFS文件系统的Stage 1.5文件
-rw-r--r--. 1 root root 1.4K 11 月 15 2010 splash.xpm.gz
#系统启动时,GRUB程序的背景图像
-rw-r--r--. 1 root root 512 4月 10 21:49 stage1
#安装到引导扇区中的Stage 1的备份文件
-rw-r--r--. 1 raot root 124K 4月 10 21:49 stage2 #Stage2的备份文件
-rw-r--r--. 1 root root 12K 4月 10 21:49 ufs2_stage1_5
#UFS文件系统的Stage 1.
-rw-r--r--. 1 root root 12K 4 月 10 21:49 vstafs_stage1_5
#vstafs文件系统的Stage 1.5文件
-rw-r--r--. 1 root root 14K 4月 10 21:49 xfs_stage1_5
#XFS文件系统的Stage 1.5文件
可以看到,这个目录中主要就是 GRUB 的配置文件和各种文件系统的 Stage1.5 文件。不过 GRUB 的配置文件有两个:/boot/grub/grub.conf 和 /boot/grub/menu.lst,这两个配置文件是软链接,所以修改哪一个都可以。
我们已经知道 Linux 系统分区的设备文件名的命名是有严格规范的,类似于 /dev/sda1 代表第一块 SCSI 硬盘的第一个主分区。但是在 GRUB 中分区的表示方法却完全不同,采用了类似 hd(0,0) 的方式来表示分区。
其实也很好理解,其中:
也就是说,hd(0,0) 代表的是第一块硬盘的第一个分区,和 Linux 系统中 /dev/sda1 的含义类似,只是不再区分是 SCSI 硬盘还是 IDE 硬盘。我们用表 1 来说明一下 Linux 系统对分区的描述和 GRUB 中对硬盘的描述。
硬?盘 | 分?区 | Linux中的设备文件名 | GRUB中的设备文件名 |
---|---|---|---|
第一块 SCSI 硬盘 | 第一个主分区 | /dev/sdal | hd(0,0) |
第二个主分区 | /dev/sda2 | hd(0,1) | |
扩展分区 | /dev/sda3 | hd(0,2) | |
第一个逻辑分区 | /dev/sda5 | hd(0,4) | |
第二块 SCSI 硬盘 | 第一个主分区 | /dev/sdb1 | hd(1,0) |
第二个主分区 | /dev/sdb2 | hd(1,1) | |
扩展分区 | /dev/sdb3 | hd(1,2) | |
第一个逻辑分区 | /dev/sdb5 | hd(1,4) |
在这张表中要注意,逻辑分区不能占用主分区与扩展分区的分区号,所以第一个逻辑分区在 Linux 系统中应该用 /dev/sda5 表示,在 GRUB 中应该用 hd(0,4) 表示,还要注意 GRUB 的表示方式只在 GRUB 的配置文件中生效,一旦离开了 GRUB 的配置文件,就要使用 Linux 中的设备文件名来表示分区了。
本节,我们就来看看 GRUB 的配置文件 /boot/gmb/grub.conf 中到底写了什么。命令如下:
[rootdlocalhost ~]# vi /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
#以上为GRUB的整体设置
title CentOS (2.6.32-279.el6.i686)
root (hdO,0)
kernel /vmlinuz-2.6.32-279.el6.i686 ro root=OOID=b9a7ala8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel= auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-279.el6.i686.img
这个文件的内容可以分成两部分:前 4 行为 GRUB 的整体设置;title 以下 4 行为要启动的 CentOS 系统的具体配置。这里只安装了一个系统,如果多系统并存,那么每个系统都会有类似的 title 行存在(不一定都是 4 行)。
我们先看整体设置:
再来介绍 CentOS 系统的具体配置:
那么,如何査询分区的 UUID 呢?方法有很多种,最简单的办法就查询 /ec/fstab 文件。命令如下:
[root@localhost ~]# cat /etc/fetab | grep"/ "
UUID=b9a7a1a8-767f-4a87-8a2b-a535edb362c9 / ext4 defaults 1 1
可以看到"/"分区的 UUID 和 kernel 行中的 UUID 是匹配的。注意一下 grep 后的"/",在"/"后是有空格的。
以下禁用都只是在启动过程中禁用,是为了加速系统启动的:
除了以上这样,命令输出信息中还包含以下内容:
GRUB的配置文件的内容就是这样的,主要是 kernel 行较为复杂。不过,在这个 /boot/gmb/grub.conf 配置文件中,只启动了一个 Linux 系统。如果在 Linux 服务器中 既安装了 Linux 系统,又安装了 Windows 系统,那么 GRUB 的配置文件又是什么样子的呢?
其实每个系统都是用 title 字段来表示的,如果在服务器中又多了一个 Windows 系统,那么在 GRUB 的配置文件中只不过就是多了一个 title 字段而已。不过要注意,我们一般建议先安装 Windows 系统,后安装 Linux 系统。
原因是 Windows 系统的启动引导程序无法把启动过程转交到 Linux 系统的 GRUB 中,自然就不能启动 Linux 系统了。如果我们后安装 Linux 系统,GRUB 就会安装到 MBR 中,覆盖 Windows 系统的启动引导程序。而 GRUB 是可以把启动过程转交到 Windows 系统的启动引导程序中的,所以 Windows 系统和 Linux 系统都可以顺利启动。
当然,如果真的是后安装 Windows 系统,则也可以通过手工再安装一次 GRUB 来覆盖 MBR 中的 Windows 系统的启动引导程序,具体方法后续章节会讲。
那么我们就来看看 Windows 和 Linux 双系统并存的 GRUB 的配置文件是什么样子的。命令如下:
[root@localhost ~]#vi /boot/gmb/gmb.conf
default:0
timeout=-1
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title WinXp
rootnoverify (hd0,0)
#指定Windows XP的启动分区。是第一块硬盘的第一个分区
#rootnoverify是不检测此分区的意思
makeactive
#设定分区为激活状态
chainloader +1
#把启动过程转交给此分区的第一个扇区
title CentOS (2.6.32-279.el6.i686)
root (hd0,5)
#Linux系统的/boot分区安装到了第一块硬盘的第六个分区中
kemel/vmlinuz-2.6.32-279.el6.i686 ro
root=UUID=23e5c9d6-77a8-403a-8c0e2bfeffcab5ef rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd/initramfs-2.6.32-279.el6.i686.img
配置文件的变化主要是多了 WinXP 这一段。rootnoverify(hd0,0) 字段说明这个分区不检测,同时标称了 Windows 系统的启动分区在第一块硬盘的第一个分区中。也就是 Windows 系统的 C: 盘在第一块硬盘的第一个分区中。chainloader+1 的意思是,GRUB 会把启动过程转交到位于这个分区的第一个扇区(启动扇区)中的引导程序中。
我们已经知道,为了实现多系统启动,除 MBR 中可以安装启动引导程序外,每个分区的第一个扇区也可以安装启动引导程序。在这个例子中,Windows 系统的启动引导程序就被安装到了 C: 盘所在分区的启动扇区中,chainloader+1 就是 GRU 把启动过程交给了 Windows 系统的启动引导程序,所以可以启动 Windows 系统。
需要手工安装 GRUB 主要有两种情况:
下面,我们分别介绍这两种情况如何手工安装 GRUB 引导程序。
我们先来讲第一种情况,就是 Linux 系统中没有安装 GRUB,我们需要重新安装 GRUB;或者打算把不是启动分区的某个分区变成启动分区。比如我的系统中新建了一个分区 /dev/sdb1,并挂载到了 /tdisk/ 目录上,我们查看一下新建立的分区,命令如下:
[root@localhost ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda3 19923216 1787736 17123412 10% /
tmpfs 312672 0 312672 0% /dev/shm
/dev/sda1 198337 26359 161738 15% /boot
/dev/sdb1 2071384 68632 1897528 4% /tdisk
这个分区是我手工建立的,当然不是系统的默认启动分区(系统默认启动分区是 /boot 分区)。我们用这个分区模拟一个不是采用 GRUB 作为默认引导程序的 Linux 硬盘,在这个分区中手工安装 GRUB 引导程序。也就是说,这个实验成功后,/boot 分区可以启动系统,/tdisk 分区也可以启动系统。
具体安装步骤如下:
在 /boot 分区中有一个 /boot/grub/ 目录,这个目录中保存的就是 GRUB 的相关文件(如文件系统的 Stage 1.5 文件)。我们查看一下 /boot 分区中的这个目录,如下:
[root@localhost ~]#ls /boot/grub/
device.map ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2
xfs_stage1_5 e2fs_stage1_5 grub.conf menu.lst splash.xpm.gz
ufs2_stage1_5 fat_stage1_5 iso9660_stage1_5 minix_stage1_5 stage1
vstafs_stage1_5
但是在 /tdisk 目录中并不存在这些文件,所以第一步就是要在 /tdisk 目录中安装这些 GRUB 相关文件,具体采用 grub-install 命令。这个命令的格式如下:
[root@localhost ~]# grub-install [选项] 设备文件名
选项:
【例 1】命令标准格式。
[root@localhost ~]# gmb-install /dev/sda
#因为默认 GRUB 就是安装到 /dev/sda 中的,所以不需要指定 --root-directory 选项
我们需要把 GRUB 安装到 /tdisk 分区,所以需要执行以下命令:
[root@localhost ~]# grub-install --root-directory=/tdisk/dev/sdb1
#把GRUB安装至/tdisk分区
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map/tdisk/boot/ grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-rnn the script 'grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
#说明安装的设备文件名
查看一下:
[root@localhost ~]# ll /tdisk/boot/grub/
总用量272
-rw-r--r--. 1 root root 45 5 月 22 23:51 device.map
-rw-r--r--. 1 root root 13392 5 月 22 23:51 e2fs_stage1_5
-rw-r--r--. 1 root root 12632 5 月 22 23:51 fat_stage1_5
-rw-r--r--. 1 root root 11760 5 月 22 23:51 ffs_stage1_5
-rw-r--r--. 1 root root 11768 5 月 22 23:51 iso9660_stage1_5
-rw-r--r--. 1 root root 13280 5 月 22 23:51 jfs_stage1_5
-rw-r--r--. 1 root root 11968 5 月 22 23:51 minix_stage1_5
-rw-r--r--. 1 root root 14424 5 月 22 23:51 reiserfs_stage1_5
-rw-r--r--. 1 root root 512 5月 22 23:51 stage1
-rw-r--r--. 1 root root 125984 5月 22 23:51 stage2
-rw-r--r--. 1 root root 12036 5 月 22 23:51 ufs2_stage1_5
-rw-r--r--. 1 root root 11376 5 月 22 23:51 vstafs_stage1_5
-rw-r--r--. 1 root root 13976 5 月 22 23:51 xfs_stage1_5
GRUB 的相关文件已经安装到 /tdisk/boot/grub/ 目录中。当然,这些文件还是需要 GRUB 的配置文件来读取的。大家注意到了吗? /tdisk/boot/grub/ 目录中没有 grub.conf 或 menu.lst 配置文件,这些配置文件还是需要依赖 /boot/grub/ 目录的。
注意,如果系统中没有 grul-install 命令,则说明没有 GRUB 软件,这时可以源码包安装,也可以 RPM 包安装。RPM 包的安装命令如下:
[root@localhost ~]# rpm -ivh /mnt/cdrom/Packages/ grub-0.97-77.el6.i686.rpm
在我们的实验中,GRUB 是已经安装好的,所以可以直接修改 /boot/grub/gmb.conf 配置文件。但如果是没有安装过 GRUB 的 Linux 系统手工安装 GURB,就需要自己建立 GRUB 配置文件了。那么我们修改 /boot/grub/grub.conf 配置文件如下:
[root@localhost ~]# vi /boot/gmb/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
root(hd0,0)
kemel/vmlinuz-2.6.32-279.el6.i686 ro
root=UUID=b9a7a1 a8-767f-4a87-8a2ba535edb362c9 rd_NO_LUKS
KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkemel=auto
LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd/initramfs-2.6.32-279.el6.i686.img title CentOS tdisk #给自己这个启动分区起个名字吧
root(hd1,0)
#注意启动分区的位置是/dev/sdb1,也就是/tdisk目录
chainloader +1
#使用当前分区所在的启动扇区启动系统
在 title CentOS tdisk 段中不能指定内核镜像和 initramfs 虚拟文件系统,因为在 /tdisk/boot/ 目录中只有 grub 目录,而没有内核镜像文件和 initramfs 虚拟文件系统的镜像文件,所以需要通过 chainloader 来调用启动扇区。
刚刚通过 GRUB 配置文件中的 chainloader 来调用启动扇区,但是 /dev/sdb1 这个分区是新建立的,它的启动扇区中并没有 GRUB 程序。所以最后一步就是要在 /dev/sdb1 分区的启动扇区中安装 GRUB。这时就要利用 GRUB 交互模式了,如下:
[root@localhost boot]# grub
#启动进入GRUB交互模式
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
#设定GRUB的主目录,这里只能是(hd0,0),因为内核和虚拟文件系统安装在/dev/sdal中,也就是/boot分区中
grub> find /boot/gnab/stagel
find /boot/grub/stagel (hd1,0)
#查询一下Stage 1安装的分区
#好像有一点问题,我们在/boot和/tdisk分区中都安装了GRUB,只看到了/tdisk分区
grub> find /gcub/stagel
find /grub/stagel (hd0,0)
#只有这样才能看到/boot分区中的Stage 1。因为/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)
Checking if "/boot/grub/stagel" exists... no
Checking if "/grub/stagel" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd1,0)"... failed (this is not fatal)
Running "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
Running "install /grub/stagel d (hd1,0) /grub/stage2 p /grub/grub.conf "...
succeeded
Done
#在/tdisk分区的启动扇区中安装GRUB吧。虽然有两个failed,但这只是两个文件系统的Stage 1.5文件没有安装,并不影响
grub> quit
#退出GRUB交互界面
这时 GRUB 安装完成了,可以重新启动试验一下了。重启后可以看到图 1 所示的界面。
图 1 GRUB界面
当然 /tdisk 分区中并没有真正的内核,所以最终还是要靠 /boot 分区启动。如果是多内核并存的,就可以真正启动了。
总结一下,在 Linux 系统中安装 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 的方式要比第一种情况简单,因为这并不是全装,仅仅是覆盖安装而已。
Linux 在启动时,在 GRUB 管理界面中是可以通过按"e"键进入编辑模式,修改启动选项的。
图 1 GRUB界面
如图 1 所示,每个启动选项都支持按"e"键进入编辑模式。在编辑模式中可以修改启动模式,比如进入单用户模式(单用户模式主要用于破解密码,我们将在后续章节中讲 解)。
但是有时候,我们不想让用户进入编辑模式,就需要给 GRUB 菜单加密。那么,如何生成加密的密码串呢?可以通过命令?grub-md5-crypt?来实现。命令如下:
[root@localhost ~]# grub-md5-crypt
Password:
Retype password:
#输入两次密码
$1$Y84LB1$8tMY2PibScmuOCc8z8U35/
#生成加密的密码串
这样就可以生成加密的密码串,这个字符串是采用 MD5 加密的,我们会利用这个加密的密码串来加密 GRUB 配置文件。
GRUB 的加密有两种模式:
如果给每个启动菜单加密,那么系统在启动时进入相应的启动菜单,必须输入正确的密码,否则系统不能启动。具体的方法如下:
[root@localhost ~]# vi /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
password --md5 $l$Y84LBl$8tHY2PibScmuOCc8z8D35/
#加入password选项,密码串是通过grub-md5-crypt命令生成的
root(hd0,0)
kernel /vmlinuz-2.6.32-279.el6?i686 ro root=UUID=b9a7ala8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_N0_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_N0_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-279.el6.i686.img
这样就能加密 CentOS 启动菜单了,在启动时如果不输入正确的密码,是不能启动系统的。需要注意的是,password 选项一定要在 title 下面第一行。
如果只是加密单个启动菜单,那么 GRUB 的编辑模式是不能被锁定的,仍然可以按"e"键进入编辑模式。而且在进入编辑模式后,是可以删除 password 字段的,再按"b"(boot启动)键就可以不用密码直接进入系统。这时就需要给 GRUB 菜单整体加密。在整体加密后,如果想进入 GRUB 编辑界面,则必须输入正确的密码。加密方法其实只是把 password 字段换一个位置而已,具体方法如下:
[root@localhost ~]# vi /boot/grub/grub.conf
default=0
timeout=5
password --md5 $l$Y84LBl$8tMY2PibScmuOCc8z8U35/
#将password选项放在整体设置处
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
root (hd0,0)
kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=b9a7ala8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-279.el6.i686.img
这样就会把 GRUB 界面整体加密,要想进入 GRUB 的编辑界面,必须先输入正确的密码,如图 2 所示。
图 2 GRUB 整体加密
注意到了吗?在 GRUB 界面中已经看不到"e"键了,必须输入"p"键,并输入正确的密码才能进入编辑界面。但是这样加密,在启动 CentOS 时,是不需要密码就能正常启动的。如果既需要 GRUB 的整体加密,又需要系统启动时输入正确的密码,应该怎么做呢?
很简单,方法如下:
default=0
timeout=5
password --md5 $l$Y84LBl$8tHY2PibScmuOCc8z8U35/
splashimage=(hdO,0)/grub/splash.xpm.gz hiddenmenu
title CentOS (2.6.32-279.el6.i686) lock
#在title字段下加入lock选项,代表锁死,如果不输入正确的GRUB密码,则不能启动root(hd0,0)
kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=b9a7ala8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd / initramf s-2.6.32-27.9 .el6.i686. img
只要在 GRUB 整体配置中加入 password 选项,在 title 中加入 lock 选项,就可以既加密 GRUB 编辑界面,又加密系统启动过程了。是不是很简单?
如果安装了 Linux 的图形界面,则使用图形界面修改分辨非常方便也很简单。但是如果只安装了字符界面,难道就不能修改分辨率了吗?
当然是可以的,只要利用 GRUB 的配置文件就可以完成。当然需要确定内核是否支持 CONFIG_FRAMEBUFFER_CONSOLE 功能,如果没有开启这项功能,则需要重新编译内核。査询方法如下:
[root@localhost ~]# grep "CONFIG_FRAMEBUFFER_CONSOLE" /boot/ config-2.6.32-279.el6.i686
#还记得/boot/config*2.6.32-279.el6.i686文件吗?这个文件中保存的是内核编译时选择的功能和模块。我们在这个文件中査找
CONFIG_FRAMEBUFFER_CONSOLE=y
#出现了=y,当然是支持了
在字符界面界支持的分辨率列表如表 1 所示。
色 深 | 640像素x480像素 | 800像素x600像素 | 1024像素x768像素 | 1280像素x1024像素 |
---|---|---|---|---|
8位 | 769 | 771 | 773 | 775 |
15位 | 784 | 787 | 790 | 793 |
16位 | 785 | 788 | 791 | 794 |
32位 | 786 | 789 | 792 | 795 |
如果想把字符界面的分辨率设置为 1024 像素x 768 像素,色深为 16 位,则只需要修改 GRUB 的配置文件,在 kernel 行最后加入下面的内容:
[root@localhost ~]#vi /boot/grub/gmb.conf
default:0
timeout=5
splashimage=(hd0,0)/gmb/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
root (hd0,0)
kemel/vmlinuz-2.6.32-279.el6.i686 ro
root=UUID=b9a7a1 a8-767f-4a87-8a2ba535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet vga=791
initrd/initramfs-2.6.32-279.el6.i686.img
然后重新启动系统,就会发现分辨率已经改变了。有些 Linux 的版本需要将 vga 的值写成十六进制的,可以先试试表 1 中的数字,如果不行则可以尝试十六进制数。
Linux 的内核会在启动过程中自动检验和加载硬件与文件系统的驱动。一般这些驱动都是用模块的形式加载的,使用模块的形式保存驱动,可以不直接把驱动放入内核,有利于控制内核大小。
模块的全称是动态可加载内核模块,它是具有独立功能的程序,可以被单独编译,但不能独立运行。模块是为内核或其他模块提供功能的代码集合。这些模块可以是 Linux 源码中自带的,也可以是由硬件厂商开发的(可以想象成驱动)。不过内核因为发布时间较长,所以自带的模块可能版本较低,还有一些新硬件可能就不自带模块了,只能由硬件厂商在发布硬件的同时发布新模块。
也就是说,安装模块一般有两种方法:
本节我们主要来学习第二种方法,也就是如果我已经得到了一个模块,该如何手工安装?这个模块该如何得到呢?
如果是新硬件的驱动,则可以到硬件官方网站下载内核驱动或内核模块。如果下载的是内核模块,则直接安装即可;如果下载的是内核驱动源码,则只需要编译源码包,就会生成模块(具体编译过程和源码包安装非常类似,可以查看驱动的说明)。如果需要加入的模块不是硬件的驱动,而只是内核中的某项功能,那么,只要部分重新编译内核,就可以生成新功能的模块(我们会通过 NTFS 文件系统支持来学习这种方法),然后安装这个模块即可。
内核模块的保存位置在什么地方?其实在 /lib/modules/ 内核版本 /kernel/ 目录中,在 CentOS 6.x 中这个目录就是:
[root@localhost ~]# cd /lib/modules/2.6.32-279.el6. i686/kemel/
查看一下目录内容:
[root@localhost kernel]#ls
arch
与硬件相关的模块
crypto
#内核支持的加密技术的相关模块
drivers
#硬件的驱动程序模块,如显卡、网卡等
fs
#文件系统模块,如 fat、vfat、nfs等
lib
#函数库
net
#网络协议相关模块
sound
#音效相关模块
Linux 中所有的模块都存放在 /lib/modules/2.6.32-279.el6.i686/modules.dep 文件中,在安装模块时,依赖这个文件査找所有的模块,所以不需要指定模块所在位置的绝对路径,而且也依靠这个文件来解决模块的依赖性。如果这个文件丢失了怎么办?不用担心,使用 depmod 命令会自动扫描系统中已有的模块,并生成 modules.dep 文件。命令格式如下:
[root@localhost ~]# depmod [选项]
#不加选项,depmod命令会扫描系统中的内核模块,并写入modules.dep文件
选项:
我们把 modules.dep 文件删除,看看使用 depmod 命令是否可以重新生成这个文件。命令如下:
[root@localhost ~]# cd /lib/modules/2.6.32-279.el6.i686/
#进入模块目录
[root@localhost 2.6.32-279.el6.i686]# rm -rf modules.dep
#删除 modules.dep文件
[raot@localhost 2.6.32-279.el6.i686]# depmod
#重新扫描模块
[root@localhost 2.6.32-279.el6.i686]# ls -l modules.dep
-rw-r--r--. 1 root root 191899 5 月 23 07:09 modules.dep
#再查看一下,modules.dep文件又生成了
depmod 命令会扫描系统中所有的内核模块,然后把扫描结果放入 modules.dep 文件。后续的模块安装或删除就依赖这个文件中的内容。也就是说,如果我们要手工安装一个模块,则需要先把模块复制到指定位置,一般复制至 /lib/modules/2.6.32-279.el6.i686/kernel/ 目录中,使用 depmod 命令扫描之后,才能继续安装。
使用 lsmod 命令可以查看系统中到底安装了哪些内核模块。命令如下:
[root@localhost ~]# lsmod
Module Size Used by
autofs4 20981 3
sunrpc 215000 1
ipt_REJECT 1867 2
nf_conntrack_ipv4 7694 2
nf_defrag_ipv4 1039 1 nf_conntrack_ipv4
…省略部分输出…
lsmod命令的指定结果共有三列。
我们还可以使用 modinfo 命令来查看这些模块的说明,命令格式如下:
[root@localhost ~]# modinfo 模块名 例如:
[root@localhost ~]# modinfo autofs4
filename:/lib/modules/2.6.32-279.el6.i686/kernel/fs/autofs4/autofs4.ko
license: GPL
srcversion: 4F798AD1AD66D2CBBB5D953
depends:
vermagic:2.6.32-279.el6.i686 SMP mod_unload modversions 686
#能够看到模块名,来源和简易说明
其实,如果模块已经下载到本机了,那么安装模块的方法非常简单。首先需要把模块复制到指定位置,一般复制到 /lib/modules/2.6.32-279.el6.i686/kemel/ 目录中,模块的扩展名一般是 *.ko;然后需要执行 depmod 命令扫描这些新模块,并写入 modules.dep 文件;最后就可以利用 modprobe 命令安装这些模块了。命令格式如下:
[root@localhost ~]# modprobe [选项] 模块名
选项:
举个例子,我们需要安装 vfat 模块(fat32 文件系统的模块),那么需要执行如下命令即可:
[root@localhost ~]# modprobe vfat
#安装vfat模块
[root@localhost ~]# Ismod | grep vfat
vfat 8575 0
fat 47049 1 vfat
vfat 模块是系统中的默认模块,所以不需要执行 depmod 命令进行扫描。如果是外来模块,则必须执行 depmod 命令。因为已经把模块的完整文件名写入了 modules.dep 文件,所以安装模块的命令不需要写绝对路径。
那么,如何删除这个模块呢?命令如下:
[root@localhost ~]# modprobe -r vfat
[root@localhost ~]# lsmod | grep vfat
#查找为空
在 CentOS 6.x 中,默认 NTFS 文件系统是没有安装的,也就是说在 CentOS 6.x 中是不能直接挂载 NTFS 分区的。但是目前 Windows 的分区绝大多数是 NTFS 分区,这就需要在 CentOS 6.x 中安装 NTFS 文件系统的模块之后,才能使用 NTFS 分区。
安装 NTFS 文件系统模块的方法有三种:
如果使用这种方法,则首先需要得到 NTFS 文件系统模块,这些模块一般是用 *ko 作为扩展名的。我们可以直接在互联网上找到 ntfs.ko 的模块文件下载之后安装;也可以下载完整的内核源码,自己编译生成 ntfs.ko 模块,然后安装。
我们采用第二种方法。具体步骤如下。
我们可以到内核的官方网站下载和本机安装的内核版本相同的内核源码。本机内核的版本可以使用 uname -r 命令查看,命令如下:
[root@localhost ~]# uname -r
2.6.32-279.el6.i686
这里下载的是 linux-2.6.32.tar.bz2 这个内核源码。我们可能会发现,在内核官网上找到的内核源码的版本可能和本机内核的版本不完全相同,这不会有太大影响,只需找到和本机版本差不多的内核源码即可。
另外,在 2.4.x 内核版本中,我们可以通过 RPM 包安装完整的内核源码到本机,而不用去官网下载。但是在 2.6.x 内核版本之后,如果采用 RPM 包的方式安装内核源码,则只会安装部分源码文件,而不会安装完整的内核源码文件。RPM 包安装的内核源码是不能进行正常编译和安装的,所以只能到内核的官方网站上下载完整的内核源码。
下载的内核是压缩包,需要解压。解压命令如下:
[root@localhost ~]# tar -jxvf linux-2.6.32.tar.bz2
[root@localhost ~]# cp -r linux-2.6.32 /usr/src/kernels/
#复制内核源码到默认内核源码保存位置
在进行内核编译时,是需要依赖 .config 配置文件来配置内核功能的,这个文件是通过 make menuconfig 命令生成的。
不过,我们在这里不讲解完整的内核编译过程,只是为了生成 ntfs.ko 文件,那么我们就不需要执行复杂的 make menuconfig 命令了。我们可以安装 RPM 包的内核,虽然 RPM 包安装的内核源码并不完整(早期 Linux 版本会安装完整的内核源码),但是有 .config 配置文件,我们可以直接利用这个配置文件,而不需要使用 make menuconfig 命令自己生成 .config 配置文件(在进行真正的内核编译时,是需要使用 make menuconfig 命令来配置自己需要的功能,并生成 .config 配置文件的)。 命令如下:
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/
[root@localhost ~]# rpm -ivh /mnt/cdrom/Packages/ kemel-devel-2.6.32-279.el6.i686.rpm
#安装RPM包的不完整的内核源码
[root@localhost ~]# cp /usr/src/kemels/2.6.32-279.el6.i686/.config/usr/src/
kemels/linux-2.6.32/
#从RPM包的内核源码中复制.config配置文件到源码包的内核源码中
这样我们就有了 .config 配置文件,当然也可以通过 make menuconfig 命令生成这个配置文件。不过我们现在还没有学习内核的编译过程,所以采用了这种简单的办法。当然,还要修改一下 .config 配置文件,让它支持 NTFS 文件系统。需要把 #CONFIG_NTFS_FS is not set 这行代码改为 CONFIG_NTFS_FS=m,意思是用模块形式加载 NTFS 文件系统。命令如下:
[root@localhost ~]# vi /usr/src/kernels/ linux-2.6.32/.config
…省略部分输出…
# CONFIG_NTFS_FS is not set
#改为
CONFIG_NTFS_FS=m
…省略部分输出…
使用 make modules 命令来编译所有的模块,因为我们开启了 NTFS 文件系统模块,所以会生成 ntfs.ko 文件。当然,编译要想正确进行,gcc 编译器是必须安装的。命令如下:
[root@localhost ~]# cd /usr/src/kernels/linux-2.6.32/
#编译命令一定要进入内核目录才能执行,因为编译命令编译的是模块当前所在目录
[root@localhost linux-2.6.32]# make modules
#在命令执行过程中,需要选择安装哪些模块,这时只选择NTFS相关模块,其他模块都不安装,这样能加快安装速度。注意:需要选择的选项较多,不要漏选
…省略部分输出…
NTFS file system support (NTFS_FS) [M/n/y/?] m
NTFS debugging support (NTFS_DEBUG) [N/y/?] (NEW)y
NTFS write support (NTFS_RW) [N/y/?] (NEW)y
#只有这几个功能选择y(安装)或m(安装成模块),其他功能都不需要安装
…省略部分输出…
接下来需要等待编译过程结束,就能看到 ntfs.ko 模块了。命令如下:
[root@localhost linux-2.6.32]# ll /usr/src/kemels/ linux-2.6.32/fe/ntfs/ntfs.ko
-rw-r--r--. 1 root root 3175255 6 月 4 18:57 /usr/src/ kemels/linux-2.6.32/
fs/ntfs/ntfs.ko
我们有了 ntfs.ko 模块,接下来的安装过程就比较简单了。先把 ntfs.ko 复制到指定位置,命令如下:
[root@localhost linux-2.6.32]# cp fs/ntfs/ntfe.ko/lib/ modules/2.6.32-279.el6.i686/kemel/fs/
然后开始模块安装,命令如下:
[root@localhost linux-2.6.32]# depmod -a
#扫描所有模块
[root@localhost linux-2.6.32]# modprobe ntfs
#安装ntfs模块
如果 modprobe ntfs 命令报错,那是因为版本不符。这个问题很好解决,只要执行如下命令:
[root@localhost linux-2.6.32]# modprobe -f ntfs
#-f:强制
强制安装 ntfs 模块即可。然后查询一下:
[root@localhost linux-2.6.32]#lsmod | grep ntfs
ntfs 93874 0 [permanent]
这样 ntfs 模块就安装成功了,我们就可以尝试挂载和使用 NTFS 的分区或移动硬盘了。
注意,虽然我们使用了部分内核编译命令,但是我们的目的不是编译内核,而只是生成 ntfs.ko 模块,所以不需要完成内核的完整编译与安装过程。而且,如果执行了 make install 命令,那么安装的新内核有 ntfs 功能,其他功能都不存在,新内核是不能正确使用的。
我们已经学习了利用 ntfs.ko 模块安装 NTFS 文件系统,这种方法生成 ntfs.ko 模块比较麻烦。如果采用安装 NTFS-3G 插件的方式安装 NTFS 文件系统,则更加简单和方便。具体步骤如下。
首先,下载 NTFS-3G 插件到 Linux 服务器上。
在编译安装 NTFS-3G 插件之前,要保证 gcc 编译器已经安装。具体安装命令如下:
[root@localhost ~]# tar -zxvf
ntfs-3g_ntfsprogs-2013.1,13.tgz
#解压
[root@localhost ~]#cd ntfs-3g_ntfeprogs-2013.1.13
#进入解压目录
[root@localhost ntfs-3g_ntfsprogs-2013.1.13]#./ configure
#编译器准备。没有指定安装目录,安装到默认位置
[root@localhost ntfs-3g_ntfsprogs-2013.1.13]# make
#编译
[root@localhost ntfs-3g_ntfsprogs-2013.1.13]# make install
#编译安装
这样安装就完成了,可以挂载和使用 Windows 的 NTFS 分区了。不过需要注意,挂载分区时的文件系统不是 NTFS,而是 NTFS-3G。挂载命令如下:
[root@localhost ~]# mount -t ntfs-3g 分区设备文件名 挂载点
例如:
[root@localhost ~]# mount -t ntfe-3g /dev/sdb1 /mnt/win
这样看来,使用安装 NTFS-3G 插件的方式比安装 NTFS 文件系统更加简便方便。