NFS(Network File System)即网络文件系统,是 FreeBSD 支持的文件系统中的一种,它允许网络中 的计算机之间通过 TCP/IP 网络共享资源。在 NFS 的应用中,本地 NFS 的客户端应用可以透明地读写 位于远端 NFS 服务器上的文件,就像访问本地文件一样。其实大部分的网络文件共享都是基于TCP/IP(更加的安全)的,极有少部分并不是TCP/IP的,例如:TFTP(走的是UDP协议)等。
NFS 最早是由 Sun 公司发展出来的,后被逐渐完整以及整合至 Linux 内核。
它就是是可以透过网络,让不同的主机、不同的操作系统可以共享存储
NFS 在文件传送或信息传送过程中依赖于 RPC 协议。远程过程调用 (Remote Procedure Call) 是能使 客户端执行其他系统中程序的一种机制,所以只要用到 NFS 的地方都要启动 RPC 服务,不论是 NFS SERVER 或者 NFS CLIENT 。这样 SERVER 和 CLIENT 才能通过 RPC 来实现 PROGRAM PORT 的对应。可以这么理解 RPC 和 NFS 的关系:NFS 是一个文件系统,而 RPC 是负责数据信息的传输,NFS 本身只是文件数据的控制和配置。
实验环境:两台服务器
10.10.10.11
10.10.10.12
/etc/exports 文件的配置格式为:
NFS共享目录 NFS客户端地址1(参数 1,参数 2,参数 3…) 客户端地址 2(参数 1,参数 2,参数 3…)
NFS共享目录 NFS客户端地址 (参数 1,参数 2,参数 3…)
在 NFS 配置文件中是按行匹配的,一行就是一个完整的共享,另一行就是另外一个共享,以此类推。
相关的NFS命令
#显示NFS服务器加载的信息
showmount [选项] [参数]
showmount -e ip #-e:显示NFS服务器上所有的共享目录
showmount -d ip #-d:仅显示已被NFS客户端加载的目录
#查看挂载
mount -t nfs ip:/file /file1
/etc/exports 配置文件参数解释
rw:read-write,可读可写,注意,仅仅这里设置成读写客户端还是不能正常写入,还要正确地设置共享目录的权限 ;
ro:read-only,只读;
sync:文件同时写入硬盘和内存,更加的安全,使用的速度会较慢;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS 客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说, 也拥有 root 权限。显然开启这项是不安全的;
root_squash:NFS 客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说,拥 有匿名用户权限,通常他将使用 nobody 或 nfsnobody 身份 ;
all_squash:不论 NFS 客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
anonuid:匿名用户的 UID 值,通常是 nobody 或 nfsnobody,可以在此处自行设定;
anongid:匿名用户的 GID 值;
哪怕有一点的安全性提升,都需要管理员进行操作提升系统的安全性。
$ yum -y install rpcbind nfs-utils
#服务器端安装 rpcbind 和 NFS-utils 软件包
$ mkdir /nfs1 /nfs2
#共享点
$ chown -R nobody:nobody /nfs1 /nfs2
#给匿名用户权限
$ ls -ld /nfs1 /nfs2
drwxr-xr-x 2 nobody nobody 6 Sep 5 11:02 /nfs1
drwxr-xr-x 2 nobody nobody 6 Sep 5 11:02 /nfs2
$ vim /etc/exports
#修改配置文件
#共享目录的绝对路径 NFS客户端地址(共享权限参数,...,...)
/nfs1 10.10.10.12(rw,async,no_root_squash)
/nfs2 10.10.10.0/24(ro,async,no_root_squash)
#CentOS7
$ systemctl restart nfs && systemctl restart rpcbind
$ systemctl restart nfs
#CentOS6
#$ service nfs restart && service rpcbind restart
#$ service nfs restart
#需要在重启下nfs
#格式: showmount -e
#查看挂载情况
$ showmount -e 10.10.10.11
Export list for 10.10.10.11:
/nfs2 10.10.10.0/24
/nfs1 10.10.10.12
#拷贝测试文件
$ cp -a /etc/fstab /nfs1/
$ cp -a /var/log/messages /nfs2/
$ /etc/init.d/rpcbind status
# 查看 rpcbind 当前状态
LANG=en # 查看当前语言
$ rpcinfo -p localhost | grep nfs
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
$ lsof –i :111
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 714 rpc 6u IPv4 18451 0t0 UDP *:sunrpc
rpcbind 714 rpc 8u IPv4 18455 0t0 TCP *:sunrpc (LISTEN)
rpcbind 714 rpc 9u IPv6 18456 0t0 UDP *:sunrpc
rpcbind 714 rpc 11u IPv6 18458 0t0 TCP *:sunrpc (LISTEN)
#查看NFS上所有的共享目录
$ showmount -e 10.10.10.11
Export list for 10.10.10.11:
/nfs2 10.10.10.0/24
/nfs1 10.10.10.12
$ mkdir -pv /nfs1 /nfs2
#创建挂载点
$ chown -R nobody:nobody /nfs1 /nfs2
#给匿名用户权限
#格式:mount -t nfs ip:/file /file1
#在客户端进行 NFS 的挂载操作
$ mount -t nfs 10.10.10.11:/nfs1/ /nfs1/
#把nfs服务器的/nfs1挂载到客户端的/nfs1
$ mount -t nfs 10.10.10.11:/nfs2/ /nfs2/
#这两个目录都是同步的,查看文件是否同步
$ ls -l /nfs1 /nfs2
/nfs1:
total 4
-rw-r--r-- 1 root root 583 Sep 5 11:11 fstab
/nfs2:
total 824
-rw------- 1 root root 841478 Sep 5 11:06 messages
#查看挂载点
$ mount | grep nfs
10.10.10.11:/nfs1 on /nfs1 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.12,local_lock=none,addr=10.10.10.11)
10.10.10.11:/nfs2 on /nfs2 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.12,local_lock=none,addr=10.10.10.11)
#10.10.10.12 /nfs1 可读可写测试
$ cat /nfs1/fstab #可读该文件
$ echo "Hello NFS FileSystem" > /nfs1/test.txt
$ cat /nfs1/test.txt
Hello NFS FileSystem
#10.10.10.12 /nfs2 只读测试
$ cat /nfs2/messages #可读该文件
$ echo "Hello NFS FileSystem" > /nfs2/test.txt
-bash: /nfs2/test.txt: Read-only file system #只读目录
#卸载客户端的挂载目录
$ umount 挂载点
#停止服务器端的共享
$ exportfs -au
#自动挂载:
$ vim /etc/fstab
#格式:服务器ip地址:/服务器共享目录 /本地挂载目录 nfs defaults 0 0
10.10.10.11:/nfs1 /nfs1 nfs defaults 0 0
$ mount -a
#重启机器后会自动进行挂载操作
$ reboot
...
$ mount | grep nfs
10.10.10.11:/nfs1 on /nfs1 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.12,local_lock=none,addr=10.10.10.11)
管理NFS共享文件系统列表
补充说明
exportfs 命令用来管理当前NFS共享的文件系统列表。
参数:
-a 打开或取消所有目录共享。
-o options,...指定一列共享选项,与 exports(5) 中讲到的类似。
-i 忽略 /etc/exports 文件,从而只使用默认的和命令行指定的选项。
-r 重新共享所有目录。它使 /var/lib/nfs/xtab 和 /etc/exports 同步。
它将 /etc/exports 中已删除的条目从 /var/lib/nfs/xtab 中删除,将内核共享表中任何不再有效的条目移除。
-u 取消一个或多个目录的共享。
-f 在“新”模式下,刷新内核共享表之外的任何东西。 任何活动的客户程序将在它们的下次请求中得到 mountd添加的新的共享条目。
-v 输出详细信息。当共享或者取消共享时,显示在做什么。 显示当前共享列表的时候,同时显示共享的选项。
显示NFS服务器加载的信息
补充说明
showmount命令 查询“mountd”守护进程,以显示NFS服务器加载的信息。
语法
showmount(选项)(参数)
选项
-d:仅显示已被NFS客户端加载的目录;
-e:显示NFS服务器上所有的共享目录。
参数
NFS服务器:指定NFS服务器的ip地址或者主机名。