一、nfs简介
nfs(network file system)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。
nfs主要适用用linux与Unix系统间文件共享,由于是nfs是明文传输,无法加密,而且只能基于IP认证,所以一般用于公司或校园的局域网。
nfs的优点就是能大量节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,而且访问的时候就跟访问自己的家目录一样方便,而且数据同步非常稳定、迅速。
nfs是运行在应用层的协议,监听于2049/tcp端口和2049/udp套接字。
二、nfs的组成
nfs可以由一台nfs服务器和N台客户机组成
客户机通过tcp/ip协议网络远程访问存放在NFS服务器上的数据
在nfs服务器正式启用前,根据实际环境和需求,配置一些nfs参数
三、nfs的应用场景
多个机器共享一台CDROM或其他设备,这样比多台机器都装一台CDROM方便的多
大型局域网内,配置一台NFS服务器用于放置所有用户的home目录,不管你周围局域网哪台工作站上登录,都是同一目录,能给工作带来极大的方便
不同客户端如果通过NFS观看影视文件,能节省大量本地空间
在客户端完成的工作数据,可以备份到NFS服务器上自己的路径下
四、nfs的工作原理
nfs是通过rpc(远程过程调用协议)来实现网络文件系统共享的,rpc是通过网络从远程计算机上请求服务器,不需要通过底层网络技术的协议
nfs服务器端运行了四个进程:
nfsd
mountd
idmapd
portmapper
idmapd ----实现用户账号的集中映射,把所有的账号都映射成NFSNOBODY,但在访问时却能以本地用户访问,所以需要目录的权限
mountd ----用户验证客户端是否在允许访问此NFS文件系统的客户端列表中,在就允许访问
nfsd ----nfs的守护进程,监听在2049端口上
portmapper ---nfs服务器的rpc服务,监听在111端口,用于管理远程过程调用
举个例子说明工作过程:
客户机A想查看file文件的信息,此信息存储在远程NFS服务器端主机B(挂载在本地目录/nfs中),A把查看文件信息的请求发给内核,内核通过NFS模块明白是远程主机B上的,内核通过RPC协议吧请求封装成rpc请求通过tcp111端口发给主机B的portmapper,portmapper告诉A主机B主机的mountd服务所在端口,然后A去找mountd请求验证,mountd看他有的允许列表,如果A在表内,就给一个令牌给A,A拿着这个令牌去找B主机的nfsd进程,请求查看需要的文件,B主机的nfsd进程发起本地调用,向B内核请求查看主机A要查看的文件信息,B内核执行系统调用,将结果返回给nfsd服务,nfsd服务器收到后将结果封装成rpc请求报文并用过tcp/ip协议发给主机A
五、配置文件
nfs的主配置文件是/etc/exports,此文件定位NFS系统的输出目录(共享目录),访问权限参数,允许访问的主机参数,该文件默认为空,文件每一行提供一个共享目录的使者,其格式为
《共享目录》 【 客户端1IP(权限参数)】 【客户端2IP(权限参数)】
共享目录为你想要共享出去的目录绝对路径
客户端ip为你想共享给哪些或哪个主机
权限参数为用户访问的权限,用户映射的选项
exportfs -r 重读配置文件,使其立即生效,无需重启服务
访问权限选项:
访问权限选项 | 说明 |
---|---|
ro | 设置输出目录只读 |
rw | 设置输出目录可读写 |
用户映射选项:
用户映射选项 | 说明 |
---|---|
all_squash | 将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody) |
no_all_squash | 不将远程访问的所有普通用户及所属用户组都映射为匿名用户或用户组(默认设置) |
root_squash | 将root用户及所属用户组都映射为匿名用户或用户组(默认设置) |
no_root_squash | 不将root用户及所属用户组都映射为匿名用户或用户组 |
anonuid=xxx | 将远程访问的所有用户都映射为匿名用户,并指定该匿名用户为本地用户帐户(UID=xxx) |
anongid=xxx | 将远程访问的所有用户组都映射为匿名用户组,并指定该匿名用户组为本地用户组(GID=xxx) |
常用的其他选项:
其他选项 | 说明 |
---|---|
secure | 限制客户端只能从小于1024的TCP/IP端口连接NFS服务器(默认设置) |
insecure | 允许客户端从大于1024的TCP/IP端口连接NFS服务器 |
sync | 将数据同步写入内存缓冲区或磁盘中,效率较低,但可保证数据一致性 |
async | 将数据先保存在内存缓冲区中,必要时才写入磁盘 |
wdelay | 检查是否有相关的写操作,如果有则这些写操作一起执行,可提高效率(默认设置) |
no_wdelay | 若有写操作则立即执行,应与sync配置使用 |
subtree_check | 若输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认设置) |
no_subtree_check | 即使输出目录是一个子目录,NFS服务亦不检查其父目录的权限,可提高效率 |
nohide | 若将一个目录挂载到另一个目录之上,则原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需启用hide选项 |
六、nfs使用:
nfs安装
yum -y install rpcbind nfs-utils
启动服务
systemctl start rpcbind nfs-server
shoumount命令测试共享目录状态
-a 显示指定NFS服务器的所有客户端主机及其所连接的目录
-d 显示指定NFS服务器的已被客户端连接的所有输出目录
-e显示指定NFS服务器的所输出的共享目录
客户端临时挂载NFS文件系统
yum install rpcbind nfs-utils -y
mount -t nfs ip:/path1 /path2
客户端设置自动挂载nfs
vim /etc/fstab
ip/path /path2 nfs defaults,_netdev 0 0
mount -a
df -h
检查输出目录所使用的选项:
在配置文件/etc/exports中,即使在命令行中只设置了一两个选项,但在真正输出目录时,实际上还带有很多默认的选项。通过查看/var/lib/nfs/etab文件,可以看到具体使用了何选项
七、NFS使用实例:
1.手动搭建一个nfs服务器
开放/nfs/shared目录,供所有用户查阅资料
开放/nfs/upload目录为172.16.12.0/24网段的数据上传目录,并将所有用户及所属的用户组都映射为nfs-upload,其UID与GID均为300
服务器端
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum install rpcbind nfs-utils
mkdir /nfs
chmod 775 /nfs
groupadd -g 300 nfs-upload
useradd -u 300 -g 300 nfs-upload
echo " /nfs 172.16.12.0/24(ro,all-squash,root_squash,anonuid=300,anongid=300,sync)" > /etc/export
systemctl start rpcbind nfs-server
systemctl enable nfs-server
systemctl enable rpcbind
exportfs -r
客户端
mkdir /nfs
mount -t nfs 192.168.160.46:/data/nfs /nfs
或
vim /etc/fstab
192.168.160.46:/data/nfs /nfs nfs defaults,_netdev 0 0
mount- a
df -h