NFS

1.1NFS定义:

NFS(Network File System) 网络文件系统,它的工作机制是基于rpc来实现网络文件系统共享的。

1.2NFS作用

'1.通过局域网让不同的主机系统之间可以共享文件或目录
2.节省本地存储空间,本地终端将可以减少自身存储空间的使用
3.用户不需要在网络中的每个机器都建有Home目录,home目录可以放在NFS服务器,可以在网络上被访问
4.减少整个网络上可移动介质设备的数量(存储设备:软驱、COROM、zip(一种高储存密度的磁盘驱动器与磁盘)等可以在网络上被别的机器使用。'

1.3nfs的体系组成

一台nfs服务器
若干台客户机

如图:

2.1RPC

RPC(Remote  Procedure  Call Protocol),远程过程调用协议,通过网络从远程计算机程序上请求服务,在OSI网络通信模型中,RPC跨越了传输层和应用层。
RPC采用客户机/服务器模式。请求程序就是客户机,而服务提供程序就是一个服务器。

2.2NFS系统原理

'Rpc.nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器'

'Rpc.mount: 主要功能是管理NFS的文件系统。当客户端顺利通过nfs登录NFS服务器后,在使用NFS服务所提供的文件前,还必须通过文件使用权限的验证。
             它会读取NFS的配置文件/etc/exports来对比客户端权限
Portmap:主要功能是进行端口映射工作’						 

3.1搭建nfs服务器环境准备

服务器系统 NFS服务端(nfs-serverA) NFS客服端(nfs-clientB)
Centos 192.168.228.20 192.168.228.21

3.2基础环境配置 开启nfs服务之前,必须关闭防火墙

'开机不启动防火墙'
[root@yaoxiaorong ~]# systemctl disable firewalld  
'查看firewalld防火墙是否开启'
[root@yaoxiaorong ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-07-30 08:39:34 HKT; 1 weeks 0 days ago
     Docs: man:firewalld(1)
 Main PID: 693 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─693 /usr/bin/python -Es /usr/sbin/firewal...

Jul 30 08:39:28 yaoxiaorong systemd[1]: Starting firew...
Jul 30 08:39:34 yaoxiaorong systemd[1]: Started firewa...
Jul 30 08:39:36 yaoxiaorong firewalld[693]: WARNING: I...
Jul 30 08:39:36 yaoxiaorong firewalld[693]: WARNING: b...
Jul 30 08:39:36 yaoxiaorong firewalld[693]: WARNING: I...
Jul 30 08:39:36 yaoxiaorong firewalld[693]: WARNING: f...
Jul 30 08:39:36 yaoxiaorong firewalld[693]: WARNING: I...
Jul 30 08:39:36 yaoxiaorong firewalld[693]: WARNING: r...
Hint: Some lines were ellipsized, use -l to show in full.
'关闭firewalld防火墙'
[root@yaoxiaorong ~]# systemctl stop firewalld.service 


关闭selinux防火墙

'Selinux(Security-Enhanced Linux)是美国国家安全局(NSA)对于强制访问控制的实现,是linux历史上最杰出的新安全子系统。Selinux默认安装在Fedora和Red  Hat  Enterprise Linux上,也可以作为其他发行版上容易安装的包得到。强制访问控制(MAC)安全系统,Selinux支持三种模式:'
'#Enforcing:强制模式,代表SElinux运作中,已经正确的开始限制domain/type'
'#Permissive:宽容模式,代表SElinux运作中,不过仅会有警告讯息并不会实际限制domain/type的存取。这种模式可以运来作为selinux的debug只用'
'#Disabled:关闭'
'查看selinux防火墙的状态'
[root@yaoxiaorong ~]# getenforce 
Enforcing
'临时关闭selinux防火墙'
[root@yaoxiaorong ~]# setenforce 0
[root@yaoxiaorong ~]# getenforce
Permissive

'永久关闭selinux防火墙,但是必须设置完毕之后重启系统'
[root@yaoxiaorong ~]# vim /etc/selinux/config 
*将SELINUX=enforcing修改成---->SELINUX=disabled*

3.3安装NFS-server

'安装nfs服务主程序'
[root@yaoxiaorong ~]# yum install nfs-utils rpcbind -y

3.4启动NFS-Server

'启动rpcbind服务'
[root@yaoxiaorong ~]# systemctl start rpcbind
'加入开机自启动'
[root@yaoxiaorong ~]# systemctl enable rpcbind
'启动nfs服务'
[root@yaoxiaorong ~]# systemctl start nfs-server
'加入开机自启动'
[root@yaoxiaorong ~]# systemctl enable nfs-server
'查看rpc注册信息'
[root@yaoxiaorong ~]# 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@yaoxiaorong ~]# ps -ef |egrep "rpc|nfs"
rpc       17208      1  0 15:09 ?        00:00:00 /sbin/rpcbind -w
rpcuser   17271      1  0 15:13 ?        00:00:00 /usr/sbin/rpc.statd
root      17272      2  0 15:13 ?        00:00:00 [rpciod]
root      17282      1  0 15:13 ?        00:00:00 /usr/sbin/rpc.mountd
root      17283      1  0 15:13 ?        00:00:00 /usr/sbin/rpc.idmapd
root      17293      2  0 15:13 ?        00:00:00 [nfsd4_callbacks]
root      17299      2  0 15:13 ?        00:00:00 [nfsd]
root      17300      2  0 15:13 ?        00:00:00 [nfsd]
root      17301      2  0 15:13 ?        00:00:00 [nfsd]
root      17302      2  0 15:13 ?        00:00:00 [nfsd]
root      17303      2  0 15:13 ?        00:00:00 [nfsd]
root      17304      2  0 15:13 ?        00:00:00 [nfsd]
root      17305      2  0 15:13 ?        00:00:00 [nfsd]
root      17306      2  0 15:13 ?        00:00:00 [nfsd]
root      17332  16143  0 15:16 pts/0    00:00:00 grep -E --color=auto rpc|nfs

3.4配置/etc/exports文件

'/etc/exports'     主配置文件,文件中的项格式相当简单,要共享一个文件系统
nfs主配置文件中的常用选项:
'secure'   缺省项,它使用了1024以下的TCP/IP端口实现NFS的连接,指定insecure可以禁用这个选项
'rw'   允许客户机进行读/写访问
'async'           此选项可以改进性能,但如果没有完全关闭NFS守护进程就重启了NFS服务器,但可能会造成数据丢失
'no_wdelay'    选项关闭延时,如果设置了async,那么NFS就会忽略此选项
'nohide'     若将一个目录挂载到另一个目录之上,则原来的目录通常就被隐藏起来,或看起来像空的一样,要禁用这种行为,需启动hide选项
'no_subtree_check'  此选项关闭子树检查,子树检查会执行一些不想忽略的安全性检查。缺省选项是启用子树检查
'no_auth_nlm'   此选项可作为insecure_locks指定,它告诉NFS守护进程不要对锁请求进行认证。若关心安全性问题,就要避免使用此选项,缺省选项是auth_nlm或secure_locks
'mp(mountpoint=path'     通过显式的声明此选项,NFS要求挂载所导出的目录
'fsid=num'   此选项通常在NFS故障恢复时使用
'编辑nfs主配置文件,共享/gongxiang目录至192.168.228.21,可读写'
[root@yaoxiaorong ~]# vim /etc/exports
[root@yaoxiaorong ~]# cat /etc/exports
/gongxiang 192.168.228.21(rw,async)
'创建需要共享的目录'
[root@yaoxiaorong ~]# mkdir -p /gongxiang
'重启nfs服务'
[root@yaoxiaorong ~]# systemctl restart nfs-server
'查看NFS分享出来的目录的完整权限设置值的配置文件'
[root@yaoxiaorong ~]# cat /var/lib/nfs/etab 
/gongxiang	192.168.228.21(rw,async,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)
'查看65534属于哪个用户'
[root@yaoxiaorong ~]# grep "65534" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

'递归赋予/gongxiang目录属主nfsnobody'
[root@yaoxiaorong ~]# chown -R nfsnobody.nfsnobody /gongxiang/

'给共享/gongxiang目录权限777'
[root@yaoxiaorong ~]# chmod 777 /gongxiang/

'重启nfs-server服务生效'
[root@yaoxiaorong ~]# systemctl restart nfs-server.service 


3.5客户端查看NFS服务器端共享的文件系统

'先安装showmount'
[root@yaoxiaorong ~]# yum install showmount -y
[root@yaoxiaorong ~]# showmount -e 192.168.228.20
Export list for 192.168.228.20:
/gongxiang 192.168.228.21

3.6挂载NFS文件系统

[root@yaoxiaorong ~]# mount -t nfs 192.168.228.20:/gongxiang /mnt
[root@yaoxiaorong ~]# df -h
Filesystem                           Size  Used Avail Use% Mounted on
/dev/mapper/centos_yaoxiaorong-root   17G  1.7G   16G  10% /
devtmpfs                             478M     0  478M   0% /dev
tmpfs                                489M     0  489M   0% /dev/shm
tmpfs                                489M   13M  476M   3% /run
tmpfs                                489M     0  489M   0% /sys/fs/cgroup
/dev/sda1                           1014M  125M  890M  13% /boot
tmpfs                                 98M     0   98M   0% /run/user/0
192.168.228.20:/gongxiang            5.0G  1.6G  3.5G  31% /mnt

永久挂载

'开机自动挂载nfs:编辑/etc/fatab文件,添加如下格式的内容:'
192.168.228.20:/gongxiang /mnt nfs  defautls 0 0

客户端卸载

[root@yaoxiaorong ~]# umount /mnt
'注意:卸载的时候如果提示“umount.nfs: /mnt: device is busy'
1.退出挂载目录在卸载
2.NFS Server 宕机,强制卸载umount  -lt  /mnt mount -a

自动挂载

自动挂载服务autofs,挂载方式如下两种:
直接:direct /-子配置文件必须写本地绝对路径
间接:indirect /path子配置文件写相对于/path的子目录
客户端安装autofs自动挂载
yum install autofs -y
systemctl enable autofs
systemctl start autofs
直接挂载方式:本地的挂载点要写绝对路径
名称后缀必须是autofs,/-代表这是一个直接挂载定义,根据/etc/auto.nfs_direct进行挂载全写

[root@yaoxiaorong ~]# vim /etc/auto.master.d/nfs.autofs

/-   /etc/auto.nfs_direct

填写挂载配置
[root@yaoxiaorong ~]# vim /etc/auto.nfs_direct

/mnt -rw,sync,soft 192.168.228.20:/data
重启autofs服务
[root@yaoxiaorong ~]# systemctl restart autofs
[root@yaoxiaorong ~]# mount
/etc/auto.nfs_direct on /mnt type autofs (rw,relatime,fd=18,pgrp=16781,timeout=300,minproto=5,maxproto=5,direct,pipe_ino=43596)
192.168.228.20:/data on /mnt type nfs4 (rw,relatime,sync,vers=4.1,rsize=131072,wsize=131072,namlen=255,soft,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.228.21,local_lock=none,addr=192.168.228.20)

3.8客户端在共享的目录中创建文件,服务端查看是否能创建目录

'客户端:'
[root@yaoxiaorong ~]# cd /mnt
[root@yaoxiaorong mnt]# touch abc
'服务端:'
[root@yaoxiaorong ~]# cd /gongxiang/
[root@yaoxiaorong gongxiang]# ls
abc

4.1shell脚本来搭建nfs服务器

'在服务端运用ssh,使服务端远程访问客户端免密码'
[root@yaoxiaorong ~]# ssh-keygen -t rsa
[root@yaoxiaorong ~]# ls .ssh
id_rsa  id_rsa.pub
[root@yaoxiaorong ~]# ls .ssh
id_rsa  id_rsa.pub
[root@yaoxiaorong ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.228.21


[root@yaoxiaorong ~]# vim nfs.sh

#!/bin/bash
setenforce 0
sed -ri 's/(SELINUX=).*/\1disabled/g' /etc/selinux/config
systemctl stop firewalld
yum install nfs-utils -y
yum install rpcbind -y
systemctl start rpcbind
systemctl start nfs-server
echo "/data 192.168.228.21(rw,async)" >/etc/exports && mkdir -p /data
chmod 777 /data
chown -R nfsnobody.nfsnobody /data/
systemctl restart nfs-server

ssh root@192.168.228.21 'yum install showmount -y'
ssh root@192.168.228.21 'showmount -e 192.168.228.20'
ssh root@192.168.228.21 'mount -t nfs 192.168.228.20:/dat
a /mnt && mkdir mnt/123'

[root@yaoxiaorong ~]# chmod +x nfs.sh
[root@yaoxiaorong ~]# ./nfs.sh