使用现有文件系统重新创建 XFS 分区

使用现有文件系统重新创建 XFS 分区

我有一台 CentOS 服务器,有两个 RAID 阵列。一个是 OS 阵列,另一个是 DATA 阵列。长话短说,最近 OS 出了不少问题,不得不重新加载 CentOS(原先是 5.7,现在升级到 6.5)。现在 OS 部分一切正常。但是,我的 DATA 阵列出现了问题。

阵列显示为 /dev/sdb,但我以前有一个分区 (/dev/sdb1),所有数据都存储在其中。服务器不再看到 /dev/sdb1,所以我最好的猜测是分区表不知何故被搞乱了。当我在 parted 中打印时,它将分区类型列为循环:

NON-WORKING SERVER:
Model: Adaptec DATA (scsi)
Disk /dev/sdb: 59.9TB
Sector size (logical/physical): 512B/512B
Partition Table: loop

Number  Start  End     Size    File system  Flags
 1      0.00B  59.9TB  59.9TB  xfs

我有另一台服务器与该服务器完全重复,并且它在 parted 中正确显示,并且 /dev/sdb1 可见:

WORKING SERVER:
Model: Adaptec STORAGE (scsi)
Disk /dev/sdb: 59.9TB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      17.4kB  59.9TB  59.9TB  xfs          primary       

有什么方法可以修复分区而不破坏我的数据?我迫切需要保留数据,但似乎无法弄清楚是否有办法修复分区和/或为什么它会显示为循环。

感谢您的任何帮助!!

附加信息:

fdisk -l /dev/sdb:

Disk /dev/sdb: 59914.8 GB, 59914783293440 bytes
255 heads, 63 sectors/track, 7284224 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf0b62000

BLKIDD:

/dev/sda1: UUID="9de0d036-a86f-4557-8e09-a5ccd33c66be" TYPE="ext4" 
/dev/sda2: UUID="VYyo4L-lkdG-GivI-a6eM-pFfX-TOoV-E1LxcF" TYPE="LVM2_member" 
/dev/mapper/VolGroup-lv_root: UUID="18bbe93e-9b67-4343-8d71-71bd087ab145" TYPE="ext4" 
/dev/sdb: LABEL="Data" UUID="dfda2895-d1cd-4b3e-8453-e5c51c093260" TYPE="xfs" 
/dev/mapper/VolGroup-lv_swap: UUID="d71f193f-acd4-4aea-8d11-be2acd4575f3" TYPE="swap" 
/dev/mapper/VolGroup-lv_home: UUID="223b2be8-f9e9-4671-bc84-e5aa5f73b697" TYPE="ext4" 

parted /dev/sdb unit s 打印(非工作服务器):

Model: Adaptec DATA (scsi)
Disk /dev/sdb: 117021061120s
Sector size (logical/physical): 512B/512B
Partition Table: loop

Number  Start  End            Size           File system  Flags
 1      0s     117021061119s  117021061120s  xfs

parted /dev/sdb unit 打印 (工作服务器):

Model: Adaptec STORAGE (scsi)
Disk /dev/sdb: 117021061119s
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start  End            Size           File system  Name     Flags
 1      34s    117021061086s  117021061053s  xfs          primary       

答案1

因此,有人用新的、空的 XFS 文件系统覆盖了整个卷,而您的问题是您需要找到旧文件系统的超级块,因为超级块包含一个随机数,该随机数用于校验和计算以确定特定块是当前文件系统的一部分还是早期迭代的一部分(否则,新文件系统上的 fsck 会偶然发现旧数据)。

我的第一个方法是创建具有偏移的只读循环设备,然后看看是否可以安装它们:

标准偏移量为 1MB,因此请先尝试

losetup -r -o 1M /dev/loop0 /dev/sdb
mount -r /dev/loop0 /mnt

并检查这是否是您想要的文件系统。如果这不是正确的偏移量,您可以搜索,例如

d=`losetup -f`
for i in `seq 1 4096`
do
    until losetup -r -o ${i}k $d /dev/sdb
    do
        :
    done &&
    mount -r $d /mnt && break
    losetup -d $d
done

需要内部循环是因为在循环设备设置期间似乎存在竞争条件,有时会导致“设备或资源繁忙”。

在该循环结束时,您应该已经挂载了文件系统——验证它是否是您想要的,并且$i是否是分区的偏移量(以千字节为单位)。

然后,当您找到该分区后,您可以清除它前面的区域以摆脱错误的超级块,为该分区创建一个具有正确偏移量的新分区表,然后运行文件系统检查。

如果文件系统确实已被格式化,则可能会造成严重损坏,但偏移量至少应该可以使某些内容可恢复。

答案2

不可靠。

循环分区类型其实就是没有分区表。

分区表基本上告诉操作系统在创建文件系统时从哪里开始查找分区以及从哪里停止。因此,分区表没有什么神奇之处,如果您有正确的信息,只需将其写入相应的位置,您的磁盘应该就和……呃……新……一样好……好吧,您明白了……;)

以下是我要做的事情:

  1. 使用以下命令创建问题主机当前分区表的备份(尽管它是空的)dd if=/dev/sdb of=/root/sdb-parttable.bin bs=512 count=1
  2. 然后我会使用 fdisk 找出另一台服务器上的起始扇区和结束扇区,把它们放下来,
  3. 在问题服务器上使用 fdisk 创建一个新分区(无需执行任何其他操作!),使用第二台服务器的精确值。
  4. 将分区表写入磁盘
  5. 尝试挂载 /dev/sdb1
  6. 如果这不起作用,请使用dd if=/root/sdb-parttable.bin of=/dev/sdb bs=1 count=64 skip=446 seek=446恢复旧的分区表。

免责声明:这是一个有点棘手的操作。本答案中的信息旨在希望它有用,但不提供任何保证...如果您有任何方法可以在执行以下步骤之前以字节级别备份磁盘:这样做!

相关内容