Bootload 从磁盘上加载 vmlinuz-2.6.18-194.el5 和 initrd-2.6.18-194.el5.img 到内存中并展开,进而完成系统的初始化工作。
[root@node2 ~]# vim /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda2 # initrd /initrd-version.img #boot=/dev/sda1 # 设置默认启动的操作系统,0 表示:第一个 title 定义的操作系统。 default=0 # 可以这么说,GRUB 是一个交互式的程序,这里定义的“超时时间”,超过 timeout 定义的 # 时间,用户不与 GRUB 进行交互,GRUB就自动启动default的操作系统。 timeout=5 # 设置 GRUB 的背景图片,图片位置在第一块磁盘的第一分区, 站在 Linux 磁盘系统的角度也 # 就是 /boot (dev/sda1 第一分区), # 也就是说图片的位置在 /boot/grub/splash.xpm.gz splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz # 使用 hiddenmenu 来隐藏 GRUB 菜单。 hiddenmenu # GRUB # GRUB 的密码有两种: # 1、设置 GRUB 的密码,password 设置密码的位置在title定义系统前面。在启动系 # 统时候,如果想要操作控制(如进入单用户模式) GRUB 则需要输入该密码。 # 2、如果 title 使用 password 设置了密码。启动该系统时,要要求用户输入正确有 # 口令,才可以启动该系统的。 password --md5 $1$28AGIPNd$u85jSwiyrsReVQGkZv6JD/ title CentOS (2.6.18-194.el5) root (hd0,0) kernel /vmlinuz-2.6.18-194.el5 ro root=LABEL=/ quiet initrd /initrd-2.6.18-194.el5.img
说明:
上述就是 grub(boot load)的配置文件,在 grub 的指挥下把磁盘上的 kernel 和 initrd 加载到内存中并运行。
查看 /boot/initrd-2.6.18-194.el5.img 把它拆开就成下述样子
root@node2 ~]# ll /tmp/test/ total 5912 drwx------ 2 root root 4096 Jun 19 07:44 bin drwx------ 3 root root 4096 Jun 19 07:44 dev drwx------ 2 root root 4096 Jun 19 07:44 etc -rwx------ 1 root root 2536 Jun 19 07:44 init drwx------ 3 root root 4096 Jun 19 07:44 lib drwx------ 2 root root 4096 Jun 19 07:44 proc lrwxrwxrwx 1 root root 3 Jun 19 07:44 sbin -> bin drwx------ 2 root root 4096 Jun 19 07:44 sys drwx------ 2 root root 4096 Jun 19 07:44 sysroot
lib 目录保存了,initrd 加载的模块
[root@node2 ~]# ll /tmp/test/lib/ total 1200 -rw------- 1 root root 17908 Jun 19 07:44 dm-log.ko -rw------- 1 root root 11188 Jun 19 07:44 dm-mem-cache.ko -rw------- 1 root root 8808 Jun 19 07:44 dm-message.ko -rw------- 1 root root 75644 Jun 19 07:44 dm-mod.ko -rw------- 1 root root 74148 Jun 19 07:44 dm-raid45.ko -rw------- 1 root root 18512 Jun 19 07:44 dm-region_hash.ko -rw------- 1 root root 147376 Jun 19 07:44 ext3.ko -rw------- 1 root root 177220 Jun 19 07:44 scsi_mod.ko -rw------- 1 root root 31560 Jun 19 07:44 scsi_transport_spi.ko ...
bin 目录保存了, initrd 需要使用到的命令工具
[root@node2 ~]# ll /tmp/test/bin/ total 4752 -rwx------ 1 root root 1075172 Jun 19 07:44 dmraid -rwx------ 1 root root 476292 Jun 19 07:44 insmod -rwx------ 1 root root 862468 Jun 19 07:44 kpartx lrwxrwxrwx 1 root root 10 Jun 19 07:44 modprobe -> /sbin/nash -rwx------ 1 root root 2427036 Jun 19 07:44 nash
查看该小的 linux 的运行过程
#!/bin/nash mount -t proc /proc /proc setquiet echo Mounting proc filesystem echo Mounting sysfs filesystem mount -t sysfs /sys /sys echo Creating /dev mount -o mode=0755 -t tmpfs /dev /dev mkdir /dev/pts mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts mkdir /dev/shm mkdir /dev/mapper echo Creating initial device nodes mknod /dev/null c 1 3 。。。 mknod /dev/systty c 4 0 mknod /dev/tty c 5 0 mknod /dev/console c 5 1 。。。 mknod /dev/tty0 c 4 0 。。。 mknod /dev/tty12 c 4 12 。。。 mknod /dev/ttyS3 c 4 67 echo Setting up hotplug. hotplug echo Creating block device nodes. mkblkdevs echo "Loading ehci-hcd.ko module" insmod /lib/ehci-hcd.ko echo "Loading ohci-hcd.ko module" insmod /lib/ohci-hcd.ko echo "Loading uhci-hcd.ko module" insmod /lib/uhci-hcd.ko mount -t usbfs /proc/bus/usb /proc/bus/usb echo "Loading jbd.ko module" insmod /lib/jbd.ko echo "Loading ext3.ko module" # 装载 ext3 文件系统 insmod /lib/ext3.ko echo "Loading scsi_mod.ko module" # 由于 Linux 是宏(单)内核设计的,它把磁盘驱动做成了模块。bootload 从 MBR 把内核加 # 载到内存展开并初始化,它首先要启动init 进程对系统的各项工作 # 进行初始化操作。启动init进程,就需要把二进制运行程序/sbin/init,从磁盘中加载到内 # 存。就要从磁盘上读取数据。但是 bootload 加载的内核中没有磁盘的驱动程序, # 所以就没法从磁盘中读取数据。所以 Linux 就使用了initrd-2.6.18-194.el5.img 把 # scsi 磁盘驱动装载进来。 # ext2文件系统是直接做进内核的,可以使用该方法来查看是否把 ext2 文件系统做进了内核 # [root@node2 ~]# cat /boot/config-2.6.18-194.el5 | grep -i ext2 # CONFIG_EXT2_FS=y ----> 值不为 m ,所以不是做成模块的。 # CONFIG_EXT2_FS_XATTR=y # # 上面也使用了 insmod /lib/ex3.ko 把 ex3 文件系统装载进来了。GRUB 包含了磁盘的 # 分区表,所以这个时候内核就可以访问磁盘上的数据了。 insmod /lib/scsi_mod.ko echo "Loading sd_mod.ko module" insmod /lib/sd_mod.ko echo "Loading scsi_transport_spi.ko module" insmod /lib/scsi_transport_spi.ko 。。。 echo "Loading dm-mem-cache.ko module" insmod /lib/dm-mem-cache.ko echo "Loading dm-mod.ko module" insmod /lib/dm-mod.ko echo "Loading dm-log.ko module" insmod /lib/dm-log.ko echo "Loading dm-region_hash.ko module" insmod /lib/dm-region_hash.ko echo "Loading dm-message.ko module" insmod /lib/dm-message.ko echo "Loading dm-raid45.ko module" insmod /lib/dm-raid45.ko echo Waiting for driver initialization. stabilized --hash --interval 1000 /proc/scsi/scsi mkblkdevs echo Scanning and configuring dmraid supported devices resume LABEL=SWAP-sda3 # 创建 root 根设备,并以只读方式挂载之。 echo Creating root device. mkrootdev -t ext3 -o defaults,ro sda2 echo Mounting root filesystem. mount /sysroot echo Setting up other filesystems. setuproot # 切换至“根目录”并启动 init 进程。 cho Switching to new root and running init. switchroot
说明:
由于系统启动的时候,只以只读的方式挂载了 ”/“ 根目录,根目录存储有系统启动所需的各项工具,配置文件和链接库。
对于Red Hat Enterprise Linux来说,其根文件系统必须至少包括/etc、/bin、/sbin、/bin和/dev等目录,否则无法启动。
所以,要注意我们装系统划分分区的时候,是不可以把 /etc、/bin、/sbin、/lib 、/dev 划分为独立的分区的。
转载于:https://blog.51cto.com/9528du/1428127