NFS

NFS存储服务概念介绍

NFS是Network File System的缩写,中文意思是网络文件共享系统,
它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录
存储服务的种类
用于中小型企业: 实现数据共享存储
FTP(文件传输协议)
运维01 服务器A 服务器B FTP服务器
运维02 服务器C 服务器D
中小型电商公司(游戏点卡 游戏币 道具 Q币 充值话费) --- 财务对账信息(数据库) --- 对账文件 --- FTP服务器
权限(用户认证的权限 存储目录的权限(用户))
获取数据的方式 ??? SSH远程服务 sFTP
samba windows--linux之间数据传输 Linux部署samba
NFS linux--linux之间数据传输
用于门户网站:
一个用户 -- 存储服务器
上万个用户 -- 存储服务器
利用分布式存储
Moosefs(mfs) 比较落伍,初学学习比较简单
GlusterFS
FastDFS 企业应用较多

NFS存储服务作用

1) 实现数据的共享存储
2) 编写数据操作管理
3) 节省购买服务器磁盘开销 淘宝--上万 用电开销


NFS服务部署流程

RPC: 远程过程调用服务程序--- 相当于租房的中介(网络编程支持)
服务端部署

## 第一个历程: 下载安装软件
rpm -qa|grep -E "nfs|rpc"
yum install -y nfs-utils rpcbind

第二个历程: 编写nfs服务配置文件

vim /etc/exports (man exports)
/data   172.16.1.0/24(rw,sync)


01     02(03)
01: 设置数据存储的目录 /data
02: 设置网络一个白名单 (允许哪些主机连接到存储服务器进行数据存储)
03: 配置存储目录的权限信息 存储目录一些功能

第三个历程: 创建一个存储目录

mkdir /data
chown nfsnobody.nfsnobody /data

第四个历程: 启动服务程序

先启动 rpc服务
systemctl start rpcbind.service 
systemctl enable rpcbind.service
再启动 nfs服务
systemctl start nfs
systemctl enable nfs

## 客户端部署
第一个历程: 安装nfs服务软件(客户端不装的话识别不到nfs文件系统)
yum install -y nfs-utils

第二个历程: 实现远程挂载共享目录
mount -t nfs 172.16.1.31:/data  /mnt 

NFS服务工作原理:

服务端:

1. 启动rpc服务,开启111端口
2. 启动nfs服务
3. 实现nfs服务进程和端口好的注册

补充: 检查nfs服务进程与端口注册信息
没有注册时候:

    [root@nfs01 ~]# rpcinfo -p 172.16.1.31
    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@nfs01 ~]# rpcinfo -p 172.16.1.31
    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  53997  status
     100024    1   tcp  49863  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


(nfs重启之后端口号就会变化)

## 客户端:
1. 建立TCP网络连接
2. 客户端执行挂载命令,进行远程挂载
3. 可以实现数据远程传输存储

nfs服务端详细配置说明

## 实现多个网段主机可以进行挂载
- 第一种方法:
/data 172.16.1.0/24(rw,sync) 10.0.0.0/24(rw,sync)
* 第二种方法:
/data 172.16.1.0/24(rw,sync)
/data 10.0.0.0/24(rw,sync)

## NFS配置参数权限
rw -- 读写权限
ro -- 只读权限
sync -- 同步方式存储数据 直接将数据保存到磁盘(数据存储安全)
async -- 异步方式存储数据 直接将数据保存到内存(提高数据存储效率)例,秒杀
no_root_squash -- 不要将root用户身份进行转换
root_squash -- 将root用户身份进行转换
all_squash -- 将所有用户身份都进行转换
no_all_squash -- 不要将普通用户身份进行转换

操作演示all_squash参数功能:
    vim /etc/exports
    /data   172.16.1.0/24(ro,sync,all_squash)
    [oldboy@backup mnt]$ touch oldboy_data.txt
    [oldboy@backup mnt]$ ll
    total 4
    -rw-rw-r-- 1 nfsnobody nfsnobody 0 May  9 12:11 oldboy_data.txt

操作演示no_all_squash参数功能:
    [root@nfs01 ~]# vim /etc/exports
    /data   172.16.1.0/24(rw,sync,no_all_squash)
    [oldboy@backup mnt]$ touch oldboy_data02.txt
    touch: cannot touch ‘oldboy_data02.txt’: Permission denied

解决权限问题:
    [root@nfs01 ~]# chmod o+w /data/
    [root@nfs01 ~]# ll /data/ -d
    drwxr-xrwx. 2 nfsnobody nfsnobody 52 May  9 12:11 /data/
    [oldboy@backup mnt]$ touch oldboy_data02.txt
    [oldboy@backup mnt]$ ll
    total 4
    -rw-r--r-- 1 nfsnobody nfsnobody 7 May  9 10:57 backup_data.txt
    -rw-rw-r-- 1 oldboy    oldboy    0 May  9 12:17 oldboy_data02.txt
    -rw-rw-r-- 1 nfsnobody nfsnobody 0 May  9 12:11 oldboy_data.txt

操作演示root_squash参数功能:
    vim /etc/exports
    /data   172.16.1.0/24(rw,sync,root_squash)
    [root@backup mnt]# touch root_data.txt
    [root@backup mnt]# ll
    -rw-r--r-- 1 nfsnobody nfsnobody 0 May  9 12:20 root_data.txt

操作演示no_root_squash参数功能
    [root@backup mnt]# ll
    total 4
    -rw-r--r-- 1 root      root      0 May  9 12:23 root_data02.txt

