一、概念
NFS (Network File
System)网络文件系统,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利。
二、原理
如图,当NFS服务器设置了一个共享目录/home/public后,可以访问NFS服务器的NFS客户端就可以通过将挂载点目录挂载到本机目录下,来访问共享目录的全部内容。当服务器端配置客户端只读,客户端对目录只有读权限;当服务器端配置客户端可以读写,客户端即可以对目录进行读写。
NFS服务器与客户端由于是通过网络来进行数据的传送,所以NFS服务器会有一个相对应的网络端口,一般来说端口号为2049,但是由于文件系统的复杂,NFS还有其他的程序去随机启动一些别的端口(小于1024)
这时就需要用到远程过程调用(Remote Procedure Call,RPC)协议,rpc对外端口号为111,通过RPC来记录指定NFS服务器的端口号,并将端口号告知NFS客户端,从而客户端能够连接到端口进行数据传输。
在启动NFS服务器之前,需先启动RPC使得端口号能够注册,重启RPC后NFS服务器也需要进行重启,这里需要注意:更改NFS的配置后不需要再进行重启,只需要exportfs –rv即可使修改的/etc/exports生效。
三、通讯过程
NFS通讯过程:
1.服务器端起RPC服务,开启1111端口
2.服务器端起NFS服务,并向RPC注册端口信息
3.客户端起RPC服务,并向服务端的RPC发出请求
4.服务端的RPC告知客户端RPC端口信息
5.客户端得知端口号,进行连接和数据传输
四、配置(服务器端)
1.装包(默认存在)
nfs-utils:NFS主程序,rpcbind:PRC主程序
Mount /dev/sr0 /mnt
Systemctl stop firewalld
Setenforce 0
2.[root@localhost ~]# systemctl restart nfs
重启
查看NFS软件包
#rpm -qa | egrep "nfs|rpcbind"
3.配置文件为/etc/exports
格式为:
输出目录 客户端 选项 [访问权限,用户映射,其他]
输出目录: 需要共享的目录路径
客户端: 服务的用户对象
选项: 共享的权限,紧跟客户端列
例:
Vim /etc/exports
(1)/test *(ro) 即共享目录为/test,所有用户都能进行只读
(2)/haha 192.168.11.128(rw) 共享目录/haha只有192.168.11.128可以读写
(3)/test *(ro,all_squash) 在1的基础上使所有用户都被压缩为匿名用户
访问权限选项:
Rw 表示可读写
ro Read-only表示只能读权限
Sync 请求或者写入数据时,数据同步写入到NFS server的硬盘中后才会返回
Async 不同步
no_root_squas 访问共享目录的用户如果是root的话,它对该目录具有root权限。
root_squash 访问共享目录的用户如果是root的话,会被压缩成为nobody用户身份。
all_squash 不管访问共享目录的用户身份如何,它的权限都将被压缩成为匿名用户,同时他们的udi和gid都会变成nobody或nfsnobody账户的uid,gid。
No_all_squash
但不同系统有可能匿名用户的uid,gid不同。因为此处我们需要服务端和客户端之间的用户是一样的。比如说:服务端指定匿名用户的UID为2000,那么客户端也一定要存在2000这个账号才可以
anonuid anonuid就是匿名的uid和gid。说明客户端以什么权限来访问服务端,在默认情况下是nfsnobody。Uid65534.
anongid 同anongid,就是把uid换成gid而已
4.对配置进行保存
[root@localhost ~]# exportfs -r
5.查看共享信息
[root@localhost ~]# showmount -e 查看本地主机共享信息
[root@localhost ~]# showmount -e 192.168.11.128 查看指定主机共享信息
五、配置(客户端)
#mount (服务端地址)192.168.11.128:/test /mnt
将服务端下的/test目录挂载到客户端的/mnt目录下
六、查看
[root@localhost ~]# ll /mnt
在客户端如果要删除haha文件需要在服务端的主配置文件更改为
test *(rw)
服务端将权限更改:
[root@localhost ~]# chmod o+w /test
[root@r ~]# ll -d /test
drwxr-xrwx. 2 root root 17 2月 11 10:28 /test
然后在客户端删除/mnt/test
七、练习
某公司需要在网络上共享一个文件夹,所有人都只有只读权限,且只有192.168.1.0/24子网的用户可以访问,试通过NFS共享该文件夹。NFS服务器的IP地址是192.168.1.1。
具体操作步骤如下:
(1)以root身份登录,在/目录下创建目录share。
#mkdir share
(2)编辑/etc/exports文件,在该文件中加入下面的命令行。
/share 192.168.1.0/24(ro,root_squash)
“/share” 表示要共享的目录,192.168.1.0/24表示允许访问的主机(这里是一个子网的主机),括号内的ro表示客户机上的用户对该共享目录只有只读权 限,root_squash表示当客户机上的root用户访问该共享目录时,映射该用户为匿名用户,即当客户机上的root用户访问该共享目录时相当于服务器上的anonymous(nobody)用户。
(3)在192.168.1.0/24子网上的任意一台客户机上安装共享目录。
#mount 192.168.1.1:/share /mnt
上面命令行的意思是:将192.168.1.1上的/share目录作为一个分区挂接到本机的/mnt目录下。
(4)测试权限。
进入/mnt目录建立目录test,此时会出现下面的提示
[ root@ /mnt]#mkdir: cannot create directory `mydir': Permission` denied
因为在步骤(2)中的命令行中加了参数ro,任何人对该共享目录都只有只读权限