nfs特点
使用nfs的好处
nfs体系至少有两个主要部分
不同的客户端可以在NFS上观看影视文件,节省本地空间,一台NFS服务器上可以存放所有用户的home目录,带来便利这些目录被输出到网络以便用户不管在哪台工作站上登录,总是能得到相同的home目录
在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下
nfs 工作机制
nfs 是基于rpc来实现网络文件系统的共享的RPC
RPC,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据,在OSI网络模型中,RPC跨越了传输层和应用层
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器
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故障恢复时使用 |
用户映射:
用户映射的选项
选项 | 作用 |
---|---|
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 关闭指定的导出的文件系统
环境介绍
服务器 | IP |
---|---|
nfs-server | 192.168.169.10 |
nfs-client | 192.168.169.20 |
[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
[root@nfs-server ~]# yum -y install nfs-utils rpcbind
[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
......此处省略
[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
[root@nfs-server ~]# vim /etc/exports
/opt/chens 192.168.169.20(rw,async,all_squash)
[root@nfs-server ~]# mkdir /opt/chens
[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)
[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/
[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
此处省略步骤…
[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
[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 搭建完成!