环境:
nfsserver:
系统:CentOS Linux release 7.4 (Core)
内核版本:3.10.0-693.11.6.el7.x86_64
IP地址:10.45.10.151
nfsclient:
系统:CentOS Linux release 7.4 (Core)
内核版本:3.10.0-693.11.6.el7.x86_64
IP地址:10.45.29.216
nfs软件:
nfs-utils: NFS服务的主程序
rpcbind: RPC服务程序 (服务端和客户端都需要安装)
操作步骤:
* 安装部署
一)在nfsserver上操作
1)查看是否安装rpcbind和nft-utils服务
[root@nfsserver ~]# rpm -qa nfs-utils rpcbind
2)如果没有安装,则使用yum来安装
[root@nfsserver ~]# yum -y install rpcbind nfs-utils
在查看一下
[root@nfsserver ~]# rpm -qa nfs-utils rpcbind
nfs-utils-1.3.0-0.48.el7_4.2.x86_64
rpcbind-0.2.0-42.el7.x86_64
启动服务
1)启动rpc服务
[root@nfsserver ~]# systemctl enable rpcbind
[root@nfsserver ~]# systemctl start rpcbind
[root@nfsserver ~]# ps -ef|grep rpc
rpc 11200 1 0 10:52 ? 00:00:00 /sbin/rpcbind -w
root 11202 3049 0 10:53 pts/0 00:00:00 grep --color=auto rpc
[root@nfsserver ~]# 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
(RPC服务对外使用111端口)
2)启动nfs服务
~~~
[root@nfsserver ~]# 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@nfsserver ~]# systemctl start nfs
[root@nfsserver ~]# 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
100024 1 udp 57003 status
100024 1 tcp 49338 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
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 47873 nlockmgr
100021 3 udp 47873 nlockmgr
100021 4 udp 47873 nlockmgr
100021 1 tcp 37146 nlockmgr
100021 3 tcp 37146 nlockmgr
100021 4 tcp 37146 nlockmgr
~~~
二)在nfsclient上操作
1)安装rpcbind服务
[root@nfsclinet ~]# rpm -qa rpcbind
[root@nfsclinet ~]# yum -y install rpcbind showmount
查看一下
[root@nfsclinet ~]# rpm -qa rpcbind
rpcbind-0.2.0-42.el7.x86_64
启动服务:
[root@nfsclinet ~]# systemctl enable rpcbind
[root@nfsclinet ~]# systemctl start rpcbind
* 简单测试
1)在nfsserver上配置
假如我需要把如下目录共享给nfsclient
[root@nfsserver ~]# ll /data/video/
total 0
编写nfs配置文件
[root@nfsserver ~]# vim /etc/exports
#shared /data/video for pet project at 20180412
/data/video 10.45.29.216(rw,sync)
~
重新载入nfs服务
[root@nfsserver ~]# systemctl reload nfs
在本地检查,看看有没有共享出来
[root@nfsserver ~]# showmount -e localhost
Export list for localhost:
/data/video 10.45.29.216
2)在客户端检查(nfsclient)
[root@nfsclinet ~]# showmount -e 10.45.10.151
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
解答:防火墙没开放
firewall-cmd --add-port=892/udp --permanent
firewall-cmd --add-port=892/tcp --permanent
firewall-cmd --add-port=111/udp --permanent
firewall-cmd --add-port=111/tcp --permanent
firewall-cmd --reload
然后在查看一下
[root@nfsclinet ~]# showmount -e 10.45.10.151
Export list for 10.45.10.151:
/data/video 10.45.29.216
然后执行挂载命令
[root@nfsclinet ~]# mount -t nfs 10.45.10.151:/data/video /upload/video
[root@nfsclinet ~]# cd /upload/video/
问题2:
[root@nfsclinet video]# touch b.txt
touch: cannot touch ‘b.txt’: Permission denied
解决办法:
[root@nfsserver ~]# useradd -u 2005 -s /sbin/nologin www
[root@nfsclinet ~]# useradd -u 2005 -s /sbin/nologin www
/data/video 10.45.29.216(rw,sync,anonuid=2005,anongid=2005)
(注意:这里的IP可以写多个,如/data/video 10.45.29.216(rw,sync,anonuid=2005,anongid=2005) 192.168.119.50(ro,sync)
[root@nfsserver ~]# systemctl reload nfs
[root@nfsserver video]# chown -R www.root /data/video/
[root@nfsclinet video]# touch b.txt
[root@nfsclinet video]# ll b.txt
-rw-r--r-- 1 www www 0 Apr 12 13:50 b.txt
(通过以上测试,就发现nfs客户端是以我们配置好的用户,写入文件)
查看nfs服务器端
[root@nfsserver video]# ll
total 8
-rw-r--r-- 1 www root 0 Apr 12 13:40 a.txt
-rw-r--r-- 1 www www 0 Apr 12 13:50 b.txt
最后:由于重启nfsclient客户端服务器,挂载的会丢失,我们可以通过如下操作
[root@nfsclinet ~]# echo "mount -t nfs 10.45.10.151:/data/video /upload/video" >> /etc/rc.local
nfs服务器端参数详解:
rw: 读写
ro: 只读
sync:同步(请求或写入数据,数据同步写入到NFSserver)
async:异步
all_squash: 不管访问nfs server共享目录的身份是什么,他的权限都被压缩为匿名用户,同时uid和gid都变成nfsnobody,或者是你指定的annouid用户
注意:(确保所有服务器对nfs共享目录具备相同的权限,第一种方式: all_squash 把所有客户端都压缩成匿名用户,这个匿名用户通过anonuid来指定,所有客户端都要有相同的uid和gid的用户)
anonuid: 指定匿名用户的uid
anongid: 指定匿名用户的gid
查看:
[root@nfsserver ~]# cat /var/lib/nfs/etab
/data/video 10.45.29.216(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=2005,anongid=2005,sec=sys,secure,root_squash,all_squash)
nfs客户端挂载的参数
defaults: 相当于rw,suid,dev,exec,auto,nouser,and async
noatime: 不更新文件系统inode的时间戳
auto: 自动挂载
noexec: 不允许执行程序 (即使设置咯,php程序还可以执行的)
nosuid: 不允许有suid
查看客户端挂载参数:
[root@nfsclinet video]# cat /proc/mounts
10.45.10.151:/data/video /upload/video nfs4 rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.45.29.216,local_lock=none,addr=10.45.10.151 0 0