我可以通过合并磁盘来创建单个 zfs 镜像吗?
mypool
mirror1
disk1 (2TB)
disk2 (2TB)
combined
disk3 (1TB)
disk4 (1TB)
换句话说,磁盘3 和磁盘4 应该包含与磁盘3+磁盘4 组合相同的数据。
这可能吗?或者类似的事情可能吗?如果是这样,那么从我当前的配置中获取命令的命令是什么:
mypool
mirror1
disk1 (2TB)
disk2 (2TB)
上述配置?
答案1
抱歉,不,我认为你不能。
但如果你热衷于尝试,首先
备份你的泳池!
这篇文章是一项学术练习,旨在为您提供想法,但不保证它在现实世界中有效,并且明确警告您不要因根据这些建议采取的行动而导致数据丢失。
我确实知道zpool
会警告您不要混合镜像和 raidz vdev。例如,请参阅-f
的标志。您提议的 vdev本质上是一个“ ”或串联的 vdev,而显然是一个镜像。zpool add
combined
raidz-0
mirror1
尽管如此,备份完池子后,仔细研究手册页并注意-n
一些命令上的标志。这样您就可以看到命令的效果,而无需对池进行任何实际操作。
针对您的解决方案的进一步证据按提议在手册页中找到zpool
:
虚拟设备不能嵌套,因此镜像或 raidz 虚拟设备只能包含文件或磁盘。不允许使用镜像的镜像(或其他组合)。
然而,如果您使用的是 FreeBSD,则可以使用gstripe
连接disk3
并disk4
创建combined
设备。然后,您可以将该设备添加到镜像中,因为 ZFS 会将其视为另一个磁盘。
以下是关于如何进行实验的建议,假设您在 FreeBSD 上运行 ZFS。我们将使用 2GB 而不是 TB 的模拟驱动器,但除此之外……
# mkdir zfs-test; cd zfs-test
# truncate -s 2G drive1; truncate -s 2G drive2
# truncate -s 1G drive3; truncate -s 1G drive4
创建与驱动器[1-4]文件对应的伪设备md1到md4:
# for N in $(jot 4); do mdconfig -u $N -t vnode -f drive$N; done
# mdconfig -lv
md1 vnode 2048M /home/jim/zfs-test/drive1
md2 vnode 2048M /home/jim/zfs-test/drive2
md3 vnode 1024M /home/jim/zfs-test/drive3
md4 vnode 1024M /home/jim/zfs-test/drive4
您现有的镜像创建起来很简单:
# zpool create mypool mirror md1 md2
# zpool status mypool
pool: mypool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
md1 ONLINE 0 0 0
md2 ONLINE 0 0 0
errors: No known data errors
zpool
这就是你目前被困住的地方。有了这个沙箱,你现在可以使用's标志尝试各种命令-n
,但我认为除了这个之外,没有什么能起作用:
# gstripe label -h combined md3 md4
# gstripe status
Name Status Components
stripe/combined UP md3
md4
# zpool attach mypool md2 stripe/combined
cannot attach stripe/combined to md2: device is too small
如果你的 2TB 硬盘确切地使 1TB 硬盘的大小翻倍。连接两个 1TB 硬盘时会略微损失空间,导致combined
硬盘比两个原生 2TB 硬盘略小。 diskinfo(8)
确认md1
和md2
每个都有 4194304 个扇区,但stripe/combined
比 4194048 个扇区小 256 个扇区:
# diskinfo -v md1 md2 stripe/combined
md1
512 # sectorsize
2147483648 # mediasize in bytes (2.0G)
4194304 # mediasize in sectors
0 # stripesize
0 # stripeoffset
MD-DEV5473951480393710199-INO24 # Disk ident.
Yes # TRIM/UNMAP support
Unknown # Rotation rate in RPM
md2
512 # sectorsize
2147483648 # mediasize in bytes (2.0G)
4194304 # mediasize in sectors
0 # stripesize
0 # stripeoffset
MD-DEV5473951480393710199-INO24 # Disk ident.
Yes # TRIM/UNMAP support
Unknown # Rotation rate in RPM
stripe/combined
512 # sectorsize
2147352576 # mediasize in bytes (2.0G)
4194048 # mediasize in sectors
65536 # stripesize
0 # stripeoffset
No # TRIM/UNMAP support
Unknown # Rotation rate in RPM
但在我的游戏沙箱中,我可以解决这个问题。
首先,我将删除combined
条带及其组成伪设备 /dev/md3 和 /dev/md4:
# gstripe destroy combined
# mdconfig -d -u3; mdconfig -d -u4
# mdconfig -lv
md1 vnode 2048M /home/jim/zfs-test/drive1
md2 vnode 2048M /home/jim/zfs-test/drive2
现在我可以重新创建 disk3 和 disk4,使它们每个都略大于 1GB,重新创建 /dev/md3 和 md4 设备,将它们条带化在一起以创建 /dev/stripe/combined 设备,然后将该设备附加到镜像:
# truncate -s 1025M drive3
# truncate -s 1025M drive4
# mdconfig -u3 -t vnode -f drive3
# mdconfig -u4 -t vnode -f drive4
# gstripe label -h combined md3 md4
# zpool attach mypool md2 stripe/combined
# zpool status mypool
pool: mypool
state: ONLINE
scan: resilvered 81.5K in 0 days 00:00:04 with 0 errors on Thu May 23 15:27:26 2019
config:
NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
md1 ONLINE 0 0 0
md2 ONLINE 0 0 0
stripe/combined ONLINE 0 0 0
errors: No known data errors