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

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

赶紧把照片发到了 VIP 群里摇人,很快大佬们就冒泡了。
经过分析,确认是 sdb 硬盘有故障,然后启动售后方案,直接寄两块新盘过来替换(咱就说屌不屌)。

因为我初始化系统的时候做的 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 口的照片(照片看不明白也不用担心,主板上有很明显的印刷字样标注)

## 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暂无评论