什么是NFS?
1台Linux主机的磁盘可以通过网络挂载到其他Linux主机上,实现云盘效果。
NFS是一套软件和协议,同时也是一种文件系统,可以直接把远程的磁盘挂载到本地使用。
我用NFS做什么?
我有1个斐讯N1盒子,但是内置的emmc存储空间很小,而且寿命很差。
我还有1个树莓派,它上面还插着1块SSD硬盘。
因此,我想把树莓派的SSD硬盘通过NFS挂载到斐讯N1上,这样斐讯N1也就有一块大磁盘可以用了,多省钱。
怎么搭建NFS呢?
非常简单,跟随我开始吧。
安装nfs
因为我的斐讯N1和树莓派其实都是Debian发行版,所以我实际参考了Debian的官方手册:https://wiki.debian.org/NFSServerSetup。
注意,在服务端以及客户端,都需要安装完全一样的nfs相关软件:
Shell
sudo apt install nfs-kernel-server portmap
1
sudoaptinstallnfs-kernel-serverportmap
nfs-kernel-server:NFS服务端,它会启动多个随机的监听端口用于各种用途。
portmap:古老的软件,nfs会把自己的监听端口注册给portmap,然后portmap对外提供查询服务,告知客户端NFS监听的实际端口。
启动nfs
在客户端和服务端都要启动!
Shell
sudo systemctl enable portmap
sudo systemctl start portmap
sudo systemctl enable nfs-server
sudo systemctl start nfs-server
1
2
3
4
5
sudosystemctlenableportmap
sudosystemctlstartportmap
sudosystemctlenablenfs-server
sudosystemctlstartnfs-server
导出目录(在服务端)
我现在登录树莓派了!
在服务端,需要配置共享哪些磁盘给客户端。
树莓派上,我计划把/home/pi/data共享出去,这个目录实际挂载的是一块SSD盘:
Shell
pi@raspberrypi:~ $ pwd
/home/pi
pi@raspberrypi:~ $ ll
total 4
drwxr-xr-x 7 pi pi 4096 Nov 20 17:52 data
1
2
3
4
5
pi@raspberrypi:~$pwd
/home/pi
pi@raspberrypi:~$ll
total4
drwxr-xr-x7pipi4096Nov2017:52data
编辑/etc/exports,将这块盘共享出去:
/home/pi/data *(rw,sync,all_squash,anonuid=1000,anongid=1000,no_subtree_check)
/home/pi/data:你要共享出去的目录
*:允许哪些客户端挂载,*表示任意客户端,也支持配置IP网段等限制方式。
(rw,sync,all_squash,anonuid=1000,anongid=1000,no_subtree_check):一些选项,下面逐一说明,
rw:允许客户端读写
sync:客户端写入后数据强制同步到服务端,可靠一些,但是写入会慢一些。
all_squash:无论客户端是什么登录用户,其创建/修改的文件后,文件的用户/组都设置为anonuid以及anongid。
anonuid:翻译过来是匿名uid,实际就是配置all_squash用的,所有修改的文件uid都是1000,而1000其实是服务端pi用户的linux user id。
anongid:匿名gid,所有修改文件的gid都是1000,实际就是服务端pi用户组的group id。
no_subtree_check:客户端访问时,服务端不检查共享目录的父级目录权限;否则一个/root/xxx的共享目录,对于客户端的uid=3用户来说是没有权限访问的,因为父目录/root对于a来说是没有权限的。
其实最难理解的就是squash以及anonuid/anongid的设定,其实NFS并不会认证用户,而是直接基于服务端和客户端的uid/gid做权限管理的。
NFS官方是建议服务端和客户端使用相同的用户名/组,对应相同的uid和gid,这样权限方面就比较一致。
那么,我上述的配置其实就是想实现:
客户端创建与修改的文件,在NFS上均以树莓派的pi用户作为属主,仅此而已。
为了生效,在服务端执行如下命令即可:
sudo exportfs -a
也可以查看服务端导出了哪些路径:
Shell
pi@raspberrypi:~ $ sudo exportfs -s
/home/pi/data *(rw,wdelay,root_squash,all_squash,no_subtree_check,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)
1
2
pi@raspberrypi:~$sudoexportfs-s
/home/pi/data*(rw,wdelay,root_squash,all_squash,no_subtree_check,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)
挂载NFS(在客户端)
登录斐讯N1了!
首先查看树莓派上导出了哪些路径:
Shell
root@aml:~# showmount -e 192.168.2.101
Export list for 192.168.2.101:
/home/pi/data *
1
2
3
root@aml:~# showmount -e 192.168.2.101
Exportlistfor192.168.2.101:
/home/pi/data*
之前说过NFS也是一种文件系统,无非是一种网络文件系统,所以mount -t nfs指定类型挂载到本地即可:
Shell
mount -t nfs 192.168.2.101:/home/pi/data /root/data
1
mount-tnfs192.168.2.101:/home/pi/data/root/data
看一下这块盘,其uid和gid都是1000,其实就是树莓派pi用户的uid和gid:
Shell
root@aml:~# ll data/
total 192
drwxr-xr-x 3 1000 1000 4096 Nov 20 21:27 dnsmasq_dig
-rw-r--r-- 1 1000 1000 159012 Nov 18 21:14 gfwlist.conf
-rw-r--r-- 1 1000 1000 900 Nov 18 21:18 gfwlist.py
drwxr-xr-x 3 1000 1000 4096 Nov 21 03:00 ilovegfw
drwx------ 2 1000 1000 16384 Nov 18 16:17 lost+found
drwxr-xr-x 3 1000 1000 4096 Nov 19 18:45 transmission-daemon
drwxr-xr-x 4 1000 1000 4096 Nov 18 16:34 yuerblog
1
2
3
4
5
6
7
8
9
root@aml:~# ll data/
total192
drwxr-xr-x3100010004096Nov2021:27dnsmasq_dig
-rw-r--r--110001000159012Nov1821:14gfwlist.conf
-rw-r--r--110001000900Nov1821:18gfwlist.py
drwxr-xr-x3100010004096Nov2103:00ilovegfw
drwx------21000100016384Nov1816:17lost+found
drwxr-xr-x3100010004096Nov1918:45transmission-daemon
drwxr-xr-x4100010004096Nov1816:34yuerblog
因为我在斐讯N1上是root用户,自然对任意uid都有权限访问,所以根本不关心是1000还是2000啦。
因为之前我的配置原因,我现在用root(其uid=0)创建一个文件,你会发现文件的uid还是1000,这就是all_squash以及anonuid/anongid的作用了:
Shell
root@aml:~/data# touch a
root@aml:~/data# ll
total 192
-rw-r--r-- 1 1000 1000 0 Nov 21 13:59 a
drwxr-xr-x 3 1000 1000 4096 Nov 20 21:27 dnsmasq_dig
-rw-r--r-- 1 1000 1000 159012 Nov 18 21:14 gfwlist.conf
-rw-r--r-- 1 1000 1000 900 Nov 18 21:18 gfwlist.py
drwxr-xr-x 3 1000 1000 4096 Nov 21 03:00 ilovegfw
drwx------ 2 1000 1000 16384 Nov 18 16:17 lost+found
drwxr-xr-x 3 1000 1000 4096 Nov 19 18:45 transmission-daemon
drwxr-xr-x 4 1000 1000 4096 Nov 18 16:34 yuerblog
1
2
3
4
5
6
7
8
9
10
11
root@aml:~/data# touch a
root@aml:~/data# ll
total192
-rw-r--r--1100010000Nov2113:59a
drwxr-xr-x3100010004096Nov2021:27dnsmasq_dig
-rw-r--r--110001000159012Nov1821:14gfwlist.conf
-rw-r--r--110001000900Nov1821:18gfwlist.py
drwxr-xr-x3100010004096Nov2103:00ilovegfw
drwx------21000100016384Nov1816:17lost+found
drwxr-xr-x3100010004096Nov1918:45transmission-daemon
drwxr-xr-x4100010004096Nov1816:34yuerblog
在服务端(树莓派)那一边看的话,是这样的:
Shell
pi@raspberrypi:~/data $ ll
total 192
-rw-r--r-- 1 pi pi 0 Nov 21 13:59 a
drwxr-xr-x 3 pi pi 4096 Nov 20 21:27 dnsmasq_dig
-rw-r--r-- 1 pi pi 159012 Nov 18 21:14 gfwlist.conf
-rw-r--r-- 1 pi pi 900 Nov 18 21:18 gfwlist.py
drwxr-xr-x 3 pi pi 4096 Nov 21 03:00 ilovegfw
drwx------ 2 pi pi 16384 Nov 18 16:17 lost+found
drwxr-xr-x 3 pi pi 4096 Nov 19 18:45 transmission-daemon
drwxr-xr-x 4 pi pi 4096 Nov 18 16:34 yuerblog
1
2
3
4
5
6
7
8
9
10
pi@raspberrypi:~/data$ll
total192
-rw-r--r--1pipi0Nov2113:59a
drwxr-xr-x3pipi4096Nov2021:27dnsmasq_dig
-rw-r--r--1pipi159012Nov1821:14gfwlist.conf
-rw-r--r--1pipi900Nov1821:18gfwlist.py
drwxr-xr-x3pipi4096Nov2103:00ilovegfw
drwx------2pipi16384Nov1816:17lost+found
drwxr-xr-x3pipi4096Nov1918:45transmission-daemon
drwxr-xr-x4pipi4096Nov1816:34yuerblog
开机自动挂载
编辑/etc/fstab文件:
192.168.2.101:/home/pi/data /root/data nfs defaults 0 1
然后验证一下fstab文件是否可以全部成功挂载:
mount -a
没错就完事了,重启试试自动挂载吧。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~