近期服务器由于磁盘空间满而发生了错误,数据盘有了扩容的需求。当前的系统采用了稳如磐石的FreeBSD系统,文件系统使用了更加安全、可靠的ZFS。
阿里云
云硬盘满,我们首先想到的是去服务商那扩容。但使用了zfs文件系统后,扩容的最并没有反馈到系统中,也就是说虽然云服务端给我们扩容到了100G,但我们能够使用的仍然为40G。
注意:在阿里云完成扩容后,一定要去它的控制台中完成重启操作,否则云盘不生效。
自建SAN
以TrueNAS为例,在扩容时需要先调整块设备的大小。然后来客户端重新进行扫描,此时会看到硬盘的大小已经为调整后的。
然后我们重启虚拟机,以时虚拟机中的硬盘的容量已经为新的容量。可以使用gpart show
来查看:
# gpart show
=> 40 167772080 da1 GPT (80G)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 100661248 3 freebsd-zfs (48G)
104857600 62914520 - free - (30G)
上述内容中的最下方 - free - (30G) 即为可扩容空间。
如果不小心遇到了CORRUPT
:
# gpart show
=> 40 104857584 da1 GPT (80G) [CORRUPT]
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 100661248 3 freebsd-zfs (48G)
104857600 24 - free - (12K)
则需要先打个快照。然后执行 gpart recover <da1>
来恢复分区表,后执行 camcontrol rescan <da1>
查看结果。
然后使用gpart resize -i 3 /dev/<da1>
调整分区大小。
请将<da1>
换成自己的实际硬盘标识,比如:vtbd1
最后执行gpart show
查看扩容结果:
# gpart show
=> 40 167772080 da1 GPT (80G)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 163575744 3 freebsd-zfs (78G)
167772096 24 - free - (12K)
ZFS扩容方案
搜索了相关的扩容关键字,但基本上所有的文章都在讲如何对实体的硬盘进行扩容(老的硬盘换了新的更大的硬盘),却没有一篇文章提及如何在云盘扩容后同步扩容zpool。
最终查阅了oracle的官方文档得到了答案:
方案一
查看zpool状态,得到zpool名称以及加入到zpool的硬盘名称:
root@xxx:/dev # zpool status
pool: zroot
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
①zroot ONLINE 0 0 0
②vtbd1 ONLINE 0 0 0
得到①zpool的名称为zroot ②当前挂载的硬盘为vtbd1.
然后执行扩容命令:
root@PingTai:/dev # zpool online -e ①zroot ②vtbd1
方案二
查看zpool状态,得到zpool名称:
root@xxx:/dev # zpool status
pool: zroot
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
①zroot ONLINE 0 0 0
vtbd1 ONLINE 0 0 0
得到zpool
的名称为zroot
,将zpool
的autoexpand
属性设置为on
:
# zpool set autoexpand=on ①zroot
然后当磁盘扩容后,重新启动服务器,扩容自动完成。
ZFS
简单介绍下ZFS,它是一个文件系统,内部有多种模式:disk、file、mirror、raidz、spare(统称为VDEV ---- 虚拟设备)等,比较常用的是raidz,该模式下有三个子模式,分别为raidz1、raidz2、raidz3。raidz1相当于普通的raid5,而raidz2及raidz3则在raid5的基础上使用了2块或3块硬盘做校验盘,同时一个zpool(虚拟硬盘)中又可以包括多个虚拟设备,所以可以每个zpool最大支持16EB,也就是1600万TB。
故障排查
有时候虽然操作一切都正确,但是也不表示我们就一定能获取到成功的结果。这时候就需要逐一来排查问题。
看硬件信息
首先是重新启动服务器,然后查看文件:/var/run/dmesg.boot,在该文件中记录了系统启动的所有的硬件信息。比如:
vtblk1: <VirtIO Block Adapter> on virtio_pci3
vtblk1: 30720MB (62914560 512 byte sectors)
virtio_pci4: <VirtIO PCI Balloon adapter> port 0xc100-0xc11f irq 11 at device 7.0 on pci0
在此先判断该容量是否与预期相同,如果此处的容量与预期不相同,那么需要从硬件上下手,比如联系你的服务商。
看磁盘信息
硬件信息没有问题后,基本上磁盘的信息也就随之没有问题了,在freebsd中,比较安全的方法是使用geom disk list
,这是由于你一旦使用了zfs文件系统,那么gpart show
命令将直接失效。
$ geom disk list
Geom name: vtbd0
Providers:
1. Name: vtbd0
Mediasize: 42949672960 (40G)
Sectorsize: 512
Mode: r1w1e3
descr: (null)
ident: (null)
rotationrate: unknown
fwsectors: 63
fwheads: 16
Geom name: vtbd1
Providers:
1. Name: vtbd1
Mediasize: 53687091200 (50G)
Sectorsize: 512
Mode: r1w1e1
descr: (null)
ident: (null)
rotationrate: unknown
fwsectors: 63
fwheads: 16
如果上述两处的信息都没有问题,那么就继续执行扩容方案吧。
参考官方文档: https://docs.oracle.com/cd/E19120-01/open.solaris/817-2271/githb/index.html
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。