Linux操作系统启动流程

2018-06-24  本文已影响0人  Net夜风

Linux操作系统启动流程

POST -->
BootSequence(BIOS) -->
Bootloader(mbr) -->
kernel(ramdisk) -->
rootfs(switch_root) --> /sbin/init(/etc/inittab;/etc/init/*.conf;/usr/lib/systemd/system/) -->
设置默认运行级别;运行系统初始化脚本,完成系统初始化;关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 -->
设置登录终端 -->
启动[图形]终端

以上流程分两部分:
  1. POST(power on system test):加电自检;给CMOS加电,通过启动其上的BIOS(Basic Input Output System即基本输入输出系统)程序去读取硬件信息并检测其是否存在。

  2. Boot Sequence:按次序查找个引导设备,第一个有引导程序的设备即为本次启动要用到的设备。

  3. Bootloader(mbr): 引导加载器,程序。提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核。(注意:BootLoader只能放在基本磁盘分区上,而不能存放于逻辑磁盘)

  4. kernel(ramdisk):自身初始化
    <1>探测可识别到的所有硬件设备
    <2>加载硬件驱动程序(有可能会借助于ramdisk加载驱动)

    • ramdisk (虚拟文件系统): Linux内核特性之一;使用缓冲和缓存来加速对磁盘上的文件访问;即把内存当磁盘来用。
    • 配置文件:
      * CentOS 5:/boot/initrd-VERSION-release.img ;程序工具:mkinitrd
      为当前正在使用的内核重新制作ramdisk文件:mkinitrd /boot/initramfs-(uname -r).img(uname -r)
      * CentOS 6,7:/boot/initramfs-VERSION-release.img;程序工具:dracut
      为当前正在使用的内核重新制作dracut /boot/initramfs-(uname -r).img(uname -r)
  5. rootfs:挂载根文件系统(readonly以只读方式挂载根文件系统);

  6. switch_root:切换根文件

  1. /sbin/init: 运行用户空间的第一个应用程序/sbin/init
    * CentOS 5:SysV init ;配置文件:/etc/inittab
    * CentOS 6:Upstart;配置文件:/etc/inittab;/etc/init/*.conf
    * CentOS 7:Systemd;配置文件:/usr/lib/systemd/system;/etc/systemd/system

  2. 设置默认运行级别:
    * 运行级别:为了系统的运行或维护等目的而设定的机制
    * 共分7个级别:0-6
    * 0:关机,shutdown
    * 1:单用户模式(single user),root用户无需认证,维护模式
    * 2:多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式
    * 3:多用户模式,完全功能模式,文本界面
    * 4:预留级别,目前无特别使用目的,但习惯以同3级别功能使用
    * 5:多用户模式,完全功能模式,图形界面
    * 6:重启,reboot

    • 默认级别为:3或5;服务器基本上默认使用3级别
      • 级别切换:init #
      • 级别查看:who -r或者runlevel
  3. 运行初始化脚本,完成系统初始化:/etc/inittab(只针对CentOS5系统)
    * 每行定义一种action,以及与之对应的process
    init配置文件/etc/inittab中的格式:
    id:runlevels:action:process
    * id:一个任务的标识符
    * runlevels:在哪些级别启动此任务:#,###, 也可以为空,表示所有级别
    * ation:在什么条件下启动任务
    * wait:等待切换至此任务所在的级别时执行一次
    * respawn:此任务终止时就自动重新启动之
    * initdefault:设定默认运行级别,此时process省略
    * sysinit:设定系统初始化方式,此处一般指定/etc/rc.d/rc.sysinit脚本
    * process:启动的任务

    • init的处理流程:init是通过自上而下的读取inittab文件依次执行的
      * CentOS6在此设置默认的runlevel:id:5:initdefault:
      • init是根据/etc/rc.d/rc.sysinit中的内容进行系统初始化,/etc/rc.d/rc.sysinit所做的事情:
        (1) 设置主机名;
        (2) 设置欢迎信息;
        (3) 激活udev和selinux;
        (4) 挂载/etc/fstab文件中定义的所有文件系统;
        (5) 检测根文件系统,并以读写方式重新挂载根文件系统;
        (6) 设置系统时钟;
        (7) 根据/etc/sysctl.conf文件来设置内核参数;
        (8) 激活lvm及软raid设备;
        (9) 激活swap设备;
        (10) 加载额外设备的驱动程序;
        (11) 清理操作;
  1. 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务:
    * 例如 /etc/rc.d/rc3/ 目录下的服务脚本所控制的服务:
    * K:要停止的服务;K##,优先级数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的服务
    * S* :要启动的服务;S##*,优先级数字越小,越是优先启动,被依赖的服务先启用,而后启动依赖的服务
    * rc脚本:接受一个运行级别数字为参数
    脚本框架: for srv in /etc/rc.d/rc#.d/k*.d;do $srv stop done for srv in /etc/rc.d/rc#.d/s*.d;do $src start done
    • 注意:正常级别下,最后启动的一个服务SS99local 没有连接至/etc/init.d下的某脚本,而是连接至/etc/rc.d/rc.local脚本;因此,不便或不需要写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。
  1. 设置启动终端,启动[ 图形 ] 终端;
        tty1:2345:respawn:/usr/sbin/mingetty tty1
        ... ...
        tty6:2345:respawn:/usr/sbin/mingetty tty6

    (1)mingetty会调用login程序;
    (2)打开虚拟终端的程序除了mingetty之外,还有诸如getty等;
        tty7:5:respawn:/etc/X11  #启动图形终端

GRUB启动引导程序配置(Boot Loader)

grub:GRand Unified Bootloader

在系统启动流程中,BIOS读取相关信息之后,接下来就是去第一个可以启动的设备当中的MBR中读取Boot loader信息。

grub的命令接口
help:获取帮助列表
help KEYWORD:获取详细帮助信息
find (hd0,0)/PATH/TO/SOMEFILE
root (hd0,0) 设置谁为根
kernel /PATH/TO/RERNEL_FILE:内核路径;设置本次启动时用到的内核文件,额外还可以添加许多内核支持使用的cmdline参数;
     例如: init=/path/to/init,selinux=0
initrd /PATH/TO/LNITRAMS_FILE:设定为选定的内核提供额外文件的ramdisk
boot:引导启动选定的内核

...

配置文件:/etc/grub/grub.conf

配置项:
    default=#:设定默认启动的菜单项;菜单项(title)编号从0开始
    timeout=#:指定菜单项等待选项选择的时长
    spashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径
    passwd [--md5] STRING: 菜单编辑认证
    hiddenmenu: 隐藏菜单
    title TITLE :定义菜单项“标题”,可以出现多次;
    root (hd0,0):grub查找stage2及kernel文件所在设备分区;为grub的根
    kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] :启动内核
    initrd /PATH/TO/IMTRAMFS_FILE :内核匹配的ramfs文件
    passwd [--md5] STRING:启动选定内核或操作系统时进行认证

    grub-md5-crypt   #密码串生成工具
        [root@localhost ~]# grub-md5-crypt
        Password: 
        Retype password: 
        \$1$XJZYv/$NB0d91w7u2UIhXa0434I8.
grup出现问题无法启动系统后如何修复
  1. 本机grub安装(grub破坏后未重启)
<1> grub-install --root-directory=/ /dev/sda
<2>grub
        grub>root (hd#,#)
        grub>setup (hd#)
示例:
        [root@localhost ~]# dd if=/dev/sda of=/boot/mbr.bak count=1 bs=512  #备份MBR
        [root@localhost ~]# dd if=/dev/zero of=/dev/sda count=1 bs=200  #破坏MBR前200个bs,即把grub.conf破坏了

    恢复方法1:  [root@localhost ~]# grub
                grub> root (hd0,0)
                root (hd0,0)
                Filesystem type is ext2fs, partition type 0x83
                grub> setup (hd0)   
                setup (hd0)
                 Checking if "/boot/grub/stage1" exists... no
                 Checking if "/grub/stage1" exists... yes
                 Checking if "/grub/stage2" exists... yes
                 Checking if "/grub/e2fs_stage1_5" exists... yes
                 Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
                succeeded
                 Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
                Done.
                grub> quit       
                quit
    
    方法2:     [root@localhost ~]# grub-install --root-directory=/ /dev/sda
                Installation finished. No error reported.
                This is the contents of the device map //boot/grub/device.map.
                Check if this is correct or not. If any of the lines is incorrect,
                fix it and re-run the script `grub-install'.
                #this device map was generated by anaconda
                (hd0)     /dev/sda
  1. grub破坏后重启,需要紧急救援模式来修复,步骤如下:
    <1> 用安装光盘启动,在安装界面选择Rescue installed system 进入紧急救援模式(或者,在此界面按ESC键,在boot: 之后输入linux rescue 进入)
    <2>然后根据提示选择语言和键盘格式
    <3>选择是否配置网卡
    <4>提示硬盘上的系统已经被找到并挂载在/mnt/sysimage 下,continue用读写模式加载
    <5>输入chroot /mnt/sysimage切换磁盘根目录
    <6>运行 grub-install --root-directory=/ /dev/sda 修复grub
    注意:此处演示为centos6系统,如果centos7系统需要使用grub2-install --root-directory=/ /dev/sda

实现kickstart文件制作与光盘镜像制作

在我们CentOS系统安装完成后 会在/root 目录下生成一个anaconda-ks.cfg文件,此文件就是kickstart,我们可以以此文件为模板来定制自己的kickstart文件。
可以使用 ks指明kickstart文件的位置
如:ks=cdrom:/PATH/TO/KICKSTART_FILE

kickstart文件的格式
命令段中的必备命令:
命令段中的可选命令:

定制kickstart文件

    yum install  system-config-kickstart
    system-config-kickstart
        
        检查语法错误:
        # ksvalidator

......

示例:
    [root@localhost ~]# yum install  system-config-kickstart  #安装system-config-kickstart
    [root@localhost ~]# system-config-kickstart #运行kickstart之后打开一个kickstart configurator的配置界面
在此图形界面中即可配置kickstart

创建光盘镜像

    
[root@localhost ~]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o  /root/boot.iso   myboot/
上一篇 下一篇

猜你喜欢

热点阅读