我正在 FreeBSD 机器上创建 zpools。在创建 zpools 时,我观察到以下两种情况:
如果我接受
raw disks
并创建zpool
,那么我就能形成 zpools,而且它们运行良好。gpart
如果我使用格式来格式化磁盘freebsd-zfs
,然后创建 zpool,那么它们也能完美运行。
我感到困惑的是,哪种方法更适合创建 zpools?
答案1
如果可能,最好使用 ZFS 的整个磁盘。
您的用例无需分区。
答案2
每个物理磁盘使用一个专门用于 ZFS 的切片/分区,并留出一些未分区的空间。这样,如果您需要更换驱动器,并且更换的扇区小 10 个,您仍然可以这样做(http://www.freebsddiary.org/zfs-with-gpart.php)。
这就是 Solaris 自动执行的操作,也是 FreeNAS 执行的操作(https://forums.freenas.org/index.php?threads/zfs-on-partitioned-disks.37079/) 当您为 ZoL 提供整个磁盘时,它就会执行此操作(它会对其进行分区)...
将分区上的位置转换为实际设备上的位置的开销可以忽略不计。因此,一旦分区与物理扇区边界正确对齐,它的行为就不会与整个块设备不同。
使用 ZoL,我知道的唯一区别是 ZoL 会在将noop
整个磁盘分配给 vdev 时切换磁盘调度程序。没有什么可以阻止您手动设置它。
但有些建议是不能的...不要为每个磁盘创建更多 ZFS 分区,如果您决定忽略上述建议,切勿在同一个 zpool 中从它们构建 vdev。这基本上会破坏性能,因为 ZFS 会在 vdev 之间切分数据,而连续的 iops 将变成寻道噩梦...
答案3
人们声称您需要使用整个磁盘才能获得磁盘写入缓存优势,但事实并非如此。事实是,如果您将整个磁盘提供给 ZFS,ZFS 将尝试为您启用磁盘写入缓存。但是,即使您只给它一个分区,也没有人阻止您自己启用磁盘写入缓存,在这种情况下,ZFS 会检测到这种情况并完全遵守它,就像它自己启用了缓存一样。因此,使用整个磁盘获得写入缓存优势并不是必需的,它只是为您节省了自己启用磁盘写入缓存的工作。
人们还声称,如果将整个磁盘分配给它,磁盘访问速度会更快。虽然这种说法在技术上是正确的,但速度差异非常小,完全可以忽略不计。如果您的 ZFS 设置太慢,那么如果您只使用整个磁盘,它仍然会太慢。如果它在整个磁盘上运行良好,那么它在单个分区上运行同样好。
不使用整个磁盘的一个原因是磁盘大小确实会有所不同。想象一下以下情况:您使用 3 个相同的磁盘创建一个 RAIDZ,每个磁盘都是 4 TB,并且您始终使用整个磁盘。3 年后,其中一个磁盘出现故障。没问题,您只需购买一个替换件,但与此同时,该磁盘具有新的硬件修订版,新的 4 TB 型号仅小了 256 KB。它无法工作!您不能使用它作为替换件,因为它必须具有与您的其他两个磁盘完全相同的大小,甚至更大。如果它更小,无论字节数有多少,它都无法工作。
这就是为什么我总是创建一个分区并留下大约 10 MB 的磁盘空间未使用。每个磁盘损失 10 MB 几乎不算什么(对于 4 TB 磁盘,损失 0.00025%),这意味着替换磁盘最多可以小 10 MB,并且仍然可以工作(或者最多有 10 MB 的坏扇区等)。
答案4
我脑子里出现这个问题是因为我怀疑如果我晚点能指定,那个磁盘上有什么...所以当你在整个驱动器上创建池时(是的,如果需要,使用 -f 选项),zpool 实际上会创建 gpt 分区表和 Solaris 分区,如下所示:
(fdisk -l ...)
...
Disklabel type: gpt
Disk identifier: 4CBE587E-23AF-8E4B-A7F0-B44AD6083171
Device Start End Sectors Size Type
/dev/sdd1 2048 3907010559 3907008512 1,8T Solaris /usr & Apple ZFS
/dev/sdd9 3907010560 3907026943 16384 8M Solaris reserved 1
所以真的没有必要手动创建分区...