我周围有大约 8 个硬盘驱动器,我的主 PC(运行 openSUSE Tumbleweed)中有足够的 SATA 端口来连接它们。有些驱动器已经使用了 5 年以上,大小从 384GB 到 2TB 不等。
我认为让所有存储空间闲置是一种耻辱,因此我想安装和使用它们,但显然不是作为单独的卷。我曾经使用较旧的磁盘运行 mdadm RAID5 和 RAID6 阵列,但在这种情况下,这会变得乏味(一个 8 驱动器阵列,每个磁盘 384GB,一个 7 驱动器阵列,与下一个更大的差异......并且很快)。所以我一直在寻找替代方案。
我还在 4 个相同的驱动器上运行 BTRFS RAID5 阵列有一段时间了,并根据我的经验(每年大约需要一次完整恢复,其中一些文件丢失......),并且事实是甚至开发人员似乎也不希望他们能够使其可靠地工作,而无需用户保持高度警惕让我怀疑 BTRFS 对于这样的异构阵列是否是一个明智的选择。
我听说过有关 ZFS 及其 RAIDZ 功能的神奇之处,它们能够容纳具有 3 个奇偶校验块的不同大小的驱动器,但到目前为止我能找到的大多数建议只涉及相同的驱动器,或者至少是大小相同的 RAID 分区。
我的首要任务既不是速度也不是访问时间,因为机器仅供我使用,硬盘驱动器吞吐量很少是一个问题。我的目的是在余生中相对舒适地使用这些硬盘上的空间,而不必担心偶尔的驱动器故障会导致我丢失数据或大量时间。我想要进行一些设置,可以将它们全部捆绑在一起,如果其中一个驱动器出现故障,我会将其删除并继续(或者如果我需要空间,则可以添加一个新驱动器)。
我不介意做一些额外的前期配置,只要我可以放心,除非驱动器损坏,否则它不需要我个人关注,并且如果/当驱动器损坏时它会通知我。覆盖 2 或 3 个驱动器故障会很好,但如果我可以使用一半的容量(即类似 RAID10),我也可以,只要我可以使用所有驱动器及其上的大部分空间。
- 这样的事情存在吗?
- 有什么选择?
- 有没有解释如何设置的操作方法?
答案1
实现您所寻求的目标的关键是将您的驱动器分组为总存储量相同或几乎相同的组,然后将每组物理驱动器连接成一个虚拟驱动器,该虚拟驱动器代表存储量的总和。该组中的驱动器可用的存储空间。
我将在 FreeBSD 中执行此操作,但我认为 Linux 中也存在类似的工具。这里手头的主要工具是gconcat(8)
。
让我们考虑一个场景:
- 五个 384G 驱动器(如
/dev/md0-md4
) - 四个 2T 驱动器(如
/dev/md5-md8
) - 两个 1T 驱动器(如
/dev/md9-md10
)
使用gconcat
我们可以将这些驱动器连接成五组:
- 四组2T+384G
- 1T+1T+384G一套
然后,我们将拥有 5 个大小相似的虚拟串联磁盘,并可以根据这些磁盘构建我们的池。为了节省空间,我实际上会将这些大小降低 2^10 倍,但概念保持不变。所以我将使用 5 个 384M 的驱动器、4 个 2G 的驱动器和 2 个 1G 的驱动器。
首先,考虑到/dev/md*
上面概述的设备(可能/dev/sd*
与 Linux 中的物理磁盘类似),我们可以将这些物理磁盘连接成五个虚拟磁盘,我们将命名这些虚拟磁盘vdisk0-vdisk4
:
# gconcat create -v vdisk0 md0 md5
# gconcat create -v vdisk1 md1 md6
# gconcat create -v vdisk2 md2 md7
# gconcat create -v vdisk3 md3 md8
# gconcat create -v vdisk4 md4 md9 md10
在 FreeBSD 中,这些串联的磁盘显示为 devices /dev/concat/vdisk0-vdisk4
。与围绕磁盘设备操作构建的许多 FreeBSD 命令一样,/dev/
可以理解并在gconcat status
.同样,为了方便起见GEOM
,引用条目的基于 - 的命令/dev/
可以省略前导/dev/
。
# gconcat status
Name Status Components
concat/vdisk0 UP md0
md5
concat/vdisk1 UP md1
md6
concat/vdisk2 UP md2
md7
concat/vdisk3 UP md3
md8
concat/vdisk4 UP md4
md9
md10
我们还可以验证每个串联磁盘的介质大小是否相似(或者在本例中是相同的):
# gconcat list | grep -A2 ^Prov
Providers:
1. Name: concat/vdisk0
Mediasize: 2550136832 (2.4G)
--
Providers:
1. Name: concat/vdisk1
Mediasize: 2550136832 (2.4G)
--
Providers:
1. Name: concat/vdisk2
Mediasize: 2550136832 (2.4G)
--
Providers:
1. Name: concat/vdisk3
Mediasize: 2550136832 (2.4G)
--
Providers:
1. Name: concat/vdisk4
Mediasize: 2550136832 (2.4G)
所以!我们现在有五个 2.4G 设备,可以从中创建一个 ZFS 池。让我们创建一个双奇偶校验 RAIDZ2 池,但将其安装点设置为none
:
# zpool create -m none tank raidz2 concat/vdisk{0..4}
# zpool status tank
pool: tank
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
concat/vdisk0 ONLINE 0 0 0
concat/vdisk1 ONLINE 0 0 0
concat/vdisk2 ONLINE 0 0 0
concat/vdisk3 ONLINE 0 0 0
concat/vdisk4 ONLINE 0 0 0
errors: No known data errors
# zfs list tank
NAME USED AVAIL REFER MOUNTPOINT
tank 179K 6.64G 39.3K none
量子ED。
总之,关键概念是将驱动器分组为总存储量尽可能接近相同的组,因为最小的驱动器组将限制池的 VDEV 大小。对物理驱动器进行最佳分组后,将每组驱动器连接到一个代表该组组合存储的虚拟磁盘中。最后,从虚拟串联驱动器构建您的 ZPOOL。
如果驱动器出现故障怎么办?
如果发生驱动器故障(让我们/dev/concat/vdisk2
作为示例),只需销毁物理驱动器发生故障的串联虚拟磁盘,更换故障驱动器,重新创建虚拟磁盘,然后将池重新同步到虚拟磁盘上。串联磁盘。
# zpool status tank
pool: tank
state: DEGRADED
status: One or more devices has been removed by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using zpool online' or replace the device with
'zpool replace'.
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
concat/vdisk0 ONLINE 0 0 0
concat/vdisk1 ONLINE 0 0 0
concat/vdisk2 REMOVED 0 0 0
concat/vdisk3 ONLINE 0 0 0
concat/vdisk4 ONLINE 0 0 0
errors: No known data errors
既然vdisk2
失败了,我们就销毁它:
# gconcat destroy vdisk2
接下来,我们更换包含 的故障驱动器concat/vdisk2
。如果必须使用备用驱动器大小,请确保新驱动器vdisk2
不小于池中最小的虚拟磁盘,否则 ZFS 将不允许您使用池中的该磁盘。
将故障驱动器更换为合适的替换驱动器后,重新连接这些物理驱动器以创建新驱动器vdisk2
:
# gconcat create vdisk2 md2 md7
# zpool online tank concat/vdisk2
# zpool status tank
pool: tank
state: ONLINE
scan: resilvered 7.50K in 00:00:01 with 0 errors on Wed Sep 22 11:26:55 2021
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
concat/vdisk0 ONLINE 0 0 0
concat/vdisk1 ONLINE 0 0 0
concat/vdisk2 ONLINE 0 0 0
concat/vdisk3 ONLINE 0 0 0
concat/vdisk4 ONLINE 0 0 0
errors: No known data errors