一、前言

    计算机开机是一个神秘的过程。我们只是按了开机键,就看到屏幕上的进度条或者一行行的输出,直到我们到达登录界面。然而,计算机开机又是个异常脆弱的过程,我们满心期望的登录界面可能并不会出现,而是一个命令行或者错误信息。了解计算机开机过程有助于我们修复开机可能出现的问题。

二、Linux启动流程

    linux启动时我们会看到许多启动信息,大致可分为:BIOS > MBR > 引导加载程序 > 内核 > init process > login

    init程序的类型:

  • SysV: init, CentOS 5之前, 配置文件: /etc/inittab。

  • Upstart: init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf。

  • Systemd:systemd, CentOS 7,配置文件: /usr/lib/systemd/system、 /etc/systemd/system。

  1、加电自检

    当我们打开计算机电源,计算机会自动从主板的BIOS读取其中所存储的程序。这一程序通常知道一些直接连接在主板上的硬件(硬盘,网络接口,键盘,串口,并口)。现在大部分的BIOS允许从软盘、光盘或者硬盘中选择一个来启动计算机。

  2、计算机从所选择的存储设备中读取起始的512 bytes

    前512 bytes叫做主引导记录MBR (master boot record)。MBR会告诉电脑从该设备的某一个分区(partition)来装载引导加载程序(boot loader)。加载程序储存有操作系统(OS)的相关信息,比如操作系统名称,操作系统内核所在位置等。常用的boot loader有GRUB和LILO。

    GRUB有几个重要的文件,引导顺序: stage 1 > stage 1.5 > stage 2 
        stage 1:它只有512字节,通常放在MBR中,它的作用很简单,就是在系统启动时用于装载STAGE2并将控制权交给它。
        stage 2:GRUB的核心,所有的功能都是由它实现。

       stage 1.5:介于 stage 1和 stage 2之间,是它们的桥梁,因为 stage 2较大,通常都是放在一个文件系统当中的,但是 stage 1并不能识别文件系统格式,所以才需要 stage 1.5来引导位于某个文件系统当中的 stage 2。

     根据文件系统格式的不同, stage 1.5也需要相应的文件,如:e2fs_stage1_5,fat_stage1_5,分别用于识别ext和fat的文件系统格式。它存放于1-63的柱面之间。

   主要的配置文件为 grub.conf
   里面选项含义:
   
   title : 一个操作系统引动的标头,可以使多个
       root : 指明所需文件存在于哪个磁盘哪个分区上 (hd0,0)表示第一个硬盘,第一个分区,可参考/boot/grub/device.map
       kernel : 内核文件的名字,并且会有一些加载内核时的参数 or代表以只读方式加载
       initrd : 包含一些附加的驱动程序


  3、boot loader加载内核(kernel)

     内核实际上是一个用来操作计算机的程序,它是计算机操作系统的内核,主要的任务是管理计算机的硬件资源,充当软件和硬件的接口。操作系统上的任何操作都要通过内核传达给硬件。Windows和Linux各自有自己内核。狭义的操作系统就是指内核,广义的操作系统包括内核以及内核之上的各种应用。我们可以在多个分区安装boot loader,每个引导加载程序对应不同的操作系统,在读取MBR的时候选择我们想要启动的引导加载程序。这就是多操作系统的原理。

  4、若加载的是Linux内核,Linux内核开始工作

     内核会首先预留自己运行所需的内存空间,然后通过驱动程序(driver)检测计算机硬件。这样,操作系统就可以知道自己有哪些硬件可用。随后,内核会启动一个init进程。它是Linux系统中的1号进程(Linux系统没有0号进程)。到此,内核就完成了在计算机启动阶段的工作,交接给init来管理。

     Linux系统有7个运行级别(runlevel):

  •  运行级别0:系统关机状态,系统默认运行级别不能设为0,否则不能正常启动

  •  运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆,可以破译密码

  •  运行级别2:多用户状态(没有NFS)

  •  运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式

  •  运行级别4:系统未使用,保留

  •  运行级别5:有图形化的完全多用户模式,X11控制台,登陆后进入图形GUI模式

  •  运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

    通常使用较多的默认级别为 3 或 5 ,服务器基本上默认使用 3 级别,即文本界面。不同级别之间可以进行切换。

    查看init运行级别:runlevel

    切换级别:init 5

  5、根据boot loader的选项,Linux此时可以进入单用户模式(single user mode)

      在此模式下,初始脚本还没有开始执行,我们可以检测并修复计算机可能存在的错误随后,init会运行一系列的初始脚本(startup scripts),这些脚本是Linux中常见的shell scripts。这些脚本执行如下功能:

     设置计算机名称,时区,检测文件系统,挂载硬盘,清空临时文件,设置网络等;

     当执行完这些初始脚本,操作系统已经完全准备好了。

  6、在此后的过程中,你将以用户(user)的身份操作电脑。此外,根据创建用户时的设定,Linux还会将其用户归到某个组(group)中。

三、常见问题及其解决方法

  实验一 删除/boot/grub/下除了grub.conf外的其他文件

