一、什么是NFS
NFS是Network File System的缩写及网络文件系统。NFS的主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
通常中小企业首选NFS作为集群架构的存储,但如果是大型网站, 会用到复杂的分布式文件系统,如FastDFS,glusterfs等等
二、NFS相关协议及软件
协议
- nfs:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器
- rpcbind:主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,rpcbind会将所管理的与服务器对应的端口提供给客户端,从而使客户端可以通过该端口向服务器请求服务。
软件
- nfs-utils*:包括NFS命令与监控服务
- rpcbind*:支持安全NFS RPC服务的连接
三、NFS挂载原理
![](https://img.haomeiwen.com/i21046519/1df06c680f4f3969.jpg)
- 服务器端nfs向rpc注册随机端口,并暴露rpc自己的111端口
- 客户端通过rpc的111端口来获取服务器端nfs端口
- 客户端通过服务器nfs端口来建立连接
- 客户端建立本地挂载点,nfs服务器将共享目录映射在本地客户端
四、NFS服务器配置
- NFS服务器的配置相对简单,只需要在相应的配置文件中进行设置,然后启动NFS服务器即可。
- NFS服务器的配置文件为/etc/exports,这个文件使NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要手动建立,然后在文件中写入配置文件。
- /etc/exports 文件格式:
共享目录 客户端1(访问权限,用户映射,其他) 客户端2(访问权限,用户映射,其他)
访问权限选项:
设置输出目录只读:ro
设置输出目录读写:rw
用户映射选项:
root_squash:将root用户的访问映射为匿名(nfsnobody)用户uid和gid;(默认生效)
no_root_squash:保留管理员权限,以服务器管理员的权限管理;
all_squash:将访问用户及访问组都映射为指定uid,gid的匿名用户;
anonuid=xxx
anongid=xxx
其他选项:
sync:将数据同步写入内存缓存区与磁盘中,效率低,但可以保证数据的一致性(同步);
async:将数据先保存在内存缓冲区中,必要时才写入磁盘(异步);
五、NFS实验
实验环境
server 192.168.200.101
client 192.168.200.103
- 安装软件包
[root@server ~]# yum -y install nfs-utils* rpcbind*
- 服务器端启动nfs和rpcbind
[root@server ~]# systemctl start rpcbind && systemctl enable rpcbind
Created symlink from /etc/systemd/system/multi-user.target.wants/rpcbind.service to /usr/lib/systemd/system/rpcbind.service.
[root@server ~]# systemctl start nfs && systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@server ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100024 1 udp 58264 status
100024 1 tcp 51366 status
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 60204 nlockmgr
100021 3 udp 60204 nlockmgr
100021 4 udp 60204 nlockmgr
100021 1 tcp 53436 nlockmgr
100021 3 tcp 53436 nlockmgr
100021 4 tcp 53436 nlockmgr
rpcbind先于nfs启动,nfs先rpc进行端口注册,rpc不会主动向nfs询问端口信息
rpcinfo -p localhost 检查向rpcbind注册的服务端口
- 服务器端准备共享目录
[root@server ~]# mkdir /data
[root@server ~]# chmod o+w /data/
[root@server ~]# mount /dev/sde5 /data
为了不让系统被写满,将一个分区挂载在/data/目录上,作为数据卷
- 编写nfs服务器端配置文件/etc/exports
[root@server ~]# vi /etc/exports
/data/ 192.168.200.103(rw,root_squash,sync)
[root@server ~]# systemctl reload nfs
[root@server ~]# exportfs
/data 192.168.200.103
[root@server ~]# showmount -e 192.168.200.101
Export list for 192.168.200.101:
/data 192.168.200.103
[root@client ~]# showmount -e 192.168.200.101
Export list for 192.168.200.101:
/data 192.168.200.103
将data目录作为共享目录,rw权限,nfsnobody权限,同步读写
服务器端,客户端检查nfs共享状态
- 客户端挂载
[root@client ~]# mkdir /test
[root@client ~]# mount -o vers=3 192.168.200.101:/data /test
[root@client ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 xfs 18G 4.7G 14G 27% /
devtmpfs devtmpfs 899M 0 899M 0% /dev
tmpfs tmpfs 913M 84K 913M 1% /dev/shm
tmpfs tmpfs 913M 9.0M 904M 1% /run
tmpfs tmpfs 913M 0 913M 0% /sys/fs/cgroup
/dev/sda1 xfs 297M 144M 154M 49% /boot
tmpfs tmpfs 183M 16K 183M 1% /run/user/42
tmpfs tmpfs 183M 0 183M 0% /run/user/0
192.168.200.101:/data nfs 20G 44M 19G 1% /test
使用nfs V3版本挂载,避免同步延迟
- 检测连通性
[root@client test]# echo test > try.text
[root@server data]# cat try.text
test
六、用户映射详解
root_squash:
将root用户的访问映射为匿名(nfsnobody)用户uid和gid;(默认生效)
[root@server ~]# vi /etc/exports
/data/ 192.168.200.103(rw,root_squash,sync)
[root@server ~]# systemctl reload nfs
[root@client test]# echo test > try.text
[root@client test]# ll
-rw-r--r-- 1 nfsnobody nfsnobody 5 Jan 31 11:14 try.text
[root@server data]# ll
-rw-r--r-- 1 nfsnobody nfsnobody 5 Jan 31 11:14 try.text
no_root_squash:
保留管理员权限,以服务器管理员的权限管理;
[root@server ~]# vi /etc/exports
/data/ 192.168.200.103(rw,no_root_squash,sync)
[root@server ~]# systemctl reload nfs
[root@client test]# echo test > try1.text
[root@client test]# ll
-rw-r--r-- 1 root root 5 Jan 31 11:20 try1.text
-rw-r--r-- 1 nfsnobody nfsnobody 5 Jan 31 11:14 try.text
[root@server data]# ll
-rw-r--r-- 1 root root 5 Jan 31 11:20 try1.text
-rw-r--r-- 1 nfsnobody nfsnobody 5 Jan 31 11:14 try.text
all_squash:
将访问用户及访问组都映射为指定uid,gid的匿名用户;
anonuid=xxx
anongid=xxx
[root@client ~]# groupadd -g 2222 test_all_squash
[root@client ~]# useradd -u 2222 -g 2222 test_all_squash
[root@client ~]# id test_all_squash
uid=2222(test_all_squash) gid=2222(test_all_squash) groups=2222(test_all_squash)
[root@server ~]# vi /etc/exports
/data/ 192.168.200.103(rw,all_squash,anonuid=2222,anongid=2222,sync)
[root@server ~]# systemctl reload nfs
[root@client test]# echo test > try2.text
[root@client test]# ll
-rw-r--r-- 1 root root 5 Jan 31 11:20 try1.text
-rw-r--r-- 1 test_all_squash test_all_squash 5 Jan 31 11:41 try2.text
-rw-r--r-- 1 nfsnobody nfsnobody 5 Jan 31 11:14 try.text
[root@server data]# ll
-rw-r--r-- 1 root root 5 Jan 31 11:20 try1.text
-rw-r--r-- 1 2222 2222 5 Jan 31 11:41 try2.text
-rw-r--r-- 1 nfsnobody nfsnobody 5 Jan 31 11:14 try.text
七、相关命令(服务器端)
exportfs命令
格式:exportfs 【-aruv】
-a 全部挂载卸载
-r 重新挂载,卸载
-u 卸载单一目录
-v 输出详细信息
exportfs -au 卸载
exportfs -ra重新挂载
rpcinfo命令
rpcinfo -p 查看rpc开启的端口所提供的程序
网友评论