• Linux系统启动流程


    Linux系统启动流程
     
    Linux系统从按下开机按钮到等待用户输入用户名、密码,这中间到底发生了什么,本文接下来将要简单讲解一下Linux系统的启动过程。
     
    Linux系统启动流程大致是这样的:
     
    BIOS(Boot Sequence) --> MBR(GRUB) --> Kernel --> initrd --> (ROOTFS)/sbin/init(/etc/inittab)
     
    下面详细讲一下其中的每一步。
     

    1. BIOS

     
    BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序。
    主板在接通电源后,BIOS会第一个获得系统的控制权。BIOS首先会对系统硬件进行检测(POST, Power On Self Test, 上电自检),自检测过程大致为:加电-CPU-ROM-BIOS-System Clock-DMA-64KB RAM-IRQ-显卡等。如果关键部件有问题,计算机会发出报警声。
    自检一切正常后BIOS会调用一些设备自身ROM中的初始化代码,对这些设备进行初始化,比如显卡。这时可以看到一些初始化信息,介绍生产厂商、芯片类型等内容。
    最后,BIOS会根据COMS中设置的启动顺序(Boot Sequence),依次尝试启动。当启动设备是硬盘时,BIOS会把系统控制权交给硬盘MBR中的bootloader。
     

    2. MBR

    MBR是Master Boot Record的简写, 即主引导记录。MBR记录一般在磁盘 0 磁道 1 扇区,共512个字节。前446个字节是BootLoader(引导程序),后 4*16 的 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA。
    大多数Linux系统使用GRUB作为BootLoader。GRUB可以引导多种操作系统,它可以识别磁盘文件系统的格式,所以只需要内核文件名和内核所在分区就可以加载内核,通过/boot/grub/grub.conf文体来配置这些信息。
    GRUB是模块化的,运行时经历如下阶段:
     
    Stage 1
        Stage1 的代码保存在MBR中前446字节。
    将MBR导出为文件后查看
     
    [plain] view plain copy
     
    1. # dd if=/dev/sda count=1 of=/tmp/MBR  
    2. 1+0 records in  
    3. 1+0 records out  
    4. 512 bytes (512 B) copied, 0.000283544 s, 1.8 MB/s  
    5.   
    6. # file /tmp/MBR  
    7. /tmp/MBR: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3,  
    8. boot drive 0x80, 1st sector stage2 0x8480e, GRUB version 0.94;  
    9. partition 1: ID=0x83, active, starthead 32, startsector 2048, 1024000 sectors;  
    10. partition 2: ID=0x8e, starthead 221, startsector 1026048, 82860032 sectors,  
    11.              code offset 0x48  
    /boot/grub/stage1 是stage 1未作修改的代码备份。
     
    [plain] view plain copy
     
    1. # file /boot/grub/stage1  
    2. /boot/grub/stage1: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3,  
    3. GRUB version 0.94, code offset 0x48  
    Stage 1_5
        Stage1_5的代码允许GRUB识别多种类型的文件系统,识别每个文件系统的代码的代码保存在/boot/grub/*stage1_5 的文件中。
     
    [plain] view plain copy
     
    1. # cd /boot/grub  
    2. # ls *stage1_5  
    3. e2fs_stage1_5  iso9660_stage1_5  reiserfs_stage1_5  xfs_stage1_5  
    4. fat_stage1_5   jfs_stage1_5      ufs2_stage1_5  
    5. ffs_stage1_5   minix_stage1_5    vstafs_stage1_5  
    Stage 2
        Stage 2 代码读取/boot/grub/grub.conf文件,决定如何加载内核,Stage2的代码保存在文件/boot/grub/stage2中:
    [plain] view plain copy
     
    1. # ls -al /boot/grub/stage2  
    2. -rw-r--r--. 1 root root 125976 Jun 28  2012 /boot/grub/stage2  

    3. Kernel

    GRUB的最后阶段stage2会根据/boot/grub/grub.conf文件中的配置加载kernel到内存中,并将系统控制权交给kernel。
     

    4. initrd

    initrd是"initial RAM disk"的缩写,随kernel一起被GRUB加载进内存,在系统引导过程中挂载的一个临时根文件系统。
     
    Linux内核在设计风格上属于单内核,文件系统、进程管理、内存管理都需要内核来完成,这样势必会造成内核代码非常庞大。为了减少linux内核的大小,Linux系统内核被分成了内核和内核模块,内核会根据平台需要动态加载内核模块,非核心功能通常做成内核模块,比如大多数设备驱动。
    这样势必会产生矛盾,比如,如果Linux内核中没有集成识别ext3文件系统的模块,而ext3模块却在ext3文件系统中。这时,Linux内核访问文件系统需要拿到这个模块,而这个模块又在文件系统中。这样就能看出使用initrd的必要了。
     
    在linux 2.5内核开始引入initramfs技术,作用与initrd类似,都是 由内核执行其上的某个程序(initrd是/linuxrc, initramfs是/init)。区别是 /linuxrc不是以PID=1执行的, 因为 1这个进程ID是给/sbin/init保留的。initrd机制找到真正的根设备后将其设备号写入/proc/sys/kernel/real-root-dev, 然后控制转移到内核,由内核装载根文件系统并启动/sbin/init。initramfs机制中/init以PID=1执行,由init装载根文件系统并用exec转到真正的/sbin/init, 这样简化了启动流程,减少了启动时间。
     

    5.init

    /sbin/init进程是Linux启动的第一个进程,PID=1。Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvinit 已经淡出历史舞台,新系统普遍采用 UpStart 和 systemd 。
     
    sysvinit读取的一个主配置文件是/etc/inittab,文件格式参考这里
    inittab文件主要完成的配置有:
        1. 定义默认启动级别
        2. 系统初始化阶段调用rc.sysinit
        3. 调用rc脚本,传入运行级别作为参数,启动和关闭对应级别的服务
        4. ctrl+alt+del组合按键的动作
        5. 6个虚拟终端
        7. 运行级别为5时启动窗口显示管理器
     
    而UpStart则仅保留sysvinit的inittab文件中默认启动级别,其它的配置分散到了/etc/init/*.conf多个文件中。
     
    [plain] view plain copy
     
    1. [rising@centos ~]$ ls /etc/init  
    2. control-alt-delete.conf  prefdm.conf         rcS-emergency.conf        readahead-disable-services.conf  tty.conf  
    3. init-system-dbus.conf    quit-plymouth.conf  rcS-sulogin.conf          serial.conf  
    4. kexec-disable.conf       rc.conf             readahead-collector.conf  splash-manager.conf  
    5. plymouth-shutdown.conf   rcS.conf            readahead.conf            start-ttys.conf  

    init程序(sysvinit)读取或运行的文件顺序如下:
    init -> inittab -> rc.sysinit -> rc -> rc.local -> mingetty tty[1-6] -> X11/prefdm
     
    /etc/inittab的任务:
    1、设定默认运行级别;
    2、运行系统初始化脚本;
    3、运行指定运行级别对应的目录下的脚本;
    4、设定Ctrl+Alt+Del组合键的操作;
    5、定义UPS电源在电源故障/恢复时执行的操作;
    6、启动虚拟终端(2345级别);
    7、启动图形终端(5级别);
     
    /etc/rc.d/rc.sysinit完成的任务:
    1、激活udev和selinux;
    2、根据/etc/sysctl.conf文件,来设定内核参数;
    3、设定时钟时钟;
    4、装载键盘映射;
    5、启用交换分区;
    6、设置主机名;
    7、根文件系统检测,并以读写方式重新挂载;
    8、激活RAID和LVM设备;
    9、启用磁盘配额;
    10、根据/etc/fstab,检查并挂载其它文件系统;
    11、清理过期的锁和PID文件;
     
    /etc/rc.d/rc文件中
    有如下的shell代码,负责运行指定运行级别对应的目录下的脚本,接受一个参数作为运行级别
    for I in /etc/rc$1.d/K*; do
      $I stop
    done
     
    for I in /etc/rc$1.d/S*; do
      $I start
    done
     
    关闭或启动的优先次序,数据越小越优先被选定
    先关闭以K开头的服务,后启动以S开头的服务;
     
    /etc/rc.d/rc.local:
    系统最后执行的一个脚本。一般被链接为S99local,被/etc/rc.d/rc脚步执行。
     
    mingetty 
    inittab文件中定义了多个虚拟终端运行的程序。mingetty会启动login程序进行身份验证。
     
    版权声明:本文为博主Toormi原创文章,转载需表明出处。 https://blog.csdn.net/Toormi/article/details/47957567
  • 相关阅读:
    KETTLE集群搭建
    初识spark
    利用python操作mrjob实例---wordcount
    hive 优化 (转)
    hive权限管理
    hadoop常用操作命令
    hive的分桶
    Hive HQL基本操作
    hadoop--hive数据仓库
    Hive配置项的含义详解
  • 原文地址:https://www.cnblogs.com/huhyoung/p/8910195.html
Copyright © 2020-2023  润新知