linux的操作系统开机大致流程图如下:

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启

开机流程

大致的开机流程

这里针对的是linux系统的开机过程,linux系统大致开机流程如下:

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”执行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.加载终端或者图形界面

BIOS:开机自检与MBR

要启动系统首先就得去加载BIOS(Basic Input Output System),并通过BIOS程序去加载CMOS的信息,并且由CMOS内的设定值取得主机的各项硬件配置信息(如开机设备的搜寻顺序、硬盘的大小与类型、 系统时间、各周边总线的是否启动Plug and Play (PnP, 即插即用设备)、等等)。在取得这些信息后,BIOS还会进行开机自检(Power-on Self Test, POST)。 然后开始执行硬件检测的初始化,并设定PnP设备,之后再定义出可开机的设备顺序, 接下来就会开始进行开机设备的数据读取了(MBR相关的任务开始)。

我们还需要一个开机管理程序来处理内核文件的加载问题,这个开机管理程序就被称为Boot Loader。这个Boot Loader程序安装在开机设备的第一个扇区(sector)内,也就是MBR (Master Boot Record,主要启动记录区,第一个扇区的512字节)。

主板BIOS不断重启 bios 不断重启_运行级别_02

Boot Loader最主要功能是加载内核到主存储器中去执行,由于不同操作系统的文件格式不一致,因此每种操作系统都有自己的boot loader。 由boot loader的管理而开始读取内核文件后,接下来,Linux 就会将内核解压缩到主存储器当中, 并且利用内核的功能,开始测试与驱动各个周边设备,包括储存设备、CPU、网卡、声卡等等。 此时 Linux 内核会以自己的功能重新检测一次硬件,内核会被放置到 /boot 里面,并且取名为 /boot/vmlinuz

init及配置文件 /etc/inittab 与 runlevel

在内核加载完毕、进行完硬件检测与驱动程序加载后,此时主机硬件已经准备就绪了,这时候内核会启动第一个程序,那就是 /sbin/init;/sbin/init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动等。 而所有的动作都会通过 init的配置文件/etc/inittab来规划,而inittab 内还有一个很重要的设定内容,那就是默认的 runlevel (开机运行级别)。

Linux就是通过设定runlevel来规定系统使用不同的服务来启动,让Linux的使用环境不同。这个inittab文件里面的支持级别
#vim /etc/inittab 部分内容解释如下:

0 - halt (系统直接关机)
1 - single user mode (单人维护模式,用在系统出问题时的维护)
2 - Multi-user, without NFS (类似底下的 runlevel 3,但无 NFS 服务)
3 - Full multi-user mode (完整含有网络功能的纯文本模式)
4 - unused (系统保留功能)
5 - X11 (与 runlevel 3 类似,但加载使用 X Window)
6 - reboot (重新启动)

0, 4, 6 不是关机、重新启动就是系统保留的,所以不能将预设的run level设定为这三个值。

[root@CentOS-7 ~]# vim /etc/inittab 

# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default                #查看默认级别
# 
# To set a default target, run:
# systemctl set-default TARGET.target  #设置默认级别

按照该文件所说的,runlevels被targets所取代,即CentOS7采用加载target的方式来替代之前的启动级别。其中有两个重要的target:multi-user.target与graphical.target。它们分别表示运行级别中的3与5级别。

设置运行级别

get-default :取得当前的target
set-default :设置指定的target为默认的运行级别
isolate :切换到指定的运行级别
unit.target :为5.1表中列出的运行级别

systemctl

命令 说明

systemctl get-default

获得当前的运行级别

systemctl set-default multi-user.target

设置默认的运行级别为mulit-user

systemctl isolate multi-user.target

在不重启的情况下,切换到运行级别mulit-user下

systemctl isolate graphical.target

在不重启的情况下,切换到图形界面下

注:该表前两行是设置默认运行级别,后两行是设置当前运行级别。

[root@CentOS-7 ~]# systemctl get-default
multi-user.target

[root@CentOS-7 ~]# runlevel 
N 3

