今天正好有人在群里问FreeNAS和TrueNAS的扩容问题,我这里正好说一下。首先说,TrueNAS Core版本的前身是FreeNAS,这两个合并了,具体原因不太清楚,但是现在都是免费的,所以国外用的比较多,国内大部分用群晖或者爱快这种NAS。
  现在许多人遇到一个问题,就是前期我没有那么多硬盘,比如我只有3块硬盘,每个只有1T,做了最简单的带RAID功能的ZFS只有不超过2T容量。现在想加硬盘却要所有分区重新建,你需要买个2T硬盘把里面文件拷贝出来,然后买别的硬盘重新建立多个硬盘的ZFS。因为ZFS不支持增加硬盘数量的动态扩容。
  如果你是4T*4块硬盘以上面的模式组成了12T的ZFS而且容量已经满了,那重建分区你就需要12T的空间作为中转,所以说ZFS的扩容是一个令许多人头疼的问题。目前百度和谷歌没有找到比较好的直接扩容方案,我这里提供一种思路,就是利用LVM精简卷实现虚拟ZFS扩容。

LVM精简卷

  先来说说LVM精简卷(Thinly-Provisioned Logical Volumes),如果被人偷偷的在生产中使用,紧急故障处理的时候,可以一下子给人干懵。并且在百度还不能搜索到完整可用的文档。其实很简单,就是用多少空间,申请多少空间。好好利用它可以让你在100G的硬盘上创建100TB的磁盘空间。。LVM的精简逻辑卷,这可以创建大于可用盘区的逻辑卷。精简池可以在需要时进行动态扩展,存储管理员可以过量使用物理存储,以节省成本地分配存储空间。在标准的逻辑卷中磁盘空间在创建时就会占用卷组的空间,但是在精简卷中只有在写入时才会占用存储池"thin pool LV"中的空间。

ZFS扩容方案

  其实这里的扩容并非真的扩容,而是使用LVM精简卷的方式欺骗ZFS我有很大的容量。这样,以后磁盘空间不够用了,只需要在lvm上面增加Thin-pool的空间即可实现扩容,当然总容量不能超过最初设定的大小。比如我最初ZFS设定由5盘组成单盘100T的RAID5空间,虽然最初你可能只有5块4T硬盘,利用LVM精简卷组成ZFS,只要数据不超过12T,不会出问题,后面可以用LVM增加硬盘容量,但最大空间只有100T*4也就是400T的大小。

  原理已经讲明白了,下面直接开始实际操作。

# 建立pv
pvcreate /dev/sda
pvcreate /dev/sdb
pvcreate /dev/sdc

# 建立vg
vgcreate vg1 /dev/sda
vgcreate vg2 /dev/sdb
vgcreate vg3 /dev/sdc

# 建立thin pool,这里指定poolmetadatasize为3G,其实一般2G也够用,看具体情况配置,可以预先留点空间以免以后要扩容的时候没有空间
lvcreate -L 2.70t -T -n tp1 --poolmetadatasize 3G vg1
lvcreate -L 2.70t -T -n tp2 --poolmetadatasize 3G vg2
lvcreate -L 2.70t -T -n tp3 --poolmetadatasize 3G vg3

# 建立 lv,我这里留了一部分空间,在扩容的时候使用
lvcreate -T vg1/tp1 -V 2.70t -n lvz1
lvcreate -T vg2/tp2 -V 2.70t -n lvz2
lvcreate -T vg3/tp3 -V 2.70t -n lvz3

# 建立zpool
zpool create data raidz /dev/mapper/vg1-lvz1 /dev/mapper/vg2-lvz2 /dev/mapper/vg3-lvz3

# 开启 autotrim,这个是扩容的关键,如果没有这个,删除文件时不会通知 lvm thin pool 回收空间
zpool set autotrim=on data

# 关闭 thin_check 的 mappings 扫描,加快开机速度。由于thin_check 在大容量的硬盘上执行检查会非常慢,所以我这里就直接关掉。
# 在 /etc/lvm/lvm.conf 里面取消 thin_check_options 的注释,并修改值
thin_check_options = [ "-q", "--clear-needs-check-flag", "--skip-mappings" ]