## 总结:共享目录的权限和哪些因素有关:
1)和存储目录的本身权限有关 (755 属主:nfsnobody)
2)和配置文件中的权限配置有关 rw/ro xxx_squash anonuid/anongid
3)和客户端挂载命令的参数有关 ro
??

## 企业互联网公司如何配置NFS 各种squash参数
###保证网站存储服务器用户数据安全性:

  • no_all_squash 需要进行配置 然后共享目录权限为www(确保客户端用户 服务端用户 uid数值一致)
  • root_squash 需要进行配置 此时root变成nfsnobody,data目录权限为www(root也无权)

以上也是nfs的默认配置(很多服务默认配置都是从安全角度出发)
如何查看nfs默认配置

cat /var/lib/nfs/etab   --- 记录nfs服务的默认配置记录信息(仅是记录文件)
/data   172.16.1.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,rw,secure,root_squash,no_all_squash)


### 如何让root用户可以操作管理www用户管理的data目录
]# grep nfsnobody /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

root  --- root_squash --- www  ---操作--- data目录
anonuid=65534,anongid=65534    --- 可以指定映射的用户信息

修改映射用户:www=1002
/data   172.16.1.0/24(rw,sync,anonuid=1002,anongid=1002)

## 企业中如何编辑nfs配置文件
01. 通用方法 *****
/data 172.16.1.0/24(rw,sync)
02. 特殊情况 (让部分人员不能操作存储目录 可以看目录中的数据)
/data 10.0.0.0/24(ro,sync)
03. 修改默认的匿名用户
/data 10.0.0.0/24(ro,sync,anonuid=xxx,anongid=xxx)

nfs客户端详细配置说明

mount -t nfs 172.16.1.31:/data /mnt

如何实现自动挂载:

 01. 利用rc.local
echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
  02. 利用fstab文件
vim /etc/fstab
172.16.1.31:/data /mnt nfs defaults 0 0
有时fstab文件无法实现自动挂载

##centos无法自动挂载原因
* centos6:无法实现网路存储服务自动挂载原因
根据系统服务启动顺序
串行启动
按照顺序依次启动 network服务--- sshd服务--- crond服务--- rsync服务--- rpcbind服务--- nfs服务
先加载/etc/fstab --- network服务 --- autofs服务

`所以需借助autofs服务程序:开机自动启动,服务启动好之后,重新加载fstab` 

* centos7:无法实现网路存储服务自动挂载原因
根据系统服务启动顺序
并行启动
network服务
sshd服务
crond服务
rsync服务
先加载/etc/fstab network服务
autofscentos7??

##客户端mount命令参数

    rw   --- 实现挂载后挂载点目录可读可写  (默认)
    ro   --- 实现挂载后挂载点目录可读可写
    suid --- 在共享目录中可以让setuid权限位生效  (默认)
  nosuid --- 在共享目录中可以让setuid权限位失效   提供共享目录的安全性
    exec --- 共享目录中的执行文件可以直接执行
  noexec --- 共享目录中的执行文件可以无法直接执行 提供共享目录的安全性
    auto --- 可以实现自动挂载(fstab文件中default改为auto)     mount -a 实现加载fstab文件自动挂载
  noauto --- 不可以实现自动挂载(fstab中不想某个挂载可以noauto)
  nouser --- 禁止普通用户可以卸载挂载点
    user --- 允许普通用户可以卸载挂载点
    [oldboy@web01 ~]$ umount /mnt
    umount: /mnt: umount failed: Operation not permitted  ???

##客户端如何卸载
umount -lf /mnt --- 强制卸载挂载点
-l 不退出挂载点目录进行卸载

#nfs服务问题:
* nfs服务器重启,挂载后创建数据比较慢
* 服务器重启方式不正确
* 服务重启:
01. restart 重启服务 强制断开所有连接 用户感受不好
02. reload 重启服务(平滑重启) 强制断开没有数据传输的连接 提升用户感受
-f 强制进行卸载操作

开机自动挂载

/etc/rc.local 文件要有执行权限
/etc/fstab 实现fstab文件挂载自动加载nfs存储目录 必须让remote-fs.target服务开机自启
centos7 必须启动 remote-fs.target
centos6 必须启动 netfs

需求问题:如何找到一台服务器开机运行了哪些服务
ll /etc/systemd/system/multi-user.target.wants/

##NFS服务挂载不上排查方法:
服务端进行排查:
1. 检查nfs进程信息是否注册
rpcinfo -p localhost/172.16.1.31
问题原因:
服务启动顺序不对,没有启动nfs服务

2. 检查有没有可用存储目录
showmount -e 172.16.1.31
问题原因:
配置文件编写有问题,重启nfs服务

3. 在服务端进行挂载测试
是否能够在存储目录中创建或删除数据
客户端测试:
(1. 检查nfs进程信息是否注册
rpcinfo -p localhost/172.16.1.31
问题原因:
服务启动顺序不对,没有启动nfs服务
(2. 检查有没有可用存储目录
showmount -e 172.16.1.31
问题原因:
配置文件编写有问题,重启nfs服务
网络问题
ping 172.16.1.31
telnet 172.16.1.31 111

#坑
挂载报错:

mount: wrong fs type, bad option, bad superblock on 172.16.1.31:/data,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

客户端需:
yum install -y nfs-utils

服务器技术交流群请加微信 YJZyjz