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

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

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

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

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

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

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

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

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

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

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

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

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

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

替换计划很简单。如下:

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

第一步操作中,由于我们是两个硬盘做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进行同样的操作,替换成新硬盘。

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

扩容操作分两步走,

第一步操作将分区扩容。第二步操作将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之后,这些操作就是小操作了~

About: dato


发表评论

邮箱地址不会被公开。 必填项已用*标注