zoukankan      html  css  js  c++  java
  • 系统引导

    Linux系统引导过程

    Linux引导总览:

    Linux引导过程:

    加电自检-->MBR扇区-->GRUB配置(/boot/grub/grub.conf)

    -->root(hd0,0)
      kernel(/boot/vmlinuz)
      initrd(boot/initrd-....img)
    -->/etc/inittab:
      /etc/rc.d/rc.sysinit
      /etc/rc.d/rc 级别 (initdefault默认级别)
     -->/etc/rcX.d/快捷方式
            --> /etc/rc.d/init.d/服务脚本
      S99local-->/etc/rc.local(自定义开机脚本)
    mingety tty1-tty6-->login-->验证用户配置(passwd、shadow)-->/bin/bash--?>用户正常执行命令

    Linux系统启动流程

    POST-->BIOS(Boot Sequence)-->MBR(bootloader,446)-->Kernel-->initrd-->(ROOTFS)/sbin/init(/etc/inittab)

    说明:

    Boot Sequence(启动次序):决定了到哪去找操作系统所在的位置
    bootloader:根据MBR的分区表查找活动分区,也就意味着找到操作系统所在那个分区,并加载那个分区上的内核 
    //如果第一个分区没有bootloader,就会去第二个分区找;如果第一个分区有bootloader,但bootloader损坏了,就不会到其他分区找bootloader 一般而言,bootloader获得控制权以后,BIOS基本上就退出了;bootloader获得控制权以后,就会去加载磁盘分区用户所选定的内核,
    此时把kernel装载入内存,在内存中完成解压缩,而后将控制权转交给kernel, 这时bootloader就退出了;Kernel就获得整体硬件的控制权

     

    启动引导开机顺序

        (1)主机加电自检,加载BIOS硬件信息
            (2)读取MBR的引导文件(grub,lilo)
            (3)引导linux内核
            (4)运行第一个进程init(进程号永远为1)
            (5)进入相应的运行级别  //运行级别0 1 2 3 4 5 66)运行终端,输入用户名密码

    或者:

    1.BIOS初始化
    2.引导程序
    3.内核初始化
    4.init开始并进入运行级别
    4.1执行/etc/rc.d/rc.sysinit脚本
    4.2执行/etc/rc.d/rc and /etc/rc.d/rc[0-6].d/下的脚本
    4.3执行/etc/rc.d/rc.local脚本
    4.4进入虚拟控制台Virtual consoles
    4.5进入图形界面

    BIOS初始化

     

     

    1.侦测外围设备
    2.选择引导设备
    读取和执行引导设备的第一个扇区,即MB

     

     

    编辑/etc/grub.conf

    
    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE:  You have a /boot partition.  This means that
    #          all kernel and initrd paths are relative to /boot/, eg.
    #          root (hd0,0)
    #          kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
    #          initrd /initrd-[generic-]version.img
    #boot=/dev/vda
    default=0  ##启动顺序,从0开始排序
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz  #表示第一个硬盘的第一个分区
    hiddenmenu
    title CentOS 6 (2.6.32-642.el6.x86_64)  #加载内核
            root (hd0,0)
            kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=tty0 console=ttyS0,115200n8
            initrd /initramfs-2.6.32-642.el6.x86_64.img

    #ro :以只读方式挂载根分区

     

    :卷标

     

    rootnoverify :不校验

    chainloader +1:读取硬盘的第一个扇区

     grub加密:

    文件:

    default=0  # 设定默认启动的title的编号,从0开始
    timeout=5  # 等待用户选择的超时时长,单位是秒
    splashimage=(hd0,0)/grub/splash.xpm.gz  # grub的背景图片
    hiddenmenu # 隐藏菜单
    password redhat
    password --md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG.
    title Red Hat Enterprise Linux Server (2.6.18-308.el5)  # 内核标题,或操作系统名称,字符串,可自由修改
        root (hd0,0)  # 内核文件所在的设备;对grub而言,所有类型硬盘一律hd,格式为(hd#,N);hd#, #表示第几个磁盘;最后的N表示对应磁盘的分区;
        kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet   # 内核文件路径,及传递给内核的参数;虽然是/boot/的文件,但是是通过grub访问的
        initrd /initrd-2.6.18-308.el5.img # ramdisk文件路径
        password --md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG.
    title Install Red Hat Enterprise Linux 5
        root (hd0,0)
        kernel /vmlinuz-5 ks=http://172.16.0.1/workstation.cfg ksdevice=eth0 noipv6
        initrd /initrd-5
        password --md5 $1$FSUEU/$uhUUc8USBK5QAXc.BfW4m.

    内核初始化

     

    1.设备检测
    2.设备驱动初始化
    3.只读方式挂载根分区系统
    4.加载init程序

     ctrl+alt+del3秒重启

    市电停电后,由ups发出指令让计算机2分钟后关机

    发电了,结束关机动作

    2345级别进入系统可以得到1-6tty终端

    1.在执行此脚本之前,3级别和5级别是一模一样的
    2.如果把5改成3,通过5或3进来都会进入字符界面

    系统启动后执行的最后一个脚本:/etc/rc.d/rc.local;跟用户无关;这个脚本执行后才会进入登录界面

     

     

    Linux运行级别

    默认包括7种运行级别

        0:halt
            1: single user mode, 直接以管理员身份切入, s,S,single
            2:multi user mode, no NFS
            3: multi user mode, text mode
            4:reserved
            5: multi user mode, graphic mode
            6: reboot

     INIT进程

    Linux内核加载执行 /sbin/init程序

    系统中第一个进程,进程ID始终为1
    主配置文件:/etc/inittab

    /etc/inittab记录格式

    id:runlevels:action:process
    或者:

    [设置项目]:[runlevel]:[init操作行为]:[命令项目]

     

    id:runlevels:action:process
    id: 标识符
    runlevels: 在哪个级别运行此行;
    action: 在什么情况下执行此行;
    process: 要运行程序; 

    行动类别

    initdefault: 设定默认运行级别
    sysinit: 系统初始化
    wait: 等待级别切换至此级别时执行
    respawn: 一旦程序终止,会重新启动

    配置文件:

    [root@localhost ~]#  vim  /etc/inittab    //进入设置启动级别         
            id:5:initdefault:        //设置系统默认启动的级别             
            ca::ctrlaltdel:/sbin/shutdown -t3 -r now  //三键重启比较危险,所以在编辑第32行时要在ca前面加#号屏蔽掉这条命令     

    /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.sysinit脚本

    ##: 关闭或启动的优先次序,数据越小越优先被选定
    先关闭以K开头的服务,后启动以S开头的服务;

     

    切换运行级别

    设置默认级别

     默认级别千万不要设置为 0 4 6

     查看当前的运行级别

    #runlevel
    5 3

     切换到指定的运行级别

    #init 3

     其他初始化配置

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

    由init进程调用执行
    设置网络时钟、加载文件系统等一系列工作

    /etc/rc.d/rc脚本

    由init进程调用执行
    根据运行级别参数,加载/终止相关服务

    /etc/rc.d/rc.local脚本

    由rc脚本调用执行
    保存用户定义的需开机后自动执行的命令

     RHEL6的系统开机的过程: 

    1. 加载BIOS的硬件信息、进行自我测试,并依据设定获得第一个可开机的设备; 
    2. 读取并执行第一个开机设备内MBR的boot Loader(grub等程序); 
    3. 依据boot loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序; 
    4. 内核启动init; 
    5. 系统初始化:(/etc/init/rcS.conf exec /etc/rc.d/rc.sysinit);
    6. init找到/etc/inittab文件,确定默认的运行级别(X) (/etc/init/rcS.conf exec telinit $runlevel); 
    7. 触发相应的runlevel事件(/etc/init/rc.conf exec /etc/rc.d/rc $RUNLEVEL); 
    8. 开始运行/etc/rc.d/rc,传入参数X; 
    9. /etc/rc.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本; 
    10. /etc/rcX.d/中的脚本按事先设定的优先级依次启动;
    11. 最后执行/etc/rc.d/rc.local;
    12. 加载终端或X-Window 接口。

    解决修改错误配置的方法:

    1、在grub界面时输入e
    
    2、选中第二行输入e
    
    3、最后输入1/single/s(单用户级别)——

    单用户级别可绕过验证,不会去读/etc/inittab这个文件

  • 相关阅读:
    (Redis基础教程之十) 如何在Redis中运行事务
    (Python基础教程之十三)Python中使用httplib2 – HTTP GET和POST示例
    (Redis基础教程之六)如何使用Redis中的List
    (Redis基础教程之九) 如何在Redis中使用Sorted Sets
    (Python基础教程之十九)Python优先级队列示例
    (Python基础教程之十八)Python字典交集–比较两个字典
    (Python基础教程之十七)Python OrderedDict –有序字典
    Heap_Sort
    Quick_Sort
    Merge_Sort
  • 原文地址:https://www.cnblogs.com/zhongguiyao/p/9180396.html
Copyright © 2011-2022 走看看