raid-xfs硬盘修复笔记

raid-xfs硬盘修复笔记

raid-xfs硬盘修复笔记

正确步骤

查看内核日志

  1. 使用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

检查硬盘

  1. 使用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

扫描坏道

  1. 使用badblocks /dev/sdc -s -b4096 -o badblcok.log扫描坏道[1]

    此过程较长,可以使用nohup至后台。

    出现较少坏道可以使用下述方法修复,如果很多推荐尽早备份更换硬盘。

    image-20221221113709734

-s	显示进度
-b	指定扫描的块大小
-o	输出到指定文件
#---以下不推荐使用
#利用硬盘的重分配特性修复坏道,此处对于阵列卡不推荐使用。单盘可以使用,但是使用写入测试模式可能会造成数据损失,推荐使用fsck修复。
# badblocks -w /dev/sdc -s -b4096 end start
-w	使用写入测试模式修复坏道
end start	结束及起始块位置,可以在上述badblcok.log中看到。

修复坏道

  1. 使用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博客

恢复 mdadm 超级块

mdadm - 如何恢复突袭? 安装:无法读取超级块

[已解决] Mdadm 缺少超级块

关于Raid0,Raid1,Raid5,Raid10的总结 - iVictor - 博客园

综合的raid常见修复解决方案。软件 RAID HOWTO:错误恢复

此处的修复方法是错误的,在raid阵列中不要使用fsck修复单个阵列设备。centos7–软raid中硬盘故障修复 - 走看看

CentOS 7 RAID磁盘阵列之RAID 0实战_Linux教程_Linux公社-Linux系统门户网站

lost+found目录有啥用? - 开发者博客

linux操作系统故障处理-ext4文件系统超级块损坏修复 - 我的征途是星辰大海 - 博客园


  1. 坏道检测修复命令badblocks详解使用 badblocks 命令处理硬盘坏道 - LUG @ USTC ↩︎

  2. 16进制编辑器,用于编辑硬盘字节数据命令详解。hexedit详解_山羊哥-老宋的博客-CSDN博客_hexedit ↩︎

  3. dd命令详解,原始的字节流传输工具Linux 下的dd命令使用详解(摘录) - 极客先锋 - 博客园 ↩︎

  4. 阵列命令mdadm详解mdadm命令详解_wm0615ht的博客-CSDN博客_mdadm ↩︎

# Linux  Raid  XFS  Disk 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×