NFS介绍
NFS是由network File System的缩写
.NFS最早由Sun公司开发,分为2,3,4这3个大版本。2和3版本由Sun起草开发,4.0开始Netapp公司参与并主导开发,最新版本为4.1版本,
NFS数据传输基于RPC协议,RPC为Remote Procedure Call的简写。RPC是指远程过程调用,也就是说2台服务器A和B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
NFS用于在网络上共享存储。应用场景:假如有3台机器A、B、C,它们需要访问同一个目录,且目录中都是图片。传统的做法是把这些图片分别放在A.B.C中,但若使用NFS只需要把图片放在A机器上,然后A实时共享给B和C即可。访问B与C时,是通过网络的方式去访问A上的那个目录的。
NFS服务端启动NFS服务,服务端通过RPC协议向客户端提供服务。RPC协议需要rpcbind来实现,在centos5及以前的版本,是需要porttmap来实现的.这2个是指的同一个东西。
NFS服务启动后,是不会监听任何的端口,最终实现 监听端口与TCP/IP通信的过程是rpcbind.
rpcbind监听111端口。
NFS服务需要借助RPC协议实现通信。
NFS服务端安装配置
安装步骤
1 . 在centos上使用NFS服务需要安装2个包(nfs-utils和rpcbind),当使用yum工具来安装nfs-utils时会一并安装rpcbind。同时在客户端与服务端安装nfs-utils。在安装过程中如果速度很慢,可以禁掉epel。方法是mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.1
2 . 配置NFS比较简单,只需要编辑配置文件/etc/exports即可。
/home/nfstestdir 192.168.244.0/24(rw,sync,all_squash,anonuid=1000,anongid=100 0)
/home/nfstestdir为共享出去的目录。信任主机为192.168.244.0/24网段,权限为读/写,同步模式,限定所使用者,并且限定的uid与gid都为1000。
3 . 创建分享的目录,并设置为777权限(方便后续的试验)。
[root@spring ~]# mkdir /home/nfstestdir/
[root@spring ~]# chmod 777 !$
chmod 777 /home/nfstestdir/
[root@spring ~]#
4 .查看rpcbind监听的端口。如果没有自动的启动,可以自己启动systemctl start rpcbind
[root@chunt ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 945/nginx: master p
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 923/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1243/master
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 945/nginx: master p
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 923/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1243/master
tcp6 0 0 :::3306 :::* LISTEN 1178/mysqld
[root@chunt ~]#
在客户端与服务端中111端口启动的都是systemd服务。是centos7的特性。
5 . 启动nfs服务后查看进程
[root@spring ~]# systemctl start nfs
[root@spring ~]# ps aux |grep nfs
root 1868 0.0 0.0 0 0 ? S< 22:31 0:00 [nfsd4_callbacks]
root 1874 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd]
root 1875 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd]
root 1876 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd]
root 1877 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd]
root 1878 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd]
root 1879 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd]
root 1880 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd]
root 1881 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd]
root 1886 0.0 0.0 112676 976 pts/0 S+ 22:31 0:00 grep --color=auto nfs
[root@spring ~]#
在启动NFS服务时,会自动启动rpc相关的服务。如果没有它们就不能正常的使用nfs。以下信息只只存在于服务端
[root@spring ~]# ps aux |grep rpc
rpc 1809 0.0 0.0 64956 1416 ? Ss 22:22 0:00 /sbin/rpcbind -w
rpcuser 1846 0.0 0.0 42376 1756 ? Ss 22:31 0:00 /usr/sbin/rpc.statd
root 1847 0.0 0.0 0 0 ? S< 22:31 0:00 [rpciod]
root 1857 0.0 0.0 42564 944 ? Ss 22:31 0:00 /usr/sbin/rpc.mountd
root 1858 0.0 0.0 43816 548 ? Ss 22:31 0:00 /usr/sbin/rpc.idmapd
root 1888 0.0 0.0 112676 976 pts/0 S+ 22:32 0:00 grep --color=auto rpc
6 . 如果想让NFS开机启动,可执行systemctl enable nfs
(在服务端)
root@spring ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@spring ~]#
NFS配置选项
- rw:表示读/写
- ro:表示只读
- sync:同步模式,表示内存中的数据实时写入磁盘,这样会降低磁盘的效率。
- async:非同步模式,表示把内存的数据定期写入磁盘,好处是保证磁盘的效率,缺点在突然断电时,会丢失部分数据。
- no_root_squash ;加上这个选项后,root用户就会对共享目录拥有至高的权限控制,就像是对本机的目录操作一样。但这样安全性降低。
- root_squash :与上面的意思相反,表示root用户对共享目录的权限不高,只有普通用户的权限,即限制了root.
- all_squash :表示不管使用nfs的用户是谁,其身份都会被限定为一个普通用户的身份。
- anonuid/anongid:要和root_suqash 以及all_squash一同使用,用于指定使用NFS的用户被限定后的uid和gid,但前提是本机的/etc/passwd中存在相应的uid的和gid
客户端挂载
1 . 安装nfs-utils
- 一台机器做了nfs服务,我们可以在客户端可以使用以下命令来查看服务端共享了哪些目录或者是否拥有权限。
[root@chunt ~]# showmount -e 192.168.244.131
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
[root@chunt ~]#
这里报错说明网络不平,不能与192.168.244.131的111端口通信,原因有2点:(1)服务端的rpcbind未开启。(2)防火墙导致。在服务端与客户端关闭防火墙与SElinux
[root@chunt ~]# systemctl stop firewalld
[root@chunt ~]# setenforce 0
[root@chunt ~]# showmount -e 192.168.244.131
Export list for 192.168.244.131:
/home/nfstestdir 192.168.244.0/24
[root@chunt ~]#
这样就能通信了。
3 .然后在客户端挂载NFS
[root@chunt ~]# mount -t nfs 192.168.244.131:/home/nfstestdir /mnt/
[root@chunt ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 18G 3.6G 15G 21% /
devtmpfs 479M 0 479M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6.7M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 197M 97M 100M 50% /boot
tmpfs 98M 0 98M 0% /run/user/0
192.168.244.131:/home/nfstestdir 197M 11M 187M 6% /mnt
[root@chunt ~]#
现在在客户端下的/mnt/目录下创建文件或者目录是可以实时共享给服务端的。在客户端创建的文件或者子目录。不管是哪个用户在客户端操作,反应过来的uid与gid都是在服务端中/etc/passwd里面uid与gid为1000的那个用户。