【Web 集群实战】18_NFS 网络文件共享服务

版权声明: https://blog.csdn.net/weixin_42061048/article/details/82954109

【Web 集群实战】18_NFS 网络文件共享服务

标签(空格分隔): Web集群实战


1. NFS 介绍

1.1 什么是 NFS

  • NFS 是 Network File System 的缩写,即网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS 客户端(一般为应用服务器,例如 Web)可以通过挂载(mount)方式将 NFS 服务器共享的数据目录挂载到 NFS 客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS 服务器端共享的目录就好像是客户端自己的磁盘分区或目录一样,而实际上却是远端的 NFS 服务器的目录。

  • NFS 网络文件系统很像 Windows 系统的网络共享、安全功能、网络驱动器映射,这也与 Linux 系统里的 Samba 服务类似。只不过一般情况下,Windows 网络共享服务或 Samba 服务用于办公局域网共享,而互联网中小型网站集群架构后端常用 NFS 进行数据共享,如果是大型网站,那么有可能还会用到更复杂的分布式文件系统,例如 Moosefs(mfs)、GlusterFS、FastDFS。

1.2 NFS 系统原理

  • 在 NFS 服务器端设置好一个共享目录 /video 后,其他有权限访问 NFS 服务器的客户端都可以将这个共享目录 /video 挂载到客户端本地的某个挂载点,如 /v/video,不同的客户端的挂载点可以不相同。

  • 客户端正确挂载完毕后,就可以通过 NFS 客户端的挂载点所在的 /v/video 目录查看到 NFS 服务器端 /video 共享出来的目录下的所有数据。

  • NFS 在传输数据时使用的端口会随机选择。NFS 客户端通过 RPC(远程过程调用,Remote Procedure Call)协议/服务得知 NFS 服务器端使用哪个端口。

1.3 什么是 RPC

  • 因为 NFS 支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS 的功能所对应的端口无法固定,它会随机取用一些未被使用的端口来作为传输之用。

  • NFS 的 RPC 服务最主要的功能就是记录每个 NFS 功能所对应的端口号,并且在 NFS 客户端请求时将该端口和功能对应的信息传递给请求数据的 NFS 客户端,从而确保客户端可以连接到正确的 NFS 端口上去,达到实现数据传输交互数据的目的。

  • 当 NFS 服务器端启动服务时会随机取用若干端口,并主动向 RPC 服务注册取用的相关端口及功能信息。然后 RPC 服务使用固定的 111 端口来监听 NFS 客户端提交的请求,并将正确的 NFS 端口信息回复给请求的 NFS 客户端。

  • 在启动 NFS Server 之前, 首先要启动 RPC 服务,否则 NFS Server 就无法向 RPC 服务注册了。另外,如果 RPC 服务重新启动,原来已经注册好的 NFS 端口数据就会丢失,因此,此时 RPC 服务管理的 NFS 程序也需要重新启动以重新向 RPC 注册。一般修改 NFS 配置文件后,是不需要重启 NFS 的,直接在命令行执行 /etc/init.d/nfs reload 或 exportfs -rv 即可使修改的 /etc/exports 生效。

2. NFS 服务器端配置

2.1 操作系统及内核版本信息

[root@ylt001 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@ylt001 ~]# uname -r
3.10.0-693.el7.x86_64
[root@ylt001 ~]# uname -m
x86_64

2.2 查看NFS 软件包

[root@ylt001 ~]# rpm -qa nfs-utils rpcbind
nfs-utils-1.3.0-0.48.el7.x86_64
rpcbind-0.2.0-42.el7.x86_64

2.3 启动 NFS 相关服务

  • 启动 rpcbind 服务
[root@ylt001 ~]# systemctl status rpcbind.service
* rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
   Active: inactive (dead)
[root@ylt001 ~]# systemctl start rpcbind.service
[root@ylt001 ~]# systemctl status rpcbind.service
* rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
   Active: active (running) since Sat 2018-10-06 23:14:19 CST; 26s ago

Oct 06 23:14:19 ylt001 systemd[1]: Starting RPC bind service...
Oct 06 23:14:19 ylt001 systemd[1]: Started RPC bind service.
[root@ylt001 ~]# lsof -i :111
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd    1 root   46u  IPv6  14504      0t0  TCP *:sunrpc (LISTEN)
systemd    1 root   47u  IPv4  14505      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1538  rpc    4u  IPv6  14504      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1538  rpc    5u  IPv4  14505      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1538  rpc    8u  IPv4  23285      0t0  UDP *:sunrpc
rpcbind 1538  rpc   10u  IPv6  23287      0t0  UDP *:sunrpc
[root@ylt001 ~]# netstat -lntup|grep rpcbind
udp        0      0 0.0.0.0:865             0.0.0.0:*                           1538/rpcbind
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1538/rpcbind
udp6       0      0 :::865                  :::*                                1538/rpcbind
udp6       0      0 :::111                  :::*                                1538/rpcbind
[root@ylt001 ~]# 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
  • 启动 NFS 服务
[root@ylt001 ~]# LANG=en
[root@ylt001 ~]# systemctl status nfs
* nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@ylt001 ~]# systemctl start nfs
[root@ylt001 ~]# systemctl status nfs
* nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Sat 2018-10-06 23:21:19 CST; 3s ago

Oct 06 23:21:19 ylt001 systemd[1]: Starting NFS server and services...
Oct 06 23:21:19 ylt001 systemd[1]: Started NFS server and services.
[root@ylt001 ~]# 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  47859  status
    100024    1   tcp  34218  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
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  38028  nlockmgr
    100021    3   udp  38028  nlockmgr
    100021    4   udp  38028  nlockmgr
    100021    1   tcp  39989  nlockmgr
    100021    3   tcp  39989  nlockmgr
    100021    4   tcp  39989  nlockmgr
  • 设置开机自启动
