一、NFS文件共享服务器概念:
NFS是network file sytem的缩写,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
二、NFS工作原理:
- 首先NFS服务器端开启rpcbind;
- 然后服务端开启NFS服务,这时NFS的各项功能都需要向RPC服务注册,这时rpc会通知portmap模块将可用的端口分配给statd,rquotad进程等;
- 然后NFS客户端RPC服务就会通过网络向NFS服务端的RPC服务的111端口发出NFS文件存取功能的询问请求。
- NFS服务端的RPC服务找到对应的已注册的NFS daemon端口后,通知NFS客户端的RPC服务。
- 此时NFS客户端就可获取到nfs服务端各个进程的正确端口,然后通过客户端rpc就直接与NFS服务器的rpc进行存取数据了(rpc知道了nfs的具体端口,就可以实现远程调用,即传输)。
ps:有一点需要注意的是nfs并不是单独存在的,而是由NFS-server,RPC,PORTMAP这三个模块组成。
NFS-server只负责将数据通过以文件系统的方式共享出去,
并进行登录管理和权限管理,并不负责数据的传输,而数据的传输则有RPC来完成。
PORTMAP主要是来分配端口给statd,rquotad等进程,NFS服务除了启动nfsd本身监听的端口2049/tcp和2049/udp,
还会启动以上进程来完成文件共享。
三、NFS安装部署:
服务器和客户端都装好nfs服务组件:
yum -y install nfs-utils
配置服务端:
1、编辑/etc/exports文件
/data/lutixia 192.168.0.0/24(rw,sync)
/data/lutixia 是服务端想要共享出去的目录,提前创建好。
192.168.0.0/24 表示这个网段都可以来挂载,也可以设置具体某个ip。
(rw,sync) 表示客户端挂载服务端目录后的权限,这里表示可读可写,
以及实时同步,还有其他选项,后面介绍。
2、导出(广播)编辑的文件,并启动rpc和nfs服务
exportfs -r
systemctl start rpcbind
systemctl start nfs
配置客户端:
1、可用showmount搜索网络中可用的共享文件
[root@localhost nfs]# showmount -e 192.168.0.187
Export list for 192.168.0.187:
/data/lutixia 192.168.0.0/24
# 192.168.0.187 服务端的IP
2、创建目录,用于挂载
mkdir /mnt/nfs
3、挂载
mount -t nfs 192.168.0.187:/data/lutixia /mnt/nfs
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 20G 1.6G 18G 9% /
...
/dev/sda1 297M 108M 190M 37% /boot
192.168.0.187:/data/lutixia 20G 5.0G 15G 26% /mnt/nfs
#可以看到已经挂载上了。
4、挂载完成之后,进入目录,可能会发现无法创建和修改文件。
[root@localhost nfs]# mkdir abc
mkdir: cannot create directory ‘abc’: Permission denied
这主要是因为客户端访问服务器时,身份被压缩成nobody,相对服务器文件系统来说,就是其他用户。所以要想编辑,需要在服务端对文件授权或者更改exports文件,设置no_root_squash(不压缩客户端root身份)。
nfs服务端修改exports文件,加上no_root_squash参数:
/data/lutixia 192.168.0.0/24(rw,sync,no_root_squash)
然后重新导出:
exportfs -r
nfs客户端再次创建文件:
[root@localhost nfs]# mkdir abc
[root@localhost nfs]# ls
abc
服务端的/etc/exports文件详解:
[root@localhost ~]# exportfs -v
/data/lutixia 192.168.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
其中:
rw:可读可写
ro:仅可读
sync:是指数据同步写入内存和磁盘
root_squash:如果客户端用root身份访问,则被压缩成nobody,权限也将受到限制。
no_root_squash:也就是不压缩,客户端使用root身份登录,全有所有权限,很危险。
all_squash:不管访问者是什么身份,包括root,全部压缩至匿名用户。
no_all_squash:保留访问用户的身份uid以及gid,一般只能查看,不能修改,权限问题,但是可以强制保存。
secure:nfs通过1024以下的安全TCP/IP端口发送
异常报错:
卸载时报错:
umount.nfs4: /mnt/nfs: device is busy
#使用以下命令强行解除挂载
umount -l /mnt/nfs
或者使用
#将会显示使用这个模块的pid
fuser -m /mnt/nfs
#将会直接kill那个pid
fuser -mk /mnt/nfs