需求
如下图,上传更新文件到在1号机器上的指定陌路上,剩下的所有的机器会自动同步更新到自己本地
NFS定义
NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。支持在异构系统之间数据的传送。
工作原理
NFS(Network File System,网络文件系统)是当前主流异构平台共享文件系统之一。主要应用在UNIX环境下。最早是由Sun Microsystems开发,现在能够支持在不同类型的系统之间通过网络进行文件共享,广泛应用在FreeBSD、SCO、Solaris等异构操作系统平台,允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,使得每个计算机的节点能够像使用本地资源一样方便地使用网上资源。换言之,NFS可用于不同类型计算机、操作系统、网络架构和传输协议运行环境中的网络文件远程访问和共享。
操作
在1号机器上安装NFS
1.软件安装
[root@ kl]#yum install nfs-utils rpcbind
2.定义服务器里要共享出去的目录给谁
#格式:共享目录 IP/网段 参数
#IP实例:172.16.1.18
#网段示例:172.16.1.0/24 或者 172.16.1.*
#参数:查看/var/lib/nfs/etab,rw是读写,all_squash是所有用户压缩成nfs匿名用户nfsnobody
[root@kl]#vim /etc/exports
/var/nfs 172.16.1.0/24(rw,no_root_squash,no_all_squash,sync)
这行代码的意思是把共享目录/var/nfs/共享给172.16.1.0这个网段所有ip,后面括号里的内容是权限参数,其中:
rw 表示设置目录可读写。
sync 表示数据会同步写入到内存和硬盘中,相反 rsync 表示数据会先暂存于内存中,而非直接写入到硬盘中。
no_root_squash NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。
no_all_squash 不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都不会拥有匿名用户权限。
如果有多个共享目录配置,则使用多行,一行一个配置。保存好配置文件后,需要执行以下命令使配置立即生效:
exportfs -r
3、创建共享目录
[root@ kl]#mkdir -p /usr/shareData
4、修改共享目录权限(可选)
[root@ kl]#chmod o+w /var/nfs/
5、.重启服务
[root@ kl]#systemctl restart rpcbind
[root@ kl]#systemctl restart nfs-utils
[root@kl]# netstat -antpu | grep 2049 #再次查看端口监听状态
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 :::2049 ::: * LISTEN +
[root@kl]# systemctl enable nfs-server.service #设置 NFS 开机自动启动。
在客户机上
1、安装rpcbind服务
客户端只需要安装rpcbind服务即可,无需安装nfs或开启nfs服务。
[root@ A]#yum -y install rpcbind
2、查看服务端已共享的目录,如果不存在,则NFS服务端出问题,需要重新排查
[root@ A]#showmount -e 172.16.1.220
Export list for 172.16.1.220:(已共享出来的服务器Ip)
/var/nfs/ 172.16.1.7(服务器已共享出来的目录)
3、建立挂载目录,执行挂载命令
把共享目录挂在到本地的 /mnt/share
[root@ A]#mkdir -p /mnt/share
[root@ A]# mount -t nfs 172.16.1.220:/var/nfs/ /mnt/share -o nolock,nfsvers=3,vers=3
如果不加 -onolock,nfsvers=3 则在挂载目录下的文件属主和组都是nobody,如果指定nfsvers=3则显示root。
如果要解除挂载,可执行命令:
[root@ A]#umount /mnt/share
设置开机自动挂载
方法一:
[root@ A]#vim /etc/rc.d/rc.local
在文件最后添加一行:
192.168.0.204:/usr/shareData /mnt/share nfs defaults,_netdev 1 1
保存并重启机器测试。
实现开机自动挂载 NFS 服务共享设备:
方法二:
[root@ A]#vi /etc/fstab
192.168.0.204:/usr/shareData /mnt/share nfs defaults,_netdev 1 1
可以重启验证;
测试验证
查看挂载结果,在客户端输入 df -h可查看挂载详情。
我遇到的问题*:
在执行 ‘showmount -e’时提示“clnt_create: RPC: Program not registered”;
重启NFS服务解决:systemctl restart nfs
不同环境处理方式不同,此地仅供参考
NFS 支持动态装载配置文件
[root@A]# exportfs –rv #重新读取配置文件不中断服务。
客户端挂载 NFS 服务的共享设备
[root@A]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.7G 4.0G 5.2G 44% /
tmpfs 996M 80K 996M 1% /dev/shm
/dev/sda1 485M 39M 421M 9% /boot
/dev/sr0 3.7G 3.7G 0 100% /mnt
192.168.0.204:/usr/shareData 99G 49G 46G 52% /usr/shareData 挂载成功;
*** 验证写入权限***
[root@A]# touch /mnt/share/a.txt #在 NFS 共享设备上创建文件。
touch: 无法创建"/mnt/share/a.txt": 权限不够
解决方法介绍
设置访问权限一般包含 2 部分
(1) 服务本身权限
(2) 目录访问权限
nfs 默认使用 nfsnobody 用户
[root@kl]# grep nfs /etc/passwd
rpcuser: x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody: x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
修改权限
[root@kl]# chmod 777 -R /media/ 不建议
或
[root@kl]# chown nfsnobody.nfsnobody -R /media/
再次验证写入权限:
[root@A]# touch /mnt/share/a.txt
[root@A]# ll !$
ll /mnt/share/a.txt
-rw-r–r-- 1 nfsnobody nfsnobody 0 5 月 24 2016 /mnt/share/a.txt
知识扩展
以下是一些 NFS 共享的常用参数:
ro #只读访问。
rw #读写访问。
sync #资料同步写入到内存与硬盘当中。
Async #资料会先暂存于内存当中,而非直接写入硬盘。
secure #NFS 通过 1024 以下的安全 TCP/IP 端口发送。
Insecure #NFS 通过 1024 以上的端口发送。
wdelay #如果多个用户要写入 NFS 目录,则归组写入(默认)。
no_wdelay #如果多个用户要写入 NFS 目录,则立即写入,当使用 async 时,无需此设置。
hide #在 NFS 共享目录中不共享其子目录。
no_hide #共享 NFS 目录的子目录。
subtree_check #如果共享/usr/bin 之类的子目录时,强制 NFS 检查父目录的权限(默认)。
no_subtree_check #和上面相对,不检查父目录权限。
all_squash #共享文件的 UID 和 GID 映射匿名用户 anonymous,适合公用目录。
no_all_squash #保留共享文件的 UID 和 GID(默认)。
root_squash #root 用户的所有请求映射成 nfsnobody 用户的权限(默认)。
no_root_squash #root 用户具有根目录的完全管理访问权限。
选项使用方法示例:
[root@A]# cat /etc/exports
/tmp/a/no_root_squash *(rw,no_root_squash)
/tmp/a/sync 192.168.0.0/24(rw,sync)
/tmp/a/ro 192.168.1.64(ro)
/tmp/a/all_squash 192.168.0.0/24(rw,all_squash,anonuid=500,anongid=500)
/tmp/a/async 192.168.3.0/255.255.255.0(async)
/tmp/a/rw 192.168.3.0/255.255.255.0(rw) 192.168.4.0/255.255.255.0(ro)
/tmp/a/root_squash *(rw,root_squash)