尝试将分区表复制到替换 RAID1 磁盘,但源分区表现在为空

尝试将分区表复制到替换 RAID1 磁盘,但源分区表现在为空

我的 RAID1 阵列中的一个磁盘 (/dev/sda) 显示出最终故障的迹象,因此我失败了,然后将其从阵列中删除。

然后,我更换了磁盘,重新启动,并开始复制分区的过程,以便将磁盘添加到阵列中,但是出了问题。

我使用的最终命令是:

sgdisk -R /dev/sdb /dev/sda

现在 lsblk 显示 /dev/sdb 的正确分区:

[root@server /]# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
nvme0n1     259:1    0   477G  0 disk  
├─nvme0n1p3 259:4    0   7.8G  0 part  
│ └─md3       9:3    0   7.8G  0 raid1 /tmp
├─nvme0n1p1 259:2    0   511M  0 part  /boot/efi
├─nvme0n1p4 259:5    0   7.8G  0 part  [SWAP]
└─nvme0n1p2 259:3    0 460.8G  0 part  
  └─md2       9:2    0 460.8G  0 raid1 /
sdb           8:16   0   3.7T  0 disk  
└─sdb1        8:17   0   3.7T  0 part  
  └─md4       9:4    0   3.7T  0 raid1 /var
nvme1n1     259:0    0   477G  0 disk  
├─nvme1n1p4 259:9    0   7.8G  0 part  [SWAP]
├─nvme1n1p2 259:7    0 460.8G  0 part  
│ └─md2       9:2    0 460.8G  0 raid1 /
├─nvme1n1p3 259:8    0   7.8G  0 part  
│ └─md3       9:3    0   7.8G  0 raid1 /tmp
└─nvme1n1p1 259:6    0   511M  0 part  
sda           8:0    0   3.7T  0 disk  

然而,当我运行时, sda 并没有显示相同的结果,甚至更糟:

sgdisk -p /dev/sdb

它没有显示分区表,与 /dev/sda 相同:

[root@server dev]# sgdisk -p /dev/sdb
Disk /dev/sdb: 7814037168 sectors, 3.6 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): 34DA93D9-0A46-433D-BDE3-6AF2566E2183
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 7814037134
Partitions will be aligned on 2048-sector boundaries
Total free space is 7814037101 sectors (3.6 TiB)

Number  Start (sector)    End (sector)  Size       Code  Name
[root@server dev]# sgdisk -p /dev/sda
Disk /dev/sda: 7814037168 sectors, 3.6 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): EBADBC60-3D20-48F7-880B-5CCF1B645A44
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 7814037134
Partitions will be aligned on 2048-sector boundaries
Total free space is 7814037101 sectors (3.6 TiB)

Number  Start (sector)    End (sector)  Size       Code  Name
[root@server dev]# 

当我运行partprobe时,它给了我以下错误:

[root@server dev]# partprobe
Error: Partition(s) 1 on /dev/sdb have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.  As a result, the old partition(s) will remain in use.  You should reboot now before making further changes.

现在我不是最有经验的 Linux 管理员(显然),但我猜测我实际上没有将 /dev/sdb 复制到 /dev/sda,而是相反并清除了 /dev/sdb 的分区表。

值得庆幸的是,我没有重新启动机器,因此系统处于活动状态并且正在运行,我希望有某种方法可以恢复工作分区表?

现在最大的不幸是这是一个生产服务器,它长时间停机/离线将是相当毁灭性的。所以我希望有人能指导我让这一切恢复正常。

我不确定还可以在这里分享什么来获得帮助,所以请随时要求我发布任何结果。

提前致谢。

答案1

如果内核仍然知道正确的分区表,您可以像这样查询分区起始偏移量和大小:

# partition start offsets
head /sys/block/sdf/sdf*/start

# partition sizes
head /sys/block/sdf/sdf*/size

示例输出:

$ head /sys/block/sdf/sdf*/start
==> /sys/block/sdf/sdf1/start <==
2048

==> /sys/block/sdf/sdf2/start <==
4198400

==> /sys/block/sdf/sdf3/start <==
8394752

==> /sys/block/sdf/sdf4/start <==
64

$ head /sys/block/sdf/sdf*/size
==> /sys/block/sdf/sdf1/size <==
4194304

==> /sys/block/sdf/sdf2/size <==
4194304

==> /sys/block/sdf/sdf3/size <==
52166656

==> /sys/block/sdf/sdf4/size <==
1984

它看起来像parted

# parted /dev/sdf unit s print
Model:  Patriot Memory (scsi)
Disk /dev/sdf: 60566016s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: pmbr_boot

Number  Start     End        Size       File system  Name     Flags
 4      64s       2047s      1984s                   grub     bios_grub
 1      2048s     4196351s   4194304s   fat32        freedos  msftdata
 2      4198400s  8392703s   4194304s   ext2         boot     lvm
 3      8394752s  60561407s  52166656s  ext2         iso      lvm

这样,您可以轻松地以正确的偏移量重新创建分区。

如果有任何特殊的分区标志(bios_grub、boot、esp...),则必须手动提供它们,但在您的情况下,它似乎位于 SSD 上,而 HDD 只有一个简单的数据分区,因此少了一件事情担心。

由于您/dev/sdb只有一个分区/dev/sdb1,因此它很可能会从 1 MiB 开始并扩展到磁盘的整个大小。因此,重新创建该分区再简单不过了。不过,仔细检查一下还是有好处的。

或者,您可以testdisk从原始数据中推导出分区表。

相关内容