cd /boot    进入boot,除了grub,删除所有文件
ls          
cd /grub    进入grub,除了grub.conf ,删除所有文件
ls

linux系统启动流程及常见问题的解决_Linux开机启动关机重启

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_02

    删除/boot下所有,除了grub.conf

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_03

    重启;

    结果 : 正常启动

  实验二dd if=/dev/zero of=/dev/sda bs=1 count=446      清空stage1

    if=/dev/zero    从文件/dev/zero读取 (全部写零的意思)
    of=/dev/sda    输出到文件/dev/sda
    bs=1           同时设置读写块的大小为1bytes
    count=446    仅读取446个数据块数

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_04

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_05

   结果 : 无法启动,直接进入了光盘引导

   处理方法 : 进入Rescue救援模式

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_06

    根据下图的指示,几乎全部默认选项来进行操作;

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_07

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_08

    在此处可以救援模式中的shell进行操作;

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_09

df  显示目前在系统上的文件系统的磁盘使用情况统计

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_10

chroot /mnt/sysimage     用来在指定的根目录下运行指令,把根目录换成指定的根目录
grub-install /dev/sda      把grub安装到/dev/sda

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_11

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_12

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_13

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_14

  实验三dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512   破坏stage1.5

    if=/dev/zero    从文件/dev/zero读取 (全部写零的意思)
    of=/dev/sda    输出到文件/dev/sda
    bs=1           同时设置读写块的大小为1bytes
    count=10240    仅读取10240个数据块数
    seek=512 从输出文件/dev/sda   开头跳过512个块后再开始复制

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_15

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_16

     处理方法 : 进入Rescue救援模式

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_17

     重启 reboot

 实验四删除  /etc/fstab    /boot     /etc/inittab(centos6 /etc/init/rcS.conf)    /etc/rc.d/rc.sysinit   

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_06

    结果 : 无法启动,直接进入了光盘引导

    处理方法 : 进入Rescue救援模式

     因为fstab文件已删除,fstab文件:存放档案系统与目录结构对应资料的档案

 mount /dev/sda2  /mnt/sysimage

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_19

    进入/boot目录中,首先恢复丢失的/etc/fstab文件,从假根环境中通过blkid命令将结果输出重定向到真根环境中/etc/fstab中

    blkid >> /mnt/sysimage/etc/fstab      blkid命令将结果输出重定向到真根环境中/etc/fstab    

    chroot /mnt/sysimage       把根目录换成指定的根目录   

    vim /etc/fstab      编译 /etc/fstab  文件

blkid >> /mnt/sysimage/etc/fstab    blkid命令将结果输出重定向到真根环境中/etc/fstab    
chroot /mnt/sysimage       把根目录换成指定的根目录

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_20 linux系统启动流程及常见问题的解决_Linux开机启动关机重启_21

    重启 init 0

    再次进入Rescue救援模式

chroot /mnt/sysimage    把根目录换成指定的根目录
grub-install /dev/sda      把grub安装到/dev/sda

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_22

mount /dev/cdrom /media      将光盘挂载到/media
rpm -ivh /media/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force      强力安装内核

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_23

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_24

vim /boot/grub/grub.conf

   default=0
   timeout=5
   hiddenmenu
   title CentOS 6       一个操作系统引动的标头,可以使多个
      root (hd0,0)         指明所需文件存在于哪个磁盘哪个分区上 (hd0,0)表示第一个硬盘,第一个分区
      kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=b2b27503-0a08-4a84-95fc-97c9eb769b1a rhgb quiet     内核文件的名字,并且会有一些加载内核时的参数 ro 代表以只读方式加载
      initrd /initramfs-2.6.32-696.el6.x86_64.img     包含一些附加的驱动程序

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_25

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_26

 rpm -qf /etc/init/rcS.conf          查询指定文件rcS.conf来自于哪一个已安装的rpm包
 rpm -qf /etc/rc.d/rc.sysinit          查询指定文件rc.sysinit 来自于哪一个已安装的rpm包

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_27

 cd /app      进入/app目录  (该目录可任意选择)  
 cp /media/Packages/initscripts-9.03.58-1.el6.centos.x86_64.rpm /app/    将依赖包下载,复制到/app/   
 rpm2cpio initscripts-9.03.58-1.el6.centos.x86_64.rpm |cpio -id   将rpm格式的文件转换为cpio格式的文件
 cp etc/init/rcS.conf /etc/init
 cp etc/rc.d/rc.sysinit /etc/rc.d

linux系统启动流程及常见问题的解决_Linux开机启动关机重启_28linux系统启动流程及常见问题的解决_Linux开机启动关机重启_29   

    重启  reboot

四、小总结

     最后总结一下,不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中。

     sync 将数据由内存同步到硬盘中。            关机指令:                                        shutdown –h 10 计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中。              shutdown –h now 立马关机
             shutdown –h 20:25 系统会在今天20:25关机    
             shutdown –h +10 十分钟后关机              halt 关闭系统              poweroff  关机
             init 0 关机      重启指令:
            shutdown –r now 系统立马重启
            shutdown –r +10 系统十分钟后重启             reboot 就是重启,等同于 shutdown –r now
            init 6 重启