Linux系统启动过程详解

时间:2022-06-29 02:14:37

Linux系统启动过程:
    BIOS自检-读取MBR-执行引导程序GRUB-加载内核-执行init——系统初始化
1.BOIS:基本输入输出系统
    BIOS自检主要工作:侦测电脑周边配套设备,如:CPU类型,速度,缓存等;内存的速度,容量;硬盘的大小类型和工作模式;
                  检查这些设备能否通过检测
2.读取MBR
    BISO自检后读取第一启动设备硬盘的第一个扇区——MBR,然后执行里面的存储程序
    MBR扇区512字节大小,其中后64字节存储磁盘分区信息,最后两个字节存储磁盘的有效标志,其余466字节空间保存启动程序,然后由这个i小程序加载
    存储其他位置的操作系统,即启动GRUB程序
3.执行引导程序——GRUB
    GRUB程序配置文件/boot/grub/grub.conf

 1 [root@H0f ~]# cat /boot/grub/grub.conf  2 # grub.conf generated by anaconda
 3 #
 4 # Note that you do not have to rerun grub after making changes to this file
 5 # NOTICE:  You have a /boot partition.  This means that
 6 #          all kernel and initrd paths are relative to /boot/, eg.
 7 #          root (hd0,0)
 8 #          kernel /vmlinuz-version ro root=/dev/sda2
 9 #          initrd /initrd-[generic-]version.img
10 #boot=/dev/sda
11 default=0      #引导程序的第一个操作系统开机,对应硬盘的第一个分区
12 timeout=5      #进入GRUB的画面后,5秒选择使用哪个操作系统开机
13 splashimage=(hd0,0)/grub/splash.xpm.gz#开机背景图案,hd0表示第一个硬盘,0指硬盘第一个分区,背景图像文件名
14 hiddenmenu     #隐藏开机选项
15 title CentOS 6 (2.6.32-642.el6.x86_64)#开机选项标题名称
16     root (hd0,0)  #0是介绍文件位于哪个目录中
17     kernel /vmlinuz-2.6.32-642.el6.x86_64(#表示kernel存放内核的位置) ro(#表示 read only)
18     root=UUID=130776d3-1cb4-415a-bed2-b4a4bf861f47 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet(#不显示错误信息) selinux=0
19     initrd /initramfs-2.6.32-642.el6.x86_64.img    #将initrd映像文件加载到内存


4.加载内核
    Linux内核保存在/boot 名字一般为vmlinux-版本号
内核作用:《取得BOIS检测到的硬件设备信息,然后将硬件设备进行管理,这样才能够提供给Linux系统使用》
接着加载相应设备驱动程序,之后挂载文件系统,加载开机所需要的库文件程序等
因此Linux下主要目录必须在同一分区上,否则将开机失败
dmesg 查看本次启动内核输出信息

 1 [root@H0f rc.d]# dmesg |more 100
 2 Initializing cgroup subsys cpuset
 3 Initializing cgroup subsys cpu
 4 Linux version 2.6.32-642.el6.x86_64 (mockbuild@worker1.bsys.centos.org) (gcc version 4.4.7 20120313
 5  (Red Hat 4.4.7-17) (GCC) ) #1 SMP Tue May 10 17:27:01 UTC 2016
 6 Command line: ro root=UUID=130776d3-1cb4-415a-bed2-b4a4bf861f47 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF
 7 -8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb q
 8 uiet selinux=0
 9 KERNEL supported cpus:
10   Intel GenuineIntel
11   AMD AuthenticAMD
12   Centaur CentaurHauls
13 Disabled fast string operations
14 BIOS-provided physical RAM map:
15  BIOS-e820: 0000000000000000 - 000000000009ec00 (usable)
16  BIOS-e820: 000000000009ec00 - 00000000000a0000 (reserved)
17  BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)
18  BIOS-e820: 0000000000100000 - 00000000bcee0000 (usable)
19  BIOS-e820: 00000000bcee0000 - 00000000bceff000 (ACPI data)
20  BIOS-e820: 00000000bceff000 - 00000000bcf00000 (ACPI NVS)
21  BIOS-e820: 00000000bcf00000 - 00000000bd000000 (usable)

5.执行init
ps -aux 查看当前系统内的所有进程,PID为1的进程永远是init,即系统第一个进程,也是所有进程的父进程

1 [root@H0f ~]# ps -aux 2 Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
3 USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
4 root          1  0.2  0.0  19344  1544 ?        Ss   13:57   1:19 /sbin/init
5 root          2  0.0  0.0      0     0 ?        S    13:57   0:00 [kthreadd]

6.系统初始化
init程序读取/etc/inittb 配置文件的设置,根据配置文件来决定接下来操作系统将如何开展工作
(1).runlevel:系统常用运行级别0,1,3,5

1 # Default runlevel. The runlevels used are:
2 #   0 - halt (Do NOT set initdefault to this) #关机
3 #   1 - Single user mode                      #单用户模式
4 #   2 - Multiuser, without NFS (The same as 3, if you do not have networking)#可以使用所有用户登录,但没有网络功能,不启用NFS working
5 #   3 - Full multiuser mode                   #可以使用所有用户登录,具有所有功能
6 #   4 - unused                                #用户自定义,默认与3相同
7 #   5 - X11                                     #与3相同,开机是图形化界面
8 #   6 - reboot (Do NOT set initdefault to this)#重启

(2)执行初始化程序
/etc/rc.d/rc.sysinit程序作用:

  •     设定计算机名称,hostname在/etc/sysconfig/network文件中
  •     设定系统时间
  •     定义键盘,加载键盘驱动,识别键盘以便于信息收集
  •     启用交换(swap)分区
  •     检查根目录,且挂载成可读可写状态
  •     加载其他设备,比如RAID和逻辑卷LVM

(3)执行runlevel对应程序

不同的级别对应执行/etc/rc.d 目录下不同的文件

1 [root@H0f rc.d]# cd /etc/rc.d
2 [root@H0f rc.d]# ls
3 init.d  rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local  rc.sysinit