liunx之nfs#
NFS的介绍
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
NFS工作流程图
NFS运行原理图
NFS服务器端配置
操作系统
[root@nfs-31 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@nfs-31 ~]# uname -r
3.10.0-862.el7.x86_64
[root@nfs-31 ~]# uname -m
x86_64
NFS&rpcbind软件
- 安装
root@nfs01 ~]# yum install nfs-utils rpcbind -y
- 检查
rpm
RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”
[root@nfs-31 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-47.el7.x86_64
nfs-utils-1.3.0-0.61.el7.x86_64
- 自动创建nfsnobody用户
[root@nfs-31 ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
启动服务
- 启动 rpcbind
[root@nfs-31 ~]# systemctl start rpcbind
#检查rpc是否启动《一》
[root@nfs-31 ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2019-01-20 13:45:44 CST; 8h ago
#检查rpc是否启动《二》
[root@nfs-31 ~]# 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
- 启动NFS
[root@nfs-31 ~]# systemctl start nfs
#检查rpc是否启动《一》
[root@nfs-31 ~]# 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 59272 status
100024 1 tcp 56237 status
#检查rpc是否启动《一》
[root@nfs-31 ~]# ps -ef | grep nfs
root 1905 2 0 13:46 ? 00:00:00 [nfsd4_callbacks]
root 1909 2 0 13:46 ? 00:00:00 [nfsd]
root 1910 2 0 13:46 ? 00:00:00 [nfsd]
root 1911 2 0 13:46 ? 00:00:00 [nfsd]
root 1912 2 0 13:46 ? 00:00:00 [nfsd]
root 1913 2 0 13:46 ? 00:00:00 [nfsd]
root 1914 2 0 13:46 ? 00:00:00 [nfsd]
root 1915 2 0 13:46 ? 00:00:00 [nfsd]
root 1916 2 0 13:46 ? 00:00:00 [nfsd]
root 2848 2221 0 22:12 pts/0 00:00:00 grep --color=auto nfs
开机启动
相关的服务添加到开机自启动中
【方法1】
将nfs服务加入并检查:
[root@nfs01 ~]# chkconfig nfs on
[root@nfs01 ~]# chkconfig --list nfs
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
将rpcbind服务加入并检查:
[root@nfs01 ~]# chkconfig rpcbind on
[root@nfs01 ~]# chkconfig --list rpcbind
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
【方法2】
加入:
[root@nfs01 ~]# echo “/etc/init.d/rpcbind start” >>/etc/rc.local
[root@nfs01 ~]# echo “/etc/init.d/nfs start” >>/etc/rc.local
查看:
[root@nfs01 ~]# tail -2 /etc/rc.local
/etc/init.d/rpcbind start
/etc/init.d/nfs start
【注意】
在实际的生产环境中用方法2而不用方法1,因为可以方便运维人员的管理
设置共享目录
默认情况下该配置文件是空的
- 配置nfs的配置文件 /etc/exports
#share /data
#/data 172.16.1.0/24(rw,sync)
#最狗血错误172.16.1.0/24(rw,sync)中24和(之间不能有空格
-
配置文件书写格式
格式:NFS共享目录 客户端地址1(参1,参2只读还是可写) 客户端地址2(参1,参2) -
参数选项说明
NFS共享的目录:为NFS服务端要共享的实际目录,要用绝对路径如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。/etc/exports配置文件格式书写详细如下表
客户端地址 | 具体地址例子 | 说明 |
---|---|---|
授权单一客户端访问NFS | 172.16.1.31 | 单一客户端不符合使用场景 |
授权整个网段可访问NFS | 172.16.1.31/24 | /24==255.255.255.0(最常用) |
NFS权限设置
常用格式 | 实例 |
---|---|
读写 | /data 172.16.1.0/24(rw,sync) 允许客户端读写,并且数据同步写到服务器的磁盘里 |
指定客户端 | data 172.16.1.0/24(rw,sync,all_squash,anonuid=888,anongid=888) 允许客户端读写,并且数据同步写到服务器的磁盘里,并且指定客户端的uid和gid,早期生产环境中的一种配置,适合多客户端共享一个NFS单目录,如果所有服务器的nfsnodoby账户的UID相同,则本案例就没什么意义了 |
只读 | /data 172.16.1.0/24(ro) 只读共享,用途:例如在生产环境中开发人员有查看服务器日志的需求,但是又不希望给开发服务器的权限,那么就可以给开发提供从某个测试服务器NFS客户端上查看某个生产服务器日志目录(NFS共享目录)的权限,但是,这不是唯一的方法喲 |
NFS配置参数权限
rw(熟记) | 表示可读写权限 |
---|---|
ync(熟记)s | 请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回,优点:数据安全不会丢,缺点:性能比不启用该参数要差 |
async(熟记) | 写入数据时会先写到内存缓冲区,直到硬盘有空档才会在写入磁盘,这样可以提升写入效率。风险是若服务器宕机或不正常关机,会损失缓冲区中未写入硬盘的数据(解决办法:服务器主板电池或UPS不间断电源) |
all_squash(熟记) | 不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩为匿名用户,同时它的UID和GID都会变成nfsnobody账号身份,在早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用,在生产环境中配置NFS的重要技巧:1)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限,all_squash把所有客户端都压缩成匿名用户(UID相同),就是anonuid,anongid指定的UID和GID相同,2)所有的客户端和服务器端都需要有一个相同的UID和GID的用户,nfsnodoby(UID必须相同) |
anonuid(熟记) | 参数以anon*开头即值anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然我们也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多个NFS Clients时,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用。一般默认就好 |
anongid(熟记) | 同anonuid,区别是把uid(用户id)换成gid(组id) |
- 更改共享目录的权限
[root@nfs-31 ~]# chown -R nfsnodoby.nfsnodoby /data
[root@nfs-31 ~]# ll -d /data
drwxr-xr-x 3 nfsnobody nfsnobody 94 Jan 20 15:12 /data
5. 平滑重启nfs服务
systemctl reload nfs
问题标记
- [解决 ] Job for nfs-server.service invalid.
重启后同样无法启动
nfs启动失败
在用上述平滑启动reload nfs的时候出现错误 解决办法:重启nfs
问题标记
/data 拒绝访问
mount.nfs: access denied by server while mounting 172.16.1.21:/data
查看是否NFS没有开启
服务端测试
挂载本地ip 的mnt目录 mount -t nfs 172.16.1.21:/data /mnt
在mnt中创建xingchao.txt
查看/data中是否也有
测试开机启动*
共享目录使用结束之后,卸载共享目录
[root@demo-nfs-21 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 48G 1.9G 47G 4% /
devtmpfs 988M 0 988M 0% /dev
tmpfs 998M 0 998M 0% /dev/shm
tmpfs 998M 9.3M 989M 1% /run
tmpfs 998M 0 998M 0% /sys/fs/cgroup
/dev/sda1 1014M 124M 891M 13% /boot
tmpfs 200M 0 200M 0% /run/user/0
172.16.1.21:/data 48G 1.9G 47G 4% /mnt
[root@demo-nfs-21 ~]# umount /mnt #卸载挂载目录
NFS服务端和客户端交互
umount
-lf 强制卸载
问题总结
- 出现上述图片谁有办法解决联系我
- 亟待解决重启后nfs无法启动问题
无法启动nfs服务问题已经解决
systemctl enable nfs-server.service 开机启动是添加 - 测试挂载
客户端测试挂载
mount -t nfs 172.16.1.31:/data /app/uploads/
NFS设置开机启动没有启动
[root@demo-nfs-21 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: inactive (dead)