CentOS6 启动流程图文解剖

摘要:
接下来,以CentOS6系列为例解释Linux启动过程。5级通常位于1级场之后的63个扇区中。它是xpm格式,采用gzip压缩,并且只能隐藏菜单标题CentOS#标题名称,用于14位彩色隐藏菜单#。用户可以自定义root#来指定grub#的根位置,以指定内核文件的位置,还可以指出root的位置和挂载方法ro,这非常重要。kernel/vmlinuz-2.6.32-358.el6.x86 _ 64roroot=/dev/mapper/vg0-rootrd_ NO_ LUKSrd_ NO_DMLANG=en_US.UTF-8rd _ LVM_LV=vg0/swaprd_NO_ MDSYSFONT=latarcyrheb-sun16crashkernel=autod_LVM_LVV=vg0/rootKEYBOARDTYPE=pcKEYTABLE=usrhgbcrashkernel=autoquietrhgbquiet#在内核启动期间安装根文件系统时,这对于initrd/initramfs-2.6.32-358el6.x86非常有用64.imginitramfs-2.6.32-358.el6.x86_64.img的本质是????之后,系统的控制权移交给/sbin/init进程。

我们在使用Linux操作系统的时候,我们只需按下电源键,等待,然后输入账户和密码就可以使用Linux操作系统了。那么在按下电源到输入账号和密码之前,操作系统都做了些什么?下面就来讲述在这段时间发生的动作。

下面以CentOS6系列为例来讲解Linux的启动流程。

一、Linux启动流程详解

下图就是启动流程的大致过程:

wKiom1PQxc6SML8nAAFcDmK4XC0648.jpg

二、POST加电自检

POST(PowerOnSelfTest)首先对每一个设备进行检查。完成后会寻找存有引导记录的设备,找到后读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺利启动。

三、MBR引导

MBR(Master Boot Record) MBR记录一般是在磁盘 0 磁道 1 扇区,共512个字节。前446个字节是BootLoder,后 4*16 的 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA。

四、GRUB(GRand Unified Bootloader)、加载内核

就是MBR中的前 446 个字节,是BooTLoader的一种,它的作用是要选择要启动的内核。

1、GRUB程序的组成:

wKioL1PQ4efw0SE_AAJbTpZuDV4737.jpg

主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5组成。对于这些部分我的理解是这样:

  • device.map:存放的是内核文件的根分区
  • menu.lis:是grub.conf的链接文件,但是这个名字我觉得更与它的功能接近,就是菜单列表。里卖弄设置了可以选择的内核菜单。存放于stage2中。
  • stage:用于grub引导程序过大,所以分2段引导,第一段存放在MBR中,第二段存放于内核文件系统中,第一段引导完成后可以找到 第二段。 但是,第二段是存放于内核文件系统中的,此时还没有格式化文件系统,如何可以访问到第二段的 menu.lst 呢??就需要借助于中间层 stage1_5,有它来协助 stage1 段来访问 stage2 段。stage1_5通常位于 stage1 字段后的 63 个扇区。 由于stage2 在内存中存放可以使用的文件系统不确定,所以这就是有多个 stage1_5 的原因了。

2、grub.conf 文件参数意义

  1. default=1    # 默认启动的内核title, 0 表示是第一个  
  2. timeout=5    # 默认等待时间  
  3. splashimage=(hd0,0)/grub/splash.xpm.gz    # 指定菜单的背景图片的路径。为xpm格式,采用gzip压缩,只能为14bits色  
  4. hiddenmenu    # 隐藏菜单  
  5. title CentOS (2.6.32-358.el6.x86_64)    # 标题名,用户可自定义  
  6.     root (hd0,0)    # 指定 grub 的根位置  
  7.     # 指定 kernel 文件的位置,还要指出 root(系统启动后) 的位置,挂载方式 ro,这项很关键。  
  8.     # 加载后会启动 init 进程。  
  9.     kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root  KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet  
  10.     # 在内核启动过程中装载根文件系统时有用  
  11.     initrd /initramfs-2.6.32-358.el6.x86_64.img 
initramfs-2.6.32-358.el6.x86_64.img 的本质是????
  1. # initramfs 是以 gzip 压缩的 cpio 格式的文件。内核启动时将他作为一个临时的根文件系统。  
  2. # grub 的 stage2 将initrd加载到内存里,让后将其中的内容释放到内容中,  
  3. # 内核便去执行init脚本,这时内核将控制权交给了init文件处理。  
  4. # init 它也主要是加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后,  
  5. # 会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。  
  6. # 这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,  
  7. # 执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了。 

wKioL1PQ7u_RXEQAAAHfgGw63dE269.jpg

如何制作 initramfs 呢?

  1. # 可以使用 dircut 命令,用法如下:  
  2. # 只有在 initramfs 文件损毁的时候会使用到  
  3. [root@server ~]# dracut /mnt/initramfs-`uname -r`.img `uname -r`  
  4. [root@server ~]# du -sh /mnt/initramfs-2.6.32-358.el6.x86_64.img   
  5. 16M /mnt/initramfs-2.6.32-358.el6.x86_64.img  
  6. [root@server ~]# du -sh /boot/initramfs-2.6.32-358.el6.x86_64.img   
  7. 16M /boot/initramfs-2.6.32-358.el6.x86_64.img  
  8. # 详细介绍,可使用这个链接:https://zh.opensuse.org/index.php?title=SDB:Dracut&variant=zh-cn#.E5.90.AF.E7.94.A8_dracut_.E7.94.9F.E6.88.90.E7.9A.84_initramfs 

