某个程序运行时候会产生大量日志文件,这些文件要保留起来供用户下载。但同时,网站本身的访问速度也很重要。
显然,我负担不起一个访问速度快,硬盘又大的服务器。为了这个功能就上 cdn 似乎也不太现实。所以,我选择了使用 NFS ,把这些文件保存到一个容量较大的服务器上。
鉴于 FreeBSD 和 Linux 的 NFS 配置过程有一些差别,而网上的资料比较少,我在这里记录一下踩坑和排查过程。
主要参考:
- https://docs.freebsd.org/en/books/handbook/network-servers/#network-nfs
- https://man.freebsd.org/cgi/man.cgi?query=exports&sektion=5&format=html
首先需要配置的是/etc/exports
,参照文档的指示,加上一行:
1 | /home/logs -alldirs 114.514.1919.810 |
表示将/home/logs/
下的所有子目录都共享到 114.514.1919.810 这个客户端上。
再在/etc/rc.conf
中加入:
1 | rpcbind_enable="YES" |
启用所需的服务。
启动 nfsd:
1 | service nfsd start |
重载 mountd,读取配置文件:
1 | service mountd reload |
到之前配置的客户端上,开启 NFS 功能:
1 | sysrc nfs_client_enable="YES" |
挂载:
1 | mount server:/home/logs /mnt |
理论上到这里就可以挂载成功了,但是我却失败了:
1 | mount.nfs: access denied by server while mounting |
这里提示的 access denied 和用户的权限没有任何关系,是挂载的时候被 NFS 服务端拒绝。所以真正的问题是服务端配置不正确。
回到服务端,查看共享目录:
1 | showmount -e 192.168.1.1 |
得到结果:
1 | Export list for 192.168.1.1: |
很明显,没有共享出去任何目录。但是,之前配置文件的语法是正确的,问题出在哪里呢?
查看系统日志:
1 | cat /var/log/messages |
发现了这样的记录:
1 | bad exports list line '/home/logs': symbolic link in export path or statfs failed |
这一段记录说明了原因,/home/logs
路径中存在软链接,所以不能共享。略加思考可以发现,和部分 Linux 发行版不同的是,在 FreeBSD 中,/home
是/usr/home
的软链接。
将
1 | /home/logs -alldirs 114.514.1919.810 |
改为
1 | /usr/home/logs -alldirs 114.514.1919.810 |
重载 mountd,读取配置文件:
1 | service mountd reload |
回到客户端上,运行:
1 | mount server:/usr/home/logs /mnt |
成功挂载。