我有一台 NAS,配备 4TB HDD,有 2 个分区:一个交换分区,另一个 ZFS 分区。第二个分区已从 NAS 中消失,并且未在 blkid 或 /dev/* 中列出。gparted 将该分区识别为 /dev/sdb2,但它没有 UUID,因此 zpool 无法导入它。
我尝试将 HDD 的起始位置克隆到较小的硬盘上(dd 复制前 40GB,sgdisk 复制分区表)。第二个分区现在显示在 /dev/sdc2 下,并且具有 UUID(预期的 UUID),但没有 PARTUUID。zpool import 现在可以识别第二个克隆的驱动器,但当我尝试导入它时,它会抛出 I/O 错误。
zdb -l /dev/sdc2 显示“路径:/dev/gptid/db7d4921-d920-1le4-9dd6-00138f6f9938”,这应该是分区 PARTUUID,但 blkid 没有在 /dev/sdc2 上显示 PARTUUID。
有什么方法可以将第一个驱动器的分区的 UUID / PARTUUID 设置为预期的吗?
答案1
gdisk
您可以使用和来查看和操作 GUID(许多 Linux 工具称之为“PARTUUID”)sgdisk
。例如:
$ sudo sgdisk -i 1 /dev/sde
Partition GUID code: C12A7328-F81F-11D2-BA4B-00A0C93EC93B (EFI System)
Partition unique GUID: C697EE49-9430-46C5-B090-0423DA7A6FFF
First sector: 40 (at 20.0 KiB)
Last sector: 409639 (at 200.0 MiB)
Partition size: 409600 sectors (200.0 MiB)
Attribute flags: 0000000000000000
Partition name: 'EFI System Partition'
此示例显示分区的 GUID ( Partition unique GUID
) 为 C697EE49-9430-46C5-B090-0423DA7A6FFF。i
中的选项gdisk
显示相同的信息。您可以使用 的选项将其设置为特定值sgdisk
,-u
如下所示:
$ sudo sgdisk -u 1:BB193EE0-3544-449A-935A-41B215819992 /dev/sde
GUID前面是分区号。您可以使用专家菜单上的选项1:
执行相同的操作。gdisk
c
答案2
尝试 import -a。如果失败,请检查您的缓存文件。
如果有的话,请检查您的 zpool.cache 文件,您可能能够在其中辨认出一些文本,看看它是否包含有关您的池的信息。在此给予希望。
现在,看看它是否有每个驱动器的设备信息,这可以帮助您寻找驱动器。
检查您的分区表,确保它们良好,使用
fdisk -l
和或gdisk
。
如果您使用设备名称导入驱动器,我甚至看到设备字母在重新启动时根据某些配置更改(或不更改?)切换。例如,/dev/sda
可能会变为/dev/sdb
,反之亦然。如果其中一个驱动器不同,这将杀死整个阵列,直到启动顺序更改回来,或者在 zfs 配置中交换字母(出于这个原因,使用设备名称创建池可能不是个好主意,例如/dev/sda
出于这个原因)。
您可以做的一件事是备份分区表,特别是当它们表明分区表损坏时。您可以使用 testdisk,或允许 gdisk 恢复分区,方法是让它选择它认为正确的分区。
通过恢复/更新分区表,您的 zpool.cache 将再次识别您的阵列,然后能够再次重新导入它,在重新启动更新分区表后,您只需以正确的方式导入zpool import <poolname>
建议1:
(对于未来的人)如果您有一个数据集,永远不要假设数据处于危险之中,直到您可以使池重新在线并可以运行清理。
ZFS 是一种极其强大的文件系统。在最坏的情况下,您可以使用 zfs 的开发模式,并禁用导入检查,以便在某些情况下导入您的池。
建议2:
(面向未来用户)创建池时,导入时尽量使用 disk-by-id。/dev/disk/by-id/
您也可以使用/dev/disk/by-partuuid/
或/dev/disk/by-uuid/