首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在池中分离镜像驱动器

在池中分离镜像驱动器
EN

Unix & Linux用户
提问于 2014-07-01 14:53:11
回答 3查看 2.3K关注 0票数 3

我有一个更年长(2-3岁)的NAS运行FreeNAS。我想是时候升级一些硬盘了。以下是当前的状态:

代码语言:javascript
复制
    NAME        STATE     READ WRITE CKSUM                                  
    Pool1       ONLINE       0     0     0                                  
      raidz1    ONLINE       0     0     0                                  
        ada3p2  ONLINE       0     0     0                                  
        ada4p2  ONLINE       0     0     0                                  
        ada5p2  ONLINE       0     0     0                                  
      mirror    ONLINE       0     0     0                                  
        ada1p2  ONLINE       0     0     0                                  
        ada2p2  ONLINE       0     0     0 

RaidZ1中的驱动器都是1GB的,并且将保持不变。

向RaidZ1添加2或3个1GB硬盘并完全删除镜像驱动器(仅为500 1GB)的最佳方法是:

  • 将数据复制到临时保存点
  • 重新创建池
  • 把它复制回来

池大约满了50%,所以我甚至不确定镜像驱动器上有数据。

如何检查或从哪里开始?

EN

回答 3

Unix & Linux用户

发布于 2014-07-02 00:38:22

唯一的方法是按照您的建议:将所有数据集复制到一个新的池中,并重新构建这个池。zfs不支持通过增加驱动器来扩展raidz1 1‘S,也不支持删除顶级的vdevs (这就是“镜像”)。

票数 1
EN

Unix & Linux用户

发布于 2021-10-13 22:18:48

简短回答:

最好的方法是..。更多..。驱动器到RaidZ1并完全删除镜像驱动器,.没有:

  • 将数据复制到临时保存点
  • 重新创建池
  • 把它复制回来

你不能。停下来。根据您的配置,如果不创建新的池并复制到镜像驱动器,您将无法删除镜像驱动器。特别是考虑到发布的时间,ZFS不支持从池中删除VDEV。对于最近遇到此问题的读者,在撰写本文时,zpool remove不支持从包含一个或多个raidz VDEV的池中删除VDEV。zpool remove确实支持删除连接磁盘或级联镜像。

长答案:

您有一个与镜像vdev连接的raidz1 vdev的不寻常配置。您将无法从池中删除镜像vdev,除非创建一个新池,将数据从旧池复制到新池,然后销毁旧池。

但是,只要不更改vdev结构,当然可以扩展当前池的容量。

因此,您可以切换到更大的驱动器,而不是添加更多的驱动器。这是相对没有痛苦的,虽然它将需要几次迭代,将池银每个新驱动器,一次一个。但与传统的RAID相比,ZFS在重发方面效率更高,因此取决于您的池有多满,它可能不会那么糟糕。

关键是必须一次只执行一个磁盘。首先要确保您有一个完整的、经过测试的池备份。

下面是一个带有三个1G驱动器(设备/dev/md0到/dev/md2 )的测试沙箱,每个驱动器上都有一个GPT分区表:

代码语言:javascript
复制
# gpart show md{0..2}
=>     40  2097072  md0  GPT  (1.0G)
       40      200    1  linux-swap  (100K)
      240  2096872    2  freebsd-zfs  (1.0G)

=>     40  2097072  md1  GPT  (1.0G)
       40      200    1  linux-swap  (100K)
      240  2096872    2  freebsd-zfs  (1.0G)

=>     40  2097072  md2  GPT  (1.0G)
       40      200    1  linux-swap  (100K)
      240  2096872    2  freebsd-zfs  (1.0G)

在这些驱动器中,我构建了一个raidz1池:

代码语言:javascript
复制
# zpool create tank raidz1 /dev/md{0..2}p2
# zpool status tank; echo; zpool list tank
  pool: tank
 state: ONLINE
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        md0p2   ONLINE       0     0     0
        md1p2   ONLINE       0     0     0
        md2p2   ONLINE       0     0     0

errors: No known data errors

NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH
tank  2.75G   196K  2.75G        -         -     0%     0%  1.00x    ONLINE

可爱的。现在,假设我有三个新驱动器,/dev/md3、md4和md5。但这些不是1G驱动器,而是10G驱动器。它们还使用GPT分区表进行设置,并准备就绪:

代码语言:javascript
复制
# gpart show md{3..5}
=>      40  20971440  md3  GPT  (10G)
        40       200    1  linux-swap  (100K)
       240  20971240    2  freebsd-zfs  (10G)

