10. Linux 系统启动原理

作者@小郭

10. Linux 系统启动原理

CentOS 7 启动过程

现代计算机系统是硬件与软件的复杂组合。从断电状态开始,到拥有登录提示符的运行中系统,这需要大量的硬件和软件配合工作。

以下列表从较高层面概述了 CentOS7 启动过程。

在这里插入图片描述

  1. 计算机接通电源。系统固件(现代UEFI或更旧的BIOS)运行开机自检(POST),并开始初始化硬件。

    配置: 在系统启动早期,通过按特定的组合键,例如F2,配置系统固件。

  2. 系统固件搜索启动设备,根据固件配置的顺序搜索启动磁盘上的主启动记录(MBR)。系统固件从磁盘读取boot loader,然后将系统控制权交给boot loader,boot loader是GRand Unified Bootloader version 2(GRUB2)。

    配置: 使用 grub2-install 命令进行配置,它将安装 GRUB2 作为磁盘上的启动加载器。

  3. GRUB2从/boot/grub2/grub.cfg文件加载配置并显示一个操作系统菜单,可以从中选择要启动的系统。

    配置: 使用 /etc/grub.d/ 目录、/etc/default/grub 文件和 grub2-mkconfig 命令进行配置,以生成 /boot/grub2/grub.cfg 文件。

  4. boot loader根据选定条目的配置,从磁盘中加载kernel和initramfs,并将它们放入内存中。initramfs是一个存档,其中包含启动时所有必要硬件的内核模块、初始化脚本等等。

    boot loader将控制权交给kernel,并同时将启动项的内核参数、initramfs在内存中的位置传递给kernel。内核在initramfs中找到所有硬件驱动程序,并初始化这些硬件。

    配置: 使用 /etc/dracut.conf.d/ 用录、dracut 命令和 lsinitrd 命令进行配置,以检查 initramfs 文件。

  5. initramfs 执行/sbin/init,作为PID 1。在CentOS中,/sbin/init是一个指向systemd的链接。

    配置: 使用内核参数init=command配置系统初始化程序。

  6. 随后,systemd会加载从内核命令行传递的target或者加载系统配置的default.target,该目标通常启动一个基于文本的登录或图形登录屏幕。

    **配置:**使用systemctl设置默认target。

  7. default.target依赖sysinit.target,sysinit.target用于初始化系统,例如读取/etc/fstab挂载文件系统,激活systemd-journald等。

    **配置:**使用/etc/fstab配置文件系统开机自动挂载。

  8. default.target还会激活开机启动的单元。

    **配置:**使用systemctl设置开机启用服务。

  9. default.target还会激活getty.target,该target将打开tty1终端用于用户登录。

系统 target

systemd使用类型为target的单元来分组不同单元,例如multi-user.target包涵chronyd.service、crond.service、firewalld.service等服务。

target还可以包涵其他target,例如graphical.target包涵multi-user.target,multi-user.target包涵basic.target,basic.target包涵sysinit.target。

使用以下命令查看target之间依赖关系:

[root@centos7 ~]# systemctl list-dependencies graphical.target
graphical.target
● ├─accounts-daemon.service
● ├─gdm.service
● ├─initial-setup-reconfiguration.service
● ├─network.service
● ├─rtkit-daemon.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● ├─udisks2.service
● └─multi-user.target
......

# 查看反向依赖
[root@centos7 ~]# systemctl list-dependencies sshd.service --reverse 
sshd.service
● └─multi-user.target
●   └─graphical.target

系统启动级别

CentOS 6 之前使用启动级别控制系统开机激活哪些服务。CentOS 7 使用target控制系统开机激活哪些服务。

runleveltarget作用
0关机,init 0 同 poweroff 和systemctl poweroff
1emergency.target rescue.target单用户模式、救援模式和紧急模式用于修复系统
2多用户文本界面,不具备NFS功能
3multi-user.target多用户文本界面
4未使用
5graphical.target多用户图形界面
6重启,init 6 同 reboot 和systemctl reboot

