在计算机启动的时候,并不会像人一样直接就知道该运行操作系统,而是需要一个程序来进行引导,告诉计算机该去如何的启动系统。这个程序可以是grub程序,或者其他的程序也可以,在这里简单的介绍grub程序。

grub程序分为三个部分,分别是stage1、stage1_5和stage2。其中stage1的作用是写入mbr中存储的bootloader程序,将stage1_5载入内存中,并执行,然后接下来执行的就是stage1_5了,它位于mbr之后的扇区,通过提供基本文件系统驱动让stage1中的bootloader程序能识别磁盘分区/boot/grub/上的stage2文件并载入内存中执行。此时执行的就是stage2,在这一阶段中会给用户提供能够选择的菜单,并加载“/boot”启动分区中的内核文件,如图所示:(当使用命令“ls /boot”即可看到)

wKioL1mJuDLTGLSxAAAO4yBp-7g279.jpg-wh_50

当grub加载了内核之后就相当于将对计算机的控制权移交给了系统,接下来就由系统自行的加载各种软件和服务等。当有的时候系统启动失败,那么就会一直的停留在这个界面,这种时候就需要对已安装好的系统进行修复或者重新安装操作系统。

使用grub能够给我们带来很大的帮助,在说具体内容之前,先来看一下grub都有哪些常见的命令行命令:

help:获取帮助信息

