Linux - 使用 GPT 修复 RAID1 阵列上的坏块

Linux - 使用 GPT 修复 RAID1 阵列上的坏块

tl;dr:我该如何修复 RAID1 阵列中 1 个磁盘上的坏块?

但请阅读整篇文章,了解我已经尝试过的方法以及我的方法中可能存在的错误。我已尽量写得尽可能详细,我真的希望得到一些反馈

这是我的情况:我有两个 2TB 磁盘(相同型号),它们设置在由 管理的 RAID1 阵列中mdadm。大约 6 个月前,当 SMART 报告时,我注意到了第一个坏块。今天我注意到了更多,现在正在尝试修复它。

本 HOWTO 页面似乎是每个人都链接到的一篇关于修复 SMART 报告的坏块的文章。这是一个很棒的页面,充满了信息,但它相当过时,并没有解决我的特定设置问题。以下是我的配置的不同之处:

  • 我在 RAID1 阵列中使用了两个磁盘,而不是一个磁盘。一个磁盘报告错误,而另一个磁盘则正常。HOWTO 仅针对一个磁盘编写,这带来了各种问题,例如“我应该在磁盘设备还是 RAID 设备上使用此命令”?
  • 我使用的是 GPT,但 fdisk 不支持。我一直在使用 gdisk,希望它能提供我需要的相同信息

那么,让我们开始吧。这是我所做的,但它似乎不起作用。请随时仔细检查我的计算和方法是否有错误。报告错误的磁盘是 /dev/sda:

# smartctl -l selftest /dev/sda
smartctl 5.42 2011-10-20 r3458 [x86_64-linux-3.4.4-2-ARCH] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       90%     12169         3212761936

由此,我们得知错误位于 LBA 3212761936 上。按照 HOWTO,我使用 gdisk 来查找稍后用于确定块号的起始扇区(因为我不能使用 fdisk,因为它不支持 GPT):

# gdisk -l /dev/sda
GPT fdisk (gdisk) version 0.8.5

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 3907029168 sectors, 1.8 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): CFB87C67-1993-4517-8301-76E16BBEA901
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 3907029134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048      3907029134   1.8 TiB     FD00  Linux RAID

使用tunefs我发现块大小为4096。使用此信息和 HOWTO 中的计算,我得出结论,所讨论的块是((3212761936 - 2048) * 512) / 4096 = 401594986

然后,HOWTO 指示我debugfs查看该块是否正在使用(我使用 RAID 设备,因为它需要 EXT 文件系统,这是令我困惑的命令之一,因为起初我不知道应该使用 /dev/sda 还是 /dev/md0):

# debugfs
debugfs 1.42.4 (12-June-2012)
debugfs:  open /dev/md0
debugfs:  testb 401594986
Block 401594986 not in use

因此,块 401594986 是空白区域,我应该能够毫无问题地覆盖它。不过,在写入之前,我会尝试确保它确实无法读取:

# dd if=/dev/sda1 of=/dev/null bs=4096 count=1 seek=401594986
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000198887 s, 20.6 MB/s

如果无法读取该块,我不希望这能起作用。然而,它确实起作用了。我重复使用/dev/sda、、、、和+ -5 到块号来搜索坏块周围。一切都成功了。我耸耸肩,继续提交写入和同步(我使用 /dev/md0 /dev/sda1,因为我认为修改一个磁盘而不修改另一个磁盘可能会导致问题,这样两个磁盘都会覆盖坏块):/dev/sdb/dev/sdb1/dev/md0

# dd if=/dev/zero of=/dev/md0 bs=4096 count=1 seek=401594986
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000142366 s, 28.8 MB/s
# sync 

我期望写入坏块会让磁盘将该块重新分配给好块,但是运行另一个 SMART 测试却显示不同的结果:

# 1  Short offline       Completed: read failure       90%     12170         3212761936

回到原点。那么基本上,我该如何修复 RAID1 阵列中 1 个磁盘上的坏块?我肯定我做错了什么……

感谢您的时间和耐心。

相关内容