zoukankan      html  css  js  c++  java
  • Linux引导流程

    系统引导流程:

      固件firmware(CMOS/BIOS)   ——>  POST加电自检

          

      自举程序BootLoader(GRUB)  ——>  载入内核

          

      载入内核Kernel          ——>  驱动硬件

          ↓

        启动init进程

          

      读取执行配置文件/etc/inittab 

    1、init进程

      在UNIX系统中,init是第一个可以存在的进程,它的PID恒为1,但它也必须向一个更高级的功能负责:PID为0的内核调度器(kernel scheduler),从而获得CPU时间。

    2、inittab 配置文件

    [root@localhost ~]# cat /etc/inittab
    # inittab is only used by upstart for the default runlevel.
    #
    # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
    #
    # System initialization is started by /etc/init/rcS.conf
    #
    # Individual runlevels are started by /etc/init/rc.conf
    #
    # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
    #
    # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
    # with configuration in /etc/sysconfig/init.
    #
    # For information on how to write upstart event handlers, or how
    # upstart works, see init(5), init(8), and initctl(8).
    #
    # Default runlevel. The runlevels used are:
    #   0 - halt (Do NOT set initdefault to this)
    #   1 - Single user mode
    #   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
    #   3 - Full multiuser mode
    #   4 - unused
    #   5 - X11
    #   6 - reboot (Do NOT set initdefault to this)
    # 
    id:3:initdefault:
    [root@localhost ~]#

      1)运行级别:

        0  -  关机(如果运行级别设置为0,就会开不了机,因为init进程读取到配置文件inittab的运行级别为0就关机了

        1  -  单用户模式 (没有图形界面,只有root用户可以登录)

        2  -  不带图形界面,多用户模式,不带NFS(NFS,用于linux系统之间的文件共享)

        3  -  不带图形界面,多用户模式

        4  -  未使用,用户可以自己定义

        5  -  linux的图形化多用户模式

        6  -  重启(如果运行级别设置为6,开机后系统就会不停的重启,因为init进程读取到配置文件inittab的运行级别为6就重启了)

      2)查看当前的运行级别:命令runlevel

    [root@localhost ~]# runlevel
    N 3
    [root@localhost ~]#

       如果之前切换过运行级别,运行runlevel命令,还会显示之前的运行级别。例如执行init 2命令切换运行级别后再查看当前的运行级别,会把之前的运行级别也显示出来

    [root@localhost ~]# init 2
    [root@localhost ~]# runlevel
    3 2
    [root@localhost ~]#

      3)运行级别切换:init[0123456]

      如切换运行级别为2

    [root@localhost ~]# init 2

      4)在inittab文件中,所有条目采取以下格式:

    id:run-level:action:process

        id:标志符,一般为两位字母或数字

        run-level:制定运行级别,可以指定多个

        action:指定运行状态

        process:指定要运行的脚本/命令

        -----------------------------------------------------

        action常用取值:

        initdefault:指定系统缺省启动的运行级别

        sysinit:系统启动执行process中指定的命令

        wait:执行process中指定的命令,并等其结束再运行其他命令

        once:执行process中指定的命令,不等待其结束

        ctrlaltdel:按CTRL+ALT+DEL时执行process指定的命令

        如inittab中的:

    id:3:initdefault:

        使用initdefault这个action指定系统缺省运行级别

    #System initialization
    si::sysinit:/etc/rc.d/rc.sysinit

        系统启动时执行: /etc/rc.d/rc.sysinit这个脚本,这个脚本完成系统服务程序启动,如系统环境变量设置、设置系统时钟、加载字体、检查加载文件系统、生成系统启动信息日志文件等

    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    l3:3:wait:/etc/rc.d/rc 3
    l4:4:wait:/etc/rc.d/rc 4
    l5:5:wait:/etc/rc.d/rc 5
    l6:6:wait:/etc/rc.d/rc 6

        根据默认运行级别,调用/etc/rc.d/rc脚本,执行相应运行级别目录中的服务程序,完成相应运行级别的初始化设置。

    [root@localhost ~]# ls /etc/rc.d
    init.d  rc0.d  rc2.d  rc4.d  rc6.d     rc.sysinit
    rc      rc1.d  rc3.d  rc5.d  rc.local
    [root@localhost ~]# 

        如当前的默认运行级别为3,就会执行/etc/rc.d/rc3.d目录中的服务程序,完成初始化。

    [root@localhost ~]# ls /etc/rc.d/rc3.d
    K01smartd      K75quota_nld     S10network      S22messagebus    S80postfix
    K10psacct      K87restorecond   S11auditd       S24avahi-daemon  S82abrt-ccpp
    K10saslauthd   K89rdisc         S11portreserve  S25cups          S82abrtd
    K15httpd       K99rngd          S12rsyslog      S25netfs         S82abrt-oops
    K20tomcat6     S01sysstat       S13cpuspeed     S26acpid         S90crond
    K50netconsole  S02lvm2-monitor  S13irqbalance   S26haldaemon     S95atd
    K74ntpd        S08ip6tables     S15mdmonitor    S26udev-post     S99local
    K75ntpdate     S08iptables      S20kdump        S55sshd
    [root@localhost ~]# 

        我们看到在rc3.d目录中,有很多的文件。主要有两种文件,一种以大写字母S开头的文件,一种是以大写字母K开头的文件。如:

        S01sysstat

        S-start,启动服务;01-表示启动的顺序,数字越小,优先级越高;sysstat-要启动的脚本的名称

            如果不想启动一个服务,可将该服务文件的首字母S改成小写或其他字母即可,系统只会启动大写S开头的服务,如改成s01sysstat,这个服务就不会被启动

        K01smartd

        K-kill,关闭服务;01-表示关闭的顺序,数字越小,优先级越高;smartd-要关闭的脚本的名称

      5)通过以上文件我们可以看到,系统启动的大致流程:

        Firmware—>Bootloader—>Kernel—>init—>/etc/inittab—>initdefault—>/etc/rc.d/rc.sysinit—>/etc/rc.d/rc—>/etc/rc.d/rcN.d  (N=0-6)

      固件加电自检;加电自检没有问题后读取硬盘主引导记录(MBR)上的自举程序Bootloader;Bootloader载入内核,内核驱动硬件,启动init进程;init进程读取系统配置文件/etc/inittab文件,判断缺省运行级别initdefault,执行脚本/etc/rc.d/rc.sysinit,然后根据缺省运行级别执行相应的服务启动脚本/etc/rc.d/rcN.d(N=0-6);进入登录界面

    3、在/etc/rc.d/init.d目录中包含各个运行级别的服务启动程序脚本

    [root@localhost ~]# ls /etc/rc.d/init.d
    abrt-ccpp     crond      irqbalance    netfs        rdisc        sshd
    abrtd         cups       kdump         network      restorecond  sysstat
    abrt-oops     functions  killall       ntpd         rngd         tomcat6
    acpid         haldaemon  lvm2-lvmetad  ntpdate      rsyslog      udev-post
    atd           halt       lvm2-monitor  portreserve  sandbox
    auditd        httpd      mdmonitor     postfix      saslauthd
    avahi-daemon  ip6tables  messagebus    psacct       single
    cpuspeed      iptables   netconsole    quota_nld    smartd
    [root@localhost ~]# 

       如果想手工启动或停止一个服务,可以执行相应的脚本命令:

       如启动ssh服务:

    [root@localhost ~]# /etc/rc.d/init.d/sshd start

       如停止ssh服务:

    [root@localhost ~]# /etc/rc.d/init.d/sshd stop

    4、设置自启动程序

      1)方式一:使用ln -s

      如写了一个简单的脚本msg.script

    date >> /root/msg.today
    who >> /root/msg.today
    free >> /root/msg.today

      把msg.script放到/etc/rc.d/init.d目录下

      现在想让这个脚本在运行级别3能自动执行:

      1.1)给这个脚本可执行权限

    [root@localhost ~]# chmod u+x /etc/rc.d/init.d/msg.script

      1.2)使用ln -s生成软链接,并放到运行级别3的服务启动目录中

    [root@localhost ~]# ln -s /etc/rc.d/init.d/msg.script /etc/rc.d/rc3.d/S100msg.script

        S100msg.script  S-start;100-启动顺序;msg.script-要启动的脚本

      2)方式二:使用chkconfig设置自启动程序

        使用chkconfig --list命令可以查看系统服务在各个运行级别的启动状态,0-6表示运行级别

    [root@localhost ~]# chkconfig --list
    abrt-ccpp       0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭
    abrt-oops       0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭
    abrtd           0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭
    acpid           0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    atd             0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭
    auditd          0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    avahi-daemon    0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭
    cpuspeed        0:关闭  1:启用  2:启用  3:启用  4:启用  5:启用  6:关闭
    crond           0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    cups            0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    haldaemon       0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭
    httpd           0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    ip6tables       0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    iptables        0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    irqbalance      0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭
    kdump           0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭
    lvm2-monitor    0:关闭  1:启用  2:启用  3:启用  4:启用  5:启用  6:关闭
    mdmonitor       0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    messagebus      0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    netconsole      0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    netfs           0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭
    network         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    ntpd            0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    ntpdate         0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    portreserve     0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    postfix         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    psacct          0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    quota_nld       0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    rdisc           0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    restorecond     0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    rngd            0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    rsyslog         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    saslauthd       0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    smartd          0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    sshd            0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    sysstat         0:关闭  1:启用  2:启用  3:启用  4:启用  5:启用  6:关闭
    tomcat6         0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    udev-post       0:关闭  1:启用  2:启用  3:启用  4:启用  5:启用  6:关闭
    [root@localhost ~]#

      查看单个服务在各个运行级别的启动状态:

    [root@localhost ~]# chkconfig --list sshd
    sshd            0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    [root@localhost ~]# 

      比如现在想让sshd服务在运行级别2345也是关闭的,可以按如下设置

    [root@localhost ~]# chkconfig --levels 2345 sshd off

      sshd在所有运行级别都关闭后,想让sshd服务只在运行级别3启动,可按如下设置

    [root@localhost ~]# chkconfig --level 3 sshd on

      3)方式3,使用ntsysv,ntsysv提供更直观的菜单选择的方式

      如要设置在运行级别3下各个服务的启动设置,可以输入如下命令:

    [root@localhost ~]# ntsysv --level 3

      回车后弹出如下界面

        * 表示是要启动的,没有*表示不启动,用空格键选择是否要启动

    5、使用dmesg检查引导期间的错误

       比如想查看在启动的时候是否识别到网卡:

    [root@localhost ~]# dmesg | grep eth0
    eth0: registered as PCnet/PCI II 79C970A
    eth0: link up
    eth0: no IPv6 routers present
    [root@localhost ~]#

      查看系统是否识别了硬盘

    [root@localhost ~]# dmesg | grep sda
    sd 2:0:0:0: [sda] 41943040 512-byte logical blocks: (21.4 GB/20.0 GiB)
    sd 2:0:0:0: [sda] Write Protect is off
    sd 2:0:0:0: [sda] Mode Sense: 61 00 00 00
    sd 2:0:0:0: [sda] Cache data unavailable
    sd 2:0:0:0: [sda] Assuming drive cache: write through
    sd 2:0:0:0: [sda] Cache data unavailable
    sd 2:0:0:0: [sda] Assuming drive cache: write through
     sda: sda1 sda2 sda3 sda4 < sda5 >
    sd 2:0:0:0: [sda] Cache data unavailable
    sd 2:0:0:0: [sda] Assuming drive cache: write through
    sd 2:0:0:0: [sda] Attached SCSI disk
    EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: 
    dracut: Mounted root filesystem /dev/sda1
    SELinux: initialized (dev sda1, type ext4), uses xattr
    EXT4-fs (sda5): mounted filesystem with ordered data mode. Opts: 
    SELinux: initialized (dev sda5, type ext4), uses xattr
    EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: 
    SELinux: initialized (dev sda2, type ext4), uses xattr
    Adding 2047992k swap on /dev/sda3.  Priority:-1 extents:1 across:2047992k 
    [root@localhost ~]# 

      如果没有任何信息显示,说没系统没有识别

    6、检查系统日志/var/log/messages,查找可能被dmesg忽略的应用程序错误

        如查看是否有关于sshd的错误信息

    [root@localhost ~]# grep sshd /var/log/messages

    7、GRUB

      GRUB的配置文件默认为:

    /boot/grub/grub.conf
    [root@localhost ~]# cat /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 do not have a /boot partition.  This means that
    #          all kernel and initrd paths are relative to /, eg.
    #          root (hd0,0)
    #          kernel /boot/vmlinuz-version ro root=/dev/sda1
    #          initrd /boot/initrd-[generic-]version.img
    #boot=/dev/sda
    default=0
    timeout=5
    splashimage=(hd0,0)/boot/grub/splash.xpm.gz
    hiddenmenu
    title CentOS (2.6.32-279.el6.i686)
            root (hd0,0)
            kernel /boot/vmlinuz-2.6.32-279.el6.i686 ro root=UUID=1782302e-7804-4b32-9e59-04aac3651342 nomodeset rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
            initrd /boot/initramfs-2.6.32-279.el6.i686.img
    [root@localhost ~]#

      default  定义缺省的启动系统

      timeout  定义缺省的等待时间

      splashimange  定义GRUB界面图片

      hiddenmenu  隐藏菜单

      title  定义菜单项目名称

      root  设置GRUB的根设备即内核所在位置

      kernel  定义内核文件所在位置

      initrd  加载镜像文件

    8、单用户模式应用

      1)root密码忘记

        进入单用户模式重新设置root密码,方法如下:

        开机按Esc键进入GRUB界面,按e键进入编辑行模式,选中kernel行,再次按e键,在新的界面的最后一行输入1,即可进入单用户模式。

        GRUB界面如下:

      功能键:

        e  编辑当前的启动菜单项

        c  进入GRUB的命令行方式

        b  启动当前的菜单项

        d  删除当前行

        Esc  返回GRUB启动菜单界面,取消对当前单项所做的任何修改

      在GRUB界面按e键,进入如下界面

      选择第二行kernel,按e键,进入如下界面:

      我们要进入运行级别为1的单用户模式,在rhgb quiet后面输入空格,再输入1,然后回车,运行级别就会被保存

      回车后,出现以下界面

      然后按b键启动内核,就可以进入到单用户模式,单用户只有root可以登录,不需要密码

      进入到单用户模式,就可以进行系统修复,修改密码等操作,现在对root密码进行更改就行了

      最后我们切换到运行级别3,多用户模式,用新密码重新登陆系统。

      2)设置GRUB密码

        方式一:使用GRUB自带的grub-md5-crypt,输入密码就会得到密文

        方式二:在GRUB交互命令界面使用md5crypt,输入密码就会得到密文

        得到密文后,将密文复制到/etc/grub.conf文件中,放到title上面

      以后进入GRUB就需要输入密码了

      2)GRUB修复

        当开机进入grub界面但没有菜单,只剩下一个grub>提示符,解决办法可以尝试手动引导 

    grub>cat /boot/grub/grub.conf (查看参数)
    grub>root(hd0,0)
    grub>kernel 参数
    grub>initrd 参数
    grub>boot

      3)光盘修复

        3.1)把安装盘放到光驱,然后重新启动机器,按F2键进入BIOS选择光驱启动

        3.2)等安装界面出来后,按F5键进入linux rescue模式,然后在boot下输入linux rescue,回车,然后按提示操作

  • 相关阅读:
    C#中使用MATLAB
    各种插值法及效果图对比
    Visual Studio中你所不知道的智能感知
    C#中使用Surfer
    XCode中连接使用GitHub
    个人作业Week1
    个人作业Week3
    个人作业Week2
    第一次作业——subway
    执行ajax加载页面中的js总结
  • 原文地址:https://www.cnblogs.com/luxh/p/2793491.html
Copyright © 2011-2022 走看看