rocky损坏系统的数据恢复
Easul Lv6

事故起因

在一起项目中的生产环境,服务器由于 minio 存储文件增速过快,磁盘容量被完全用光,在临时判断采取 服务器磁盘空间扩容 的选择后,为原有磁盘扩展空间,之后重启服务,服务器出现 网卡挂载不上root登录密码错误/home 磁盘无法挂载 等问题。

简单的事故引起步骤如下:

  1. hyper-v 的虚拟机执行关机操作
  2. 给虚拟机的已有硬盘文件执行扩展操作,扩展了200G
  3. 执行虚拟机的开机操作
  4. 开机后,先是远程 SSH 发现无法连接虚拟机,后使用Hyper-V自带的命令行界面查看服务器,发现无法使用原本的 root用户名与密码 进行登录。

恢复记录

本次恢复最终目标为将原 /home 目录的数据拷贝到新系统的 /home 目录。
相关小目标为:

  1. /home 目录进行挂载
  2. 解决出问题的网卡报错
  3. 恢复系统的root登录(最终未实现)

以下主要以命令行相关操作进行解析

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# 由于服务器已经无法使用root等用户进行登录
# 故使用救援模式下的单用户登录模式进行服务器的相关数据访问
# 首先重启服务器,然后在选择系统的页面按 e
# 在内核那一行的最后添加如下参数,rw 前边记得加一个空格
# rw init=/bin/bash
# 然后 CTRL+X 重启服务器
# 接下来重新挂载根文件系统 / 为读写模式
# mount -a 会挂载在 /etc/fstab 文件中定义的所有文件系统
mount -a remount, rw /

# 1. `home` 目录相关的挂载操作
# 使用如下命令查看当前系统挂载的硬盘块信息
# 有些时候可能环境变量并没有将命令添加进去,那么就需要在命令前添加 /bin 或 /sbin 等命令前缀,用绝对路径调用命令
lsblk
# 输出系统中所有逻辑卷的信息
# 包括 逻辑卷名称 所属卷组 大小 状态 等
/sbin/lvdisplay
# 激活逻辑卷 /dev/rl/home
# 在本次出问题的系统中,就是这个 /home 的逻辑卷老是挂不上
/sbin/lvdisplay -ay /dev/rl/home
# 输出系统中所有物理卷的信息
# 包括 物理卷名称 所属卷组 大小 状态 等
/sbin/pvdisplay
# 输出系统中所有卷组的信息
# 包括 卷组名称 大小 可用空间 物理卷数量 等属性
/sbin/vgdisplay
# 查看 LVM逻辑卷 的信息
# LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
# lvhome vghome -wi-ao---- <50.00g
# 这些参数表示 逻辑卷名称 逻辑卷所在卷组名称 属性 逻辑卷大小等
/sbin/lvs
# 查看 LVM 卷组的信息
# VG #PV #LV #SN Attr VSize VFree
# vghome 1 2 0 wz--n- <100.00g 50.00g
# 这些参数表示 卷组名称,卷组有几个物理卷,卷组有几个逻辑卷,卷组总容量<100.00g,卷组空闲50.00g
/sbin/vgs
# 查看 LVM物理卷 的信息
/sbin/pvs
# 扫描系统可用的所有逻辑卷
/sbin/lvscan
# 激活系统中的所有卷组,/home 的逻辑卷挂不上后可以使用这个命令
/sbin/vgchange -ay
# 也可以使用 vgscan
# 这个命令用于扫描系统中所有可用的卷组,并创建相应的设备节点
/sbin/vgscan --mknodes
# 如需重启系统,可以使用如下命令快速重启
exec /sbin/init

# 2. 解决出问题的网卡报错
# 由于报错网卡的网卡名为 veth926a0c3 或 br-55512fadf18e 类似的名称
# 这些都是docker的网卡,怀疑是系统自启动是 docker 网卡出了问题
# 故将 docker相关的服务先移动到 /opt 目录下
# 从而解决网卡报错
cd /usr/lib/systemd/system
mv docker.* /opt/

# 3. 恢复系统的root登录
# 由于当前 root 登录已经被锁,故使用如下命令进行 root 用户登录的解锁
# 这里用于重置 root 用户的登录失败计数器,从而接触账户锁定
/sbin/faillock --user root --reset
# 然后这里可以查看 root 用户锁定的状态
/sbin/faillock --user root
# 但由于解锁之后,修改 root 密码仍旧无法进入系统
# 故放弃在原系统进行启动,以下将进行数据复制操作