/etc/rc.d/* 文件工作内容

1、获得网络环境
2、挂载设备
3、开机启动画面Plymouth(取替了过往的 RHGB)
4、判断是否启用SELinux
5、显示于开机过程中的欢迎画面
6、初始化硬件
7、用户自定义模块的加载
8、配置内核的参数
9、设置主机名
10、同步存储器
11、设备映射器及相关的初始化
12、初始化软件磁盘阵列(RAID)
13、初始化 LVM 的文件系统功能
14、检验磁盘文件系统(fsck)
15、磁盘配额(quota)
16、重新以可读写模式挂载系统磁盘
17、更新quota(非必要)
18、启动系统虚拟随机数生成器
19、配置机器(非必要)
20、清除开机过程当中的临时文件
21、创建ICE目录
22、启动交换分区(swap)
23、将开机信息写入/var/log/dmesg文件中

这个文件里面的许多预设配置文件在/etc/sysconfig/这个目录当中,要了解更多的系统启动信息,可以到/var/log/dmesg文件中查看,也可以用dmesg命令来查看。

主板BIOS不断重启 bios 不断重启_加载_03

系统服务的启动

经过加载的第一个进程系统模块与相关硬件信息的初始化后,Linux系统应该已经能顺利工作了。但还需要启动一些为我们提供服务的服务。这个时候,依据在/etc/inittab里面run level的设定值,就可以来决定启动的服务项目了。可以打开/etc/rc* 这个文件来研究

[root@CentOS-7 ~]# ls /etc/rc*
rc0.d/    rc1.d/    rc2.d/    rc3.d/    rc4.d/    rc5.d/    rc6.d/    rc.d/     rc.local

以运行级别3来说明
#ls /etc/rc3.d/
在这个目录下的文件主要具有2个特点:
1、全部以Sxx或Kxx(xx为数字)开头
2、全部是链接文件,链接到/etc/init.d/
现在来说明一下这些的目的
S表示启动服务, K表示停止服务,后面的数字是启动的先后顺序

[root@CentOS-7 ~]# ls /etc/rc3.d/
K50netconsole  S10network
[root@CentOS-7 ~]# ll /etc/rc3.d/
total 0
lrwxrwxrwx. 1 root root 20 May 18 14:32 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 May 18 14:32 S10network -> ../init.d/network

用户自定义开机启动脚本

上面讲到的都是一些系统服务,Linux系统可以安装其它的软件来提供服务,若要自己安装的服务也要在开机启动,就可以用 /etc/rc.local 来完成。这就是我们要讲的用户自定义开机启动脚本。我们只要把想启动的脚本写到这个文件中,开机就能启动了,注意一点,写在这里面的脚本要使用绝对路径

故障排错

删除/boot/下initramfs-xxx.img 文件

查看原本机器的/boot目录下的文件

[root@CentOS-7 ~]# ll /boot
total 97940
-rw-r--r--. 1 root root   152976 Aug  8  2019 config-3.10.0-1062.el7.x86_64
drwxr-xr-x. 3 root root       17 May 18 14:31 efi
drwxr-xr-x. 2 root root       27 May 18 14:32 grub
drwx------. 5 root root       97 May 18 14:39 grub2
-rw-------. 1 root root 61179513 May 18 14:36 initramfs-0-rescue-a15014baccab41549421b2cfbaf067e3.img
-rw-------. 1 root root 21560887 May 18 14:39 initramfs-3.10.0-1062.el7.x86_64.img
-rw-r--r--. 1 root root   318717 Aug  8  2019 symvers-3.10.0-1062.el7.x86_64.gz
-rw-------. 1 root root  3594971 Aug  8  2019 System.map-3.10.0-1062.el7.x86_64
-rwxr-xr-x. 1 root root  6734016 May 18 14:36 vmlinuz-0-rescue-a15014baccab41549421b2cfbaf067e3
-rwxr-xr-x. 1 root root  6734016 Aug  8  2019 vmlinuz-3.10.0-1062.el7.x86_64

实验模拟把/boot/下initramfs-xxx.img 文件删除,并且重启看会出现哪些现象

[root@kaivi6 boot]# rm -rf initramfs-2.6.32-754.el6.x86_64.img 
[root@kaivi6 boot]# reboot

出现如下图的故障,一直卡在空白界面找不到对应的文件程序加载

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_04


进入救援模式

主板BIOS不断重启 bios 不断重启_运行级别_05


主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_06


主板BIOS不断重启 bios 不断重启_重启_07


主板BIOS不断重启 bios 不断重启_运行级别_08


这时候会自动找到系统的原来根挂载到了/mnt/sysimage下

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_09


真正的操作系统根/dev/sa2 在/mnt/sysimage下

破坏的文件initramfs-2.6.32-754.el6.x86_64.img 在/dev/sda1 /mnt/sysimage/boot下

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_10


切换到根目录下 chroot /mnt/sysimage

查看是否在根目录下 pwd

查看根下面的文件 ls

查看是否挂在到根下 df

查看 /boot下的文件 缺少了initramfs 文件使用下面ramdisk命令修复

主板BIOS不断重启 bios 不断重启_重启_11


主板BIOS不断重启 bios 不断重启_加载_12


进入/boot文件夹 cd /boot/

生成新的initramfs文件 :mkinitrd initramfs-uanme -r.img uname -r (反向单引号)

查看是否生成成功 ls -l
成功之后退出(exit)重启(reboot)即可

主板BIOS不断重启 bios 不断重启_运行级别_13


主板BIOS不断重启 bios 不断重启_重启_14

删除/boot/下vmlinuz-xxx文件

[root@kaivi6 ~]# rm -f /boot/vmlinuz-2.6.32-754.el6.x86_64

产生的现象如下图:

主板BIOS不断重启 bios 不断重启_运行级别_15


进入救援模式

主板BIOS不断重启 bios 不断重启_加载_16


主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_17


主板BIOS不断重启 bios 不断重启_加载_18


主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_19


此时的根 是光盘加载的一个虚拟的文件系统根,不是我们所要找的根文件系统

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_20


创建一个新的文件夹 ,把光盘挂在到这个临时文件夹中

主板BIOS不断重启 bios 不断重启_加载_21


原理就是在光盘中有一个文件和vmlinuz是一样的,只需要挂在光盘然后拷贝过来就ok

接下来就是退出 重启就ok

主板BIOS不断重启 bios 不断重启_加载_22

启动模式为reboot形式修复

[root@kaivi6 ~]# vim /etc/inittab

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_23


修改默认启动级别为6 reboot 模式,则会不断重复开机自启。

主板BIOS不断重启 bios 不断重启_加载_24


倒计时的时候按任意键 到下面这个界面

主板BIOS不断重启 bios 不断重启_运行级别_25


按照下面的提示 按下 a 键

主板BIOS不断重启 bios 不断重启_运行级别_26


在 qiuet 后面加上 空格 1-6 跳过 /etc/inittab 中的启动选项 先进入这里对应的

默认启动项 这里选择 3 字符界面为例 ,即在qiuet 后面直接输入 3

这里注意这是临时启动,还需要改对应的文件 vim /etc/inittab 。

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_27


1 模式 单用户模式 可以修改 破解root 口令

主板BIOS不断重启 bios 不断重启_运行级别_28

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_29


按照下面的提示 按下 a 键 进入模式1 单用户模式

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_30


执行passwd修改口令即可

主板BIOS不断重启 bios 不断重启_运行级别_31


reboot

服务故障起不来故障排错

服务故障起不来故障排错

临时进入1 单用户模式 因为 一般2-5模式都是关闭的 但是1模式是开启的

一般很多服务都不启动,所以一般因为服务起不来而down机

主板BIOS不断重启 bios 不断重启_运行级别_32


checonfig --list

找到对应的服务先暂时关闭

checonfig [service] off [service] 对应的服务名称

重启忽略这个服务先把机器起来

之后再解决的服务的问题

reboot

grub破坏

破坏一阶段(RBM前面446字节)

[root@kaivi6 ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446
446+0 records in
446+0 records out
446 bytes (446 B) copied, 0.00988625 s, 45.1 kB/s

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_33


产生的现象:

直接到了光盘启动,因为光盘已经连接

主板BIOS不断重启 bios 不断重启_重启_34


断开光盘现象:

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_35


会尝试去通过网络来去找开机引导文件进入救援模式:

主板BIOS不断重启 bios 不断重启_重启_36

GRUB安装
安装grub:
1.grub-install
安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下
grub-install --root-directory=DIR/dev/DISK

2.grub
grub>root(hd#,#)
grub>setup(hd#)

第一种方式后面加的是硬盘DISK,因为gurb的引导文件在BMR的前面446字节,不属于任何一个分区
第二种方式是gurb交互是的方式
boot 的分区
setup 按装分区

进入到开启shell的模式下:

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_37


主板BIOS不断重启 bios 不断重启_运行级别_38


先要切换到根目录下 之后运行grub 修复命令即可

也可以用第二种方式进行交互式grub修复

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_39


MBR后续的27个扇区里面 上图看的很清楚

不仅仅修复1阶段 其他阶段都有着一定的修复

重启即可

查看是否修复

主板BIOS不断重启 bios 不断重启_加载_40

破坏1.5阶段 就是后面27个扇区(27*512=13k)

[root@kaivi6 ~]# dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512
10240+0 records in
10240+0 records out
10240 bytes (10 kB) copied, 0.021381 s, 479 kB/s

产生的现象:

主板BIOS不断重启 bios 不断重启_运行级别_41


依旧救援模式 一直到开启shell中救援:

主板BIOS不断重启 bios 不断重启_运行级别_42


重启即可

二阶段的grub修复

先破坏二阶段的分区表

[root@kaivi6 grub]# dd if=/dev/zero of=/dev/sda bs=1 count=446
446+0 records in
446+0 records out
446 bytes (446 B) copied, 0.00951482 s, 46.9 kB/s

[root@kaivi6 grub]# hexdump -C -n 512 /dev/sda -v 
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
[root@kaivi6 grub]# rm -rf /boot/grub/
[root@kaivi6 grub]# reboot

grub1阶段破坏就认为没有启动功能了 产生现象:

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_43


依旧救援模式 一直到开启shell中救援:

主板BIOS不断重启 bios 不断重启_运行级别_44


这个修复了grub1 2 的部分文件,但是没有修复grub.conf文件 需要手工写

主板BIOS不断重启 bios 不断重启_加载_45

vim /boot/grub/grub.conf

主板BIOS不断重启 bios 不断重启_重启_46

技巧:
:r!ls /boot/vmlinuz*
:r!ls /boot/init*

重启即可

删除/sbin/init 第一个进程

[root@kaivi6 ~]# mv /sbin/init /data
[root@kaivi6 ~]# reboot

产生的现象如下图,一直转圈圈:

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_47


主板BIOS不断重启 bios 不断重启_加载_48


选择 a键

为了看到更加清楚,把前面的rhgb quiet删除 然后加上 selinux=0 init=/bin/bash

禁用selinux 更改第一个进程

主板BIOS不断重启 bios 不断重启_加载_49


主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_50

主板BIOS不断重启 bios 不断重启_重启_51


挂载光盘

之后可以引用光盘里面对应的包

ls /mnt/Packages

主板BIOS不断重启 bios 不断重启_加载_52


主板BIOS不断重启 bios 不断重启_运行级别_53


找到对应的安装包

有时候会第一次根的挂载第一次是只读的,这时候就需要重新挂载一次

主板BIOS不断重启 bios 不断重启_加载_54


找一个比较空的地方解开对应的压缩包

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_55


主板BIOS不断重启 bios 不断重启_重启_56


查看文件是否存在

主板BIOS不断重启 bios 不断重启_运行级别_57


重新移到/sbin目录下

重启即可

(登入问题)

方法二:

重启后,发现可以在bash环境下操作。此时,用rpm命令查询/sbin/init文件对应的安装包为upstart,挂载光盘到/mnt目录为安装做准备。由于/目录挂载状态为只读,重新挂载并设置为读写。

rpm重新安装upstart软件包。因为只是丢失了/sbin/init文件,所以需要添加–force选项强制覆盖安装。

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_58


重新启动后,成功进入系统。

实验: rm /sbin/init 恢复之
1 grub菜单 加 selinux=0 init=/bin/bash
2 mount -o remount,rw /
3 mount /dev/sr0 /mnt/
4 rpm2cpio /mnt/Packages/upstart.xxx.rpm | cpio -idv ./sbin/init
5 mv ./sbin/init /sbin/

删除 /etc/fstab 和 /boot/

[root@kaivi6 ~]# rm -rf /etc/fstab  /boot/*
[root@kaivi6 ~]# cat /etc/fstab
cat: /etc/fstab: No such file or directory
[root@kaivi6 ~]# ll /boot/
total 0

主板BIOS不断重启 bios 不断重启_重启_59


直接到救援模式下的开始shell下进行操作

对应一样的版本号

这次的后果 系统找不到根在哪里,找不到分区

主板BIOS不断重启 bios 不断重启_重启_60


找不到根就等于说进不去根下面的/boot/里面进行修复

所以第一步就是先回复fastab配置文件,这样才能把根挂载

主板BIOS不断重启 bios 不断重启_重启_61


能看到只有一块sda 硬盘 一共分了5个分区 分区4和5 可以先排除,因为一个扩展分区 一个swap分区 对于1分区只有1个G的很小空间,所以当根的话不现实

,大概率是/boot分区 。最大可能是2 3 。所以在这里可以建立一个临时文件夹,尝试挂载一下 看下里面具体的内容,从而来判断哪一个是根分区。

主板BIOS不断重启 bios 不断重启_重启_62


很明显,sda2 是根

主板BIOS不断重启 bios 不断重启_加载_63


主板BIOS不断重启 bios 不断重启_运行级别_64


主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_65


主板BIOS不断重启 bios 不断重启_重启_66


在上面文件配置之后重启

就能找到对应的根了 就可以chroot 切根进行修复了

重新启动 进入救援模式 开启shell界面

主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_67


主板BIOS不断重启 bios 不断重启_加载_68


切根并且进入/boot文件夹,boot中重要的2个文件 一个是vmlinuz文件,这个文件需要光盘重新挂载后重新拷贝一份到/boot/下即可

主板BIOS不断重启 bios 不断重启_重启_69


有个这个vmlinuz文件就可以通过命令生成initramfs文件

主板BIOS不断重启 bios 不断重启_加载_70


现在还缺少grub.conf文件 需要自己配置

vim /boot/grub/grub.conf

主板BIOS不断重启 bios 不断重启_重启_71


主板BIOS不断重启 bios 不断重启_主板BIOS不断重启_72

1 rescue mode
恢复/etc/fstab 找到/ 所在分区 fdisk -l
mkdir /mnt/tmp
mount/dev/sdaN /mnt/tmp
ls /mnt/tmp
mount /dev/sda2 /mnt/tmp
vim /mnt/tmp/etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda3 /data ext4 defaults 0 0
/dev/sda5 swap swap defaults 0 0

reboot

2 rescue mode 恢复内核和initrd 文件
/dev/sda2 --> /mnt/sysimage
chroot /mnt/sysimage
mount /dev/sr0 /mnt/
方法1 rpm -ivh/mnt/Packages/kernel.xxxx.rpm --force

方法2 cp /mnt/isolinux/vmlinuz /boot/
mkinitrd /boot/initramfs.img uname -r

3 修复 grub grub-install /dev/sda vim /boot/grub/grub.conf 方法2
cat /boot/grub/grub.conf
default=0
timeout=5
title=centos
kernel /vmlinuz root=/dev/sda2
initrd /initramfs.img
4 reboot

给grub的启动过程加密

给grub的启动过程加密:

可以在grub的启动过程的两个环节加密:
1)给启动菜单项编辑权限加密;
2)启动特定菜单项的加密,加密命令相同,但是位于/boot/grub/grub.conf文件的不同位置

加密可以使用明文密码,但安全性太差。目前使用md5和sha-512加密方式加密,现在用md5加密启动项编辑权限,用sha-512加密启动特定菜单项

可以在vim编辑器下使用:r!grub-md5-crypt和r!grub-crypt命令直接生成md5和sha-512加密密码。一般把这个password放在hiddenmenu前面。

主板BIOS不断重启 bios 不断重启_重启_73


加密选项的语法为:

md5加密:password --md5 加密密码

sha-512加密:password --encrypted 加密密码