1

近期服务器由于磁盘空间满而发生了错误,数据盘有了扩容的需求。当前的系统采用了稳如磐石的FreeBSD系统,文件系统使用了更加安全、可靠的ZFS。

阿里云

云硬盘满,我们首先想到的是去服务商那扩容。但使用了zfs文件系统后,扩容的最并没有反馈到系统中,也就是说虽然云服务端给我们扩容到了100G,但我们能够使用的仍然为40G。

注意:在阿里云完成扩容后,一定要去它的控制台中完成重启操作,否则云盘不生效。

image.png

自建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,将zpoolautoexpand属性设置为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。
image.png

故障排查

有时候虽然操作一切都正确,但是也不表示我们就一定能获取到成功的结果。这时候就需要逐一来排查问题。

看硬件信息

首先是重新启动服务器,然后查看文件:/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


潘杰
3.1k 声望238 粉丝

引用和评论

0 条评论