创建 zfs 池,允许用稍小的磁盘替换其中一个磁盘

创建 zfs 池,允许用稍小的磁盘替换其中一个磁盘

这是关于 Linux(CentOS 7)上 zfs 的问题。我有一个非常简单的设置,有两个 8 TB 磁盘,一个磁盘镜像另一个磁盘。

zpool create -f -o ashift=12 $zpoolName 镜像 $disksById

根据 zpool 手册页,如果需要更换其中一个磁盘,则替换磁盘的大小必须等于或大于配置中两个磁盘中最小的一个。据我所知,不同品牌和型号(以及型号修订版)的驱动器的确切大小通常会略有不同,即使它们都标记为 8 TB。但是,我希望能够用任何其他 8 TB 磁盘替换它,不一定是同一品牌和型号。

我如何实现这个目标?

我本来希望 zpool create 命令有一个选项,这样就不会将整个磁盘用于池,而是留下一些空闲空间,但是我找不到这样的选项。我看到的唯一建议是在创建池之前对磁盘进行分区,创建一个“池”分区和一个“空闲”分区,但我读到这会影响磁盘性能,因为 zfs 无法正确使用磁盘缓存,所以我想我应该避免这种情况。

答案1

我看到的唯一建议是在创建池之前对磁盘进行分区,创建一个“池”分区和一个“松弛”分区

这是正确答案。

但我读过这会影响磁盘性能,因为 zfs 无法正确使用磁盘缓存。

这是一个误解。使用分区而不是完整磁盘只会在分区未对齐的情况下影响性能,如果您使用的是现代分区编辑器,这通常需要用户做出一些真正的决定。Linux 和 BSD fdisk、sfdisk 和 gparted 都了解分区边界并在其中工作,除非完全被迫不这样做。

此外,如果你仔细观察整个馈送到 zfs 的磁盘,你会注意到文件系统实际上已经对它本身进行了分区。例如:

root@banshee:~# zpool status data
  pool: data
 state: ONLINE
  scan: scrub repaired 0 in 27h54m with 0 errors on Mon Mar 13 05:18:20 2017
config:

    NAME                                           STATE     READ WRITE CKSUM
    data                                           ONLINE       0     0     0
      mirror-0                                     ONLINE       0     0     0
        wwn-0x50014ee206fd9549  ONLINE       0     0     0
        wwn-0x50014ee2afb368a9    ONLINE       0     0     0
      mirror-1                                     ONLINE       0     0     0
        wwn-0x50014ee25d2510d4  ONLINE       0     0     0
        wwn-0x5001517bb29d5333  ONLINE       0     0     0

errors: No known data errors

root@banshee:~# ls -l /dev/disk/by-id | grep 510d4
lrwxrwxrwx 1 root root  9 Mar 22 15:57 wwn-0x50014ee25d2510d4 -> ../../sdd
lrwxrwxrwx 1 root root 10 Mar 22 15:57 wwn-0x50014ee25d2510d4-part1 -> ../../sdd1
lrwxrwxrwx 1 root root 10 Mar 22 15:57 wwn-0x50014ee25d2510d4-part9 -> ../../sdd9

如您所见,ZFS 已对池中的原始磁盘进行了分区。池使用分区 1;分区 9 留空。

root@banshee:~# sfdisk -d /dev/sdd
label: gpt
label-id: B2DED677-DB67-974C-80A6-070B72EB8CFB
device: /dev/sdd
unit: sectors
first-lba: 34
last-lba: 3907029134

/dev/sdd1 : start=        2048, size=  3907010560, type=6A898CC3-1DD2-11B2-99A6-080020736631, uuid=A570D0A4-EA32-F64F-80D8-7479D918924B, name="zfs"
/dev/sdd9 : start=  3907012608, size=       16384, type=6A945A3B-1DD2-11B2-99A6-080020736631, uuid=85D0957B-65AF-6B4A-9F1B-F902FE539170

sdd9长度为 16384 个扇区。这是一个 4K 磁盘,因此大小为 64M,如果现有磁盘发生故障,任何比现有磁盘小不超过 63M 左右的磁盘都可以作为其替代品。

答案2

我看到的唯一建议是在创建池之前对磁盘进行分区

这确实是处理该问题的唯一方法。您不必创建第二个小分区,该空间可以保持未分区状态。由于磁盘之间的差异通常很小,因此您只会丢失几兆字节,这对于 8TB 磁盘来说不是问题。

另一种方法是只购买完全相同型号的磁盘(通常不建议这样做,因为制造过程中的一系列故障只会影响一个型号);或者从最小的磁盘开始,然后换成更大的磁盘,但这会让您损失更多的空间,并且一段时间后可能无法实现。

相关内容