记数据盘故障后的修复操作

ety001

发布于390天前
远程工作,Steem开发者,Steem见证人
# 一、起因

周二早上开车出门,像往常一样打开懒猫上的 Emby,想要听歌,结果提示“故障修复”。

![84f762832897d167193f11b0b644fe5e.jpg](https://dl.playground.lazycat.cloud/guidelines/364/2675d3a0-2147-4847-bceb-8fddb5e196da.jpg "84f762832897d167193f11b0b644fe5e.jpg")

按照页面提示,先重启了一下,结果没起来,直接显示“数据盘异常”

![809d837244e2cb596d0f52db4bcb3292.jpg](https://dl.playground.lazycat.cloud/guidelines/364/0f7a8562-4f38-433c-bb82-09e892030692.jpg "809d837244e2cb596d0f52db4bcb3292.jpg")

赶紧把照片发到了 VIP 群里摇人,很快大佬们就冒泡了。

经过分析,确认是 sdb 硬盘有故障,然后启动售后方案,直接寄两块新盘过来替换(咱就说屌不屌)。

![image.png](https://dl.playground.lazycat.cloud/guidelines/364/22d17a28-bcbf-4298-b9b3-c19f39daddf9.png "image.png")

因为我初始化系统的时候做的 RAID 1,所以不担心数据丢失,不过为了防止意外,还是先关机了。

# 二、数据恢复

今天周五,一早快递就上门来配送硬盘了。拿到硬盘后,在 VIP 群跟各位大佬报告已经收到新盘了,准备开搞。

## 1.再次确认故障盘

```
~ # btrfs filesystem show
Label: none  uuid: 69d77fa4-d781-43b3-b6f1-0490e6a5ffba
	Total devices 1 FS bytes used 45.49GiB
	devid    1 size 462.94GiB used 58.02GiB path /dev/nvme0n1p3

Label: 'data'  uuid: 9fbcf9f8-58f2-46c2-b40b-556c653b19d8
	Total devices 2 FS bytes used 1.07TiB
	devid    1 size 3.64TiB used 1.13TiB path /dev/sdb1
	devid    2 size 3.64TiB used 1.13TiB path /dev/sda1
```

执行命令后,发现没有故障报警了,看了一下懒猫客户端的面板,已经启动成功了,这有点神奇了。

但是检查 RAID 组的统计数据,发现之前的报错记录还是存在的

```
 ~ # btrfs device stats /data
[/dev/sdb1].write_io_errs    202615
[/dev/sdb1].read_io_errs     490
[/dev/sdb1].flush_io_errs    24796
[/dev/sdb1].corruption_errs  754
[/dev/sdb1].generation_errs  0
[/dev/sda1].write_io_errs    0
[/dev/sda1].read_io_errs     0
[/dev/sda1].flush_io_errs    0
[/dev/sda1].corruption_errs  0
[/dev/sda1].generation_errs  0
```

再次确认是 sdb 这块硬盘之前出过报错,为了妥善期间还是计划用新盘替换掉 sdb 这块硬盘。

## 2.检查硬盘接口

```
~ # ls -lh /dev/disk/by-path/
total 0
lrwxrwxrwx 1 root root  9 May  9 09:06 pci-0000:00:17.0-ata-1 -> ../../sdb
lrwxrwxrwx 1 root root 10 May  9 09:06 pci-0000:00:17.0-ata-1-part1 -> ../../sdb1
lrwxrwxrwx 1 root root  9 May  9 09:06 pci-0000:00:17.0-ata-1.0 -> ../../sdb
lrwxrwxrwx 1 root root 10 May  9 09:06 pci-0000:00:17.0-ata-1.0-part1 -> ../../sdb1
lrwxrwxrwx 1 root root  9 May  9 09:06 pci-0000:00:17.0-ata-2 -> ../../sda
lrwxrwxrwx 1 root root 10 May  9 09:06 pci-0000:00:17.0-ata-2-part1 -> ../../sda1
lrwxrwxrwx 1 root root  9 May  9 09:06 pci-0000:00:17.0-ata-2.0 -> ../../sda
lrwxrwxrwx 1 root root 10 May  9 09:06 pci-0000:00:17.0-ata-2.0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 13 May  9 09:06 pci-0000:01:00.0-nvme-1 -> ../../nvme0n1
lrwxrwxrwx 1 root root 15 May  9 09:06 pci-0000:01:00.0-nvme-1-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 May  9 09:06 pci-0000:01:00.0-nvme-1-part2 -> ../../nvme0n1p2
lrwxrwxrwx 1 root root 15 May  9 09:06 pci-0000:01:00.0-nvme-1-part3 -> ../../nvme0n1p3
```
可以看到 sdb 硬盘在 ata-1 接口上。

## 3.记录一下故障盘序列号

```
~ # smartctl -a /dev/sdb
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.5.0-0.deb12.4-amd64] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     TOSHIBA MQ04ABB400
Serial Number:    64K3PZU6T
```
记录一下序列号,即使搞不清楚哪个接口,通过拆下来的硬盘上的标签,也可以锁定故障盘是哪一块。

这里有一张 VIP 群大佬拍的主板两个 sata 口的照片(照片看不明白也不用担心,主板上有很明显的印刷字样标注)

![06e25b00f718e857535dc3465eb1b354.jpg](https://dl.playground.lazycat.cloud/guidelines/364/031519ad-4364-4f9e-95e0-8c2937a6f068.jpg "06e25b00f718e857535dc3465eb1b354.jpg")

## 4.拆机更换新盘

参考官方的这个教程即可: [https://legacy.lazycat.cloud/playground/%2Fguideline%2F438](https://legacy.lazycat.cloud/playground/%2Fguideline%2F438) 。

注意提前准备好螺丝刀,外壳是四个梅花螺丝。

## 5.恢复 RAID 组

重新开机后,懒猫客户端依然会显示数据盘故障,大概是因为 RAID 组没有恢复无法成功挂载的原因。

> 这里额外说一句,之前搞 LVM 和 MDADM 组 RAID 1 的时候,我印象是有故障盘的时候,RAID 组是可以挂载的,但是看上去 Btrfs 不支持这样做

先看一下目前的接口和盘符对应情况

```
~ # ls -al /dev/disk/by-path
total 0
drwxr-xr-x 2 root root 240 May  9 09:51 .
drwxr-xr-x 8 root root 160 May  9 09:51 ..
lrwxrwxrwx 1 root root   9 May  9 09:51 pci-0000:00:17.0-ata-1 -> ../../sda
lrwxrwxrwx 1 root root   9 May  9 09:51 pci-0000:00:17.0-ata-1.0 -> ../../sda
lrwxrwxrwx 1 root root   9 May  9 09:51 pci-0000:00:17.0-ata-2 -> ../../sdb
lrwxrwxrwx 1 root root  10 May  9 09:51 pci-0000:00:17.0-ata-2-part1 -> ../../sdb1
lrwxrwxrwx 1 root root   9 May  9 09:51 pci-0000:00:17.0-ata-2.0 -> ../../sdb
lrwxrwxrwx 1 root root  10 May  9 09:51 pci-0000:00:17.0-ata-2.0-part1 -> ../../sdb1
lrwxrwxrwx 1 root root  13 May  9 09:51 pci-0000:01:00.0-nvme-1 -> ../../nvme0n1
lrwxrwxrwx 1 root root  15 May  9 09:51 pci-0000:01:00.0-nvme-1-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root  15 May  9 09:51 pci-0000:01:00.0-nvme-1-part2 -> ../../nvme0n1p2
lrwxrwxrwx 1 root root  15 May  9 09:51 pci-0000:01:00.0-nvme-1-part3 -> ../../nvme0n1p3
```

发现换了新盘后,盘符发生了变化,ata-1 对接的盘符变成了 sda。我们更换的是 ata-1 上的硬盘,所以 sda 这块应该是新盘。

为了保险,再确认一下

```
 ~ # smartctl -a /dev/sda
```
看了一下上电时间,确定是这块盘了。

下面的操作就是恢复了。

有两个方案,一个是直接使用 `btrfs replace` 命令,一个是先 `btrfs device add`,然后 `btrfs balance` 完成数据平衡,最后移除 missing 的硬盘 `btrfs device remove`。

这里有个小插曲就是,我直接 AI 查的 btrfs 的命令,一开始 AI 给的是方案一,命令如下:

```
btrfs device replace start /dev/sdb /dev/sde /mnt/btrfs 
```
其中 sdb 是故障盘, sde是新盘。

问题是我的故障盘已经拔出了,不可能有盘符了,这条命令咋执行呢?

把问题抛给 AI 后,AI 给了我第二个方案。

后来 VIP 群大佬说,其实命令里可以用 RAID 组里的盘ID,而不用盘符。WTF。。。

### 1) 方案一

a) 先挂载 RAID 组到一个临时目录,之所以到临时目录,主要是怕挂载到 `/data` 后,有进程对 `/data` 写操作,出现不必要的问题(还可以使用 `hc shutdown` 来关闭懒猫的进程避免写操作发生)。

> 这里额外吐槽一下 btrfs ,为啥操作 RAID 组需要先挂载才能操作呢?

```
~ # mkdir /mnt/data
~ # mount -o degraded,recovery LABEL=data /mnt/data
```
b) 检查 missing 的盘 ID
```
~ #  btrfs filesystem usage -T /mnt/data
Overall:
..........
..........
             Data    Metadata System
Id Path      RAID1   RAID1    RAID1     Unallocated Total    Slack
-- --------- ------- -------- --------- ----------- -------- -----
 1 missing         -        -         -     3.64TiB  3.64TiB     -
 2 /dev/sdb1 1.07TiB  3.00GiB  32.00MiB     2.56TiB  3.64TiB     -
-- --------- ------- -------- --------- ----------- -------- -----
.........
.........
```
c) 执行替换命令
```
~ # btrfs replace start 1 /dev/sda /mnt/data
```
* 1 代表坏盘的 ID
* /dev/sda 代表新盘

等待命令执行成功即可。

d) 检查状态,卸载 RAID 组,重启机器

```
~ # btrfs filesystem usage -T /mnt/data
~ # umount /mnt/data
~ # reboot
```

### 2) 方案二

a) 第一步都是一样的
```
~ # mkdir /mnt/data
~ # mount -o degraded,recovery LABEL=data /mnt/data
```
b) 把新硬盘加入 RAID 组
```
btrfs device add /dev/sda /mnt/data
```
c) 开始数据平衡,也就是 copy 数据
```
btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/data
```
因为我是 RAID1,所以 `dconvert` 和 `mconvert` 都写 `raid1`。
d) 等待数据平衡结束,可以使用下面的命令检查数据平衡进度。我花了大概一下午加半个晚上吧。
```
~ # btrfs balance status /mnt/data
```
e) 完成后,检查状态,没有问题,就可以移除 missing 盘,重启了
```
~ # btrfs filesystem usage -T /mnt/data
~ # btrfs device remove 1 /mnt/data/
~ # umount /mnt/data
~ # reboot
```

# 三、总结

* 懒猫的售后刚刚的
* 我又学会了一项新技能
* AI 有时候还是会误导人的,命令以后还是能查手册就查手册了

评论

0

暂无评论

说点什么呢~
收藏
1
0
0