开机启动流程

一、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。

本步的流程:

  1. 先加载两个镜像;

  2. 再加载MOD模块文件,把grub2程序加载执行;

  3. 接着解析配置文件/boot/grub/grub.cfg,根据配置文件加载内核模块到你内存

  4. 之后构建虚拟根文件系统,最后转到内核。

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

本步的流程:

  1. 执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关);

  2. 然后执行sysinit.target来初始化系统和basic.target来准备操作系统;

  3. 接着启动multi-user.target下的本机服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动;

  4. 最后执行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

三、救援模式

前提:需要有系统盘,才可以进入救援模式

  1. 将系统盘放入光驱中

  1. 以光盘启动引导系统 ,保存退出(在虚拟机关闭状态下,选择“打开电源时进入固件”或者在虚拟机启动时,按F2进入BIOS;然后通过键盘选择到“BOOT”,选择第一启动项为"CD-ROM Drive",按F10保存并重启系统

  1. 使用光盘引导,系统重启后进入centos系统安装的界面,选择“Troubleshooting”

  1. 选择第二个Rescue a CentOS system进入救援模式

  1. 接着在光标后输入“1”,选择“continue”选项;

    Continue是让虚拟系统找到根分区并读写方式挂载到/mnt/sysimage,这是最常用的一种方式

  1. 系统会给一个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 特点

  1. 最新系统都采用systemd管理(RedHat7,CentOS7,Ubuntu15…)
  2. CentOS7 支持开机并行启动服务,显著提高开机启动效率
  3. CentOS7关机只关闭正在运行的服务,而CentOS6,全部都关闭一次。
  4. CentOS7服务的启动与停止不再使用脚本进行管理,也就是/etc/init.d下不在有脚本。
  5. 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

山林不向四季起誓 荣枯随缘