一、前言

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

二、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

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

重启;

结果 : 正常启动

实验二、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个数据块数

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

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

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

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

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

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

实验三、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个块后再开始复制

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

重启 reboot

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

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

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

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

 mount /dev/sda2  /mnt/sysimage

进入/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       把根目录换成指定的根目录

重启 init 0

再次进入Rescue救援模式

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

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

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     包含一些附加的驱动程序

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

 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/initcp etc/rc.d/rc.sysinit /etc/rc.d

重启  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 重启

转载于:https://blog.51cto.com/13869720/2164266

linux系统启动流程及常见问题的解决相关推荐

  1. Linux下启动程序常见问题,linux系统启动流程及常见故障解决方式

    Linux系统中启动的流程: 1.加载bios的硬件信息以及进行自我检测  并根据设置取得第一个启动的设备 2.若以硬盘方式引导  读取并执行引导扇区 MBR 3.加载grub(引导程序)启动菜单(/ ...

  2. Linux 系统启动流程及其介绍

    熟悉Linux系统启动流程可以更好的排除Linux系统在启动的过程中所遇到的错误,下面介绍Linux系统在启动过程. 开机,BIOS自检:检测外置设备,目的是为了把外围设备的信息提供给操作系统使用 寻 ...

  3. Linux系统启动流程(4)制作自定义linux之一

    Linux系统启动流程(4)制作自定义linux之一 平时使用的服务器类型的linux系统一般都会装载各种软件与服务,而在某些情况下,并不能一直直接使用公司管理的系统,一是可能会出现故障,二是在处理一 ...

  4. arm linux系统启动流程

    ===================================================== arm linux系统启动相关文章列表: arm linux系统启动流程 http://bl ...

  5. linux 系统重启过程,linux 系统启动流程

    linux系统启动流程可以简单总结为以下几步 1)开机BIOS自检 2)读取MBR,进行MBR引导 3)启动bootloader 4)加载内核kernel 5)启动init进程,依据inittab文件 ...

  6. linux 打开设备 流程,Linux系统启动流程

    1.linux系统启动流程 1.加载BIOS的硬件信息,获取第一个启动设备 Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分.负责完成对CPU.主板.内存.硬盘子系统.显示 ...

  7. Arm linux系统启动流程简介

    文章目录 介绍 一.Bootloader 1.总体流程 二.Linux内核 1.总体流程 2.具体流程 总结 介绍 Arm Linux 系统启动流程可分为四个部分: 1.引导加载程序(bootload ...

  8. 图解Linux系统启动流程

    废话不多说,先上图 说明1:上图是Linux系统启动时的详细流程,其中黑色部分为主流程分支,蓝色部分为详细流程分支,绿色部分是注释部分.大家可点击查看大图. 说明2:增加了kernel和initrd间 ...

  9. ac3165 linux驱动_一文读懂Linux系统启动流程

    Linux启动管理 11.1 CentOS 6.x系统启动过程详解 CentOS 6.x系统启动过程发生了较大的变化,使用Upstart启动服务取代了原先的System V init启动服务.Upst ...

最新文章

  1. 扩展springmvc组件——当页面跳转时,需要在Controller里面创建一个空方法去跳转或者是创建一个配置类  ||日期格式化说明||自定义格式化器||消息转化器扩展fastjson
  2. 结构对齐--__packed与#pragma pack
  3. 依次提取二进制1位置的数字,
  4. 关闭window端口445
  5. ios取两个数之间的随机小数_如果取到小数区间内的任一数字?
  6. java复制的函数会报错,2 面试题之面向对象
  7. python用户交互、基本数据类型、运算符
  8. LeetCode之Two Sum
  9. preg_match_all中的标记
  10. 使用freemarker模板生成word文档
  11. nodejs的koa中cookie和session的使用,cookie和session的区别
  12. JS函数assign
  13. php阴历阳历互转类(1900~2100年)
  14. Mapbox 绘制区域边界线 鼠标悬停效果 vue
  15. multiprocessing.pool详解
  16. GAMES101 Windows作业环境配置 【Visual Studio】
  17. Ubuntu 12.04 Eclipse 3.7 紧凑布局样式美化
  18. 解决win10升级补丁后共享打印机0x0000011b报错问题最简单解决方法,不需要卸载补丁
  19. C++之getch(),getche(),getchar()的区别
  20. SAP BADI增强点初学分享

热门文章

  1. java hibernate的使用_《Hibernate快速开始 – 4 – 使用JAVA持久层 API (JPA)教程》
  2. vba交付图表设计_您是在为交付目的而“设计”吗?
  3. java 商品评价计算算法
  4. Objective-C中的@property
  5. Windows 10下,如何使用PowerShell批量重启局域网电脑
  6. mysql添加普通用户用于管理单一数据库
  7. Acitivty生命周期
  8. [tp3.2.1]数据模型 - 简单的模型连接
  9. SAP BW系统日常维护日常工作及常见的Infopackage错误
  10. Oracle分区表常用命令