我的 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
从原始数据中推导出分区表。