设置系统运行目标

/etc/inittab文件是CentOS 6之前版本初始化系统使用的配置文件。

# 部分内容如下
# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
# 设置运行级别为5,也就是图形化方式启动。
id:5:initdefault:

设置系统当前运行 target

# 设置系统当前运行target为multi-user.target
[root@centos7 ~]# systemctl isolate multi-user.target

# 设置系统当前运行target为graphical.target 
[root@centos7 ~]# systemctl isolate graphical.target 

设置系统开机默认运行 target

# 查看系统开机默认运行target
[root@centos7 ~]# systemctl get-default 
graphical.target

# 设置系统开机默认运行target
[root@centos7 ~]# systemctl set-default multi-user.target
# 重启验证

在系统启动时选择其它目标

要在启动时选择其他目标,将 systemd.unit=target.target 参数附加到内核命令行。该配置是临时生效的,经常用于系统启动过程中故障排除。

要使用这种选择其他目标的方法,请执行以下步骤:

  1. 启动或重新启动系统。

  2. 按任意键中断启动加载器菜单倒计时(Enter除外,它用于执行正常启动)。

  3. 将光标移至第一个内核条目,按e编辑当前条目。

    在这里插入图片描述

  4. 将光标移至以linux16开头的行,末尾附加systemd.unit=target.target。例如,systemd.unit=multi-user.target。按 Ctrl+x 使用这些更改进行启动。

    在这里插入图片描述

重置 ROOT 密码

以下几种方法可用于设置新的root密码。例如:

  • 系统管理员可以使用Live CD启动系统,挂载根文件系统,然后编辑/etc/shadow:
    • 删除root账户密码字段
    • 使用已知密码字段替换root密码字段
  • 在CentOS 7之后版本中,可以让initramfs运行的脚本在某些点暂停,以提供root身份的shell,然后在该shell中重置root密码。

方法1:rd.break

  1. 重新启动系统。

  2. 按任意键(Enter除外)中断启动加载器倒计时。

  3. 将光标移至第一个内核条目,按e编辑当前条目。

    在这里插入图片描述

  4. 将光标移至以 linux16 开头的行,末尾附加 rd.break。利用该选项,在系统从initramfs向实际系统移交控制权前,系统将会中断。按Ctrl+x进行启动。

    在这里插入图片描述

  5. 此时,系统会显示root shell,且磁盘上的实际根文件系统以只读方式挂载在/sysroot。

    以读/写形式重新挂载/sysroot。

    switch_root:/# mount -o remount,rw /sysroot
    
  6. 切换root位置,把/sysroot做为文件系统树的根。

    switch_root:/# chroot /sysroot
    
  7. 设置新root密码。

    sh-4.2# echo password | passwd --stdin root
    
    #修改密码的另一种方式。
    [root@centos7 ~ 15:03:02]# echo root:123 |chpasswd
    
    

    提示:password 是用户自定义密码,例如设为123.

  8. 如果系统开启了 SELinux 功能,则需要确保所有未标记的文件(包括此时的/etc/shadow)在启动过程中都会重新获得标记。

    sh-4.2# touch /.autorelabel     
    
  9. 执行以下命令,系统将继续启动。如果系统开启了SELinux功能,还需要执行完整的 SELinux 重新标记,然后再次重新启动。

    sh-4.2# exit
    switch_root:/# exit
    
  10. 登录验证。

方法2:登录root不用密码