# 4. 进行相关数据拷贝操作
# 创建 中转盘,用于 转移数据
# 右键hyper-v中该系统,点击设置,
# 点击 SCSI控制器,点击 硬盘驱动器,点击 添加,点击 新建,
# 磁盘类型 选择 动态扩展(动态扩展就是指定了50G磁盘大小,如果用了不够50G,则物理磁盘占用为实际占用,够了50G,则磁盘占用才到50G)
# 指定名称和位置 也重新改一下,磁盘位置可以放到 创建虚拟机时 指定的固定目录
# 磁盘大小 设置为合适的大小后即可完成,然后点 应用 挂载该新硬盘
# 之后在命令行中列出系统中所有可用的磁盘分区
/sbin/fdisk -l
# 使用 fdisk 创建磁盘分区,
# 进入之后相关命令如下
# p 打印磁盘分区表
# d 删除现有的某个分区
# n 创建一个新的分区
# w 创建完之后保存分区
# q 退出
# 相关创建跟随提示即可
/sbin/fdisk /dev/sdb
# 执行 XFS 文件系统检查和修复
fsck.xfs /dev/sdb1
# 创建或格式化一个新XFS分区
mkfs.xfs /dev/sdb1
# 创建新的目录,用于将中转的硬盘块挂载到这个目录
mkdir /data
mount /dev/sdb1 /data
# 查看当前各文件系统的使用情况
# -T 用于显示文件系统的类型
# -H 用于以人类可读的格式显示磁盘容量
df -TH
# 这里挂好了中转盘,就可以将出问题机器上的数据复制到 /data 目录了
# 此时可以执行下边的 `hyper-v创建rocky虚拟机记录` 进行新系统的创建
# 创建好了之后,数据如果也复制完了,可以进行数据盘的卸载,然后挂载到新的系统
umount /data/
# 查看下卸载后的文件系统信息
df -Th
# 确认 中转盘 卸载后,右键hyper-v中的该系统,点击设置
# 点击 SCSI控制器,点击 中转盘 的那块 硬盘驱动器,点击 删除>确定,即可将中转盘从就旧系统完全卸载
# 然后右键hyper-v中刚刚创建的新系统,
# 点击 SCSI控制器,点击 硬盘驱动器,点击 添加
# 虚拟硬盘 处点击 浏览,将刚刚那块 中转盘 添加进来,点击 应用,即可在新系统进行数据盘的挂载

# 5. 新系统中的数据转移
# 查看新系统中的磁盘分区信息,可通过容量大小判断刚刚的 中转盘 是否挂载上来
fdisk -l
# 在新系统中创建 中转盘 挂载目录,并进行磁盘挂载
mkdir /data
mount /dev/sdb1 /data
# 在 hyper-v 创建一块大的盘,用于存储更多的数据,右键hyper-v中刚刚创建的新系统,
# 点击 SCSI控制器,点击 硬盘驱动器,点击 添加,点击 新建,
# 磁盘类型 选择 动态扩展
# 指定名称和位置 也重新改一下,磁盘位置可以放到 创建虚拟机时 指定的固定目录
# 磁盘大小 设置为合适的大小后即可完成,然后点 应用 挂载该新硬盘
# 接下来在新系统中即可为挂载的新硬盘进行格式化
# 查看新系统中的磁盘分区信息,可通过容量大小判断刚刚的 新硬盘 是否挂载上来
fdisk -l
# 若 新硬盘 为 /dev/sdc ,则执行如下命令进行格式化
# 这样会进入到 parted 自己的命令行窗口中,用于 创建,删除,调整 磁盘分区
parted /dev/sdc
# 创建GPT分区表,可以比MBR支持更大更多的分区
mklabel GPT
# 创建新的分区,需要指定
# 分区名。可不填
# 文件系统类型。可设置为 xfs
# 开始位置。设置为 0%
# 结束位置。设置为 100%
mkpart
# 也可以直接使用一行命令进行创建,参数为 分区名 开始位置 结束位置
# 这里可能提示 The resulting partition is not properly aligned for best performance: 34s % 2048s != 0s
# 表示分区的起始扇区没有进行正确对齐,可能会影响磁盘性能。
# 如果不追求太高的性能,那么这里可以 Ignore
# mkpart primary 0 100%
# 将第一个分区标记为 LVM(逻辑卷) 分区
set 1 lvm on
# 然后可以查看所有的设置信息
print
# 没有问题之后退出 parted
quit
# 继续查看磁盘分区信息,可发现 新硬盘 创建了 新的分区
fdisk -l
# 创建物理卷
pvcreate /dev/sdc1
# 创建一个新卷组 vghome ,将物理卷 /dev/sdc1 添加到卷组
# 一个卷组可以有多个物理卷
vgcreate vghome /dev/sdc1
# 查看 LVM 卷组的信息
vgs
# 在 vghome 卷组上创建 逻辑卷 lvhome
# 创建的时候如果 100% 的空间不够,如
# Volume group 'vghome' has insufficient free space (127999 extents): 128000 required
# 可以将 100% free 换成 稍微小一点的空间,例如分了 500G,可以改成 499G
lvcreate -L 100% free -n lvhome vghome
# 查看 LVM逻辑卷 的信息
lvs
# 格式化为XFS分区
mkfs.xfs /dev/vghome/lvhome
# 挂载新的分区到 /home 目录
# /dev/mapper/ 为LVM设备的路径前缀
mount /dev/mapper/vghome-lvhome /home/
# 查看当前各文件系统的使用情况
df -Th
# 修改文件系统表,用于系统启动时自动挂载某些目录
vi /etc/fstab
# 添加如下新的分区配置进去,参数为
# 挂载设备路径 挂载目录 文件系统类型 挂载选项(读写权限等) 转储选项(0为不需要转储该文件系统) 文件系统检查顺序(0表示不需要检查该文件系统)
/dev/mapper/vghome-lvhome /home xfs defaults 0 0
# 然后再全部挂载一下文件系统表中所有设备,就可以使用新硬盘下的空间了
# 然后将 中转盘 中的数据转移到 /home 目录即可
mount -a

