linux的操作系统开机大致流程图如下:
开机流程
大致的开机流程
这里针对的是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字节)。
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命令来查看。
系统服务的启动
经过加载的第一个进程系统模块与相关硬件信息的初始化后,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
出现如下图的故障,一直卡在空白界面找不到对应的文件程序加载
进入救援模式
这时候会自动找到系统的原来根挂载到了/mnt/sysimage下
真正的操作系统根/dev/sa2 在/mnt/sysimage下
破坏的文件initramfs-2.6.32-754.el6.x86_64.img 在/dev/sda1 /mnt/sysimage/boot下
切换到根目录下 chroot /mnt/sysimage
查看是否在根目录下 pwd
查看根下面的文件 ls
查看是否挂在到根下 df
查看 /boot下的文件 缺少了initramfs 文件使用下面ramdisk命令修复
进入/boot文件夹 cd /boot/
生成新的initramfs文件 :mkinitrd initramfs-
uanme -r
.imguname -r
(反向单引号)
查看是否生成成功 ls -l
成功之后退出(exit)重启(reboot)即可
删除/boot/下vmlinuz-xxx文件
[root@kaivi6 ~]# rm -f /boot/vmlinuz-2.6.32-754.el6.x86_64
产生的现象如下图:
进入救援模式
此时的根 是光盘加载的一个虚拟的文件系统根,不是我们所要找的根文件系统
创建一个新的文件夹 ,把光盘挂在到这个临时文件夹中
原理就是在光盘中有一个文件和vmlinuz是一样的,只需要挂在光盘然后拷贝过来就ok
接下来就是退出 重启就ok
启动模式为reboot形式修复
[root@kaivi6 ~]# vim /etc/inittab
修改默认启动级别为6 reboot 模式,则会不断重复开机自启。
倒计时的时候按任意键 到下面这个界面
按照下面的提示 按下 a 键
在 qiuet 后面加上 空格 1-6 跳过 /etc/inittab 中的启动选项 先进入这里对应的
默认启动项 这里选择 3 字符界面为例 ,即在qiuet 后面直接输入 3
这里注意这是临时启动,还需要改对应的文件 vim /etc/inittab 。
1 模式 单用户模式 可以修改 破解root 口令
按照下面的提示 按下 a 键 进入模式1 单用户模式
执行passwd修改口令即可
reboot
服务故障起不来故障排错
服务故障起不来故障排错
临时进入1 单用户模式 因为 一般2-5模式都是关闭的 但是1模式是开启的
一般很多服务都不启动,所以一般因为服务起不来而down机
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
产生的现象:
直接到了光盘启动,因为光盘已经连接
断开光盘现象:
会尝试去通过网络来去找开机引导文件进入救援模式:
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的模式下:
先要切换到根目录下 之后运行grub 修复命令即可
也可以用第二种方式进行交互式grub修复
MBR后续的27个扇区里面 上图看的很清楚
不仅仅修复1阶段 其他阶段都有着一定的修复
重启即可
查看是否修复
破坏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
产生的现象:
依旧救援模式 一直到开启shell中救援:
重启即可
二阶段的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阶段破坏就认为没有启动功能了 产生现象:
依旧救援模式 一直到开启shell中救援:
这个修复了grub1 2 的部分文件,但是没有修复grub.conf文件 需要手工写
vim /boot/grub/grub.conf
技巧:
:r!ls /boot/vmlinuz*
:r!ls /boot/init*
重启即可
删除/sbin/init 第一个进程
[root@kaivi6 ~]# mv /sbin/init /data
[root@kaivi6 ~]# reboot
产生的现象如下图,一直转圈圈:
选择 a键
为了看到更加清楚,把前面的rhgb quiet删除 然后加上 selinux=0 init=/bin/bash
禁用selinux 更改第一个进程
挂载光盘
之后可以引用光盘里面对应的包
ls /mnt/Packages
找到对应的安装包
有时候会第一次根的挂载第一次是只读的,这时候就需要重新挂载一次
找一个比较空的地方解开对应的压缩包
查看文件是否存在
重新移到/sbin目录下
重启即可
(登入问题)
方法二:
重启后,发现可以在bash环境下操作。此时,用rpm命令查询/sbin/init文件对应的安装包为upstart,挂载光盘到/mnt目录为安装做准备。由于/目录挂载状态为只读,重新挂载并设置为读写。
rpm重新安装upstart软件包。因为只是丢失了/sbin/init文件,所以需要添加–force选项强制覆盖安装。
重新启动后,成功进入系统。
实验: 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
直接到救援模式下的开始shell下进行操作
对应一样的版本号
这次的后果 系统找不到根在哪里,找不到分区
找不到根就等于说进不去根下面的/boot/里面进行修复
所以第一步就是先回复fastab配置文件,这样才能把根挂载
能看到只有一块sda 硬盘 一共分了5个分区 分区4和5 可以先排除,因为一个扩展分区 一个swap分区 对于1分区只有1个G的很小空间,所以当根的话不现实
,大概率是/boot分区 。最大可能是2 3 。所以在这里可以建立一个临时文件夹,尝试挂载一下 看下里面具体的内容,从而来判断哪一个是根分区。
很明显,sda2 是根
在上面文件配置之后重启
就能找到对应的根了 就可以chroot 切根进行修复了
重新启动 进入救援模式 开启shell界面
切根并且进入/boot文件夹,boot中重要的2个文件 一个是vmlinuz文件,这个文件需要光盘重新挂载后重新拷贝一份到/boot/下即可
有个这个vmlinuz文件就可以通过命令生成initramfs文件
现在还缺少grub.conf文件 需要自己配置
vim /boot/grub/grub.conf
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 0reboot
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.imguname -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前面。
加密选项的语法为:
md5加密:password --md5 加密密码
sha-512加密:password --encrypted 加密密码