首发于NAS DIY之家
ZFS怎么扩大磁盘空间?我们试试看

ZFS怎么扩大磁盘空间?我们试试看

大家可能都遇到过磁盘空间不足的情况,一半情况下,替换更大的磁盘可以解决问题。购买硬盘很简单,网上下单,第二天送到!问题是,怎么扩容?

你可能会说,这个问题不是和大象放冰箱一样么?只需要三个步骤即可。

  1. 备份老硬盘的数据
  2. 替换上新的硬盘
  3. 将备份数据恢复到新磁盘

就是这么简单?理论上往往很简单,但是实际操作起来很多问题需要考虑。

  1. 备份老硬盘的数据?怎么备份?备份到那里去?
  2. 替换上新硬盘,替换时需要停机么?
  3. 备份数据传输回新硬盘。需要多久才能恢复服务?

如果你是一台个人台式机,或者笔记本,可能比较简单。比如:

先将老数据拷贝到移动硬盘,然后新安装系统到新硬盘,最后通过移动硬盘将数据拷回来即可。或者如果你的机器是双硬盘,需要扩大的硬盘不是系统盘时,可以将新硬盘接上去直接倒数据,然后拆掉老硬盘即可。方法多种多样。

但是如果你要操作的是一台服务器,你需要不中断服务的前提下进行扩容,该怎么办?

接下来我用我的一台NAS机器扩容系统盘为例,看看这个操作在FreeBSD上是怎么优雅完成的。


介绍操作之前先介绍一下我NAS的系统构成。借用之前的图

这次要扩容的就是左下角的两个硬盘,从128G扩容到512GB。

这两个硬盘是SATA SSD,使用了热插拔盒子,因此可以直接替换而不用重起动机器。

我最初安装FreeBSD时使用了ZFS的Root MIRROR系统盘。

替换计划很简单。如下:

  1. 先将老硬盘的数据恢复到新硬盘
  2. 扩容空间

第一步操作中,由于我们是两个硬盘做mirror,拔掉其中一个也不影响系统运行,所以拔掉其中一个硬盘,然后插上新的512GB硬盘。(我这一步操作有危险,如果是生产环境,建议先插上新硬盘,同步完数据之后再拔老硬盘。由于我没有空余的硬盘位,所以先拔老的,再插新的。)

自然,拔掉一个硬盘之后,ZFS显示一个硬盘丢失。

我们不用管它,插入新硬盘,对新硬盘通过gpart进行分区。

由于我们是替换硬盘,所以将mirror硬盘的分区配置直接给新硬盘用就可以了。

在下面的命令中,ada0是老的mirror硬盘,ada1被我们拔掉,又插入新的硬盘。所以新硬盘是ada1

root@x10drl:~ # gpart backup ada0 | gpart restore ada1
root@x10drl:~ # 

这个命令执行完之后,什么提示都没有,新硬盘分区就搞定了。我们看一下。

root@x10drl:~ # gpart show ada1
=>        40  1000215136  ada1  GPT  (477G)
          40        1024     1  freebsd-boot  (512K)
        1064         984        - free -  (492K)
        2048    16777216     2  freebsd-swap  (8.0G)
    16779264   233289728     3  freebsd-zfs  (111G)
   250068992   750146184        - free -  (358G)

注意到后面有358G的磁盘空余空间。我们下一步再进行扩容。

接下来我们将新硬盘的分区加入到zroot的zpool中,这样子zfs会将老硬盘的数据自动同步到新硬盘中。

root@x10drl:~ # zpool attach zroot ada0p3 ada1p3

注意!这里的attach不能写成add,否则你会很后悔....具体原因以后有机会在讲。

root@x10drl:~ # zpool status zroot
  pool: zroot
 state: ONLINE
  scan: resilvered 3.03G in 0 days 00:00:11 with 0 errors on Tue Jul 30 12:33:41 2019
config:

	NAME        STATE     READ WRITE CKSUM
	zroot       ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    ada0p3  ONLINE       0     0     0
	    ada1p3  ONLINE       0     0     0

这一步之后zpool会提示数据正在同步中,上面是我已经同步完成的情况,3.03G的数据花费11秒.... 真的很快。

接下来我们需要将启动分区写上启动启动代码

root@x10drl:~ # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot  -i 3 ada1

执行到此,我们已经将一个老硬盘替换掉成新硬盘,并且恢复完成数据。整个过程都不需要停机或者重新启动机器!ZFS万岁!

同样,我们对ada0进行同样的操作,替换成新硬盘。


上述操作之后,我们都将老硬盘换成新硬盘,但是磁盘空间并没有增加。接下来我们需要将空间进行扩容。

扩容操作分两步走,

  1. 第一步操作将分区扩容。
  2. 第二步操作将zpool扩容。

分区扩容很简单,如下

root@x10drl:~ # gpart resize -i 3 ada0
ada0p3 resized
root@x10drl:~ # gpart show ada0
=>        40  1000215136  ada0  GPT  (477G)
          40        1024     1  freebsd-boot  (512K)
        1064         984        - free -  (492K)
        2048    16777216     2  freebsd-swap  (8.0G)
    16779264   983435912     3  freebsd-zfs  (469G)

由于我们将第三个分区直接扩容到最大空间,所以不需要制定大小。

同样对ada1也执行上述操作

root@x10drl:~ # gpart resize -i 3 ada1
ada0p3 resized
root@x10drl:~ # gpart show ada1
=>        40  1000215136  ada1  GPT  (477G)
          40        1024     1  freebsd-boot  (512K)
        1064         984        - free -  (492K)
        2048    16777216     2  freebsd-swap  (8.0G)
    16779264   983435912     3  freebsd-zfs  (469G)

分区的扩容已经完成,接下来是对zpool的扩容。扩容前的大小为111G。

root@x10drl:~ # zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot   111G  3.66G   107G        -         -     0%     3%  1.00x  ONLINE  -

执行下面命令对zroot空间扩容

root@x10drl:~ # zpool online -e zroot ada0p3
root@x10drl:~ # zpool online -e zroot ada1p3

执行完之后看一下

root@x10drl:~ # zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot   468G  3.66G   464G        -         -     0%     0%  1.00x  ONLINE  -

空间已经变成了468G


上述的操作你可能觉得很复杂。其实很简单的。

你觉得复杂是因为每一步操作你都不熟悉,每一个概念你都没听过,每一个设备名称都和你之前的认知不符。

等你慢慢适应了FreeBSD&ZFS之后,这些操作就是小操作了~

发布于 2019-08-05 16:11