相关后续思考问题:

  1. hyper-v创建新硬盘后,如何用新硬盘为原本某个挂载目录扩容(是否是逻辑卷创建的问题)

hyper-v创建rocky虚拟机记录

  1. 创建虚拟机时,可以选择自己创建的目录用于虚拟机文件的存储,便于虚拟机的分类和寻找。这里创建的是虚拟机的基础配置文件
  2. 虚拟机使用代数 选择第二代
  3. 启动内存可以指定固定大小,不要使用动态内存
  4. 配置网络使用 外部网络 分配的网卡,可以为虚拟机映射和本机IP段相同的IP
  5. 连接虚拟硬盘 这里的 创建虚拟硬盘 是具体系统文件存储的位置,可以选择盘更大的位置。如果后期使用空间不够的话,可以创建新的硬盘块挂载到系统,然后使用逻辑卷拼接到原来的目录就可以扩充空间了。
  6. 然后右键新建的虚拟机,点设置
    1. 安全启用安全启动 关闭掉
    2. 处理器数量 可以改一下
    3. SCSI控制器 添加一个 DVD驱动器,在 映像文件 用于指定 ISO系统 的位置
    4. 固件 里的 DVD驱动器 移动到最开始
    5. 启动系统即可(进入到系统的连接界面,点击 操作CTRL + ALT + Delete 也可以进行系统的重启)
  7. 安装目的地 选择 sda存储配置 选择 自定义(用于自己分配各个分区的大小)
  8. 分区方案使用 LVM,然后点击下方的 加号,然后为 /boot/efi(200M即可), /boot(至少512M), swap(如可以不分该分区,则不需要分,分的话4G或8G都可以), /(分配的时候不要填数字,即可把剩余所有的空间分配到这里) 进行分区分配。填入的内容格式为 1G1M,字母大小写没关系。分配完之后,点击 完成
  9. 时间和日期 选择 上海网络和主机名 点击配置,为 eth0 配置网络信息。
    1. IPv4设置方法 选择 手动
    2. 然后点击 添加,填入对应的 地址(IP),子网掩码(一般为 255.255.255.0),网关(gateway)
    3. DNS服务器 设置为 223.5.5.5,8.8.8.8,然后点击保存
    4. 退出该窗口后,点击 以太网(eth0) 右边的开关,左边显示 已连接 则网卡配置成功
  10. 如果需要root用户直接登录,则在 root密码 处进行设置,创建用户 处可以创建普通用户
  11. 全部设置好后,点击开始安装即可。安装完成,即可以使用 ssh 进行服务器的登录。

后记

你永远都不知道,为什么明明没有问题的操作,引发了一起大事故。

 评论