去年就把年底要把NAS升级的卫星送上天了,卫星在天上也飞了一年多了。虽然今年还是很忙,但是还是抽空把这卫星收了吧,不然搞不好真就迷失了。
首先介绍一下之前NAS的基本情况,这个NAS真正组装于2023年底,当时觉得笔记本里2T珍贵的磁盘空间不适合存放电影、游戏这些文件,同时也考虑到自己的SVN代码库日益庞大(实际也没有多大),加上家人和自己平时的照片,那不得搞个NAS还行。然后就有了现在的这个NAS,这个NAS实际已经经历了一次升级过程,硬件的东西下一篇文章里细说吧。今天主要讨论软件。
一开始需求很简单,只要能实现文件共享就行。后来要的东西也越来越多,陆陆续续就在上面装了不少东西。主要软件信息如下:
- 操作系统:Debian 12
- 文件共享:Samba
- 版本库:subversion
- iSCSI:targetcli-fb
- 多媒体:NasCab(Docker环境部署)
操作系统看了飞牛,飞牛不支持iSCSI、ZFS,放弃。FreeNAS不喜欢,放弃。市面各种NAS操作系统都被我找出这样那样的原因给PASS了。那就还是自己搭吧,我喜欢折腾。
软件层面实际没有发生什么大的变化,操作系统由Debian 12升级的Debian 13,考虑安装KVM以支持虚拟化。存储文件系统采用ZFS。
这里我主要说一下ZFS的部署,本来想单独开一个ZFS的文章,最后想想这本来就是因为NAS要升级搞出来的事,所以就在这里写吧。下面会写一下具体的安装过程。
安装必要linux-headers软件包
apt install -y linux-headers-$(uname -r)
安装ZFS全量软件包
apt install -y zfsutils-linux
这里有点需要注意的,如果直接执行ZFS全量软件包的命令,没有先安装linux-headers包也是可以安装的,ZFS安装时并不会自动安装依赖的linux-headers包。这就导致了不仔细看安装日志以为安装完成了,实际执行zfs相关命令时各种报错。如下图:

我一开始就是直接执行了安装ZFS的命令,我认为它会自己处理依赖。没看仔细看安装日志,实际上图中已经明确的说明了缺失linux-headers。然后我执行命令自然都是报错。下面是报错的图。

安装完成后就可以开始创建ZFS存储池了,命令如下:
zpool create Pool-Name Raidz-Mode disk-Name
Pool-Name表示存储池的名称,Raidz-Mode表示存储池模式,我使用的是RAIDZ2也就是等同于RAID6,具体有哪些类型,每个类型要求的磁盘数量大家自己去查吧,我这里不赘述了。disk-Name表示磁盘的名称,可以通过lsblk或者ls /dev查看。命令执行完后,执行zfs list就可以看到ZFS存储池了。

这时执行df命令可以看到,ZFS存储池已经挂载到操作系统了。

因为我要使用iSCSI,但是ZFS将整个池挂载到了操作系统,这就导致我没办法使用块设备的方式来创建iSCSI的后端存储。这里可以使用ZFS卷的方式来实现以块设备方式创建iSCSI后端存储。命令如下:
zfs create -V Size Zpool-Name/Zvol-Name
Size表示ZFS卷大小,Zpool-Name表示ZFS存储池名称,Zvol-Name表示ZFS卷名称。执行结果如下图:

图中可以看到命令执行后,通过zfs list命令可以查到ZFS卷,因为ZFS卷属于块设备,所以df命令查看并没有看到ZFS卷被挂载。
执行下面的命令,可以进一步确认ZFS卷已经创建。
ls -al /dev/zvol/Zpool-name/
Zpool-Name表示ZFS存储池名称,命令执行后的结果如下图。

到此就可以执行targetcli以块设备创建iSCSI后端存储了,其中设备路径就是/dev/zvol/Zpool-name/Zvol-name
补充一下,如果单单就是想创建一个有大小配额的子文件系统,执行如下命令即可。
zfs create -o quota=Size Zpool-Name/Sub-filesystem-Name
Size表示配额大小,Zpool-Name表示ZFS存储池名称,Sub-filesystem-Name表示子文件系统名称。子文件系统实际就是个目录,说目录更好理解一些。同样它一经创建也会被自动挂载。

这篇文章更多的是说明ZFS作为文件系统的一些安装配置问题,后面我会再说说硬件配置,以及一些我当前环境里ZFS文件系统的优化。