tl; dr:如何修复RAID1阵列中1个磁盘上的坏块?
但是请阅读整篇文章,以获取我已经尝试过的内容以及方法中可能出现的错误。我尝试了尽可能详细,我真的希望能得到一些反馈
这是我的情况:在由管理的RAID1阵列中设置了两个2TB磁盘(相同型号)mdadm
。大约6个月前,我在SMART报告时注意到了第一个坏块。今天,我注意到了更多信息,现在正在尝试对其进行修复。
该HOWTO页似乎是每个人都可以链接以解决SMART报告的坏块的文章。这是一个很棒的页面,充满了信息,但是它已经过时了,无法解决我的特定设置。这是我的配置不同之处:
- 我在RAID1阵列中使用了两个磁盘,而不是一个磁盘。一个磁盘报告错误,而另一个磁盘正常。HOWTO的编写只考虑了一个磁盘,这会引发各种问题,例如“我是否在磁盘设备或RAID设备上使用此命令”?
- 我正在使用fdisk不支持的GPT。我一直在使用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查找了以后要用来确定块号的起始扇区(由于它不支持GPT,因此我无法使用fdisk):
# 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
,/dev/sda1
,/dev/sdb
,/dev/sdb1
,/dev/md0
,和+ -5块号来搜索周围的坏块。一切正常。我耸了耸肩,继续进行写入和同步(我使用/ 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
回到平方1.那么,基本上,我该如何修复RAID1阵列中1个磁盘上的坏块?我确定我做的事情不正确...
感谢您的时间和耐心等待。
编辑1:
我试图运行一个长时间的SMART测试,但相同的LBA返回的结果很差(唯一的不同是它报告剩余30%而不是90%):
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Extended offline Completed: read failure 30% 12180 3212761936
# 2 Short offline Completed: read failure 90% 12170 3212761936
我也将badblocks与以下输出配合使用。输出很奇怪,似乎格式错误,但是我尝试测试输出为块的数字,但是debugfs给出了错误
# badblocks -sv /dev/sda
Checking blocks 0 to 1953514583
Checking for bad blocks (read-only test): 1606380968ne, 3:57:08 elapsed. (0/0/0 errors)
1606380969ne, 3:57:39 elapsed. (1/0/0 errors)
1606380970ne, 3:58:11 elapsed. (2/0/0 errors)
1606380971ne, 3:58:43 elapsed. (3/0/0 errors)
done
Pass completed, 4 bad blocks found. (4/0/0 errors)
# debugfs
debugfs 1.42.4 (12-June-2012)
debugfs: open /dev/md0
debugfs: testb 1606380968
Illegal block number passed to ext2fs_test_block_bitmap #1606380968 for block bitmap for /dev/md0
Block 1606380968 not in use
不知道从这里去哪里。badblocks
肯定找到了一些东西,但我不确定如何处理显示的信息...
编辑2
更多命令和信息。
我觉得自己是个白痴,忘记了最初包含的内容。这是的SMART值/dev/sda
。我有1个Current_Pending_Sector,还有0个Offline_Uncorrectable。
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x002f 100 100 051 Pre-fail Always - 166
2 Throughput_Performance 0x0026 055 055 000 Old_age Always - 18345
3 Spin_Up_Time 0x0023 084 068 025 Pre-fail Always - 5078
4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 75
5 Reallocated_Sector_Ct 0x0033 252 252 010 Pre-fail Always - 0
7 Seek_Error_Rate 0x002e 252 252 051 Old_age Always - 0
8 Seek_Time_Performance 0x0024 252 252 015 Old_age Offline - 0
9 Power_On_Hours 0x0032 100 100 000 Old_age Always - 12224
10 Spin_Retry_Count 0x0032 252 252 051 Old_age Always - 0
11 Calibration_Retry_Count 0x0032 252 252 000 Old_age Always - 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 75
181 Program_Fail_Cnt_Total 0x0022 100 100 000 Old_age Always - 1646911
191 G-Sense_Error_Rate 0x0022 100 100 000 Old_age Always - 12
192 Power-Off_Retract_Count 0x0022 252 252 000 Old_age Always - 0
194 Temperature_Celsius 0x0002 064 059 000 Old_age Always - 36 (Min/Max 22/41)
195 Hardware_ECC_Recovered 0x003a 100 100 000 Old_age Always - 0
196 Reallocated_Event_Count 0x0032 252 252 000 Old_age Always - 0
197 Current_Pending_Sector 0x0032 100 100 000 Old_age Always - 1
198 Offline_Uncorrectable 0x0030 252 100 000 Old_age Offline - 0
199 UDMA_CRC_Error_Count 0x0036 200 200 000 Old_age Always - 0
200 Multi_Zone_Error_Rate 0x002a 100 100 000 Old_age Always - 30
223 Load_Retry_Count 0x0032 252 252 000 Old_age Always - 0
225 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 77
# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu May 5 06:30:21 2011
Raid Level : raid1
Array Size : 1953512383 (1863.01 GiB 2000.40 GB)
Used Dev Size : 1953512383 (1863.01 GiB 2000.40 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Tue Jul 3 22:15:51 2012
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Name : server:0 (local to host server)
UUID : e7ebaefd:e05c9d6e:3b558391:9b131afb
Events : 67889
Number Major Minor RaidDevice State
2 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
根据答案之一:看来我确实做了切换seek
和skip
for dd
。我正在使用搜索,因为那是HOWTO所使用的。使用此命令将导致dd
挂起:#dd if = / dev / sda1 of = / dev / null bs = 4096 count = 1 skip = 401594986
在该块周围使用块(..84,.. 85,.. 87,.. 88)似乎可以正常工作,并且将/ dev / sdb1与块一起使用也401594986
可以正常读取(这与磁盘通过SMART测试所期望的一样) )。现在,我的问题是:在该区域上写以重新分配块时,应使用/dev/sda1
还是使用/dev/md0
?我不想通过直接写入一个磁盘而不更新另一磁盘来引起RAID阵列的任何问题。
编辑3
直接写入块会产生文件系统错误。我选择了一个可以快速解决问题的答案:
# 1 Short offline Completed without error 00% 14211 -
# 2 Extended offline Completed: read failure 30% 12244 3212761936
感谢所有提供帮助的人。=)
/sbin/badblocks -sv /dev/sda
检查磁盘。
sudo mdadm -D /dev/md0
smartctl -t long /dev/sda
并查看第一个错误的LBA是否更改。