开机启动流程
一、Centos 6启动流程
1.内核引导
- 加载BIOS的硬件信息,根据设定取得第一个可开机引导设置,如:光驱,硬盘,网络,USB
- 读取硬盘中MBR的boot Loader就是grub引导
GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。
MBR的硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)
为什么MBR分区表,只能分4个主分区?
注:磁盘默认一个扇区大小为:512字节。MBR由以下3部分组成:
第一部分是:主引导程序(boot loader)占446个字节。主引导程序,它负责从活动分区中装载,并运行系统引导程序。
第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。每个分区表项长16个字节,16*4=64字节。为分区项1、分区项2、分区项3、分区项4。64字节只存4个分区表。
第三部分是MBR有效标识位,占2个字节,固定为55AA。如果这个标志位0xAA55,就认为这个是MBR。
所以:16*4+446+2=512
- 依据 boot loader 的设定,到引导分区加载 Kernel ,Kernel 会开始侦测硬件并加载驱动程序;
2.运行init
- 在硬件驱动成功后,Kernel 会主动执行 init 程序,而 init 会取得 run-level 信息
init:
sysV: CentOS5之前使用的 pid为1的进程
Upstart: CentOS6使用的 pid为1的进程
Systemd: CentOS7使用的 pid为1的进程
其中Systemd启动速度最快
## 加载init,涉及到Linux系统中7个运行级别
# 查看Linux系统当前的运行级别
[root@localhost ~]# runlevelN 3
0:关机运行级别
1:单用户运行级别(维护模式)
2:多用户运行级别,没有文件系统(无网络支持)
3:多用户运行级别,有文件系统(命令行模式)
4:CentOS6和7 保留,未使用
5:多用户,图形化运行级别
6:重启运行级别
3.系统初始化
- 加载rc.sysinit(系统初始化)
读取完运行级别,系统将执行第一个用户层文件/etc/rc.d/rc.sysinit,该文件功能包括:设定PATH运行变更、设定网络配置、启动swap分区、设定/proc、系统函数、配置SELinux等。 - 加载内核模块
读取/etc/modules.conf文件及/etc/modules.d目录下的文件夹来加载系统内核模块。该模块文件,可以后期添加或者修改及删除。
4.建立终端
- 启动运行级别程序
根据读取到的运行级别,操作系统会运行rc0.d到rc6.d中相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
- 读取 rc.local文件
操作系统启动完相应服务后,会读取执行/etc/rc.d/rc.local文件
5.用户登录系统
- 执行/bin/login程序
执行/bin/login程序,启动到系统登录界面,如下图所示,输入用户名、密码即可登录Linux操作系统。至此该操作系统完整启动流程完毕。
二、CentOS7启动流程
第一步:硬件启动阶段
加载BIOS的硬件信息,根据设定取得第一个可开机引导设置,如:光驱,硬盘,网络,USB
第二步:GRUB2引导阶段
CentOS7的主引导程序使用的是grub2。
本步的流程:
-
先加载两个镜像;
-
再加载MOD模块文件,把grub2程序加载执行;
-
接着解析配置文件/boot/grub/grub.cfg,根据配置文件加载内核模块到你内存
-
之后构建虚拟根文件系统,最后转到内核。
CentOS7中一般是使用命令进行配置,而不直接去修改配置文件grub.cfg配置文件开头注释部分说明了由/etc/grub.d/目录下文件和/etc/default/grub文件组成。一般修改好配置后都需要使用命令grub2-mkconfig -o /boot/grub2/grub.cfg,将配置文件重新生成。
第三步、内核引导阶段
执行的初始化程序变成了/usr/lib/systemd/systemd
第四步、systemed初始化阶段(又叫系统初始化阶段)
CentOS7中我们的初始化进程变为了systemd。
runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target
runlevel3.target -> multi-user.target
runlevel4.target -> multi-user.target
runlevel5.target -> graphical.target
runlevel6.target -> reboot.target
本步的流程:
-
执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关);
-
然后执行sysinit.target来初始化系统和basic.target来准备操作系统;
-
接着启动multi-user.target下的本机服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动;
-
最后执行multi-user下的getty.target及登录服务,检查default.target是否有其他的服务需要启动。
注意:/etc/systemd/system/default.target指向了/lib/systemd/system/目录下的graphical.target或multiuser.target。而graphical.target依赖multiuser.target,multiuser.target依赖basic.target,basic.target依赖sysinit.target,所以倒过来执行。
(1)./etc/systemd/system/default.target
这是一个软链接,和默认运行级别相关
(2)./usr/lib/systemd/system/
这个目录存储每个服务的脚本,类似CentOS6的/etc/init.d/
(3)./run/systemd/system/
系统执行过程中产生的脚本
(4)./etc/systemd/system/
类似于CentOS6的/etc/rc.d/rc#.d/SXX类文件的功能,管理员建立的执行脚本,大部分是软链接
CentOS7进入单用户模式-忘记root密码
1.关机
关机命令:
halt
poweroff
shutdown -n now
init 0
2.开机
- 按e进入gurb2菜单
3.找到Linux 16的那一行,将ro改为"rw 如果不改的话则需要重新挂载/ mount -o rw,remount 因为/目前只是可读状态。行末添加enforcing=0 init=/bin/bash
4.按Ctrl+x执行可进入单用户模式
5.切换到系统真正的根目录下:chroot/sysroot
6.输入passwd root修改密码
7.重新加载init exec /sbin/init
CentOS7进入单用户模式-修改默认运行级别
1.关机
2.进入grub2菜单
3.按e编辑grub2菜单的内核参数
修改后,按Ctrl + x
将Linux16行中的ro 改成rw
行末写:rd.break
# 1.重新挂载root权限目录
mount -o rw,remount /sysroot
# 2.获取root权限
chroot /sysroot
# 3.修改默认运行级别
systemctl set-default multi-user.target
# 4.退出
exit
# 5.重启
reboot
三、救援模式
前提:需要有系统盘,才可以进入救援模式
- 将系统盘放入光驱中
- 以光盘启动引导系统 ,保存退出(在虚拟机关闭状态下,选择“打开电源时进入固件”或者在虚拟机启动时,按F2进入BIOS;然后通过键盘选择到“BOOT”,选择第一启动项为"CD-ROM Drive",按F10保存并重启系统
- 使用光盘引导,系统重启后进入centos系统安装的界面,选择“Troubleshooting”
- 选择第二个Rescue a CentOS system进入救援模式
-
接着在光标后输入“1”,选择“continue”选项;
Continue是让虚拟系统找到根分区并读写方式挂载到/mnt/sysimage,这是最常用的一种方式
-
系统会给一个shell维护脚本,这时候进入的是虚拟系统的根目录,真实的目录存储在/mnt/sysimage下面,
我们使用chroot /mnt/sysimage命令把原本假的根目录切换到真实的根目录
# 1.先输入回车
# 2.获取root的环境(root权限)
chroot /mnt/sysimag
案例1-损坏系统扇区
dd </dev/zero >/dev/sda bs=1count=446
将/dev/zreo中的数据拷贝至sda的MBR扇区中,以达到模拟破坏MBR扇区的效果。
MBR扇区
MBR扇区位于磁盘的第一扇区,一个扇区512字节。系统启动时候会最先读取MBR扇区,获取系统启动必要文件路径。MBR扇区中包含三个部分,446字节的引导代码(grud),64字节的分区表(4个主分区信息)和2字节结束标志。MBR分区表的损坏会导致系统无法正常启动,因此需要备份MBR扇区,防止由于MBR扇区的损坏导致系统的启动异常。
MBR扇区的备份与还原
由于MBR扇区中包含着主分区表信息,所以当硬盘主分区变化时,MBR扇区的数据也会发生变化,所以当分区过后应当及时备份MBR分区表。防止修复后导致分区表信息错误,后导致数据丢失。
进入救援模式
# 1.修复扇区
grub2-install /dev/sda
# 2.退出root环境
exit
# 3.重启
reboot
案例2-修复grub菜单
# 1.修复扇区
grub2-install /dev/sda
# 1.5 重置grub.cfg配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
# 2.退出root环境
exit
#3.重启
reboot
四、systemd管理服务
upstart 增加了系统启动的并行性,从而提高了系统启动速度。但是在 upstart 中,有依赖关系的服务还是必须先后启动。比如任务 3 , 4因为存在依赖关系,所以在这个局部,还是串行执行。
systemd 能够更进一步提高并发性,即便对于那些 upstart 认为存在相互依赖而必须串行的服务,比如 Avahi 和 D-Bus 也可以并发启动。
systemctl介绍
systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起。
systemd 特点
- 最新系统都采用systemd管理(RedHat7,CentOS7,Ubuntu15…)
- CentOS7 支持开机并行启动服务,显著提高开机启动效率
- CentOS7关机只关闭正在运行的服务,而CentOS6,全部都关闭一次。
- CentOS7服务的启动与停止不再使用脚本进行管理,也就是/etc/init.d下不在有脚本。
- CentOS7使用systemd解决原有模式缺陷,比如原有service不会关闭程序产生的子进程
systemd相关配置文件
#系统中所有服务启动的脚本存放路径
C7:/usr/lib/systemd/syste
C6:/etc/init.d
# 系统运行级别相关目录
C7:/etc/systemd/syste
C6:[root@localhost ~]# ll /etc/rc*.d -d
lrwxrwxrwx. 1 root root 10 May 710:46 /etc/rc0.d -> rc.d/rc0.d
lrwxrwxrwx. 1 root root 10 May 710:46 /etc/rc1.d -> rc.d/rc1.d
lrwxrwxrwx. 1 root root 10 May 710:46 /etc/rc2.d -> rc.d/rc2.d
lrwxrwxrwx. 1 root root 10 May 710:46 /etc/rc3.d -> rc.d/rc3.d
lrwxrwxrwx. 1 root root 10 May 710:46 /etc/rc4.d -> rc.d/rc4.d
lrwxrwxrwx. 1 root root 10 May 710:46 /etc/rc5.d -> rc.d/rc5.d
lrwxrwxrwx. 1 root root 10 May 710:46 /etc/rc6.d -> rc.d/rc6.d
# 默认运行级别需要开机自启的服务存放目录
C7:/etc/systemd/system/multi-user.target.wa
lrwxrwxrwx. 1 root root 38 Mar 15 17:12 auditd.service -> /usr/lib/systemd/system/auditd.service
lrwxrwxrwx. 1 root root 37 Mar 15 17:12 crond.service -> /usr/lib/systemd/system/crond.service
#上面相当于在/etc/systemd/system目录添加一个符号链接,指向/usr/lib/systemd/system里面的.service文件。
C6:/etc/rc3.d
K01smartd -> ../init.d/smartd
K10psacct -> ../init.d/psacc
S10network -> ../init.d/network
S11auditd -> ../init.d/audit
#K+N代表关机启动的顺序,S+N代表开机启动的顺序
systemd管理服务的命令
# 1.启动服务
C6:/etc/init.d/服务名 start
service 服务名 start
C7:systemctl start 服务名
service 服务名 start
# 2.停止服务
C6:/etc/init.d/服务名 stop
service 服务名 stop
C7:systemctl stop 服务名
service 服务名 stop
# 3.服务重启
C6:/etc/init.d/服务名 restart
service 服务名 restart
C7:systemctl restart 服务名
service 服务名 restart
# 4.服务重新加载
C6:/etc/init.d/服务名 reload
service 服务名 reload
C7:systemctl reload 服务名
service 服务名 reload
# 5.检查服务的启动状态
C6:[root@localhost ~]# /etc/init.d/sshd status
openssh-daemon (pid 1508) is running...
C7:systemctl status sshd
# 6.判断服务是否在运行
[root@localhost ~]# systemctl is-active sshd
active
[root@localhost ~]# systemctl stop sshd
[root@localhost ~]# systemctl is-active sshd
inactive
# 7.禁用某个服务
[root@localhost ~]# systemctl mask crond
# 8.取消禁用某个服务
[root@localhost ~]# systemctl unmask crond
开机自启服务管理
# 1.查看开机自启的服务有哪些
C6:[root@localhost ~]# chkconfig
C7:[root@localhost ~]# systemctl list-unit-files
# 2.设置开机自启动
C6:[root@localhost ~]# chkconfig sshd on (默认 2 3 4 5 运行级别都自启)
[root@localhost ~]# chkconfig |grep sshd
sshd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost ~]# chkconfig sshd on
[root@localhost ~]# chkconfig |grep sshd
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@localhost ~]# chkconfig sshd off
[root@localhost ~]# chkconfig |grep sshd
sshd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost ~]# chkconfig sshd --level 3 on
[root@localhost ~]# chkconfig |grep sshd
sshd 0:off 1:off 2:off 3:on 4:off 5:off 6:off
C7:[root@localhost ~]# systemctl enable sshd
# 3.关闭开机自启
C6:[root@localhost ~]# chkconfig sshd off
C7:[root@localhost ~]# systemctl disable sshd
# 4.查看指定服务是否开机自启
C6:[root@localhost ~]# chkconfig --list sshd
sshd 0:off 1:off 2:off 3:on 4:off 5:off 6:off
C7:[root@localhost ~]# systemctl is-enabled nginx
enabled:允许开机自启
disabled:不允许开机自启
# 7.如果启动脚本被修改,重新加载启动脚本
C7:systemctl daemon-reload
Comments | NOTHING