使用 freebsd 搭建家用 nas

最近拍摄的照片和视频有点多,手机存不下,准备搞个家用 nas 来存,经过一番对比之后准备上 freebsd,这里记录下一些重要配置。

freebsd 安装和设置

本文使用的是 13-RELEASE。要注意的地方主要是分区的时候选手动,分区表格式选 GPT,文件系统格式填 freebsd-zfs,系统会单独分一个 512KB 的 /boot,剩下的全分给 /

更新系统(例如更新到 13.2):

freebsd-update upgrade -r 13.2-RELEASE
freebsd-update install

更新完系统后可以执行

pkg upgrade

来更新其它软件包。

如果更新后执行 pkg 报错,可以使用以下命令来修复:

pkg-static install -f pkg
pkg upgrade -f

修改 /boot/loader.conf 启用 aio:

aio_load="YES"

按需修改 /etc/sysctl.conf

kern.maxfiles=25600
kern.maxfilesperproc=16384

zfs 设置

首先在 /etc/rc.conf 加上

zfs_enable="YES"

在系统启动的时候自动 import 所有 pool。

不用 raid,每天快照,每周 send/recv 增量备份所有快照。

创建存储数据的 data1 和用于备份的 backup

zpool create data1 /dev/ada1
zpool create backup /dev/ada2

一些设置:

zfs set atime=off logbias=throughput dnodesize=auto acltype=off recordsize=1M xattr=off data1

每天快照:

zfs snapshot -r data1@`date +%Y%m%d`

-r 选项表示对该 pool 的所有 dataset 进行递归快照。

初始备份:

zfs send -R data1@20220426 | zfs recv -F -o compression=zstd-19 mountpoint=/backup/data1 backup/data1

send 的选项 -R 表示递归;recv 的选项 -F 表示覆盖 backup 的内容,-o 指定使用 zstd 的最高压缩等级。注意这里的 compression 选项,如果只在创建 backup 的时候指定而初始备份的时候没有指定,则会被 data1 的选项覆盖(这里的 data1 并没有打开压缩选项,因此如果没有加 -o compression=xxx,在初始备份之后用 zfs get compression backup 查看会发现这个选项是 off)。

如果 data1 设置了压缩选项,例如

zfs set compression=zstd-5 data1

那么直接备份即可:

zfs send -R data1@20220426 | zfs recv -F -o mountpoint=/backup/data1 backup/data1

注意第一次初始化备份之后,backup/data1data1 的 mountpoint 是一样的,所以需要指定 mountpoint。

之后的每周增量备份:

zfs send -RI data1@old data1@new | zfs recv backup/data1

-I 表示备份从 old 到 new 之间的所有快照。

nfs 设置

首先配置要共享的目录。在 /etc/exports 中添加

V4: /
/path/to/data1 -alldirs -mapall=root -network 192.168.0.1/24

-mapall=root 表示客户端的所有操作的执行者都映射到服务端的 root 用户,保证所有接入的客户端都有 data1 的读写权限,方便查看和上传。权限控制由防火墙来设置,需要在路由器配置可以接入的设备的 ip。如果修改了 exports 文件,需要重启或 reload mountd。注意第一行的 V4: / 表示对整个根目录使用 nfsv4,与下面的 vfsv4_server_enable 选项对应。

接着在 /etc/rc.conf 添加

rpcbind_enable="YES"
nfs_server_enable="YES"
nfsv4_server_enable="YES"
mountd_flags="-r"
mountd_enable="YES"
rpc_lockd_enable="YES"
rpc_statd_enable="YES"

然后启动服务:

service rpcbind start
service mountd start
service nfsd start

设置完成后,可以通过 showmount -e 来查看是否导出成功,如果不成功的话,可以查看 /var/log/messages 里面的错误提示。然后客户端就可以通过挂载 nfs 查看和上传了。

samba 设置

加入 samba 是为了在 iphone 自带的文件 app 中访问。

首先是安装 samba:

pkg install samba416

可用的 samba 版本可以通过 pkg search samba 查看。

然后新增配置 /usr/local/etc/smb4.conf

[global]
# allow guest without passord
map to guest = Bad User
hosts allow = 192.168.0. 127.

[data1]
path = /path/to/data1
guest ok = yes
read only = no
# guest upload files as root
force user = root
force group = wheel

选项可以通过 man smb.conf 查看,有十分详细的解释。这里实现的功能基本跟 nfs 一致,就是允许无密码登录,并且登录用户都视为 root。

/etc/rc.fonf 中添加

samba_server_enable="YES"

然后手动用 service samba_server start 或者重启即可。

可以用 smbclient 来验证下

smbclient //127.0.0.1/data1 -U guest%

要注意这里的路径用的是 smb4.conf 里面的 [data1] 中的名字 data1,而不是 path。

防火墙设置(没用上)

用的是 ipfw。

首先编辑 /etc/ipfw.rules 设置防火墙规则:

ipfw -q -f flush # delete all rules

cmd="ipfw -q add"
pif="em0"
iprange="192.168.0.1/24"

$cmd 00001 allow all from any to any via lo0
$cmd 00002 check-state
$cmd 00010 allow log tcp from $iprange to me 22 in via $pif setup keep-state
$cmd 00010 allow log tcp from $iprange to me 2049 in via $pif setup keep-state
$cmd 00010 allow log udp from $iprange to me 2049 in via $pif
$cmd 65534 deny all from any to any via $pif

一定要以空行结尾!否则会报错 “syntax error in config file: pf rules not loaded”。

这个文件就是一个 shell 脚本。内容还是挺容易看懂的,首先是允许本地的所有网络访问,然后允许指定 ip 段的机器通过 ssh 访问(22 端口)以及访问 nfs(2049 端口),最后的规则是除了上述流量全都拒绝。其中第二列是一个从 1~65534 的数字,表示命令的执行顺序,如果数字相同则按照配置顺序执行。

接着在 /etc/rc.conf 中添加 ipfw 的配置:

firewall_enable="YES"
firewall_logging="YES"
firewall_script="/etc/ipfw.rules"

然后启动服务:

service ipfw start

硬盘监控

可以用 smartd,不过有两份数据,就不加监控了。

在 macos 上挂载 nfs

可以手动在命令行用 mount 来挂载

mount -t nfs -o rw,noatime 192.168.0.5:/data /data

但是每次重启就没了,如果需要开机自动挂载,需要用到 automount。

首先编辑 /etc/auto_master,加入以下内容:

/data auto_nfs

第一列是挂载点,第二列是一个配置文件路径,这是个相对于 /etc 的相对路径,也就是说实际文件是 /etc/auto_nfs

data1 -rw,bg,noatime 192.168.0.5:/path/to/data1

然后生效

automount -vc

接着在 /data 下面就能看到 data1 了。

如果在界面上操作挂载,先在 /etc/nfs.conf 加入挂载选项:

nfs.client.mount.options = vers=4.0,rw,noatime

然后在 Finder -> 前往 -> 连接服务器…,填写 nfs://192.168.0.5:/data,挂载后把目录拖到侧边栏,这样下次从 Finder 点击该目录也会自动挂载。

最后

准备采购硬件,查了下发现内存价格目前基本是最高点,感觉用之前拆下来的笔记本硬盘先凑合一段时间也可以,然后就暂时没有然后了……

(2023.05.24)用丈母娘淘汰下来的十年前的台式机,终于把 nas 搭起来了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注