我可以透過組合磁碟來建立單一 zfs 鏡像嗎?
mypool
mirror1
disk1 (2TB)
disk2 (2TB)
combined
disk3 (1TB)
disk4 (1TB)
換句話說,disk3 和disk4 應該包含與disk3+disk4 組合相同的資料。
這可能嗎?或者類似的事情可能嗎?如果是這樣,哪些命令可以讓我擺脫目前的配置:
mypool
mirror1
disk1 (2TB)
disk2 (2TB)
到上面的配置?
答案1
抱歉,但不,我認為你不能。
但如果你熱衷於嘗試,首先
備份您的池子!
這篇文章是一項學術練習,旨在為您提供想法,不保證它在現實世界中有效,並且明確警告您不要因根據這些建議採取的操作而導致數據丟失。
我確實知道這zpool
會警告您不要混合鏡像和 raidz vdev。例如,參見-f
旗幟。zpool add
您建議的 vdevcombined
本質上是一個「raidz-0
」或串聯的 vdev,而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
建立對應drive[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
小了 256 個扇區,只有 4194048 個扇區:
# 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
條帶及其元件 psuedo-devices /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