美文网首页
Linux操作系统启动流程

Linux操作系统启动流程

作者: Net夜风 | 来源:发表于2018-06-24 19:35 被阅读0次

    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  #启动图形终端
    
    • chkconfig 命令:管控/etc/init.d/目录下每个服务脚本在各级别下的启动或关闭状态

        查看:chkconfig  --list   [name]
        添加:chkconfig  --add  name
                能被添加的服务的脚本定义格式之一:
                            #!/bin/bash
                            #
                            # chkconfig: LLL  NN NN
                            # description:  
        删除:chkconfig  --del  name
        修改指定的链接类型:
                            chkconfig  [--level  LEVELS]  name  <on|off|reset>
                            --level LEVELS:指定要控制的级别;默认为2345;
      

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

    grub:GRand Unified Bootloader

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

    • grub 0.X:grub legacy
    • grub 2.X:grub2
    • grub legacy:
      • stage1:mbr
      • stage1_5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
      • stage2:磁盘分区(/boot/grub/)
        配置文件:/boot/grub/grub.conf
        stage2及内核等通常放置于一个基本磁盘分区
      • 功用:
        (1):提供菜单,并提供交互式接口
        e:编辑模式;用于编辑菜单
        c:命令模式;交互式接口
        (2): 加载用户选择的内核或者操作系统;允许传递参数给内核;可隐藏此菜单。
        (3):为菜单提供了保护机制;为编辑菜单进行认证;为启用内核或操作系统进行认证。
    • 如何识别设备:(hd#,#)
      • hd# : 磁盘编号,用数字表示,从0开始编号
      • :分区编号,用数字表示,从0开始编号

    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文件的格式
    • 命令段:指定各种安装前配置选项,如键盘类型等;分为:

      • 必备命令
      • 可选命令
    • 程序包段:指明要安装的程序包,以及包组,也包括不安装的程序包;

             %package   #指明程序包段开始
             @group_name   #安装一个包组
              package             # 安装单个程序包
             -package           #明确指明不安装的
             %end          #程序包段结束
      
    • 脚本段:

      • %pre:安装前脚本
        运行环境:运行安装介质上的卫星Linux系统环境;
      • %post:安装后脚本
        运行环境:安装完成的系统;
    命令段中的必备命令:
    • authconfig:认证方式的配置;authconfig --enableshadow --passalgo=sha512
    • bootLoader:定义bootloader的安装位置及相关配置;bootloader --location=mbr --driveorder=sda --append="nomodeset crashkernel=auto rhgb quiet"
    • keyboard:设置键盘类型; keyboard us
    • lang:设置语言类型;lang en_US.UTF-8
    • part: 分区布局;part /boot --fstype=ext4 --size=500 part pv.008002 --grow --size=1
    • rootpw:管理员密码;rootpw --iscrypted $6$UQONRau1iY1OvJbk$NB0k1D1LpHCbV6ioFOyq3LAH/L6tSF79upN.zg48ZV8y5NzBzOoXNlqaRZEIkPn.tDdPFnuxrAnS/e3UX
    • timezone:指定时区; timezone --utc Etc/UTC
    • 补充:分区相关的其他指令
      • clearpart:清楚分区;clearpart --linux --drives=sda
      • volgroup:创建卷组;volgroup VolGroup --pesize=4096 pv.008002
      • logvol:创建逻辑卷;logvol /home --fstype=ext4 --name=lv_home --vgname=VolGroup --grow --size=100
    命令段中的可选命令:
    • install OR upgrade:安装或升级
    • text:安装界面类型,text为tui,默认为gui
    • network:配置网络接口;network --onboot yes --device eth0 --bootproto dhcp --noipv6
    • firewall:防火墙;firewall --disabled
    • selinux:SELinux;selinux --disabled
    • halt、poweroff或reboot:安装完成之后的行为;
    • repo:指明安装时使用的repository;repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100
    • url:指明安装时使用的repository;为url格式。

    定制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/
    

    相关文章

      网友评论

          本文标题:Linux操作系统启动流程

          本文链接:https://www.haomeiwen.com/subject/kxysyftx.html