目录
引导过程
-
开机自检
- 对主板上的核心硬件进行自检
- BIOS:基本输入输出系统(Basic Input Output System)
- 装在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引导过后,让用户选择操作系统的界面
- GRUB(GRand Unified Bootloader)
-
加载内核
- 把在GRUB界面选定的内核文件运行到内存里面
- 由该内核启动 init(初始化)进程
-
init进程初始化
- 只有init进程启动了,其他程序才能启动
进程树
引导过程结束后,在主机上会生成一个进程树
pstree #(ps:process static)命令查看静态进程树(这一刻的进程树)
ll /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所管理服务的文件 |
运行级别
运行级别 | 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
- 抓取指定硬盘磁道位置的数据
- 备份完毕
模拟故障恢复MBR扇区
- dd if=/dev/zero of=/dev/sda bs=512 count=1
- reboot 重启
- 进入排障模式 —— Troubleshooting
- 选择 救援一个CentOS 系统 —— Rescue a CentOS system
- 输入1,表示选择Continue
- 回车一下,获取一个Shell环境
- mkdir /bak 先创建一个挂载点
- mount /dev/sdb1 /bak 重新挂载一下刚才用于备份MBR文件的sdb磁盘
- dd if=/bak/sda.mbr.bak of=/dev/sda bs=512 count=1 这里无法指定具体位置,默认从磁盘起始位置覆盖扇区
- exit,退出,系统恢复正常
GRUB备份模拟
- cd 到 /boot/grub2
- cp grub.cfg grub.cfg.bak 拷贝引导文件
- 备份完成
GRUB故障模拟
- 在 /boot/grub2 目录下 rm -rf grub.cfg 删除该引导文件,reboot 重启
- 在虚拟机界面Ctrl + Alt + Insert 重启快捷键,在下方进度条加载完之前按一下Esc进入引导菜单
- 选择 CD-ROM Drive
- 进入排障模式 —— Troubleshooting
- 选择 救援一个CentOS 系统 —— Rescue a CentOS system
- 输入1,表示选择Continue
- 回车一下,获取一个Shell环境
- chroot /mnt/sysimage 切换为挂载硬盘的根目录(因为当前在光盘的根目录)
- 再 cd 到 /boot/grub2
- cp grub.cfg.bak grub.cfg 拷贝文件
- exit,exit
- 修复完成
GRUB故障模拟2
在没有备份grub.cfg文件的情况下修复系统
- insmod xfs 指定磁盘的文件系统类型
- 指定内核文件和根分区挂载点:输入 linux16 /vm 按一下TAB键 查看当前磁盘全部内核
- 根据内核版本补全内核全称:linux16 /vmlinuz-6.9.1-1.e17.elrepo.x86_64
- 继续,指定根分区 linux16 /vmlinuz-6.9.1-1.e17.elrepo.x86_64 root=/dev/mapper/centos-root,回车
- 指定初始化镜像文件:initrd16 /init 按TAB键 补全代码 对应好你上一步所选的内核版本
- 根据上一步对应内核版本后应是:initrd16 /initramfs-6.9.1-1.e17.elrepo.x86_64.img,回车
- 输入 boot 回车,系统会按照你指定的信息启动操作系统
- 进入操作系统后,要去 /boot/grub2 目录下重新准备一份 grub.cfg 文件
修改密码
在忘记密码时的操作
- 在虚拟机界面Ctrl + Alt + Insert 重启快捷键,在下方进度条加载完之前按一下Esc进入引导菜单
- 选择 CD-ROM Drive
- 进入排障模式 —— Troubleshooting
- 选择 救援一个CentOS 系统 —— Rescue a CentOS system
- 输入1,表示选择Continue
- 回车一下,获取一个Shell环境
- chroot /mnt/sysimage/ 切换为挂载硬盘的根目录(因为当前在光盘的根目录)
- passwd root,修改密码
- exit,重启系统