NFS共享
nfs 简介
nfs特点
- NFS(Network File System)网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源
- 在NFS的应用中的,本地的客户端应用可以透明的读写位于远端NFS服务器上的文件,就像访问本地文件一样 nfs 适用于Linux 与 Unix之间实现文件共享,不能实现Linux与windows 间的文件共享功能 nfs 是运行在应用层的协议,期监听在2049/TCP 和 2049/UDP 套接字上 nfs服务只能基于IP进行认证,这也是它的缺点之一
使用nfs的好处
- 节省本地的存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用
- 用户不需要在网络中的每个机器上都建立有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用
- 一些存储设备如软驱、CDROM和Zip(一种高存储密度的磁盘驱动与磁盘)等都可以在网络上被别的机器使用,可以减少整个网络上可移动介质设备的数量
nfs的体系组成
nfs体系至少有两个主要部分
- 一台nfs服务器
- 若干台客户机
- 客户机通过TCP/IP网络远程访问存放在NFS服务器上的数据
- 在NFS服务器正式启用前,需要根据实际环境和需求来配置NFS参数
nfs的应用场景
-
不同的客户端可以在NFS上观看影视文件,节省本地空间,一台NFS服务器上可以存放所有用户的home目录,带来便利这些目录被输出到网络以便用户不管在哪台工作站上登录,总是能得到相同的home目录
-
在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下
nfs 工作机制
-
nfs 是基于rpc来实现网络文件系统的共享的RPC
-
RPC,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议
-
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据,在OSI网络模型中,RPC跨越了传输层和应用层
-
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器
rpc 工作机制如上图所示,下面来描述
- 客户端程序发起一个RPC系统调用基于TCP协议发送给另外一台主机(服务端)
- 服务端监听在某个套接字上,当收到客户端的系统调用请求后,将收到的请求和其所传递的参数通过本地的系统调用执行一遍,并将结果返回给本地的服务进程
- 服务端的服务进程收到返回的执行结果将其封装成响应报文,在通过rpc协议返回给客户端
- 客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行
NFS 服务器端运行着四个进程:
-
nfsd
-
mountd
-
idmapd
-
portmapper
-
idmapd 实现用户账号的集中映射,把所有的账号都映射为NFSNOBODY,但是在访问时却能以本地用户的身份去访问
-
mountd 用于验证客户端是否在允许访问此NFS文件系统的客户端列表中(发放一个令牌,持令牌去找nfsd),否则拒绝
-
mountd 的服务端口是随机的由rpc 服务(portmapper)提供随机端口号 nfsd
nfs的守护进程,监听在2049/TCP和2049/UDP端口上,不负责文件的存储(由NFS服务器本地内核负责调度存储),用于理解客户端发起的rpc 请求,并将其转交给本地内核,然后存储在指定的文件系统上 -
portmapper NFS服务器的rpc 服务,其监听与111/TCP和111/UDP套接字上,用于管理远程过程调用(RPC)
nfs 的主配置文件: /etc/exports
nfs 主配置文件中的常用选项
选项 | 作用 |
---|---|
secure | 这个选项是缺省项,它使用了1024以下的TCP/IP端口实现NFS的连接,指定insecure可以禁用这个选项 |
rw | 允许NFS客户机进行读/写访问,缺省项只是读的 |
async | 此选项可以改进性能,但如果没有完全关闭NFS守护进程就重启NFS服务器,这也可能造成数据丢失 |
no_wdelay | 此选项关闭写延时,如果设置了async,那么NFS就会忽略此选项 |
nohide | 若将一个目录挂载到另一个目录之上,则原来的目录通常就被隐藏起来,或看起来像空的一样,要禁用这种行为,需启用hide |
no_subtree_check | 此选项关闭子树检查,子树检查会执行一些不想忽略的安全性检查,缺省选项是启用子树检查 |
no_auth_nlm | 此选项可作为insecure_locks指定,它告诉NFS守护进程不要对加锁请求进行认证。若关心安全性问题,就要避免使用此选项,缺省选项是auth_nlm或secure_kocks |
mp(mountpoint=path) | 通过显示的声明此选项,NFS要求挂载所导出的目录fsid=num,此选项通常在NFS故障恢复时使用 |
用户映射:
- 通过NFS中的用户映射,可以将伪或实际用户和组的标识赋给一个正在对NFS卷进行操作的用户。这个NFS用户具有映射所允许的用户和组的许可权限
- 对NFS卷使用一个通用的用户/组可以提供一定的安全性灵活性,而不会带来很多管理负荷
- 在使用NFS挂载的文件系统上的文件时,用户的访问通常都会受到限制,这就是说用户都是以匿名用户的身份来对文件进行访问的,这些用户缺省情况下对这些文件只有读权限
- 这种行为对于root
用户来说尤为重要。然而,实际上的确存在这种情况:希望用户以root用户或所定义的其他用户的身份访问远程文件系统上的文件 - NFS 允许指定访问远程文件的用户–通过用户标识号(UID)和 组标识号(GID),可以禁用正常的squash行为
用户映射的选项
选项 | 作用 |
---|---|
root_squash | 此选项不允许root用户访问挂载上来的NFS卷 |
no_root_squash | 此选项允许root用户访问挂载上来的NFS卷 |
all_squash | 此选项对于公共访问的NFS卷来说非常有用,它会限制所有的UID和GID,只使用匿名用户。缺省设置是no_all_squash |
anonuid和anongid | 这两个选项将匿名UID和GID修改成特定用户和组账号 |
客户端挂载时可以使用的特殊选项:
选项 | 作用 |
---|---|
rsize | 其值是从服务器读取的字节数(缓冲)默认为1024。若使用比较高的值,如8192,可以提高传输速度 |
wsize | 其值是写入到服务器的字节数(缓冲)默认为1024若使用比较高的值,如8192,可以提高传输速度 |
exportfs 维护exports文件导出的文件系统表的专用工具
export -ar 重新导出所有的文件系统
export -au 关闭导出的所有文件系统
export -u FS 关闭指定的导出的文件系统
NFS 的详细配置
环境介绍
服务器 | IP |
---|---|
nfs-server | 192.168.169.10 |
nfs-client | 192.168.169.20 |
服务端的配置
- 关闭防火墙、关闭selinux,并设置开机不启动
[root@nfs-server ~]# systemctl stop firewalld
[root@nfs-server ~]# systemctl disable firewalld
[root@nfs-server ~]# setenforce 0
[root@nfs-server ~]# sed -ri 's/(^SELINUX=).*/\1disbaled/g' /etc/selinux/config
2.配置yum 源
[root@nfs-server yum.repos.d]# curl -o CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@nfs-server yum.repos.d]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@nfs-server yum.repos.d]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@nfs-server yum.repos.d]# yum -y install epel-release
3.安装NFS-server
- 安装nfs服务主程序
[root@nfs-server ~]# yum -y install nfs-utils rpcbind
- 启动nfs-server 服务,查看rpc注册信息
[root@nfs-server ~]# systemctl start rpcbind
[root@nfs-server ~]# systemctl start nfs-server
[root@nfs-server ~]# systemctl enable rpcbind
[root@nfs-server ~]# systemctl enable nfs-server
[root@nfs-server ~]# 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 53070 status
100024 1 tcp 44752 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
......此处省略
- 查看系统中运行的NFS相关进程
[root@nfs-server ~]# ps -aux |egrep "rpc|nfs"
rpc 17023 0.0 0.0 64956 1416 ? Ss 18:47 0:00 /sbin/rpcbind -w
rpcuser 17048 0.0 0.0 42376 1752 ? Ss 18:47 0:00 /usr/sbin/rpc.statd
root 17049 0.0 0.0 0 0 ? S< 18:47 0:00 [rpciod]
root 17061 0.0 0.0 42564 944 ? Ss 18:47 0:00 /usr/sbin/rpc.mountd
root 17062 0.0 0.0 43816 544 ? Ss 18:47 0:00 /usr/sbin/rpc.idmapd
root 17072 0.0 0.0 0 0 ? S< 18:47 0:00 [nfsd4_callbacks]
root 17078 0.0 0.0 0 0 ? S 18:47 0:00 [nfsd]
root 17079 0.0 0.0 0 0 ? S 18:47 0:00 [nfsd]
root 17080 0.0 0.0 0 0 ? S 18:47 0:00 [nfsd]
root 17081 0.0 0.0 0 0 ? S 18:47 0:00 [nfsd]
root 17082 0.0 0.0 0 0 ? S 18:47 0:00 [nfsd]
root 17083 0.0 0.0 0 0 ? S 18:47 0:00 [nfsd]
root 17084 0.0 0.0 0 0 ? S 18:47 0:00 [nfsd]
root 17085 0.0 0.0 0 0 ? S 18:47 0:00 [nfsd]
root 17133 0.0 0.0 112660 968 pts/0 R+ 18:52 0:00 grep -E --color=auto rpc|nfs
- nfs 服务端配置共享目录,编辑nfs 主配置文件,共享目录/opt/chens到192.168.169.20
[root@nfs-server ~]# vim /etc/exports
/opt/chens 192.168.169.20/24(rw,async,all_squash)
- 创建需要共享的目录chens
[root@nfs-server ~]# mkdir /opt/chens
- 重启nfs-server服务,查看文件是否存在
[root@nfs-server ~]# systemctl restart nfs-server
[root@nfs-server ~]# cat /var/lib/nfs/etab
/opt/chens 192.168.169.20(rw,async,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,all_squash)
- nfs统一给客户端为65534用户权限,查看65534属于哪个用户,修改/opt/chens目录的属主和属组为nfsnobody
[root@nfs-server ~]# grep '65534' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs-server ~]# chown -R nfsnobody.nfsnobody /opt/chens/
[root@nfs-server ~]# ls /opt/chens/ -dl
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Sep 8 19:02 /opt/chens/
- 重启nfs-server 服务生效
[root@nfs-server ~]# systemctl restart nfs-server
[root@nfs-server ~]# ss -anllt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
LISTEN 0 128 *:20048 *:*
LISTEN 0 128 *:44752 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 64 *:33917 *:*
LISTEN 0 64 *:2049 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 64 :::33392 :::*
LISTEN 0 128 :::20048 :::*
LISTEN 0 128 :::52752 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 64 :::2049 :::*
客户端的配置
按照服务端前面的配置搭建yum 源、关闭防火墙、关闭selinux
此处省略步骤…
- 安装相关的服务,仅启动rpcbind服务即可
[root@nfs-client ~]# yum -y install nfs-utils rpcbind
[root@nfs-client ~]# systemctl start rpcbind
[root@nfs-client ~]# systemctl enable rpcbind
- 客户端查看远程服务器提供可挂载信息
[root@nfs-client ~]# showmount -e 192.168.169.10
Export list for 192.168.169.10:
/opt/chens 192.168.169.20
- 客户端挂载共享data
[root@nfs-client ~]# mount -t nfs 192.168.169.10:/opt/chens /mnt
[root@nfs-client ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/centos-root 8374272 1749196 6625076 21% /
devtmpfs 1013260 0 1013260 0% /dev
tmpfs 1024304 0 1024304 0% /dev/shm
tmpfs 1024304 8760 1015544 1% /run
tmpfs 1024304 0 1024304 0% /sys/fs/cgroup
/dev/sda1 6281216 127440 6153776 3% /boot
tmpfs 204864 0 204864 0% /run/user/0
192.168.169.10:/opt/chens 9422848 1811968 7610880 20% /mnt
- 验证是否可以共享资源,在服务端共享的目录下创建目录或者文件,在客户端挂载的目录下查看是否存在
在服务端创建目录,文件
[root@nfs-server chens]# mkdir test{1..3} ; touch chen{1..3}
[root@nfs-server chens]# ls
chen1 chen2 chen3 test1 test2 test3
在客户端验证结果,是否存在这些目录、文件
[root@nfs-client ~]# cd /mnt/
[root@nfs-client mnt]# ls
chen1 chen2 chen3 test1 test2 test3
结果存在,nfs-server 搭建完成!
更多推荐
所有评论(0)