1. init=/bin/bash

  1. 重新启动系统。

  2. 按任意键(Enter除外)中断启动加载器倒计时。

  3. 将光标移至第一个内核条目,按e编辑当前条目。

  4. 将光标移至以 linux16 开头的行,末尾附加 init=/bin/bash。利用该选项,在系统从initramfs向实际系统移交控制权前,系统将会中断,请开启一个root shell。按Ctrl+x使用这些更改进行启动。

  5. 此时系统会显示root shell,且磁盘上的实际根文件系统以只读方式挂载在/。以读/写形式重新挂载/。

    bash-4.2# mount -o remount,rw /
    
  6. 使用以下命令删除root密码,等进入系统后再重新设置root密码。

    sh-4.2# passwd -d root
    

    此时还可以使用vi编辑器直接编辑/etc/shadow文件,复制已知用户的密码记录替换root密码。

  7. 如果系统开启了 SELinux 功能,则需要确保所有未标记的文件(包括此时的/etc/shadow)在启动过程中都会重新获得标记。

    sh-4.2# touch /.autorelabel
    
  8. 执行以下命令,系统将继续启动。如果系统开启了SELinux功能,还需要执行完整的 SELinux 重新标记,然后再次重新启动。

    sh-4.2# exec /usr/lib/systemd/systemd
    
  9. 使用root登录,此时不需要密码。

2.

  1. 重新启动系统。
  2. 按任意键(Enter除外)中断启动加载器倒计时。
  3. 将光标移至第一个内核条目,按e编辑当前条目。
  4. 将光标移至以 linux16 开头的行,末尾附加 rd.break。按Ctrl+x使用这些更改进行启动。
  5. 此时系统会显示root shell,且磁盘上的实际根文件系统以只读方式挂载在/。以读/写形式重新挂载//
bash-4.2# mount -o remount,rw /
  1. 进入 vi /sysroot/etc/shadow ,将root用户密码删除 ,只将密码那一部分删除,登录的时候也可以不用密码。

/etc/fstab 引起的系统启动问题

环境准备

# 设置磁盘分区管理方案
[root@centos7 ~]# parted /dev/sdb mklabel msdos

# 创建分区
[root@centos7 ~]# parted /dev/sdb unit MiB mkpart primary 1 10241

# 格式化为xfs文件系统
[root@centos7 ~]# mkfs.xfs /dev/sdb1

# 创建挂载点
[root@centos7 ~]# mkdir /data01

# 设置持久化挂载
[root@centos7 ~]# echo '/dev/sdb1 /data01 xfs defaults 0 0' >> /etc/fstab

# 挂载并验证
[root@centos7 ~]# mount -a
[root@centos7 ~]# df -h /data01
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1        10G   33M   10G    1% /data01

故障1:挂载点不存在

环境准备

[root@centos7 ~]# umount /data01
[root@centos7 ~]# rmdir /data01

重启系统验证

# 可以正常进入系统,挂载点会被自动创建
[root@centos7 ~]# df -h /data01
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1        10G   33M   10G    1% /data01

故障2:设备名称写错或者找不到设备

环境准备

[root@centos7 ~]# vim /etc/fstab
# 将原先的sdb1修改为sdb2
/dev/sdb2 /data01 xfs defaults 0 0

重启系统验证

  1. 启动过程中找不到该设备。

  2. 1分30秒超时后,进入emergency模式,进行修复。

    修改为正确的值或者注释该条目,确保系统正常启动。

  3. 然后输入exit,继续启动。

故障3:破坏文件系统

环境准备

