raid-xfs硬盘修复笔记
正确步骤
查看内核日志
- 使用
dmesg
查看内核日志,发现IO错误。
[134659.268465] blk_update_request: I/O error, dev sdc, sector 7595353192 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
检查硬盘
- 使用
smartctl -H /dev/sdc
检查硬盘
#smartctl -H /dev/sdc
smartctl 7.1 2020-04-05 r5049 [x86_64-linux-4.18.0-305.10.2.el8_4.x86_64] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED //passed代表通过,但是不代表完全没有问题,可能还有坏道。
Please note the following marginal Attributes:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000f 062 032 044 Pre-fail Always In_the_past 110205049
扫描坏道
-
使用
badblocks /dev/sdc -s -b4096 -o badblcok.log
扫描坏道[1]此过程较长,可以使用nohup至后台。
出现较少坏道可以使用下述方法修复,如果很多推荐尽早备份更换硬盘。
-s 显示进度
-b 指定扫描的块大小
-o 输出到指定文件
#---以下不推荐使用
#利用硬盘的重分配特性修复坏道,此处对于阵列卡不推荐使用。单盘可以使用,但是使用写入测试模式可能会造成数据损失,推荐使用fsck修复。
# badblocks -w /dev/sdc -s -b4096 end start
-w 使用写入测试模式修复坏道
end start 结束及起始块位置,可以在上述badblcok.log中看到。
修复坏道
-
使用
fsck -n /dev/md0
修复坏道。除非是raid1或者单盘,否则不推荐使用修复坏道命令在单一磁盘设备上。
-n 不进行任何操作,只会检查文件系统 //确认没问题后可以去除此参数再次运行。 -y 所有提示默认同意运行,不推荐使用! -t 指定分区格式(xfs ext4) #XFS fsck -t xfs /dev/md0 //如果分区类型是XFS使用fsck修复时会推荐你使用xfs_repair命令修复 xfs_repair -n -v /dev/md0 -n 不进行任何操作,只会检查文件系统 -v 详细输出
后记
硬盘的最小单位是字节(byte)或者说块(block)
fdisk -l /dev/sdc //列出硬盘分区
Disk /dev/sdc:3.7 TiB,4000787030016 字节,7814037168 个扇区
#4000787030016 字节 该硬盘总共字节数,这个是最小单位。
#7814037168 扇区 扇区总数,硬盘驱动往硬盘读写时使用的是这个为最小单位
# 4000787030016字节 / 7814037168扇区 = 512每扇区有512字节
单元:扇区 / 1 * 512 = 512 字节
# 驱动读写的最小单位
扇区大小(逻辑/物理):512 字节 / 4096 字节
# 逻辑分配的是512块是一个扇区,物理上是4096块一个扇区。现在硬盘都大了不必节省空间,为了提升性能推荐使用4096。我这里是默认的512没改。
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:gpt
# 分区类型,一般有GPT MBR
磁盘标识符:695B49AF-65E6-8247-88FB-7FABDF3EE2AA
设备 起点 末尾 扇区 大小 类型
/dev/sdc1 2048 7814037134 7814035087 3.7T Linux RAID
#磁盘类型是RAID(fd),常见的还有XFS ext3 ext4 NTFS(dos)
#此处我这个硬盘是一个阵列中的,所以是fd类型,如果字节查看阵列的分区(/dev/md0)此处类型是XFS
超级块
无论是raid还是xfs等类型,都存有超级块。超级块是恢复硬盘的关键,存储着文件系统的关键信息。一般在硬盘上都有多个超级块备份,所以一般主超级块损坏还可以使用修复工具通过备用超级块修复。
在raid中,每个设备也都有存储raid超级块(md superblock)。如果某个硬盘坏道过多或者某种原因造成所有超级块及备份都丢失,只能通过mdadm --verbose --create /dev/md0 --chunk=512 --level=0 /dev/sdb1 /dev/sdc1
重建阵列了,此过程可能会造成数据丢失。请提前备份一份当前硬盘。重建阵列后,不要格式化,挂载直接使用,如果不能挂载使用fsck
修复,然后查看文件恢复情况。
hexedit
十六进制编辑器,可以查看编辑硬盘原始数据。[2]
#常用操作:
< 跳至整个硬盘头部
> 跳至整个硬盘尾部
ctrl+c 退出
enter 打开跳转输入框,直接输入16进制数字,跳转到该块16进制位置。
#编辑阵列设备md0
hexedit /dev/md0
0 58 46 53 42 00 00 10 00 00 00 00 00 XFSB.
0C 74 6F 2B 00 00 00 00 00 00 00 00 00 to+.
00000018 00 00 00 00 00 00 00 00 E7 81 57 CF .W.
00000024 47 E8 4C EC BB 52 43 7C 3E 47 52 2A G.L..RC|>GR*
00000030 00 00 00 00 40 00 00 09 00 00 00 00 ....@.
0000003C 00 00 04 00 00 00 00 00 00 00 04 01 .
00000048 00 00 00 00 00 00 04 02 00 00 00 01 .
00000054 03 A3 79 80 00 00 00 20 00 00 00 00 ..y.... ....
00000060 00 07 F6 00 BD B5 10 00 02 00 00 08 .
0000006C 00 00 00 00 00 00 00 00 00 00 00 00 .
00000078 0C 0C 09 03 1A 00 00 05 00 00 00 00 .
00000084 00 02 AF C0 00 00 00 00 00 00 03 1D .
00000090 00 00 00 00 66 58 9F 8B 00 00 00 00 ....fX......
0000009C 00 00 00 00 FF FF FF FF FF FF FF FF .
000000A8 FF FF FF FF FF FF FF FF 00 00 00 00 .
000000B4 00 00 00 08 00 00 00 80 00 00 01 00 .
000000C0 00 0C 10 00 00 00 10 00 00 00 01 8A .
000000CC 00 00 01 8A 00 00 00 00 00 00 00 05 .
000000D8 00 00 00 03 00 00 00 00 45 88 36 7F .E.6.
000000E4 00 00 00 04 FF FF FF FF FF FF FF FF .
000000F0 00 00 00 24 00 09 63 18 00 00 00 00 ...$..c.....
000000FC 00 00 00 00 00 00 00 00 00 00 00 00 .
00000108 00 00 00 00 00 00 00 00 00 00 00 00 .
00000114 00 00 00 00 00 00 00 00 00 00 00 00 .
00000120 00 00 00 00 00 00 00 00 00 00 00 00 .
0000012C 00 00 00 00 00 00 00 00 00 00 00 00 .
00000138 00 00 00 00 00 00 00 00 00 00 00 00 .
00000144 00 00 00 00 00 00 00 00 00 00 00 00 .
00000150 00 00 00 00 00 00 00 00 00 00 00 00 .
0000015C 00 00 00 00 00 00 00 00 00 00 00 00 .
00000168 00 00 00 00 00 00 00 00 00 00 00 00 .
#第一列是16进制位置,不是数据,只是方便你定位当前位置的。
#第二列是16进制的原始数据,8块为一组,俩俩分隔。
#第三列是asci预览
--- md0 --0x0/0x746F2B00000-
_____^当前设备
__________________^当前位置
_________________________^总共位置(16进制格式,总共有746F2B00000(hex)个块=8,001,300,725,760(dec)个块)
dd命令
dd命令的常用操作[3]
#将/dev/sdb的4000787029472后的512块数据,输出到./sdb.4000787029472.hex文件
dd if=/dev/sdb of=./sdb.4000787029472.hex skip=4000787029472 bs=1 count=512
#从/dev/sdb设备中的4000787029472后的512块读取数据,输出到/dev/sdc设备的4000787029472块后面。
dd if=/dev/sdb of=/dev/sdc skip=4000787029472 seek=4000787029472 bs=1 count=512
if 输入文件
of 输出文件
skip 跳过输入文件开头多少个块读取
seek 跳过输出文件开头多少个块写入
ibs 指定输入一次读多少块
obs 指定输出一次写多少块
bs 同时设定输入输出的块数量
count 指定处理多少次
mdadm命令
阵列磁盘的管理工具,以下是常用操作[4]
#查看阵列数组设备的信息
mdadm -E /dev/sdc1
/dev/sdc1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 58515956:8395cd1e:1639cd5c:48c95066
Name : file-b85:0 (local to host file-b85)
Creation Time : Sat Dec 17 01:20:03 2022
Raid Level : raid0
Raid Devices : 2
Avail Dev Size : 7813770895 sectors (3.64 TiB 4.00 TB)
Data Offset : 264192 sectors
Super Offset : 8 sectors
Unused Space : before=264112 sectors, after=0 sectors
State : clean
Device UUID : 06ebcc0b:f4355e59:05d57d04:5863c5e5
Update Time : Sat Dec 17 01:20:03 2022
Bad Block Log : 512 entries available at offset 8 sectors
Checksum : 64869a09 - correct
Events : 0
Chunk Size : 512K
Device Role : Active device 1
Array State : AA ('A' == active, '.' == missing, 'R' == replacing)
#查看阵列信息
mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sat Dec 17 01:20:03 2022
Raid Level : raid0
Array Size : 7813770240 (7.28 TiB 8.00 TB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Sat Dec 17 01:20:03 2022
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Layout : -unknown-
Chunk Size : 512K
Consistency Policy : none
Name : file-b85:0 (local to host file-b85)
UUID : 58515956:8395cd1e:1639cd5c:48c95066
Events : 0
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
#停止阵列md0,此处只是停止,数组设备上的超级块还是存在的还能使用-A组件起来。
mdadm -S /dev/md0
#通过sdb1 sdc1组建阵列md0
mdadm -A --force /dev/md0 /dev/sdb1 /dev/sdc1
参考资料
RAID超级块wikiRAID 超级块格式 - Linux Raid Wiki
linux创建的数组存在哪里,linux – md数组定义来自哪里?_Li Lindsay的博客-CSDN博客
关于Raid0,Raid1,Raid5,Raid10的总结 - iVictor - 博客园
综合的raid常见修复解决方案。软件 RAID HOWTO:错误恢复
此处的修复方法是错误的,在raid阵列中不要使用fsck修复单个阵列设备。centos7–软raid中硬盘故障修复 - 走看看
CentOS 7 RAID磁盘阵列之RAID 0实战_Linux教程_Linux公社-Linux系统门户网站
linux操作系统故障处理-ext4文件系统超级块损坏修复 - 我的征途是星辰大海 - 博客园
坏道检测修复命令badblocks详解使用 badblocks 命令处理硬盘坏道 - LUG @ USTC ↩︎
16进制编辑器,用于编辑硬盘字节数据命令详解。hexedit详解_山羊哥-老宋的博客-CSDN博客_hexedit ↩︎
dd命令详解,原始的字节流传输工具Linux 下的dd命令使用详解(摘录) - 极客先锋 - 博客园 ↩︎
阵列命令mdadm详解mdadm命令详解_wm0615ht的博客-CSDN博客_mdadm ↩︎