Linux操作系统启动流程

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/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容