3、grub的功能

1)提供菜单,并提供交互式接口

e: 进入编辑模式

wKiom1PQ8uLRTFq2AAFFyUCSOSo430.jpg

2)选择要启动的内核或系统

允许传递引导参数给内核

选择界面可隐藏

  1. # 可以自启动是通过 grub 像内核传递参数。  
  2. # 应用之一是:修改 root 密码(忘记密码),使用 e 选项,传递单用户指令。 

3)为编辑功能提供保护机制

启用内核文件

选择运行指定的内核得先输入密码

传递参数

使用e命令得先输入密码

  1. [root@server root]# grub-md5-crypt   
  2. Password:   
  3. Retype password:   
  4. $1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0  
  5. # 上面是生成的加密字符串  
  6. # 然后将信息加入到 grub.conf 文件中,格式如下:  
  7. password --md5 $1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0  
  8. # 当然加入 grub.conf 文件的位置不同,加密效果也不一样。  
  9. # 加入到 title 之前的话,会加密整个菜单。  
  10. # 加入到 title 指内的话,会加密对应的操作系统的入口。 

    4、安装grub的方式

    1)使用grub-install命令

    1. # grub-install [--root-directory=/path/to/somewhere] DEVICE 

    2)grub交互是命令

    wKiom1PQ_HiCHYTqAALwLfHE0OI236.jpg

    在这里我们自制一个精简grub,当然启动的时候只启动一个bash就可以。示例是在 VMware 虚拟机下完成的。

    第一步:准备好块新磁盘,分 2 个区出来

    wKiom1PRAY_CbjOxAAFQGeXx0nE979.jpg

    第二步:模拟启动时的boot目录,和根目录,并挂载。如下

    1. [root@server ~]# df -H | tail -n 2  
    2. /dev/sdd1              518M    11M   481M   3% /mnt/boot  
    3. /dev/sdd2              2.2G    71M   2.0G   4% /mnt/sysroot 

    第三步:制作 grub,并生成 grub 的配置文件

    制作grub

    wKiom1PRA4njlzRSAANnZuPPwug409.jpg

    拷贝内核文件和 initramfs 文件到 /mnt/boot 目录下,并生成 grub.conf 文件

    1. [root@server ~]# cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz  
    2. [root@server ~]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs.img  
    3. [root@server ~]# ll /mnt/boot/  
    4. total 20106  
    5. drwxr-xr-x 2 root root     1024 Jul 24 20:58 grub  
    6. -rw-r--r-- 1 root root 16542269 Jul 24 21:06 initramfs.img  
    7. -rwxr-xr-x 1 root root  4043888 Jul 24 21:05 vmlinuz  
    8. # 生成的 grub.conf 文件  
    9. [root@server ~]# cat /mnt/boot/grub/grub.conf  
    10. default=
    11. timeout=10 
    12. title Mini Linux  
    13.     root (hd0,0)   
    14.     kernel /vmlinuz ro root=/dev/sda2 selinux=init=/bin/bash  
    15.     initrd /initramfs.img 

    第四步: 生成根文件系统

    wKiom1PRBtWiGC9QAAJM8RoL0uA295.jpg

    第五步:拷贝使用命令和库到对应根目录下

    wKioL1PRDKij5REwAAM4ghH8fUw006.jpg

    将刚才的磁盘镜像作为另一个虚拟机的启动盘。

    wKioL1PRD2KC4J8-AAFGpnnDVLM992.jpg

    wKioL1PRD3LSg0DtAALqgLLfnXg176.jpg

     

    五、启动 init 进程

    init 进程是系统启动的第一个进程。其他进程都是有此进程控制fork出来的,也就是说,init是其他进程的“祖先”,PID=1。当然,PID=0进程我们称为空闲进程是属于内核的。

    init启动后所做的事情:

    1、读取/etc/inittab来读取默认级别 假设:读取到的默认级别是 3

    /etc/init/*.conf

    1. # 启动级别:(runlevel)  
    2. # 0:关机  
    3. # 1:单用户模式  
    4. # 2:多用户模式,不支持 NFS 功能  
    5. # 3:完全多用户模式,支持文本接口  
    6. # 4:预留模式  
    7. # 5:完全多用户模式,支持图形模式  
    8. # 6:关机  
    9. # /etc/inittab文件格式如下,这是遵循了CentOS5的风格。  
    10. id:3:initdefault: 

    2、执行初始化系统脚本 /etc/rc.d/rc.sysinit 来初始化脚本

    这个大家有机会可以读读,脚本主要的作用如下:

    1. # 获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。  
    2. # 答应文本欢迎信息。  
    3. # 挂载/etc/fstab文件中定义的其它文件系统。  
    4. # 激活swap  
    5. # 检测根文件系统,并以读写方式重新挂载  
    6. # 决定是否启动SELinux和udev。  
    7. # 接口设备的检测与即插即用(pnp)参数的测试。  
    8. # 用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。  
    9. # 加载核心的相关设置。按"/etc/sysctl.conf"这个文件的设置值配置功能。  
    10. # 设置系统时间(clock)。  
    11. # 设置终端的控制台的字形。  
    12. # 设置raid及LVM等硬盘功能。  
    13. # 以方式查看检验磁盘文件系统。  
    14. # 进行磁盘配额quota的转换。  
    15. # 重新以读取模式载入系统磁盘。  
    16. # 启动quota功能。  
    17. # 启动系统随机数设备(产生随机数功能)。  
    18. # 清楚启动过程中的临时文件。  
    19. # 将启动信息加载到"/var/log/dmesg"文件中。 

    3、然后执行 /etc/rc.d/rc 脚本

    此脚本运行的时候此脚本的时候,会读取/etc/rc.d/rc3.d/下的所有脚本,来控制系统启动的时候启动或者关闭那些服务

    wKiom1PSA-mDbCDSAAZ9kiqbBP4645.jpg

    1. # 这里面的脚本大致分为 2 类,以 S 开头的和以 K 开头的脚本。  
    2. # S 代表开机时启动的,K 表示开机时不启动。  
    3. # 每个文件的命名格式,例如:S01sysstat S 开机启动 01 启动次序 sysstat 启动脚本名  
    4. # 启动的定义是在每个脚本中定义的:例如  
    5. # # chkconfig: - 85 15  
    6. # 默认级别 启动次序 不启动次序 

    这些脚本是否开机自启动,可由 chkconfig 命令来管理。

    1. # 常用选项:  
    2. # chkconfig --add SRV_SCRIPT 可以将自己写的一些脚本,让此命令统一管理。例如:chkconfig --add httpd  
    3. # chkconfig --del SRV_SCRIPT 将服务删除,意思就是服务不由chkconfig这种机制来管理  
    4. # chkconfig SRV_SCRIPT {on|off} 设置服务开机是否自启动,默认管理的级别是2345.  
    5. # --level 2345 等,指定默认级别,可以与其他选项一起使用 

    4、执行/etc/rc.d/rc.local脚本,此脚本是启动过程中最后启动的一个脚本。

    最后会执行 /bin/login 登录用户。至此系统启动过程完成。

    博文链接:http://guoting.blog.51cto.com/8886857/1530109

免责声明:文章转载自《CentOS6 启动流程图文解剖》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt中使用ActiveX控件“用户登录”测试用例总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

编写通用shell脚本启动java项目,适用于多数服务,只需修改服务名即可

文件名:service-user.sh 文件内容: ##shell脚本的头文件必须有#!/bin/sh ##再次配置java环境变量以防报其他错误## java env#jdk安装目录export JAVA_HOME=/usr/java/jdk1.8.0_144export JRE_HOME=$JAVA_HOME/jre ## service nameAP...

Linux shell脚本,按顺序批量启动多个jar包,批量启动spring cloud的jar包

Linux shell脚本,按顺序批量启动多个jar包,批量启动spring cloud的jar包 一. 手动一个一个启动的方式: nohup java -jar eurekaserver.jar > ../logs/eurekaserver.log 2>&1 & nohup java -jar configserver.jar...

实验六:通过grub程序引导本地磁盘内核启动系统(busybox)

实验名称:   通过grub程序引导本地磁盘内核启动系统(busybox) 实验环境:   理论上,该实验只需要配置好xen环境即可,但是,我们的xen环境安装在centOS7上,但是我们又是使用的kernel 2.6版本的内核,所以需要安装在centOS6版本下的grub程序!   所以,这里我们提供一个centos6的机器,用来准备为磁盘安装grub0...

linux通过脚本启动集群zookeeper

当搭建集群后,每次重新启动都需手动启动每台服务器的zookeeper,当服务器数量增多后,这样会显得很繁琐,所以就需要有一个脚本,通过一台机器,利用集群机器间传输命令ssh即可实现一键启动。 首先贴上脚本底层所需知识。 #export A=1 定义的变量,会对自己所在的shell进程及其子进程生效 (相当于java中的把局部变量升级为全局变量) #B=1...

Arch Linux 分区设定以及新增用户等命令

一.启动虚拟机  二.进入live(选择第一个) 进入root根目录 cd /  三.硬盘分区   Ⅰ.查看设备信息 fdisk -l 或者 lsblk    Ⅱ.分配空间 cfdisk /dev/sda          Ⅲ.格式化分区 mkfs.fat /dev/sda1 mkswap /dev/sda2 mkfs.ext4 /dev/...

centos 7 安装 恢复windows引导项

在电脑Windows10系统上安装Centos7,安装后找不到Windows7引导菜单。 原因:因为CentOS 7已采用新式的grub2系统,所以需要进入/boot/grub2目录后使用vi编辑grub.cfg文件。 解决方法一:修改Centos 7的Grub2引导,添加Windows的启动项 1 1.sudo vi /boot/grub2/grub...