Linux启动流程

    Linux内核是由单内核和支持动态装卸载功能化模块(.ko: kernel object)组成,所有的模块都必须依托与内核才能运行,并且所有的模块和内核版本对应使用,不能跨版本使用.

    Linux内核 内核的功能:
          进程管理:task_struct, scheduler  分配进程的CPU及内存资源使用
          内存管理:内存分配管理
          I/O管理:中断及中断处理
          文件系统:ext3, ext4, reiserfs, xfs
          驱动程序:驱动硬件设备
          安全相关: SELinux

          通用软件,平台类的软件

   

一, Linux系统的初始化流程:POST --> BIOS (Boot Sequence) --> MBR(bootloader) -->  GRUB(bootloader (stage1: mbr; stage2: grub目录中)) -->Kernel (CentOS5: initrd, CentOS6: initramfs) --> /sbin/init (CentOS5:/etc/inittab, CentOS6: /etc/inittab, /etc/init/*.conf)

          POST:ROM(开机自检)+RAM

          BIOS: Boot Sequence

          MBR: 存储于0磁道总共512字节大小的引导文件.其中 446字节的bootloader引导加载器,64字节设备分区表,2字节5A效验

          GRUB: initrd或initramfs独立于内核的一个根文件系统,帮助内核初始化,挂载根.在安装时生成基础硬件信息.

          kernel文件:基本磁盘分区

              /sbin/init在redhat和centos中内核启动以后由init做为所有用户进程的父进程,负责管理用户空间的进程.所以init的PID为1,可执行文件位于/sbin/init

                  /etc/inittab 启动配置文件

                  /etc/rc.d/rc.sysinit脚本 启动

                  /lib/modules/  内核模块

 

二,GRUB: GRand Unified Bootloader.Redhat6使用的一种BooTLoader,MBR中的前 446 个字节,它的作用是引导启动内核。
 1,GRUB程序的组成,位于文件/boot/grub/,主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5组成。

    1st stage: 位于MBR中,为了引导2nd stage
    1.5 stage: 位于boot基本磁盘分区中,为识别内核文件所在的文件系统提供文件系统识别扩展
    2nd stage: 位于boot基本磁盘分区中,GRUB的引导程序      配置文件grub.conf

 2,Grub的功能:
    (1)选择要启动的内核或系统;能隐藏选择界面
    (2)提供交互式接口 e: 编辑模式 a:传递参数 c:grub命令行模式 p:输入密码,设置了密码才会出现该选项

wKiom1QEGmPBaWnlAAE1P2TZw3w443.jpg   

                编辑模式:b:启动引导 e:选择编辑的项 c:命令行模式 o:新建在上方一行 O:下方新建一行 d:删除选择的行 

wKiom1QEHYSDhicjAAF6FDce1gw997.jpg

   (3)提供基于密码的保护,密码保护的两种模式
                单独保护启用内核映像使用密码;
                定义在相应的全局段title上使用密码进入编辑模式

wKioL1QEHGyAI-3aAABcdtY27Ho132.jpg
            grub-md5-crypt:生成MD5加密密码


 3,grub.conf:配置文件的定义

default=0   #指定默认启动的内核或OS;
timeout=5   #等待用户选择要启动的内核或OS的时长,单位为秒;
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz   #指定使用的背景图片
hiddenmenu   #隐藏菜单
password --md5 ***  #说明设置进入编辑模式密码为MD5加密
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg_jt-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_jt/lv_root rd_LVM_LV=vg_jt/lv_swap  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-431.el6.x86_64.img

             title: 操作系统或内核的标题.在title前加入password字段则对进入编辑模式加密码,在title后加入password则只对启动系统映象加密码
             root: 设定内核文件所在的分区为grub的根(不是操作系统的根)
             kernel: 定义要使用的内核文件,ro标识开始定义内核的根及相关quiet为结束标识,可附加传递给内核的启动参数,

             initrd: 指定为内核提供额外驱动等功能的ram disk或ram fs文件


                 

 

 

三, init相关配置和功能 /etc/inittab:
CentOS5: 每一行定义一个操作
CentOS6: upstart 脚本

  1,配置文件:   每行定义一种操作:id:5:initdefault:

1,id: 操作的ID
2,runlevels: 在哪些级别下执行此操作
3,action: 动作常用的有initdefault,sysinit,wait,等
    initdefault: 设置默认运行级别,无需定义操作
    sysinit:指定系统初始化脚本
        si::sysinit:/etc/rc.d/rc.sysinit (id:si 所有级别 动作为sysinit 操作为:/etc/rc.d/rc.sysinit)
    wait: 等待系统切换至此级别时运行一次;
    ctrlaltdel: 定义组合键被按下时要运行的命令;
    respawn: 当指定操作进程被关闭时立即再启动一次;
        tty1:2345:respawn:/sbin/mingetty tty1
4,process: 操作


 

  2,init要完成的任务:
   (1)设定默认运行级别
   (2)指定系统运行的初始化脚本
   (3)启动指定级别下的要启动的服务,并关闭需要停止的服务

       /etc/rc.d/ 脚本文件内有被注释的chkconfig -** ** 定义启动顺序会被chkconfig命令读取. /etc/rc.d/rcN.d (0-6)内S##代表启动脚本,K##关闭脚本.在chkconfig 里查看服务对应级别的开启和关闭        rc0.d代表0级别的启动服务连接文件
        rc1.d代表1级别的启动服务连接文件
        rc2.d代表2级别的启动服务连接文件
        rc3.d代表3级别的启动服务连接文件
        rc4.d代表4级别的启动服务连接文件
        rc5.d代表5级别的启动服务连接文件
        rc6.d代表6级别的启动服务连接文件

      运行级别: 0-6: 7个级别
        0:关机
        1: 单用户模式, 直接以root用户登录(不用输入root密码)
        2:多用户模式,不支持NFS文件系统
        3:完全多用户模式,文本模式
        4:预留级别
        5:完全多用户模式,图形模式
        6:重启    /etc/init.d/  
   (4)定义CtrlAltDel组合键的动作
   (5)初始化终端:
        终端:对应的是设备
             /dev/tty#, /dev/ttyS#, /dev/console, /dev/pts/#
        调用登录入口:login-->/etc/issue     
        启动图形终端:
        X-Window, 桌面管理器

   (6)系统初始化脚本/etc/rc.d/rc.sysinit 
   (7)设置主机名
   (8)打印文本欢迎信息
   (9)激活SELinux和udev(探测装载额外硬件设备)
   (10)激活swap
   (11)挂载/etc/fstab定义的本地文件系统
   (12)检测根文件系统并对其以读写方式重新挂载
   (13)设置系统时钟
   (14)装载键盘映射
   (15)根据/etc/sysctl.conf设置内核参数
   (16)激活RAID和LVM设备
   (17)清理操作 

 

四,启动故障修复

 1,在日常使用中可能会出现忘记root用户密码的情况,在系统启动级别中1级别是可以不用输入密码进入系统.就可以利用这个特性去修改root密码

    (1)在系统尚未启动按↑↓键进入GRUB编辑模式修改启动级别

wKiom1QENofwRaNAAABabGgvgXc168.jpg

        init的级别1的表示方式:1, s, single, S
        单用户模式几乎不会启动任何服务,且不需要用户登录;但是会执行/etc/rc.d/rc.sysinit脚本;
        如是连/etc/rc.d/rc.sysinit文件也不加载,则传递 emergency

    (2)回车到GRUB选择界面按B保存修改并启动

    (3)进入系统修改root密码

wKioL1QEOG6BPqiuAACwrCiQ0qU059.jpg

    (4)修改密码以后不需要重启,使用init命令切换运行级别即可:
            # init [0-6]

            查看运行级别:
            # runlevel
            # who -r

 2,grub配置丢失bootloader并未损坏的情况,在grub中添加原配置文件信息

    (1)在系统尚未启动按↑↓键进入GRUB选择C进入grub命令行模式

    (2)设置系统引导必须的root,kernel,initrd信息

grub配置丢失后在grub中添加原配置文件信息
grub> root (hd0,0)
grub> kernel /vmlinuz-2.6.32-431.el6.x86_64(grub中原配置文件信息,tab键可以找到的文件) ro root=/dev/vg0/root quiet
grub> initrd /initramfs-2.6.32-431.el6.x86_64.img(initrd通常为cpio归档,并使用gzip压缩;通常以.img作为文件名后缀;,tab键可以找到的文件)
grub> boot

 3,grub程序损坏丢失,grub的安装:
    (1)进入安装模式选择rescue installed system(救援已安装系统)
    (2)/mnt/sysp_w_picpath 修复光盘在硬盘上检测到的根并挂载到这个目录
    (3)chroot /mnt/sysp_w_picpath 切换到这个需要修复的根系统
    (4)第一种方式:

# grub
grub> root (hd#,#)
grub> setup (hd#)
grub> quit

第二种方式:
    # grub-install --root-directory=/ /dev/sda
                                指定根目录 指定磁盘硬件


五, 根据自己的需求制作一个简单的可启动的Linux,:
  1、给将要制作的目标磁盘分区挂载到宿主机上:/dev/sdb1, /dev/sdb2
    /dev/sdb1 挂载至 /mnt/boot  #bootloader不能识别lvm,xfs等高级文件系统
    /dev/sdb2 挂载至 /mnt/sysroot  #挂载内核系统根文件系统

  2、安装grub至目标磁盘
   # grub-install --root-directory=/mnt /dev/sdb

  3、复制内核和initrd文件
   # cp /boot/vmlinuz-VERSION  /mnt/boot/vmlinuz
   # cp /boot/initramfs-VERSION.img  /mnt/boot/initramfs.img

  4、创建目标主机的根文件系统
   # mkdir -pv /mnt/sysroot/{etc/rc.d, usr, var, proc, sys, dev, lib, lib64, bin, sbin, boot, srv, mnt, media, home, root}

  5,利用脚本接着去移植bash等程序至目标主机的根文件系统;

  6、为grub提供配置文件最基础的title,root,kernel,initrd信息
  

# vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title MageEdu Little Linux
    root (hd0,0)
    kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
    initrd /initramfs.img

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章