=>      40  20971440  md4  GPT  (10G)
        40       200    1  linux-swap  (100K)
       240  20971240    2  freebsd-zfs  (10G)

=>      40  20971440  md5  GPT  (10G)
        40       200    1  linux-swap  (100K)
       240  20971240    2  freebsd-zfs  (10G)

因为池是多余的,所以我可以小心地用一个更大的驱动器替换raidz1数组中的一个驱动器,然后等待池重新显示,然后移动替换下一个驱动器,每次一个。我将用很长的方法完成第一个,由offline-ing驱动,检查数组是否仍在运行,然后用大驱动器替换小驱动器:

代码语言:javascript
复制
# zpool offline tank md0p2
# zpool status tank
  pool: tank
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
    Sufficient replicas exist for the pool to continue functioning in a
    degraded state.
action: Online the device using 'zpool online' or replace the device with
    'zpool replace'.
config:

    NAME        STATE     READ WRITE CKSUM
    tank        DEGRADED     0     0     0
      raidz1-0  DEGRADED     0     0     0
        md0p2   OFFLINE      0     0     0
        md1p2   ONLINE       0     0     0
        md2p2   ONLINE       0     0     0

errors: No known data errors

现在,我可以将1G /dev/md0p2分区替换为10G分区/dev/md3p2。实际上,上面的zpool offline步骤并不是绝对必要的。可以直接转到这个zpool replace命令:

代码语言:javascript
复制
# zpool replace tank md0p2 md3p2
# zpool status tank; echo; zpool list tank
  pool: tank
 state: ONLINE
  scan: resilvered 128K in 00:00:02 with 0 errors on Wed Oct 13 13:46:23 2021
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        md3p2   ONLINE       0     0     0
        md1p2   ONLINE       0     0     0
        md2p2   ONLINE       0     0     0

errors: No known data errors

NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH
tank  2.75G   265K  2.75G        -         -     0%     0%  1.00x    ONLINE

注意,重银器已完成。这是至关重要的。如果您在池中存储了大量数据,您将不得不等待,顺其自然地检查zpool status tank,直到刷新完成为止。

完成重新银之后,我们可以继续替换第二个磁盘:

代码语言:javascript
复制
# zpool replace tank md1p2 md4p2

再说一次,我们必须等到zpool status说重新镀银结束:

代码语言:javascript
复制
# zpool status tank
  pool: tank
 state: ONLINE
  scan: resilvered 134K in 00:00:03 with 0 errors on Wed Oct 13 13:54:17 2021
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        md3p2   ONLINE       0     0     0
        md4p2   ONLINE       0     0     0
        md2p2   ONLINE       0     0     0

errors: No known data errors

现在重新银已经完成,我们将用更大的替换替换第三个小磁盘:

代码语言:javascript
复制
# zpool replace tank md2p2 md5p2
# zpool status tank; echo; zpool list tank
  pool: tank
 state: ONLINE
  scan: resilvered 146K in 00:00:03 with 0 errors on Wed Oct 13 14:55:56 2021
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        md3p2   ONLINE       0     0     0
        md4p2   ONLINE       0     0     0
        md5p2   ONLINE       0     0     0

errors: No known data errors

NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH
tank  2.75G   319K  2.75G        -         -     0%     0%  1.00x    ONLINE

因此,现在旧的小型磁盘md0、md1和md2不再存在于池中。池运行在较大的磁盘md3、md4和md5上。但是没有额外的空间,因为我们还没有告诉zpool扩展raidz1数组。这很容易做到:

代码语言:javascript
复制
# zpool online -e tank md5p2
# zpool status tank; echo; zpool list tank
  pool: tank
 state: ONLINE
  scan: resilvered 146K in 00:00:03 with 0 errors on Wed Oct 13 14:55:56 2021
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        md3p2   ONLINE       0     0     0
        md4p2   ONLINE       0     0     0
        md5p2   ONLINE       0     0     0

errors: No known data errors

NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH
tank  29.8G   394K  29.7G        -         -     0%     0%  1.00x    ONLINE

现在不是3G池,而是一个30G池,一次小心地更换一个磁盘,然后扩展数组。

票数 1
EN

Unix & Linux用户

发布于 2017-02-03 22:19:49

首先,在进行任何更改之前,您可能需要考虑启动一个zpool scrub以确保一切都是健康的。

离开内存(所以您需要确认),我相信您想要的选项是zpool add能够扩展现有的raidz池。

为了方便地移动数据,您可以使用zfs send\receive,以及使用快照进行增量send接收。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/140180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档