[root@centos7 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1

重启系统验证

  1. 系统启动过程中尝试修复文件系统,修复失败后提示进入 emergency 模式修复。
    在这里插入图片描述

  2. 输入root 密码进入emergency 模式。

    # 执行以下命令修复
    [root@centos7 ~]# xfs_repair /dev/sdb1
    

    修复完成后,输入 exit 正常启动系统。

grub2 配置

grub2 配置文件

grub2 的主要配置文件如下:

  • /boot/grub2,grub2的主要配置文件所在目录,例如grub.cfg、grubenv、user.cfg。

  • /etc/grub2.cfg

    • /etc/grub2.cfg 是指向 /boot/grub2/grub.cfg的软连接。

    • 不要直接修改/etc/grub2.cfg文件,该文件由系统自动生成。如果需要自定义这个文件,可以通过修改/etc/grub.d/中脚本和/etc/default/grub文件,然后通过grub2-mkconfig命令生成。

    使用efi启动方式的grub2配置文件是/etc/grub2-efi.cfg。

  • /etc/grub.d/,该目录下存放多个数字开头的脚本,按照从小到大的顺序执行。例如00_header会调用/etc/default/grub配置文件来实现最基本的开机界面配置。

  • /etc/default/grub,定义grub启动部分变量信息,例如grub启动菜单选择条目的超时时间,内核参数等。

  • /boot/grub2/grubenv,设定默认启动条目。

grub 菜单超时时间

[root@centos7 ~ 09:55:28]# vim /etc/default/grub
# 修改GRUB_TIMEOUT为20
GRUB_TIMEOUT=20


# 生效grub2.cfg配置文件
[root@centos7 ~ 09:55:35]# grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-da1ca160d70e42e184fb975cbbb6f3a6
Found initrd image: /boot/initramfs-0-rescue-da1ca160d70e42e184fb975cbbb6f3a6.img
done

Generating grub configuration file ...
done

# 重启
[root@centos7 ~ 09:56:04]# reboot


如图所示:修改成功。(太快了没截图到只截图到19)

在这里插入图片描述

kernel 启动参数

[root@centos7 ~ 09:59:38]# vim /etc/default/grub
# 修改GRUB_CMDLINE_LINUX,例如在最后添加参数console=ttyS0,导致不显示启动过程
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet console=ttyS0"
# console=ttyS0: 启动过程信息显示到 ttyS0 终端,导致启动过程是tty1上不显示启动消息。
# rhgb:启用图形化启动界面(Red Hat Graphical Boot)。
# quiet:减少启动过程中的日志输出(只显示重要信息), debug 开启调试模式(显示详细启动日志)

# 生成grub2.cfg配置文件,重启验证
[root@centos7 ~ 10:01:01]# grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-da1ca160d70e42e184fb975cbbb6f3a6
Found initrd image: /boot/initramfs-0-rescue-da1ca160d70e42e184fb975cbbb6f3a6.img
done

[root@centos7 ~ 10:01:43]# reboot
本来应该显示如图所示:

在这里插入图片描述

修改后效果如下:

在这里插入图片描述

查看内核启动参数

  1. 所有内核参数的详细说明可参考 Linux 内核文档,CentOS 7 中可通过安装 kernel-doc 包获取:

    yum install kernel-doc -y
    

    文档路径:/usr/share/doc/kernel-doc-<版本>/Documentation/admin-guide/kernel-parameters.txt
    查看方式:

    less /usr/share/doc/kernel-doc-3.10.0/Documentation/admin-guide/kernel-parameters.txt
    

    (注意替换 <版本> 为实际内核版本,可通过 uname -r 查看)

  2. 常用参数说明
    除了 rhgbquiet,常见参数包括:

    • ro:只读挂载根文件系统(启动后由系统自动切换为读写)
    • rw:直接以读写方式挂载根文件系统
    • root=:指定根文件系统的设备(如 root=/dev/sda1
    • crashkernel=auto:预留内存用于内核崩溃时的转储
    • net.ifnames=0:禁用网络接口的 “一致性命名规则”(如ens33),强制使用传统命名(如eth0),便于脚本或传统工具兼容。
    • biosdevname=0:配合net.ifnames=0使用,彻底禁用基于 BIOS 的设备命名规则。

grub 菜单加密

# 查看/etc/grub.d/01_users脚本
[root@centos7 ~]# cat /etc/grub.d/01_users
#!/bin/sh -e
cat << EOF
if [ -f \${prefix}/user.cfg ]; then
  source \${prefix}/user.cfg
  if [ -n "\${GRUB2_PASSWORD}" ]; then
    set superusers="root"
    export superusers
    password_pbkdf2 root \${GRUB2_PASSWORD}
  fi
fi
EOF

#进入修改
[root@centos7 ~ 10:40:23]# vim /etc/grub.d/01_users
#将root改为gcf
set superusers="gcf"
  
    password_pbkdf2 gcf  \${GRUB2_PASSWORD}

# 生成grub2密码
[root@centos7 ~ 10:42:52]# grub2-mkpasswd-pbkdf2 
输入口令:1234
Reenter password:1234 
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.2BD4BEF4D93D69DF2A73B7D9F75FE674ED01D6CC55CED48619DA620A482775E4720B5159F49A94653BB47056C0F920DD03CD89784EF2C981F80004E828C7A053.E093F68E812A9AF3B087CA97C894FADE2A6E2C53279DFD67F7E1F74A1D9860ECEE9193CD15431FF3C2D13B11237F6C68D782202D6CF3AB6F6F0B6A4D56F3552D


# 创建文件
[root@centos7 ~ 10:43:12]# vim /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.2BD4BEF4D93D69DF2A73B7D9F75FE674ED01D6CC55CED48619DA620A482775E4720B5159F49A94653BB47056C0F920DD03CD89784EF2C981F80004E828C7A053.E093F68E812A9AF3B087CA97C894FADE2A6E2C53279DFD67F7E1F74A1D9860ECEE9193CD15431FF3C2D13B11237F6C68D782202D6CF3AB6F6F0B6A4D56F3552D

#或者也可以这样写进去。
[root@centos7 ~ 10:34:30]# echo GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.2BD4BEF4D93D69DF2A73B7D9F75FE674ED01D6CC55CED48619DA620A482775E4720B5159F49A94653BB47056C0F920DD03CD89784EF2C981F80004E828C7A053.E093F68E812A9AF3B087CA97C894FADE2A6E2C53279DFD67F7E1F74A1D9860ECEE9193CD15431FF3C2D13B11237F6C68D782202D6CF3AB6F6F0B6A4D56F3552D > user.cfg

#验证
[root@centos7 ~ 10:46:25]# cat /boot/grub2/user.cfg 
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.2BD4BEF4D93D69DF2A73B7D9F75FE674ED01D6CC55CED48619DA620A482775E4720B5159F49A94653BB47056C0F920DD03CD89784EF2C981F80004E828C7A053.E093F68E812A9AF3B087CA97C894FADE2A6E2C53279DFD67F7E1F74A1D9860ECEE9193CD15431FF3C2D13B11237F6C68D782202D6CF3AB6F6F0B6A4D56F3552D

# 生成grub2.cfg配置文件,重启验证
[root@centos7  10:38:41]# grub2-mkconfig -o /etc/grub2.cfg

[root@centos7 ~ 10:45:35]# reboot

效果如下:

  1. 启动菜单界面,按e编辑。

  2. 输入用户名gcf,密码1234。
    在这里插入图片描述

  3. 弹出如下菜单,可以编辑了。
    在这里插入图片描述

思考:如何解除 grub 菜单加密?

默认启动条目

# 查看启动条目有哪些
[root@centos7 ~]# # grep -o "^menu.*CentOS L.*Core)'" /etc/grub2.cfg 
menuentry 'CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)'
menuentry 'CentOS Linux (0-rescue-43c2aa8a5c024d90af4e8da0b3881cb2) 7 (Core)'

# 修改默认启动条目
[root@centos7 ~]# vim /boot/grub2/grubenv
# 修改saved_entry为相应条目
saved_entry=CentOS Linux (0-rescue-43c2aa8a5c024d90af4e8da0b3881cb2) 7 (Core)
......

# 生成grub2.cfg配置文件,重启验证
[root@centos7 ~]# grub2-mkconfig -o /etc/grub2.cfg
[root@centos7 ~]# reboot

grub2 故障处理

MBR 组成回顾

主引导扇区由三个部分组成:

在这里插入图片描述

  • 引导程序(占446个字节),硬盘启动时将系统控制权转给分区表中的某个操作系统。
  • 磁盘分区表项(DPT,Disk Partition Table),由四个分区表项构成(每个16个字节)。
  • 结束标志(占2个字节),其值为AA55(十六进制)。

故障1:grub 引导程序故障

环境准备

#这里count=446 是因为引导程序时446字节。
[root@centos7 ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446

**效果如下:**系统无法从硬盘启动,则会尝试使用其他设备启动。

在这里插入图片描述

**解决思路:**使用光盘启动,并重新安装引导程序。

解决过程:

  1. 开机从光盘启动,并选择Troubleshooting

在这里插入图片描述

  1. 选择Rescue a CentOS system

在这里插入图片描述

  1. 稍等片刻,进入选择界面,选择 1。搜索到系统后,提示系统已经挂载在/mnt/sysimage,按回车继续。
    在这里插入图片描述

  2. 切换root目录,并确保root文件系统是读写挂载。

    sh-4.2# chroot /mnt/sysimage
    bash-4.2# mount | grep root
    /dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota )
    
  3. 确认系统启动分区所在磁盘。

在这里插入图片描述

  1. 安装引导程序。

    bash-4.2# grub2-install /dev/sda
    Installing for i386-pc platform.
    Installation finished. No error reported. 
    
  2. 输入 exit 两次重启系统:第一次exit,退出chroot环境;第二次exit,退出系统。

    bash-4.2# exit
    sh-4.2# exit
    
    
    
    

故障2:引导文件丢失

环境准备

[root@centos7 ~]# mv /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64{,.ori}
[root@centos7 ~]# reboot

**效果如下:**系统无法启动,提示/vmlinuz-4.18.0-553.el8_10.x86_64文件找不到。

在这里插入图片描述

**解决思路:**使用光盘启动,并从起位置恢复相应文件。

解决过程:

  1. 参考 **<< grub 引导程序故障 >>**处理流程,获取root权限shell。

  2. 恢复文件。(从其他系统复制过来,从rpm包提取等)

  3. 输入 exit 两次继续启动系统。

故障处理总结

通过光盘启动的目的是将硬盘上的系统挂载到内存中,并进行修复。

我们也可以通过U盘启动盘启动或者将故障磁盘拔下来挂载到其他系统。

思考

如何避免别人获得磁盘后,读取磁盘中数据?

答案:对硬盘加密。

在这里插入图片描述

效果:

  1. 系统启动的时候,必须输入密码才能读取,硬盘中数据。

在这里插入图片描述

  1. 修复磁盘的时候,同样需要输入密码。
    在这里插入图片描述

    **提示:**该加密操作不会加密grub2系统选择菜单,也就是/boot目录中数据。

补充:

1.分区表丢失了怎么恢复。

模拟故障

dd if=/dev/zero of=/dev/sda bs=1 count=512

在这里插入图片描述

备份分区表,将备份的文件拷贝到其他硬盘中,否则硬盘分区表丢失,将无法读取该备份。
dd if=/dev/sda of=/root/mbr.bak bs=1 count=512
备份完成后,传送到windows系统。

解决过程(虚拟硬盘):
  1. 给server(正常的Linux同)添加一块硬盘

    #添加一块硬盘sdb
    [root@server ~ 15:44:06]# lsblk 
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda               8:0    0  100G  0 disk 
    ├─sda1            8:1    0    1G  0 part /boot
    └─sda2            8:2    0   99G  0 part 
      ├─centos-root 253:0    0   50G  0 lvm  /
      ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
      └─centos-home 253:2    0   47G  0 lvm  /home
    sdb               8:16   0   20G  0 disk 
    sr0              11:0    1  4.4G  0 rom  /run/media/root/CentOS 7 x86_64
    #注意这个磁盘在添加时放在桌面,因为后面加给client时需要用到,就放在桌面比较明显。
    

在这里插入图片描述

  1. 格式化为xfs文件系统,挂载到/data,将备份的mbr.bak复制到/data目录
#格式化。
[root@server ~ 15:45:20]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=4, agsize=1310720 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242880, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

#创建挂载点/data,并挂载。
[root@server ~ 15:46:11]# mkdir /data
[root@server ~ 15:46:25]# mount  /dev/sdb /data/

#备份数据。
[root@server ~ 15:47:54]# dd if=/dev/sda of=/root/mbr.bak bs=1 count=512
记录了512+0 的读入
记录了512+0 的写出
512字节(512 B)已复制,0.00138247 秒,370 kB/秒

#将备份的数据复制到/data(本质是复制到硬盘/sdb中)。
[root@server ~ 15:48:45]# cp /root/mbr.bak /data
[root@server ~ 15:49:13]# ls /data/
mbr.bak

  1. 从server虚拟机中移除该硬盘,并添加给故障虚拟机
#卸载。
[root@server ~ 15:49:17]# umount /data
  1. 利用光盘启动修复

在这里插入图片描述
在这里插入图片描述

<

  1. 挂载新的硬盘到/data
#挂载
[root@centos7 ~ 15:53:23]# mount /dev/sdb /data/
[root@centos7 ~ 15:57:15]# ls /data
mbr.bak

注意:这时候用lsblk命令去查看时,sda下面没有任何东西。
在这里插入图片描述

如图所示:进行挂载,写入数据。

在这里插入图片描述

  1. 将数据写入到/sda中。
 [root@centos7 ~ 15:57:51]# dd if=/data/mbr.bak of=/dev/sda
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.00127101 秒,403 kB/秒


  1. lsblk查看分区表,并重启系统测试。
[root@centos7 ~ 15:58:31]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   99G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0   47G  0 lvm  /home
sdb               8:16   0   20G  0 disk /data
sr0              11:0    1  4.4G  0 rom  /run/media/root/CentOS 7 x86_64

在这里插入图片描述

==注意:这里当时有个错误,count=512 写成了446, 这会导致将磁盘挂入client端后,用lsblk去查看时sda下面就会出现分区表。

解决过程(u盘):
  1. 将mbr.bak复制到xfs文件系统的u盘中
  2. 将u关联给故障的虚拟机
  3. 利用光盘启动修复
  4. 挂载u盘到/data
  5. dd if=/data/mbr.bak of=/dev/sda
  6. lsblk查看分区表,并重启系统测试。

2.如何手动加密数据盘?

假设需要加密的块设备为sdb。

步骤如下:

  1. LUKS 依赖 cryptsetup 工具,安装命令:
#添加一块硬盘sdb
[root@centos7 ~ 11:13:44]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   99G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0   47G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
sr0              11:0    1  4.4G  0 rom 

#下载依赖工具
[root@centos7 ~ 11:13:52]# yum install -y cryptsetup
  1. 初始化 LUKS 加密分区:对目标分区(如 /dev/sdb)进行 LUKS 初始化,设置加密密钥(密码):
[root@centos7 ~ 11:16:13]# cryptsetup luksFormat /dev/sdb

WARNING!
========
这将覆盖 /dev/sdb 上的数据,该动作不可取消。

Are you sure? (Type uppercase yes): YES#这里必须是大写的。
输入 /dev/sdb 的口令:`gcf520620`#这里密码也不可简单或是少于八位不然会报错。
确认密码:`gcf520620`

  • 执行后会提示警告(“WARNING! This will overwrite data on /dev/sdb1 irrevocably.”),输入 YES 确认。
  • 随后设置加密密码(建议复杂度高,至少 8 位,包含大小写、数字和特殊字符)。

注意:此操作会清除分区原有数据,需提前备份!

  1. 打开(映射)加密分区:初始化后,需将加密分区映射到一个临时设备(如 crypt_disk),才能进行格式化和挂载:
#当不映射时直接挂载,会显示不成功因为不识别。
[root@centos7 ~ 11:16:40]# mkdir /data
[root@centos7 ~ 11:17:18]# mount /dev/sdb /data
mount: 未知的文件系统类型“crypto_LUKS”

#注意这里的crypt——disk 意思是起一个别名叫做这个,可以是任意的比如abc,....
[root@centos7 ~ 11:17:53]# cryptsetup open /dev/sdb crypt_disk
输入 /dev/sdb 的口令:`gcf520620`

#此时查看,发现sdb下面出现了crypt_disk。
[root@centos7 ~ 11:18:26]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda               8:0    0  100G  0 disk  
├─sda1            8:1    0    1G  0 part  /boot
└─sda2            8:2    0   99G  0 part  
  ├─centos-root 253:0    0   50G  0 lvm   /
  ├─centos-swap 253:1    0    2G  0 lvm   [SWAP]
  └─centos-home 253:2    0   47G  0 lvm   /home
sdb               8:16   0   20G  0 disk  
└─crypt_disk    253:3    0   20G  0 crypt 
sr0              11:0    1  4.4G  0 rom
  • 输入步骤 2 中设置的密码,验证通过后,会生成映射设备 /dev/mapper/crypt_disk
  1. 格式化映射设备:对映射后的设备格式化文件系统(如 ext4 或 xfs):
# 对/dev/mapper/crypt_disk进行格式化,前面的/dev/mapper是生成时固定的,好多都是在它下面。
[root@centos7 ~ 11:19:27]# mkfs.xfs /dev/mapper/crypt_disk
  # 或 mkfs.ext4 /dev/mapper/crypt_disk
  1. 挂载加密分区
[root@centos7 ~ 11:20:08]# lsblk /dev/mapper/crypt_disk 
NAME       MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
crypt_disk 253:3    0  20G  0 crypt /data

#此时即可像使用普通分区一样在 /data 目录读写数据。
[root@centos7 ~ 11:20:22]# cp /etc/host* /data
[root@centos7 ~ 11:21:24]# ls /data
host.conf  hostname  hosts  hosts.allow  hosts.deny

  1. 卸载与关闭加密分区
[root@centos7 ~ 11:21:28]# umount /data
[root@centos7 ~ 11:26:03]# cryptsetup close crypt_disk
 # 关闭映射,加密分区恢复不可访问状态
 
 #这时候lsblk去查看时,sdb下面也不会显示 crypt_disk。
 [root@centos7 ~ 11:26:33]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   99G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0   47G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
sr0              11:0    1  4.4G  0 rom 
  1. 开机自动挂载加密分区(可选)

若需开机自动挂载,需配置 /etc/crypttab/etc/fstab

7.1 获取 LUKS 分区的 UUID

# 记录 UUID 字段(如 "UUID=xxxx-xxxx-xxxx")
[root@centos7 ~ 11:27:32]# blkid /dev/sdb
/dev/sdb: UUID="eb6940ec-0b56-4ea6-a386-b65f9da9c625" TYPE="crypto_LUKS"

7.2 编辑 /etc/crypttab,添加映射信息:

#这里也可以用'>' 因为害怕里面有内容,所以用'>>' 
[root@centos7 ~ 11:27:49]# echo "crypt_disk UUID=eb6940ec-0b56-4ea6-a386-b65f9da9c625  none luks" >> /etc/crypttab 

#查看验证
[root@centos7 ~ 11:28:42]# cat /etc/crypttab
crypt_disk UUID=eb6940ec-0b56-4ea6-a386-b65f9da9c625  none luks

格式:[映射名] [加密分区UUID] [密钥文件路径,none表示手动输入密码] [luks]

7.3 编辑 /etc/fstab,添加自动挂载信息:

[root@centos7 ~ 11:28:46]# echo "/dev/mapper/crypt_disk /data xfs defaults 0 0" >> /etc/fstab

#查看验证
[root@centos7 ~ 11:29:46]# tail  /etc/fstab -n 3 
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/mapper/crypt_disk /data xfs defaults 0 0 #在这里

若希望自动输入密码(无需手动交互),可将密码存入密钥文件(如 /root/luks_key),并在 /etc/crypttab 中指定该文件路径(需设置文件权限为 600)。

  1. 重启验证,进入时会显示如下,输入密码即可进入虚拟机。

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值