使用 freebsd 搭建家用 nas

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

freebsd 安装

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

zfs 操作

不用 mirror 或 raid(费硬盘),准备直接 stripe 保存,每天快照,每周 send/recv 增量备份所有快照。

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

zpool create data /dev/ada1 /dev/ada2
zpool create backup /dev/ada3

隐藏快照目录:

# hidden by default, set explicitly again
zfs set snapdir=hidden data
zfs set snapdir=hidden backup

一般来说这个目录默认是隐藏的,但还是手动设置一下。

每天快照:

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

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

初始备份:

zfs send -R data@20220426 | zfs recv -F -o compression=zstd-19 backup

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

之后的每周增量备份:

zfs send -RI data@old data@new | zfs recv backup

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

nfs 设置

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

/path/to/shared/data -maproot=root -network 192.168.0.1/24

所有接入的客户端都有 data 的读写权限,方便查看和上传。权限控制由防火墙来设置,需要在路由器配置可以接入的设备的 ip。

接着在 /etc/rc.conf 添加

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

然后启动服务:

service nfs start
service rpcbind start
service mountd start

客户端就可以通过挂载 nfs 查看和上传了。mac 和 windows 都自带了 nfs 客户端,具体启用方式可以 google 搜一下。

防火墙设置

用的是 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 111 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 111 in via $pif
$cmd 00010 allow log udp from $iprange to me 2049 in via $pif
$cmd 65534 deny all from any to any via $pif

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

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

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

然后启动服务:

service ipfw start

最后

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

发表回复

您的电子邮箱地址不会被公开。