Linux操作系统引导过程
一、引导顺序
开机自检(BIOS)---> MBR引导 ---> GRUB菜单 ---> 加载内核(kernel)---> init进程初始化
1. 开机自检
服务器开机时,将根据主板上的BIOS中的设置对CPU、内存、显卡、键盘等设备进行初步检测,检测成功后按照预设的启动顺序移交控制权,大多时候是移交给硬盘。
检测出第一个可以引导系统的设备,例如:硬盘、光驱
2. MBR引导
当从本机硬盘启动系统时,首先根据硬盘第一个扇区中的MBR(主引导记录)的设置,将系统的控制权传递给含有操作系统引导文件的分区或直接根据MBR记录中的引导信息调用启动菜单(例如:GRUB)
运行存放再MBR扇区里的启动GRUB引导程序
3. GRUB菜单
对于Linux操作系统来说,GRUB(统一系统加载器)是使用最广泛的多系统引导器程序。
系统控制权传到GRUB后,会先显示启动菜单给用户选择,根据所选项或默认值加载linux内核文件,然后将控制权转交给内核。
CentOS 7 采用的是 GRUB2 启动引导器
GRUB引导程序通过读取GRUB配置文件 /boot/grub.cfg,来获取内核和镜像文件系统的设置和路径
4. 加载Linux内核
Linux内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配和调度。当控制权传到内核后,将完全掌握整个linux操作系统的运行过程。
CentOS 7 系统默认内核文件位置 /boot/vmlinuz
将内核和镜像文件系统加载到内存中
5. init进程初始化
为了完成进一步的系统引导过程,linux内核首先将系统中的 /sbin/init 程序加载到内存中运行,init进程负责完成整个系统的初始化,最后等待用户进行登录
加载硬件驱动程序,内核将init进程加载到内存中运行
二、初始化进程
1. init进程
(1)由linux内核加载运行 /sbin/int 程序
(2)init 进程是系统中第一个进程,是所有的进程的父进程
(3)init 进程的PID(进程标记)号永远为1
2. systemd
(1)systemd 是linux操作系统的一种init 软件
(2)CentOS 7 中采用的全新的system启动方式,取代传统的sysVinit
(3)CentOS 7 中运行的第一个init进程是 /lib/systemd/system
传统的 sysVinit 依赖于串行执行 shell 脚本启动服务,导致功率低下,系统启动速度较慢
systemd 能够将更多的服务进程并行启动,并且具有提供按需服务的能力,使得启动更少得进程,从而提高系统的启动速度。
三、systemd 单元类型
systemd 是用于管理linux系统服务和进程的系统和服务管理器,它使用unit来描述和控制系统服务和资源
systemd 通过单元(unit)来描述和管理系统服务和资源,每个单元都有一个对应的配置文件,通常存放在 /etc/systemd/system 目录下
主要的单元类型:
单元类型 | 扩展名 | 说明 | 作用 |
---|---|---|---|
service | .service | 描述一个系统服务 | 用于启动和管理一个系统服务,可以指定服务的启动命令、依赖关系、日志记录等参数 |
socket | .socket | 描述一个进程间通信的套接字 | 用于监听网络套接字,并在接受请求时触发一个事件,可以用于管理网络服务、提供接口等(协议端口) |
target | .target | 描述一组system的单元 | 是一组服务集合,可以用于描述系统在不同运行级别下的状态。例如:multi-user.target 描述了系统在多用户模式下运行的状态 |
timer | .timer | 描述一个定时器(用于实现cron的调度任务) | 用于在指定的时间间隔或时间点触发一个事件,可以用于定时启动或停止服务、备份数据等任务 |
path | .path | 描述一个文件系统中的文件或目录 | 用于监控文件或目录的状态,在文件或目录发生变化时触发一个事件,可以用于监控日志文件、配置文件等系统资源 |
mount | .mount | 描述一个文件系统的挂载点 | 用于文件管理系统的挂载,可以指定文件系统类型、挂载选项等 |
swap | .swap | 描述一个内存交换设备或交换文件 | 用于管理交换空间的时候使用,可以指定交换分区、优先级等 |
使用system管理单元
编写配置文件
配置文件的名称应该以 .serviec、.socket、.target、.mount、.device 等后缀
配置文件中包含单元的相关信息,例如单元的类型、描述、启动参数、启动顺序、依赖关系等等
# 进入 /lib/systemd/system/ 目录下创建配置文件
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
配置信息 | 含义 |
---|---|
[Unit] | 服务的说明 |
Description | 描述服务 |
After | 当依赖的服务启动之后再启动自定义的服务, 大多数应用程序需要与网络进行通信才能正常工作 |
network.target | 系统目标在系统启动时负责启动网络相关的服务和程序 |
[Service] | 服务运行参数的设置 |
Type=forking | 是后台运行的形式,使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程 |
ExecStart | 为服务的具体运行命令 |
ExecReload | 为重启命令 |
ExecStop | 为停止命令 |
PrivateTmp=True | 表示给服务分配独立的临时空间 |
注:启动、重启、停止命令全部要求使用绝对路径
四、系统服务控制
1. systemctl
命令格式:
systemctl 控制类型 服务名称
2. 控制类型
控制类型 | 作用 |
---|---|
start | 启动 |
stop | 停止 |
restart | 重启 |
reload | 重新加载 |
status | 查看服务状态 |
3. 实操
① 查看防火墙状态
[root@localhost ~]# systemctl status firewalld.service
② 关闭防火墙
[root@localhost ~]# systemctl stop firewalld.service
③ 打开防火墙
[root@localhost ~]# systemctl start firewalld.service
五、运行级别
1. 运行级别所对应的systemd目标
运行级别 | systemd的target | 说明 |
---|---|---|
0 | target | 关机,使用该级别时将会关闭主机 |
1 | rescue.target | 单用户模式,不需要密码验证即可登录系统,多用于系统维护 |
2 3 4 | multi-user.target | 字符界面的多用户模式,大多数服务器运行次级别 |
5 | graphical.target | 图形界面的多用户模式,提供了图形桌面操作环境 |
6 | reboot.target | 重新启动,使用该级别时将会重启主机 |
2. 查看和设置运行级别
(1)查看当前运行级别
命令:runlevel 只能查看切换运行级别与当前运行级别
[root@localhost ~]# runlevel
N 5
(2)查看默认运行级别
systemctl 工具可以查看默认的运行级别
[root@localhost ~]# systemctl get-default
graphical.target
(3)更改运行级别
① 将默认运行级别改为字符界面多用户模式
使用systemctl 工具更改
[root@localhost ~]# systemctl set-default rescue.target
② 将当前运行级别改为字符界面多用户模式
使用 init 修改
[root@localhost ~]# init 3
六、修复开机故障
1. 修复MBR扇区故障
(1)故障原因
病毒、木马造成的破坏
不正确的分区操作、磁盘读写误操作
(2)故障现象
找不到应到程序,启动中断
无法加载操作系统,开机后黑屏
(3)解决思路
MBR位于第一块硬盘(/dev/sda)的第一个物理扇区出,总共512字节
应提前准备好备份文件
以安装光盘引导进入急救模式
从备份中恢复文件
修复MBR扇区故障
(4)实操
① 准备一块硬盘,将MBR备份至此硬盘中
# 创建主分区sdb1并格式化
[root@localhost ~]# fdisk /dev/sdb
[root@localhost ~]# mkfs.xfs /dev/sdb1
# 创建sdb1挂载点并挂载
[root@localhost ~]# mkdir /backup
[root@localhost ~]# mount /dev/sdb1 /backup
# 进入sdb1挂载点将MBR备份
[root@localhost ~]# cd /backup/
[root@localhost backup]# dd if=/dev/sda of=mbr.bak bs=512 count=1
# 模拟MBR被破坏
[root@localhost backup]# cd
[root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1
# 重启
[root@localhost ~]# reboot
② 重启后无法进入系统
③ 引导界面进入急救模式
④ 进入字符界面模式
⑤ 进入后选择 Continue 继续,输入 1 回车
⑥ 敲击回车键继续
⑦ 进入shell的sh环境
⑧ 创建MBR备份文件所在分区的挂载点并挂载
⑨ 进入sdb1挂载目录,将mbr.bak中的MBR备份重新写入sda
⑩ 退出此界面
恢复成功
2. 修复GRUB引导故障
(1)故障原因
MBR中的GRUB引导程序遭到破坏
grub.confg文件丢失、引导配置有误
(2)故障现象
系统引导停滞,显示 grub> 提示符
(3)解决思路
尝试手动进入引导命令
进入急救模式,重写或者从备份中恢复grub.conf
向MBR扇区重建grub程序
引导界面而进入急救模式,重建GRUB菜单配置文件
(4)实操
① 模拟GRUB出现故障
[root@localhost ~]# rm -rf /boot/grub2/grub.cfg
[root@localhost ~]# reboot
② 重启,当出现进度条时按esc键,进入急救模式
③ 选择CD-ROM 光盘镜像选项
④ 选择Troubleshooting 处理重大问题选项
⑤ 进入急救模式
⑥ 输入 1 继续
⑦ 输入回车进入shell的sh环境
⑧ 在MBR扇区重新安装grub引导程序并重新构建GRUB菜单配置文件
⑨ 退出bash环境
⑩ 重启系统
GRUB故障修复成功
3. 修改 root 密码
(1)步骤
① 先关闭selinux安全机制
setenforce 0
② 进入急救模式,加载系统镜像,切换到系统根环境
chroot /mnt/sysimage
③ 重设root用户密码
passwd root
(2)实操
① 关闭selinux安全机制
[root@localhost ~]# setenforce 0
② 重启系统按esc键,进入BOOT菜单
③ 进入处理重大问题模式选项
④ 进入急救模式
⑤ 进入shell的sh环境
⑥ 进入系统根环境bash,passwd改密码
⑦ 退出bash环境,重启系统
⑧ 使用新密码登录,登陆成功