如何替换非冗余ZFS池中的磁盘?


8

我一直在做一些阅读,看起来ZFS不喜欢从非冗余阵列中删除磁盘

您可以使用该zpool detach命令从镜像存储池分离设备。例如:

# zpool detach zeepool c2t1d0

但是,如果没有其他有效的数据副本,则拒绝此操作。例如:

# zpool detach newpool c1t2d0
cannot detach c1t2d0: only applicable to mirror and replacing vdevs

基本问题是可以理解的:从数组中删除数据的唯一副本(无论是元数据还是有效载荷数据)都会使该数据不可用。

替换ZFS存储池中的设备的示例提供了有关如何替换存储池中的设备的基本分步说明:使磁盘脱机,卸下磁盘,插入替换磁盘,运行zpool replace以将更改通知ZFS然后将磁盘联机。显然,这要求该阵列不依赖于要更换的磁盘,因此该阵列必须具有冗余性。如果它确实取决于所讨论的驱动器,则此方法存在与上述相同的问题。

非冗余 ZFS阵列中更换磁盘的推荐方法是什么?

假定现有磁盘工作正常,并假定替换磁盘的大小至少与被替换磁盘的大小相同。(如果现有磁盘发生故障,显然所有可以做的就是添加新磁盘,并从备份中还原受磁盘故障影响的所有文件。)

Answers:


3

不知道'13'是否有什么不同,但是'zfs replace'在非冗余池中起作用。您只需要运行1命令而不是先分离即可。

d1是1G,d2是2G,在/ tmp中都是空文件:

/t/test #> zpool create test /tmp/test/d1
/t/test #> zpool set autoexpand=on test
/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: none requested
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d1  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1008M   258K  1008M         -     0%     0%  1.00x  ONLINE  -


/t/test #> zpool replace test /tmp/test/d1 /tmp/test/d2


/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: resilvered 61K in 0h0m with 0 errors on Sun Sep 18 18:55:32 2016
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d2  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1.98G   408K  1.98G         -     0%     0%  1.00x  ONLINE  -

12
zpool attach pool old-disk new-disk

这样会将旧磁盘转换为具有旧磁盘和新磁盘的镜像,并开始重新同步,之后您可以分离旧磁盘。

zpool detach pool old-disk

经过回路设备测试:

# truncate -s 1G a b
# truncate -s 1200M c
# losetup  /dev/loop0 a
# losetup  /dev/loop1 b
# losetup  /dev/loop2 c
# zpool create test loop{0,1}
# zpool attach test loop1 loop2
# zpool status
      pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            loop1   ONLINE       0     0     0
            loop2   ONLINE       0     0     0
# zpool detach test loop1
# zpool status
  pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          loop2     ONLINE       0     0     0

所以您是说ZFS本机不支持这种操作?看起来很奇怪。(似乎所需要做的就是将两个驱动器都连接起来,然后通知ZFS旧驱动器即将脱机,从而使它有机会像将其上的数据一样迁移到其他驱动器上如果这是一个在一个冗余阵列重新同步)。
一个CVN

@MichaelKjörling,我不是在说那个。我只是说上面的方法应该起作用,因为我看不出为什么不应该这样做。
斯特凡Chazelas

话虽如此,看起来ZFS确实支持它。答案已更新。
斯特凡Chazelas

大!这是我一直在寻找并希望得到的答案。如果可以的话,还会再给您+1进行尝试。
CVn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.