从系统的启动过程分析,为什么我们划分分区的时候 /sbin 、/bin、/lib、/dev不能做为独立的分区?

  1. 云栖社区>
  2. 博客>
  3. 正文

从系统的启动过程分析,为什么我们划分分区的时候 /sbin 、/bin、/lib、/dev不能做为独立的分区?

技术小胖子 2017-11-08 00:53:00 浏览811

Bootload 从磁盘上加载 vmlinuz-2.6.18-194.el5 和 initrd-2.6.18-194.el5.img 到内存中并展开,进而完成系统的初始化工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[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
splashimage=(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 把它拆开就成下述样子

1
2
3
4
5
6
7
8
9
10
11
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 加载的模块

1
2
3
4
5
6
7
8
9
10
11
12
[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 需要使用到的命令工具

1
2
3
4
5
6
7
[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 的运行过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/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 划分为独立的分区的。





     本文转自成长的小虫 51CTO博客,原文链接:http://blog.51cto.com/9528du/1428127,如需转载请自行联系原作者