nfs
一、概念
1.基本概念
NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利。
NFS一般用来存储共享视频,图片等静态数据。不适合存储脚本、数据库文件。磁盘主要提供读操作,而尽量减少写操作。
2.工作原理
NFS是通过网络来进行服务端和客户端之间的数据传输,所以需要网络端口。
NFS服务器到底使用什么网络端口来传输数据的?NFS服务器端其实是选择随机端口来进行数据传输。
NFS客户端如何知道NFS服务器端使用哪个端口呢?NFS服务器其实是通过远程过程调用(remote procedure call简称RPC)协议/服务来实现的。
也就是说,RPC服务会统一管理NFS的端口,客户端和服务端通过RPC先沟通NFS使用了哪些端口,之后再利用这些端口(小于1024)来进行数据的传输。RPC管理服务端的NFS端分配,客户端要传数据,那客户端的RPC会先跟服务端的RPC去要服务器的端口。要到端口后再建立连接,然后传輸数据。
RPC和NFS之间是如何相互通讯的?
首先,当NFS启动后,会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,并且RPC会开启111端口,等待客户端RPC请求。
如果客户端发起请求,那服务端的RPC就会将记录的NFS端口信息告知客户端。
RPC和NFS的启动顺序是怎样的?
启动NFS Server之前,首先要启动RPC服务(即portmap服务,下同)否则NFS Server无法向RPC服务器注册。另外,如果RPC服务重新启动,原来己经注册好的NFS端口数据就会全部去失。此时,RPC服务管理的NFS程序要重新启动,并重新向RPC注册。最后,一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reloade或者systemctl reload nfs
客户端NFS和服务端NFS通讯过程:
1)首先,服务端启动RPC服务,并开启RPC端口为111端口。
2)之后,服务端启动NFS服务,并向该RPC服务注册1个随机的NFS端口。
3)然后,客户端启动RPC服务,并向服务端的RPC请求注册的NFS端口。
4)然后,服务端的RPC反馈NFS端口信息给客户端。
5)最后,客端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
3.NFS相关协议和软件
(1)RPC rpcbind(Linux)或RPC Endpoint Mapper(Windows) 服务端/客户端默认安装
(2)nfs-utilis-* 包括NFS命令与监控程序,默认安装了
(3)rpcbind-* 支持安装RPC NFS服务连接。CentOS 6之前的叫做portmap,默认安装了
4.NFS守护进程
(1)nfs 主要:管理客户端是够能登陆到服务器
(2)rpcbind 主要:进行端口映射工作
二、NFS服务简介
1.主配置文件
/etc/exports 默认为空,或者默认不存在
内容格式 共享目录 客户端1(访问权限、用户映射、其他) 客户端2(访问权限、用户映射、其他)
a.共享目录:共享目录是指NFS服务器共享给客户机使用的目录.,
b.客户端:客户端是指网络中可以访问这个NFS共享目录的计算机
客户端常用的指定方式(*代表所有主机)
指定ip地址的主机:192.168.100.20
指定子网中的所有主机:192.168.100.0
指定域名的主机:www.atguigu.com
指定域中的所有主机:*.atguigu.com
c.设置输出目录的访问权限、用户映射等。
访问权限选项:
设置输出目录只读:ro
设置输出目录读写:rw
用户映射选项:
root_squash:将root用户的访问映射为匿名(nfsnobody)用户uid和gid
no_root_squash:保留管理员权限,以服务器管理员的权限管理
all_squash:将远程访问的用户及所属组都映射为指定uid、gid的匿名用户:
anonuid=xxx:将远程访问的所有用户都映射为指定uid的匿名用户
anongid=xxx:将远程访问的所有用户组都映射为指定gid匿名组账户
其它选项:
sync:将数据立刻同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性(同步)。
async:将数据先保存在内存缓冲区中,必要时才写入磁盘(异步)
2.NFS启动和停止
1、启动NFS服务器
为了使NFS服务器能正常工作,需要启动rpcbind和nfs两个服务,
[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# systemctl start nfs
2、查询NFS服务器状态
[root@localhost ~]# systemctl status nfs
[root@localhost ~]# systemctl status rpcbind
3、停止NFS服务器
[root@localhost ~]# systemctl stop nfs
4、设置NFS服务自启动状态
[root@localhost ~]# chkconfig --list nfs [root@localhost ~]# chkconfig --level 2345 nfs on Note: Forwarding request to 'systemctl enable nfs.service'. Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
5、查看RPC服务开启哪些端口
[root@localhost ~]# 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 50510 status 100024 1 tcp 44883 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 45128 nlockmgr 100021 3 udp 45128 nlockmgr 100021 4 udp 45128 nlockmgr 100021 1 tcp 43901 nlockmgr 100021 3 tcp 43901 nlockmgr
三、NFS实验案例
1.NFS服务端的/atguigu共享给10.0.0.0网段,rw权限
[root@localhost ~]# mkdir /atguigu [root@localhost ~]# chmod o+w /atguigu/ #文件系统开启other的写权限,文件系统+配置文件共同决定写权限。 [root@localhost ~]# vim /etc/exports /atguigu 10.0.0.0(rw) #共享目录写绝对路径,网段不用加/24只需要最后1位为0 [root@localhost ~]# systemctl reload nfs
2.NFS服务端重启rpcbind和nfs服务
[root@localhost ~]# systemctl restart nfs [root@localhost ~]# exportfs #查看已经设置的共享目录、共享者有哪些 /atguigu 10.0.0.150
3.NFS服务端查看NFS状态
[root@localhost ~]# showmount -e 10.0.0.50 #和exportfs功能相同,填写服务端IP地址 Export list for 10.0.0.50: /atguigu 10.0.0.150
4.NFS客户端查看NFS状态
[root@localhost ~]# showmount -e 10.0.0.50 #和exportfs功能相同,仍然填写服务端IP地址 Export list for 10.0.0.50: /atguigu 10.0.0.150
5.客户端挂载共享目录
[root@localhost sharedir]# mkdir /mnt/atguigu #创建本地挂载点 [root@localhost sharedir]# mount -o vers=3 10.0.0.50:/atguigu /mnt/atguigu #-o vers=3避免同步延迟,使用nfs v3版本进行挂载
[root@localhost sharedir]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 26G 4.4G 22G 17% /
devtmpfs 1.4G 0 1.4G 0% /dev
tmpfs 1.4G 0 1.4G 0% /dev/shm
tmpfs 1.4G 11M 1.4G 1% /run
tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup
/dev/sda1 1014M 170M 845M 17% /boot
tmpfs 283M 4.0K 283M 1% /run/user/42
tmpfs 283M 32K 283M 1% /run/user/1000
/dev/sr0 4.4G 4.4G 0 100% /run/media/user1/RHEL-7.5 Server.x86_64
//10.0.0.50/atguigu 26G 3.6G 23G 14% /mnt/sharedir
10.0.0.50:/atguigu 26G 3.6G 23G 14% /mnt/atgui
6.NFS共享权限和访问控制
6.1 root用户——>nfsnobody用户(默认情况下)
客户端:
[root@localhost atguigu]# vim a.txt [root@localhost atguigu]# ll total 8 -rw-r--r--. 1 nfsnobody nfsnobody 0 May 8 21:23 a.txt #以root身份创建,但是被映射为nfsnobody用户 [root@localhost atguigu]# grep nfs /etc/passwd #看一下nfsnobody是什么用户 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologi
6.2 root用户——>root用户
服务端:
[root@localhost /]# vim /etc/exports /atguigu 10.0.0.150(rw,no_root_squash) [root@localhost /]# systemctl reload nfs
客户端:
[root@localhost atguigu]# vim b.txt #客户端同步更新配置 [root@localhost atguigu]# ll total 12 -rw-r--r--. 1 nfsnobody nfsnobody 0 May 8 21:23 a.txt -rw-r--r--. 1 root root 12 May 8 21:56 b.txt
6.3 任意用户——>指定uid+gid的匿名用户
服务端:
[root@localhost xinetd.d]# useradd nfs_test #创建1个用户 [root@localhost xinetd.d]# id nfs_test uid=1003(nfs_test) gid=1003(nfs_test) groups=1003(nfs_test) #查看这个用户的uid和gid [root@localhost /]# vim /etc/exports tguigu 10.0.0.150(rw,all_squash,anonuid=1003,anongid=1003) #将这个用户uid和gid映射过去 [root@localhost /]# systemctl reload nfs
客户端:
[root@localhost atguigu]# vim c.txt [root@localhost atguigu]# ll total 16 -rw-r--r--. 1 nfsnobody nfsnobody 0 May 8 21:23 a.txt -rw-r--r--. 1 root root 12 May 8 21:56 b.txt -rw-r--r--. 1 1003 1003 10 May 8 22:08 c.txt
服务端:
[root@localhost atguigu]# ll total 16 -rw-r--r-- 1 nfsnobody nfsnobody 0 May 8 21:23 a.txt -rw-r--r-- 1 root root 12 May 8 21:56 b.txt-rw-r--r-- 1 nfs_test nfs_test 10 May 8 22:08 c.txt
7.卸载与自动挂载
7.1卸载
客户端卸载:
[root@localhost atguigu]# umount /mnt/atguigu #客户端主动卸载挂载的目录
服务端卸载:
[root@localhost atguigu]# exportfs -au #服务端暂时停止的自身共享
服务端重新挂载:
[root@localhost atguigu]# exportfs -ra #服务端继续进行的自身共享
7.2自动卸载
/etc/fstab
[root@localhost atguigu]# vim /etc/fstab 10.0.0.50/:atguigu /mnt/atguigu nfs defaults,vers=3 0 0 [root@localhost user1]# umount /mnt/atguigu [root@localhost user1]# mount -a [root@localhost user1]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel-root 26G 4.4G 22G 17% / devtmpfs 1.4G 0 1.4G 0% /dev tmpfs 1.4G 0 1.4G 0% /dev/shm tmpfs 1.4G 11M 1.4G 1% /run tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup /dev/sda1 1014M 170M 845M 17% /boot tmpfs 283M 4.0K 283M 1% /run/user/42 tmpfs 283M 32K 283M 1% /run/user/1000 /dev/sr0 4.4G 4.4G 0 100% /run/media/user1/RHEL-7.5 Server.x86_64 //10.0.0.50/atguigu 26G 3.6G 23G 14% /mnt/sharedir 10.0.0.50:/atguigu 26G 3.6G 23G 14% /mnt/atguigu
8.NFS的相关命令
8.1 exportfs
如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动NFS呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:
格式:exportfs [-aruv]
-a全部挂载或卸载/etc/exports中的内容
-r重新读取/etc/exports中的信息,并同步更新/etc/exports、/var/lib/nfs/xtab
-u卸载单一目录(和-a起使用为卸载所有/etc/exportfs文件中的目录)
-v在export的时候,将详细的信息输出到屏幕上。
具体例子:
exportfs-au 卸载所有共享目录
exportfs-ra 重新共享所有目录并输出详细信息
8.2 rpcinfo
rpcinfo -p 可以查看出c开启的端口所提供的程序有哪些。其中nfs开启的是2049,portmapper(rpcbind)开启的是111,其余则是rpc开启的。
rpcbind rpc服务不要停止、重启,它不仅仅为NFS提供服务,还为其他进程提供服务!!
C:\Users\y21355\Documents\ShareX\Screenshots\2020-05\chrome_6bVVxCCHSF.png
1、启动NFS服务器
为了使NFS服务器能正常工作,需要启动rpcbind和nfs两个服务,
servlcerpcbindstarte
servlcenfSstart
2、查询NFS服务器状态
servlcerpcbindstatus+'
servlcenfSStatLlS
并且rpcbind
一定要先于nfs启动。