find (hd#,#)/PATH/TO/SOMEFFILE:查找文件

root (hd#,#):设定磁盘的根目录(执行后,再使用find就不需要再指定磁盘

kernel /PATH/TO/KERNEL_FILE:将选定的文件作为内核文件

initrd /PATH/TO/OMOTRAMFS_FILE:将选定的文件作为临时根文件系统

boot:启动内核


在了解了这些命令行之后,我们就可以来说一说grub带给我们的第一个有用的功能,那就是当我们忘记了root密码之后,可以通过这个命令来修改密码。具体的操作方法是,先将计算机重启,在提示进行选择的时候进入grub界面,如图所示:

wKiom1mJvUmxVnPgAAAZ6W7au6k027.jpg-wh_50

在倒数时间结束之前随便摁键盘上的一个键即可进入grub界面,界面如图所示:

wKioL1mJvdygZhoEAABgtIlVvRY720.jpg-wh_50

在这里边就可以看到所有能够启动的内核,只需要将高亮移动到你想要启动的内核,然后摁下“e”键进入子界面,即可进入如图所示界面:

wKioL1mJvmmiiehSAACJjSrBVTk321.jpg-wh_50

在这个界面中将高亮移动到第二个选项上再次摁下“e”键即可进入编辑界面,如图所示:

wKiom1mJvvHRSDYsAABGWl9l_ck933.jpg-wh_50

在这个界面中只需要在最后加上一个数字“1”或者“s”、“S”、“single”都可以进入单用户模式,如图所示:

wKioL1mJv2jhxCPKAABMBnQKsuk456.jpg-wh_50

在添加完成之后回车即可回到上一个界面,在如图所示界面中摁下“b”键即可启动内核:

wKioL1mJwmTSvZtfAACNgRKXOdU675.jpg-wh_50

经过一段时间的等待之后,就可以看到我们进入了系统的命令行界面,并且用户提示符为“root”用户:

wKiom1mJwqfhwvSLAAAb5b2eEdI056.jpg-wh_50

在这里,我们就可以修改忘记了的root用户的密码了:

wKioL1mJwurw9Kd5AABTiokKkek288.jpg-wh_50



但是这种操作的方式是一种取巧的方法,我们还可以直接通过自己键入命令来启动单用户模式,操作的步骤是在最开始的界面中摁下“c”键,如图所示:

wKiom1mJw1OgS2MJAABgtIlVvRY642.jpg-wh_50

即可进入grub命令行编辑模式的界面:

wKioL1mJw5GTVqCfAABPJN3uDaQ763.jpg-wh_50

在这个界面中,我们就可以键入命令来实现自定义内核的启动。比如启动上面提到的单用户模式,就可以按照如下的方式进行命令的键入,在后面会有演示,此时就先跳过。

使用grub命令可以让系统按照我们的需要进行启动,由于Linux的开源这个特性,所以我们还可以通过自己的需要来创建属于我们的小系统,大致的方法是首先将磁盘进行分区、创建文件系统并挂载,然后在boot分区中创建grub,同时将内核和引导文件导入boot分区中。最后将所需要的命令和其所依赖的包导入另外一个分区中。此时系统已经做好了,为了验证,我们可以将这块磁盘从当前系统中卸下,放到一个没有安装操作系统的虚拟机中运行。大致的步骤就是这样了,下面来进行详细的演示。

首先在系统中插入一块任意大小的磁盘,在这里我加入了一块20GB大小的磁盘,名字叫做test.vmdk,如图所示:

wKiom1mJyNXy6O--AABwyJ8PATI261.jpg-wh_50

然后我们就可以对其进行分区,分区的大小也是随意,但是要尽量做到合理,像boot分区100M即可,交换分区要根据内存来算,一般是内存的两倍,剩下的一个分区保存的是各种的文件,所以要大一点,在这里我为其分配了5GB的大小,可以根据实际情况进行改变。分区的命令是“fdisk /dev/磁盘”,来进入fdisk的内部,在其中命令“n”来添加分区,“d”删除分区,其他内容可以根据提示一步步进行操作。最后使用“w”或者“q”命令退出,“q”命令为不保存退出,“w”命令为保存后退出。值得注意的是在给交换分区分配完成之后要使用“t”命令来改变它的分区类型。操作过程如图所示:

wKiom1mJy2GQ3rV3AAFM10nndzY744.jpg-wh_50

在分区完成之后最好多次使用“sync”来将缓存区中的内容写入到磁盘中,然后使用“partx -a”命令将分区情况写入内存。如图所示:

wKiom1mJzIKxAqloAACP2iA9N1w598.jpg-wh_50

在分区情况被系统识别之后,就可以对其创建文件系统并挂载,分别使用“mke2fs -t ext4 /dev/磁盘”和“mount”命令。其中交换分区也需要创建交换分区的文件系统,但是不需要挂载。如图:

wKioL1mJzZGjpbftAAAR5CugNXo634.jpg-wh_50

wKiom1mJzdaila-MAAAWVeiPZLw101.jpg-wh_50wKiom1mJzfzAsr_7AAAQ_DV0Odc151.jpg-wh_50

然后分别创建两个挂载点,并将“/dev/sdb1”挂载到“/mnt/boot”上,将“/dev/sdb3”挂载到“/mnt/sysroot”上:

wKioL1mJzpqTP5dIAAAjeqr7oJg935.jpg-wh_50

wKioL1mJz0Dy4UHzAAAzpBQhw1w575.jpg-wh_50

命令分别是:

[root@localhost ~]# mke2fs -t ext4 /dev/sdb1
[root@localhost ~]# mke2fs -t ext4 /dev/sdb3
[root@localhost ~]# mkswap /dev/sdb2
[root@localhost ~]# mkdir /mnt/boot
[root@localhost ~]# mkdir /mnt/sysroot
[root@localhost ~]# mount /dev/sdb1 /mnt/boot/
[root@localhost ~]# mount /dev/sdb3 /mnt/sysroot/

    当挂载完成之后,就可以使用grub安装引导程序了,安装的方法如图所示:

wKiom1mJ0Aah24dEAACJk5HDJJI405.jpg-wh_50

命令是:

[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb

使用完这个命令之后,在去查看刚才挂载的目录中就会发现多了启动引导的文件:

wKiom1mJ0JzQl25WAABpgBiBwqc300.jpg-wh_50

但是仅仅只有引导文件是不够的,所以需要将系统的内核引入到boot分区中:

wKioL1mJ0UTCkyJoAABEVcRlQik609.jpg-wh_50

命令为:

[root@localhost ~]# cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /mnt/boot/vmlinuz
[root@localhost ~]# cp /boot/initramfs-2.6.32-573.el6.x86_64.img /mnt/boot/initramfs.img

这样,这个小系统已经可以启动起来了,但是它什么功能都没有,所以我们需要给它添加功能,首先要添加的就是“bash”,因为我们需要它来解析其他的命令,添加的过程是首先要建立一些基本的目录,比如“etc”、“dev”等,如图所示:

wKioL1mJ0tCxHn_nAABhxj9mJEE272.jpg-wh_50

命令为:

[root@localhost sysroot]# mkdir bin boot dev etc lib lib64 sbin usr var proc sys tmp

目录建完之后就可以将“/bin/”目录下的“bash”拷到“/mnt/sysroot/bin”下面了

wKioL1mJ03fRSYdyAAAZatblD44960.jpg-wh_50

但是仅仅拷贝这个文件是不可以使用的,还需要将其所依赖的库也同时的考入进去,依赖的库可以使用“ldd”命令查看:

wKioL1mJ1HWDx367AADR8Fo-smQ189.jpg-wh_50

命令为:

[root@localhost sysroot]# ldd /bin/bash
[root@localhost sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
[root@localhost sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[root@localhost sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[root@localhost sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/

此时,一个小型的Linux系统就做完了,为了验证是否可以使用,我们将这块磁盘插入另外一个新的虚拟机中:

首先为了避免磁盘的重复使用,将磁盘卸载或者将虚拟机挂起,然后建立一个新的虚拟机,前头的选项都可以随便选择,但是在磁盘那里,要选择使用已经存在的磁盘,如图所示:

wKiom1mJ1m_wZqHlAACVJQ5mSwU849.jpg-wh_50

然后将刚才使用的磁盘选中,如图所示:

wKiom1mJ1ury95IyAABr_RY2fNQ448.jpg-wh_50

wKioL1mJ1urCOMLaAABRxQ38ubk169.jpg-wh_50

接下来一直点击下一步到结束即可,结束之后启动这个虚拟机,就会到grub界面,如图所示:

wKiom1mJ11PSzMV2AABBviBw_h4706.jpg-wh_50

这个就是grub的命令行界面,在这个界面中我们需要手动的输入启动需要引导的内容,如图所示:

wKiom1mJ2DGRZPddAAB_-yLEA6E173.jpg-wh_50

在上面图片所示的命令中,root命令是为了将括号中的“hd0,0”作为主目录,后面再输入文件目录的时候就不需要再重复键入“hd0,0”了,“hd0,0”代表的是第一块磁盘的第一个分区。“selinux=0”是为了关闭selinux,如果没有这条参数,很有可能会导致启动的失败。最后使用“boot”来启动内核。在稍作等待之后就可以看见如图所示的界面,这就说明Linux小系统创建成功了。

wKiom1mJ2WqjF95UAADd8rnlrlM132.jpg-wh_50

但是这个小系统仅仅只能支持一些内置命令,如果我们想要对其进行扩展,就可以像添加bash那样将想要添加的命令进行导入即可。除此之外,还可以对内核进行定制,这就涉及到了内核的编译,请看下一篇,内核的编译。