- 引导过程
- 排除启动类故障
- 服务控制及切换运行级别
- 优化启动过程
Linux 操作系统的引导过程
系统引导是操作系统运行的开始,在用户能够正常登录到系统之前,Linux操作系统的引导过程将完成一系列的初始化任务,并加载必要的程序和命令终端,为用户登录做好准备。
引导过程总览
Linux 操作系统的引导过程一般包括以下几个阶段:开机自检、MBR 引导、GRUB 菜单、加载 Linux 内核、init 进程初始化。
开机自检
- 对主板上的核心硬件进行自检
- BIOS:基本输入输出系统(BasicInputOutputSystem)
- 装在CMOS (互补金属氧化物半导体 - Complementary Metal Oxide Semiconductor) 芯片上
寻找boot引导设备
- 常见的引导设备都有:光盘、U盘、硬盘、网络服务器
- 自检完成后,在引导设备中按设置的引导设备顺序检测,检测到就进入下一个步骤,没检测到就提示没有系统
加载MBR引导记录
- 进入硬盘中
- 找到硬盘的第一个扇区,0磁道的0号扇区
- 该扇区存放了MBR(主引导记录)引导记录,要加载该引导程序
- MBR引导记录由3部分构成
- Boot Loader (引导程序),在该扇区占第1个字节到第446个字节 (占446个字节)
- DPT (硬盘分区表)在该扇区占第447个字节到第510个字节 (占64个字节),每个主分区占16字节,64字节只能存在4个主分区,所以MBR分区表类型最多只能有4个主分区
- 55aa (结束标识) 在该扇区占第511个字节到第512个字节 (占2个字节)
GRUB菜单
- MBR引I导过后,让用户选择操作系统的界面
- GRUB (GRand Unified Bootloader)
加载内核
- 把在GRUB界面选定的内核文件运行到内存里面
- 由该内核启动 init (初始化) 进程
init进程初始化
- 只有init进程启动了,其他程序才能启动
系统初始化进程及文件
引导过程结束后,在主机上会生成一个进程树
1. pstree # (ps:process static) 命令查看静态进程树 (这一刻的进程树)
2. 11 /sbin/init #命令 查看进程初始化文件systemd:/sbin/init -> ../lib/systemd/systemd —— 早期叫init, 现在叫systemd,为了和早期版本的连贯性,所以和名为init的文件链接起来
init 进程
- 由Linux内核加载运行 /sbin/init 程序
- init进程是系统中第一个进程
- init进程的PID (进程标记) 号永远为1
守护进程
管理其他进程的开关
- 示例 /lib/systemd/system 目录下的 sshd.service 文件
- 通过服务提供的管理文件,就可以使用 systemctl 命令去管理服务
文件类型 | 说明 |
service | 服务提供给systemd所管理服务的文件 |
target |
运行级别
运行级别 | Systemd的target | 说明 |
0 | poweroff.target | 关机状态,使用该级别将会关闭主机 poweroff.target:systemd目标,0号级别为关机poweroff:关机 |
1 | rescue.target | 救援模式/单用户模式 不需要密码验证即可登录系统,多用于系统维护 rescue:救援 |
2 | multi-user.target | 用户定义/域特别运行级别。默认等同于3 |
3 | multi-user.target | 字符界面的完整多用户模式,大多数服务器主机运行在此级别 |
4 | multi-user.target | 用户定义/域特别运行级别。默认等同于3 |
5 | graphical.target | graphical:图像化 图形界面里的多用户模式,提供了图形桌面操作环境 |
6 | reboot.target | 重新启动,使用该级别时会重启主机 |
命令 | 说明 |
init 0 | 将运行级别修改至0 (关机) |
init 6 | 重启 |
runlevel | 查看当前系统的运行级别 显示格式:N 当前运行级别 N : 表示上一个运行级别 |
systemctl get-default | 查看当前系统默认运行级别 |
Systemd
- Systemd是Linux操作系统的一种init软件
- CentOS 7采用全新的Systemd启动方式,取代传统的SysVinit
- CentOS 7中运行的第一个init进程是 /lib/systemd/systemd
说明 | 说明 |
systemctl start sshd | 启动该服务 |
systemctl stop sshd | 停止该服务 |
systemctl restart sshd | 重启该服务 |
systemctl status sshd | 查询该服务状态 |
systemctl enable sshd | 启用该服务,重启后也是开启状态 |
systemctl disable sshd | 禁用该服务,重启后也不会开启 |
修复MBR扇区故障
-
故障原因
- 病毒、木马等造成的破坏
- 不正确的分区操作、磁盘读写误操作
-
故障现象
- 找不到引导程序,启动中断
- 无法加载操作系统,开机后黑屏
-
解决思路
- 应提前作好备份文件
- 以安装光盘引导进入急救模式
- 从备份文件中恢复
把该扇区备份到其他磁盘上,因为一个磁盘上的MBR扇区故障了,那么该磁盘的分区表就故障了,就找不到分区了
示例
备份MBR扇区
- 提前在虚拟机设置里新增一块硬盘
- 分区、格式化、挂载
- 使用 dd if=/dev/sda of=/bak/sda.mbr.bak bs=512 count=1
a.抓取指定硬盘磁道位置的数据 - 备份完毕
模拟故障恢复MBR扇区
- dd if=/dev/zero of=/dew/sda bs=512 count=1
- reboot 重启
- 进入排障模式 -- Troubleshooting
- 选择 救援-个CentOS 系统--Rescue aCentOs system
- 输入1,表示选择Continue
- 回车一下,获取一个Shell环境
- mkdir /bak 先创建一个挂载点
- mount/dev/sdb1 /bak 重新挂载一下刚才用于备份MBR文件的sdb磁盘
- dd if=/bak/sda.mbr.bak这里无法指定具体位置,默认从磁盘起始位置覆盖扇区
- exit,退出,系统恢复正常
GRUB备份模拟
- cd 到/bootgrub2
- cp grub.cfg grub.cfg.bak 拷贝引导文件
- 备份完成
GRUB故障模拟
- 在/boot/grub2 目录下 mm -rf grub.cfg 删除该引导文件,reboot 重启
- 在虚拟机界面Ctl +Alt +Insert 重启快捷键,在下方进度条加载完之前按-下ESC进入引导菜单
- 选择 CD-ROM Drive
- 进入排障模式 -- Troubleshooting
- 选择 救援-个CentOs系统--Rescue a CentOS system
- 输入1,表示选择Continue
- 回车一下,获取一个Shell环境
- chroot /mnt/sysimage 切换为挂载硬盘的根目录(因为当前在光盘的根目录)
- 再cd到/bootgrub2
- cp grub.cfg.bak grub.cfg 拷贝文件
- exit, exit
- 修复完成
GRUB故障模拟2
在没有备份grub.cfg文件的情况下修复系统
- insmod xfs 指定磁盘的文件系统类型
- 指定内核文件和根分区挂载点:输入linux16 m 按一下TAB键 查看当前磁盘全部内核
- 根据内核版本补全内核全称:linux16 mlinuz-6.9.1-1.e17.elrepo.x86 64
- 继续,指定根分区 linux16/mlinuz-6.9.1-1.e17.elrepo.x86 64root=/dev/mappercentos-root,回车
- 指定初始化镜像文件:initrd16 nit 按TAB键 补全代码 对应好你上一步所选的内核版本
- 根据上一步对应内核版本后应是:initrd16 /initramfs-6.9.1-1.e17.elrepo.x86 64.img,回车
- 输入 boot 回车,系统会按照你指走的信息启动操作系统
- 进入操作系统后,要去/boot/grub2 目录下重新准备一份 grub.cfg 文件
修改密码
- 在虚拟机界面Ctr + Alt + Insert 重启快捷键,在下方进度条加载完之前按-下ESC进入引导菜单
- 选择 CD-ROM Drive
- 进入排障模式--Troubleshooting
- 选择 救援-个CentOS系统--Rescue a CentOS system
- 输入1,表示选择Continue
- 回车一下,获取一个Shell环境
- chroot /mnt/sysimage/ 切换为挂载硬盘的根目录(因为当前在光盘的根目录)
- passwd root,修改密码
- exit,重启系统