Bootstrap

Linux引导过程、修复MBR扇区

目录

引导过程

开机自检

寻找boot引导设备

加载MBR引导记录

GRUB菜单

加载内核

init进程初始化

进程树

系统初始化进程

init进程

守护进程

运行级别

Systemd

修复MBR扇区故障

故障原因

故障现象

解决思路

示例

备份MBR扇区

模拟故障恢复MBR扇区

GRUB备份模拟

GRUB故障模拟

GRUB故障模拟2

修改密码


引导过程

  1. 开机自检
    1. 对主板上的核心硬件进行自检
    2. BIOS:基本输入输出系统(Basic Input Output System)
    3. 装在CMOS(互补金属氧化物半导体 - Complementary Metal Oxide Semiconductor)芯片上
  2. 寻找boot引导设备
    1. 常见的引导设备都有:光盘、U盘、硬盘、网络服务器
    2. 自检完成后,在引导设备中按设置的引导设备顺序检测,检测到就进入下一个步骤,没检测到就提示没有系统
  3. 加载MBR引导记录
    1. 进入硬盘中
    2. 找到硬盘的第一个扇区,0磁道的0号扇区
    3. 该扇区存放了MBR(主引导记录)引导记录,要加载该引导程序
    4. MBR引导记录由3部分构成
      1. Boot Loader(引导程序),在该扇区占第1个字节到第446个字节(占446个字节)
      2. DPT(硬盘分区表)在该扇区占第447个字节到第510个字节(占64个字节),每个主分区占16字节,64字节只能存在4个主分区,所以MBR分区表类型最多只能有4个主分区
      3. 55aa(结束标识)在该扇区占第511个字节到第512个字节(占2个字节)
  4. GRUB菜单
    1. MBR引导过后,让用户选择操作系统的界面
    2. GRUB(GRand Unified Bootloader)
  5. 加载内核
    1. 把在GRUB界面选定的内核文件运行到内存里面
    2. 由该内核启动 init(初始化)进程
  6. init进程初始化
    1. 只有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扇区

  1. 提前在虚拟机设置里新增一块硬盘
  2. 分区、格式化、挂载
  3. 使用 dd if=/dev/sda of=/bak/sda.mbr.bak bs=512 count=1
    1. 抓取指定硬盘磁道位置的数据
  4. 备份完毕

模拟故障恢复MBR扇区

  1. dd if=/dev/zero of=/dev/sda bs=512 count=1
  2. reboot 重启
  3. 进入排障模式 —— Troubleshooting
  4. 选择 救援一个CentOS 系统 —— Rescue a CentOS system
  5. 输入1,表示选择Continue
  6. 回车一下,获取一个Shell环境
  7. mkdir /bak 先创建一个挂载点
  8. mount /dev/sdb1 /bak 重新挂载一下刚才用于备份MBR文件的sdb磁盘
  9. dd if=/bak/sda.mbr.bak of=/dev/sda bs=512 count=1 这里无法指定具体位置,默认从磁盘起始位置覆盖扇区
  10. exit,退出,系统恢复正常

GRUB备份模拟

  1. cd 到 /boot/grub2
  2. cp grub.cfg grub.cfg.bak 拷贝引导文件
  3. 备份完成

GRUB故障模拟

  1. 在 /boot/grub2 目录下 rm -rf grub.cfg 删除该引导文件,reboot 重启
  2. 在虚拟机界面Ctrl + Alt + Insert 重启快捷键,在下方进度条加载完之前按一下Esc进入引导菜单
  3. 选择 CD-ROM Drive
  4. 进入排障模式 —— Troubleshooting
  5. 选择 救援一个CentOS 系统 —— Rescue a CentOS system
  6. 输入1,表示选择Continue
  7. 回车一下,获取一个Shell环境
  8. chroot /mnt/sysimage 切换为挂载硬盘的根目录(因为当前在光盘的根目录)
  9. 再 cd 到 /boot/grub2
  10. cp grub.cfg.bak grub.cfg 拷贝文件
  11. exit,exit
  12. 修复完成

GRUB故障模拟2

在没有备份grub.cfg文件的情况下修复系统

  1. insmod xfs 指定磁盘的文件系统类型
  2. 指定内核文件和根分区挂载点:输入 linux16 /vm 按一下TAB键 查看当前磁盘全部内核
  3. 根据内核版本补全内核全称:linux16 /vmlinuz-6.9.1-1.e17.elrepo.x86_64
  4. 继续,指定根分区 linux16 /vmlinuz-6.9.1-1.e17.elrepo.x86_64 root=/dev/mapper/centos-root,回车
  5. 指定初始化镜像文件:initrd16 /init 按TAB键 补全代码 对应好你上一步所选的内核版本
  6. 根据上一步对应内核版本后应是:initrd16 /initramfs-6.9.1-1.e17.elrepo.x86_64.img,回车
  7. 输入 boot 回车,系统会按照你指定的信息启动操作系统
  8. 进入操作系统后,要去 /boot/grub2 目录下重新准备一份 grub.cfg 文件

修改密码

在忘记密码时的操作

  1. 在虚拟机界面Ctrl + Alt + Insert 重启快捷键,在下方进度条加载完之前按一下Esc进入引导菜单
  2. 选择 CD-ROM Drive
  3. 进入排障模式 —— Troubleshooting
  4. 选择 救援一个CentOS 系统 —— Rescue a CentOS system
  5. 输入1,表示选择Continue
  6. 回车一下,获取一个Shell环境
  7. chroot /mnt/sysimage/ 切换为挂载硬盘的根目录(因为当前在光盘的根目录)
  8. passwd root,修改密码
  9. exit,重启系统
;