[root@ylt001 ~]# systemctl enable rpcbind
[root@ylt001 ~]# 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@ylt001 ~]# systemctl list-unit-files |grep enabled| egrep "rpcbind|nfs"
nfs-server.service                            enabled
nfs.service                                   enabled
rpcbind.socket                                enabled
nfs-client.target                             enabled

2.4 配置案例

  • 创建需要共享的目录并授权
[root@ylt001 ~]# mkdir -p /nfsdata
# 创建哟啊共享的 NFS 目录,也可以使用已存在的目录
[root@ylt001 ~]# cd /nfsdata/
[root@ylt001 nfsdata]# touch test.txt
# 创建测试文件
[root@ylt001 nfsdata]# chown -R nfsnobody.nfsnobody /nfsdata
# 在服务器端把要共享的 NFS 目录赋予 NFS 默认用户 nfsnobody 用户和用户组权限
[root@ylt001 nfsdata]# ls -ld /nfsdata
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Oct  7 00:04 /nfsdata
[root@ylt001 nfsdata]# grep nfsnobody /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
  • 配置 NFS 服务配置文件,并在本地查看挂载信息
[root@ylt001 nfsdata]# cat /etc/exports
/nfsdata 192.168.2.0/24(rw,sync)
[root@ylt001 nfsdata]# exportfs -rv
exporting 192.168.2.0/24:/nfsdata
[root@ylt001 nfsdata]# cat /etc/exports
/nfsdata 192.168.2.0/24(rw,sync)
[root@ylt001 nfsdata]# showmount -e localhost
Export list for localhost:
/nfsdata 192.168.2.0/24
[root@ylt001 nfsdata]# cat /var/lib/nfs/etab
/nfsdata        192.168.2.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,no_all_squash)
  • 在本地把服务器端同时又作为客户端进行挂载测试
[root@ylt001 nfsdata]# mount -t nfs 192.168.2.141:/nfsdata /mnt
[root@ylt001 nfsdata]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  9.8G  6.2G  3.1G  68% /
devtmpfs                 897M     0  897M   0% /dev
tmpfs                    912M     0  912M   0% /dev/shm
tmpfs                    912M  9.0M  903M   1% /run
tmpfs                    912M     0  912M   0% /sys/fs/cgroup
/dev/sda2                190M  147M   30M  84% /boot
tmpfs                    183M     0  183M   0% /run/user/0
tmpfs                    183M     0  183M   0% /run/user/1000
192.168.2.141:/nfsdata   9.8G  6.2G  3.1G  68% /mnt

3. NFS 客户端配置

3.1 操作系统及内核版本信息

[root@ylt001 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@ylt001 ~]# uname -r
3.10.0-693.el7.x86_64
[root@ylt001 ~]# uname -m
x86_64

3.2 查看NFS 软件包

[root@ylt001 ~]# rpm -qa nfs-utils rpcbind
nfs-utils-1.3.0-0.48.el7.x86_64
rpcbind-0.2.0-42.el7.x86_64

3.3 启动 RPC 服务

  • 防火墙控制

[root@ylt001 ~]# firewall-cmd --permanent --add-rich-rule=“rule family=“ipv4” source address=“192.168.2.0/24” port protocol=“tcp” port=“111” accept”
success
[root@ylt001 ~]# firewall-cmd --permanent --add-rich-rule=“rule family=“ipv4” source address=“192.168.2.0/24” port protocol=“udp” port=“111” accept”
success

  • 若上述方式不成功则关闭防火墙
[root@ylt001 ~]# systemctl stop firewalld
  • 启动 RPC 服务
[root@ylt001 ~]# LANG=en
[root@ylt001 ~]# systemctl start rpcbind
[root@ylt001 ~]# systemctl status rpcbind
* rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
   Active: active (running) since Sun 2018-10-07 01:23:06 CST; 7h left

Oct 07 01:23:06 ylt001 systemd[1]: Starting RPC bind service...
Oct 07 01:23:06 ylt001 systemd[1]: Started RPC bind service.

3.4 挂载 NFS 共享目录 /nfsdata

[root@ylt001 ~]# showmount -e 192.168.2.141
Export list for 192.168.2.141:
/nfsdata 192.168.2.0/24
[root@ylt001 ~]# mount -t nfs 192.168.2.141:/nfsdata /mnt
[root@ylt001 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  9.8G  6.2G  3.1G  68% /
devtmpfs                 897M     0  897M   0% /dev
tmpfs                    912M     0  912M   0% /dev/shm
tmpfs                    912M  9.0M  903M   1% /run
tmpfs                    912M     0  912M   0% /sys/fs/cgroup
/dev/sda2                190M  147M   30M  84% /boot
tmpfs                    183M     0  183M   0% /run/user/0
tmpfs                    183M     0  183M   0% /run/user/1000
192.168.2.141:/nfsdata   9.8G  6.2G  3.1G  68% /mnt
  • 测试读写数据
[root@ylt001 ~]# ls /mnt/
test.txt
[root@ylt001 ~]# mkdir /mnt/test
[root@ylt001 ~]# ll /mnt/
total 4
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Oct  6 17:37 test
-rw-r--r-- 1 nfsnobody nfsnobody    0 Oct  7  2018 test.txt

猜你喜欢

转载自blog.csdn.net/weixin_42061048/article/details/82954109