本文主要讨论在ZFS文件系统磁盘空间不足时,如何在线对存储池进行镜像和扩容。主要包括以下几个步骤:
本文使用的软件版本:
ZFS(Zettabyte File System)是Sun公司为Solaris操作系统开发的新一代文件系统,除了支持极大数据的存储需求和很高的数据完整性之外,还具有诸多新颖和强悍的功能,包括存储池、多种缓存、写时拷贝事务模型、快照与克隆、块大小可变、加密、高可用等,可以说是目前世界上最先进的文件系统。
最开始使用ZFS文件系统时,只有一块500G的硬盘,在其中一个分区上创建了ZFS文件系统,也未做镜像,没想到后来数据起来越多、起来越重要,这时就不得不考虑扩容和镜像的问题了。在找了一块大小相同的磁盘以后,这次在线扩容与镜像的实际需求就是两项:一是扩大存储空间,把整个500G全部用于ZFS文件系统,二是找一块相同参数的硬盘做RAID1镜像,提高存储的可靠性。
先使用zpool status命令看一下当前存储池使用情况:
从图中可以看出,这个磁盘中的一个MBR扩展分区被格式化为ZFS文件系统,挂载点为/data。
同时,当前存储池大小为99.5G,已使用了66.2G,目前工作状况良好。
检查/dev目录下的磁盘:
可以看出,ada0为旧磁盘,未识别出分区;ada1为新磁盘,有2个分区。
所以此次在线换盘和扩容镜像的步骤就是:
(1)备份/data目录
(2)重置新磁盘ada1
(3)将新磁盘ada1加入到存储池
(4)将旧磁盘ada0从存储池中移除
(5)重置旧磁盘ada0
(6)将旧磁盘ada0作为ada1的镜像加入到存储池
现在正式开始吧。
在开始操作之前,一定要注意,备份数据!数据很重要,一旦丢失就再也找不回来了。
切记!切记!切记!
tar zcvf /BACKUP_DEVICE/data-backup-20230531.tar.gz data
注意:这里的BACKUP_DEVICE一定要是除这两个硬盘之外的第三个磁盘,不然备份就没有意义了。
(1)对新磁盘进行分区
使用gpart命令对新磁盘ada1进行分区:
#gpart create -s GPT ada1
ada1 created
#gpart add -a 4K -t freebsd -s 2G ada1
ada1s1 added
#gpart add -a 4K -t freebsd ada1
ada1s2 added
(2)查看新磁盘分区信息
使用gpart list命令查看新磁盘信息:
# gpart list ada1
Geom name: ada1
modified: false
state: OK
fwheads: 16
fwsectors: 63
last: 976773127
first: 40
entries: 128
scheme: GPT
Providers:
1. Name: ada1s1
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Stripesize: 0
Stripeoffset: 20480
Mode: r0w0e0
efimedia: HD(1,GPT,8960349a-012d-11ee-aad1-fc4dd4d7ca1b,0x28,0x400000)
rawuuid: 8960349a-012d-11ee-aad1-fc4dd4d7ca1b
rawtype: 516e7cb4-6ecf-11d6-8ff8-00022d09712b
label: (null)
length: 2147483648
offset: 20480
type: freebsd
index: 1
end: 4194343
start: 40
2. Name: ada1s2
Mediasize: 497960337408 (464G)
Sectorsize: 512
Stripesize: 0
Stripeoffset: 2147504128
Mode: r0w0e0
efimedia: HD(2,GPT,8ce01767-012d-11ee-aad1-fc4dd4d7ca1b,0x400028,0x39f85fe0)
rawuuid: 8ce01767-012d-11ee-aad1-fc4dd4d7ca1b
rawtype: 516e7cb4-6ecf-11d6-8ff8-00022d09712b
label: (null)
length: 497960337408
offset: 2147504128
type: freebsd
index: 2
end: 976773127
start: 4194344
Consumers:
1. Name: ada1
Mediasize: 500107862016 (466G)
Sectorsize: 512
Mode: r0w0e0
使用zpool add命令将新磁盘加入存储池:
# zpool add data ada1s2
查看存储池状态如下:
使用zpool remove命令将旧磁盘从存储池中移除:
# zpool remove data /dev/diskid/DISK-WD-WCC2ERN19398s2+05517865
查看存储池状态如下:
从状态信息中可以看到,旧磁盘撤离操作正在进行,存储在旧磁盘上的数据正在向新磁盘上转移,旧磁盘当前下在存储池中,稍微等待一下,直到复制过程100%完成。
等待了20分钟以后,复制过程终于完成了,再次查看存储池状态时,可以看到存储池中目前只剩一块磁盘(分区)了。
文件数据100%从旧磁盘转移到新磁盘后,两块磁盘的交接工作就完成了,旧磁盘也就从存储池中完全移除了。
重置旧磁盘前,一定要再次确认一下数据是否已经完全转移到了新磁盘,因为肯定有人因为找不到第三块硬盘而没有进行数据备份,这是最后一次机会确认数据,一定要小心!
旧磁盘上的数据已全部转移完成以后,就可以对旧磁盘进行格式化,使其以新的面貌加入重新加入到存储池中。重置时注意要使用和新磁盘一样的分区参数,以便两个磁盘可以同步镜像。
(1)对旧磁盘进行分区
使用gpart命令对旧磁盘ada0进行分区:
#gpart destroy -s GPT ada0
ada0 destroyed
#gpart create -s GPT ada0
ada0 created
#gpart add -a 4K -t freebsd -s 2G ada0
ada0s1 added
#gpart add -a 4K -t freebsd ada0
ada0s2 added
(2)查看旧磁盘分区信息
使用gpart list命令查看旧磁盘信息:
# gpart list ada0
Geom name: ada0
modified: false
state: OK
fwheads: 16
fwsectors: 63
last: 976773127
first: 40
entries: 128
scheme: GPT
Providers:
1. Name: ada0s1
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Stripesize: 0
Stripeoffset: 20480
Mode: r0w0e0
efimedia: HD(1,GPT,ac8b4ec7-0134-11ee-931b-fc4dd4d7ca1b,0x28,0x400000)
rawuuid: ac8b4ec7-0134-11ee-931b-fc4dd4d7ca1b
rawtype: 516e7cb4-6ecf-11d6-8ff8-00022d09712b
label: (null)
length: 2147483648
offset: 20480
type: freebsd
index: 1
end: 4194343
start: 40
2. Name: ada0s2
Mediasize: 497960337408 (464G)
Sectorsize: 512
Stripesize: 0
Stripeoffset: 2147504128
Mode: r0w0e0
efimedia: HD(2,GPT,aef872aa-0134-11ee-931b-fc4dd4d7ca1b,0x400028,0x39f85fe0)
rawuuid: aef872aa-0134-11ee-931b-fc4dd4d7ca1b
rawtype: 516e7cb4-6ecf-11d6-8ff8-00022d09712b
label: (null)
length: 497960337408
offset: 2147504128
type: freebsd
index: 2
end: 976773127
start: 4194344
Consumers:
1. Name: ada0
Mediasize: 500107862016 (466G)
Sectorsize: 512
Mode: r0w0e0
可以看到,旧磁盘的分区数量和大小与新磁盘一模一样。
(3)查看dev信息
使用ls命令查看设备文件夹下的信息如下:
两块硬盘在设备文件夹中的信息也是一模一样。
zpool attach命令格式如下:
zpool attach [-f] pool device new_device
zpool attach命令将new_device连接到现有pool的device设备上。使用这个命令时,要注意这里的device不能是raidz配置的一部分。如果device当前不是某个镜像配置的一部分,device将自动转换为device和new_device的双向镜像。如果device是某个双向镜像的一部分,则连接new_device将创建一个三向镜像,依此类推。无论哪种情况,new_device都会立即开始重新同步。
其中,-f选项能够强制使用new_device,即使它显示为正在使用。但是并非所有设备都可以通过这种方式进行覆盖。
使用attach命令前存储池状态如下:
可以看到data1存储池里只有ada1s2一个设备。
执行attach命令:
# zpool attach data ada1s2 ada0s2
结果如下:
可以看到,旧磁盘又重新加入了存储池,只不过这次是以更大的分区加入的。而且,存储池中新旧两块磁盘自动进行了镜像(mirror-1)。存储池状态显示,这两块硬盘正在重新同步(resilvering),等同步结束后,此次扩容和镜像的工作就算是圆满完成了。
声明:本文是小萌在自有服务器上的一次操作记录,用于帮助大家更好地了解ZFS文件系统,对于未按要求进行备份而导致数据丢失等意外情况不承担任何责任。