zfs 镜像可以包含组合磁盘吗?

zfs 镜像可以包含组合磁盘吗?

我可以通过合并磁盘来创建单个 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 addcombinedraidz-0mirror1

尽管如此,备份完池子后,仔细研究手册页并注意-n一些命令上的标志。这样您就可以看到命令的效果,而无需对池进行任何实际操作。

针对您的解决方案的进一步证据按提议在手册页中找到zpool

虚拟设备不能嵌套,因此镜像或 raidz 虚拟设备只能包含文件或磁盘。不允许使用镜像的镜像(或其他组合)。

然而,如果您使用的是 FreeBSD,则可以使用gstripe连接disk3disk4创建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)确认md1md2每个都有 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

相关内容