为了让服务器更加节能,同时提升一些随机读写性能,希望将ZFS中2TB 3.5英寸的 机械硬盘更换成1TB的固态硬盘。直接用replace命令是不行的,只能曲线更换。

首先构造一个测试卷

hzy@hzy-VirtualBox:~$ fallocate -l 500M big-1
hzy@hzy-VirtualBox:~$ fallocate -l 500M big-2
hzy@hzy-VirtualBox:~$ sudo zpool create vault mirror ~/big-1 ~/big-2
hzy@hzy-VirtualBox:~$ zpool status
  pool: vault
 state: ONLINE
  scan: none requested
config:

        NAME                 STATE     READ WRITE CKSUM
        vault                ONLINE       0     0     0
          mirror-0           ONLINE       0     0     0
            /home/hzy/big-1  ONLINE       0     0     0
            /home/hzy/big-2  ONLINE       0     0     0

errors: No known data errors
hzy@hzy-VirtualBox:~$ sudo sh -c 'echo hello world > /vault/note'
hzy@hzy-VirtualBox:~$ cat /vault/note
hello world
hzy@hzy-VirtualBox:~$ zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
vault   480M   114K   480M        -         -     0%     0%  1.00x    ONLINE  -

然后构造第二个vdev

hzy@hzy-VirtualBox:~$ fallocate -l 300M small-1
hzy@hzy-VirtualBox:~$ fallocate -l 300M small-2
hzy@hzy-VirtualBox:~$ sudo zpool add vault mirror ~/small-1 ~/small-2
hzy@hzy-VirtualBox:~$ zpool status
  pool: vault
 state: ONLINE
  scan: none requested
config:

        NAME                   STATE     READ WRITE CKSUM
        vault                  ONLINE       0     0     0
          mirror-0             ONLINE       0     0     0
            /home/hzy/big-1    ONLINE       0     0     0
            /home/hzy/big-2    ONLINE       0     0     0
          mirror-1             ONLINE       0     0     0
            /home/hzy/small-1  ONLINE       0     0     0
            /home/hzy/small-2  ONLINE       0     0     0

errors: No known data errors
hzy@hzy-VirtualBox:~$ zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
vault   768M   132K   768M        -         -     0%     0%  1.00x    ONLINE  -

尝试删除第一个vdev

hzy@hzy-VirtualBox:~$ sudo zpool remove vault mirror-0
hzy@hzy-VirtualBox:~$ zpool status
  pool: vault
 state: ONLINE
  scan: none requested
remove: Removal of vdev 0 copied 112K in 0h0m, completed on Tue Jan 18 15:17:54 2022
    216 memory used for removed device mappings
config:

        NAME                   STATE     READ WRITE CKSUM
        vault                  ONLINE       0     0     0
          mirror-1             ONLINE       0     0     0
            /home/hzy/small-1  ONLINE       0     0     0
            /home/hzy/small-2  ONLINE       0     0     0

errors: No known data errors
hzy@hzy-VirtualBox:~$ zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
vault   288M   194K   288M        -         -     0%     0%  1.00x    ONLINE  -
hzy@hzy-VirtualBox:~$ cat /vault/note
hello world

因此总的来说

POOL=vault
OLD_VDEV=mirror-0
NEW_DEVS="/dev/dummy1 /dev/dummy2"

zpool add $POOL mirror $NEW_DEVS
zpool remove $POOL $OLD_VDEV