NFS:网络文件系统(Network File System,NFS)是由SUN公司研发的UNIX表示层协议通过网络让不同主机之间共享文件或目录。使访问者如同访问本地计算机上的文件一样的访问网络上的文件
NFS实现过程:
(1)NFS通过RPC服务来实现文件或者目录的共享,RPC服务主要用来记录NFS每个功能所对应的端口号,并将信息传递给请求数据的NFS客户端,以此实现完整的数据传输过程。
(2)NFS服务启动时会随机启动数个端口,且主动向RPC服务来注册端口信息。RPC服务以此得知每个端口对应的NFS功能
(3)RPC服务使用固定端口111来监听NFS客户端发出的请求动作,然后将正确的NFS端口传递给NFS客户端,以此实现客户端与服务端之间的通信与数据传输。
注意:
(1)服务端服务的启动顺序为先启动RPC服务,后启动NFS服务,否则NFS服务无法向RPC服务注册相关信息
(2)在CentOS5.x系统下RPC服务为portmap,在centos6.x以后统一为rpcbind,nfs-utils是NFS服务的主程序。
NFS服务端部署:
rpm -qa nfs-utils rpcbind查看是否安装rpm -qa nfs-utils rpcbind
yum install -y nfs-utils rpcbind
切记一定要按照启动顺寻来启动服务
systemctl start rpcbind.service
systemctl start nfs.service
查看NFS向RPC注册的端口信息。
rpcinfo -p 127.0.0.01/localhost
设置开机自启动
systemctl enable rpcbind.service
systemctl enable nfs.service
创建挂载目录及文件
mkdir /nfs/test -p
touch /nfs/test/test.txt
配置nfs服务的exports文件
vim /etc/exports
############################
/nfs/test/ 192.168.186.0/24(rw,sync)
############################
NFS配置文件中的参数说明
ro 目录read only
rw 目录可读写
sync 将数据同步写入内存缓冲区与磁盘中
async 将数据先写入内存缓冲区,有必要时才写入磁盘
all_squash 将远程访问用户及组全映射成默认用户或用户组nfsnobody
no_all_squash 与all_squash配置相反
root_squash 将root用户以及所属组映射成默认用户或用户组
no_root_squash 与root_squash配置相反
anonuid=xxx 将远程访问用户映射成指定用户ID的用户
anongid=xxx 将远程访问用户组映射成指定用户组ID的用户组
重新加载NFS服务配置文件
exportfs -rv
exportfs是NFS服务端发布共享的控制命令,具体参数说明如下表
-r 重新加载并刷新共享配置
-v 显示确认共享配置
-a 将配置文件/etc/exportfs中的所有共享配置发布
-u 不发布配置的共享
查看NFS服务器的挂载情况
showmount -e 127.0.0.1
showmount -e localhost
NFS客户端部署:
安装NFS与RPC服务并启动
yum -y install nfs-utils.x86_64 rpcbind.x86_64
systemctl start rpcbind.service
查看挂载情况
showmount -e 192.168.186.136
客户端挂载共享目录
mkdir /nfsclient
mount -t nfs 192.168.186.136:/nfs/test /nfsclient/
cd /nfsclient/
ls
df -mh
开机自动挂载
_netdev:声明网络设备, 系统在网络服务配置完成后,再挂载本设备
vim /etc/fstab
192.168.186.136:/nfs/test /nfsclient/ nfs defaults,_netdev 0 0
NFS客户端安全配置:
1、客户销写入测试
命令如下
[root@localhost nfsclient]# touch aaa.txt
touch: cannot touch ‘aaa.txt’: Permission denied
由测试结果可知,客户端目录无写入权限,因此需要更改服务端的目录权限。首先查服务端默认使用什么用户来访问共享目录,结果如下。
[root@nfsserver ~]# cat /var/lib/nfs/etab
/nfs/test 192.168.186.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@nfsserver ~]# grep 65534 /etc/passwd
nfsnobody❌65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
从结果中可以看出,默认是通过nfsnobody这个用户来访问共享目录的。
2.客户端安全配置
从上面的结果得知,默认是通过nfsnobody 这个用户来访问共享目录的,但对于相同版的系统默认都会存在这样一个 nfsnobody 用户。如果将服务端的共享目录权限配置成nfsnobody用户与组可读、可写、可执行也是不安全的,所以需要将默认的用户修改成自定义的用户,具体修改如下。
服务端配置修改。
首先添加自定义且指定用户ID的用户并禁止其登录,操作命令如下。
[root@nfsserver ~]# useradd -s /sbin/nologin -M -u 9090 nfsuser
[root@nfsserver ~]# tail -l /etc/passwd
qemu❌107:107:qemu user:/:/sbin/nologin
radvd❌75:75:radvd user:/:/sbin/nologin
gdm❌42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup❌991:986::/run/gnome-initial-setup/:/sbin/nologin
avahi❌70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix❌89:89::/var/spool/postfix:/sbin/nologin
sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump❌72:72:😕:/sbin/nologin
zhaorui❌1000:1000:zhaorui:/home/zhaorui:/bin/bash
nfsuser❌9090:9090::/home/nfsuser:/sbin/nologin
接着修改NFS配置,修改如下。
[root@nfsserver ~]# vim /etc/exports
/nfs/test/ 192.168.186.0/24(rw,sync,all_squash,anonuid=9090,anongid=9090)
[root@nfsserver ~]# exportfs -rv
exporting 192.168.186.0/24:/nfs/test
[root@nfsserver ~]# chown -R nfsuser.nfsuser /nfs/test/
[root@nfsserver ~]# ls -l /nfs/test/
total 0
-rw-r–r-- 1 nfsuser nfsuser 0 Jan 1 23:19 test.txt
客户端配置
首先在客户端添加与服务端相同的用户,操作如下
useradd -s /sbin/nologin -M -u 9090 nfsuser
接着进行客户端写入测试
[root@nfsclient ~]# cd /nfsclient/
[root@nfsclient nfsclient]# ls
test.txt
[root@nfsclient nfsclient]# touch 123.txt
[root@nfsclient nfsclient]# ls
123.txt test.txt
NFS客户端挂载优化
在企业实际生产环境中,NFS 服务器共享的文件一般是一些静态资源文件(如图片、视频等),挂载的文件系统都作为数据存储用途。NFS服务还可以让不同的客户端挂载使用同一个目录,以保证不同节点的客户端数据的一致性,这在生产集群环境中十分常见。
挂载参数
NFS客户端挂载的常见参数如下。
□ rsize 和 wsize:写和读缓存,两者在NFSv2、NFSv3、NFSv4各个版本中的最大
值(默认单位字节)如下。
NFSv2 rsize=8192 wsize=8192
NFSv3 rsize=32768 wsize=32768
NFSv4 rsize=65536 wsize=65536
□ noauto:不自动挂载文件系统。
□ noexec:不允许安装可执行的二进制文件。
□ nosuid:不允许配置用户标识或组标识。
□ nodev:不解释字符或文件块等特殊设备。
□ noatime:不更新文件的时间戳。
□ nodiratime:不更新目录的时间戳。
优化实例测试
测试无优化情况下文件写入速度命令如下。
[root@nfsclient nfsclient]# cd /nfsclient/
[root@nfsclient nfsclient]# time dd if=/dev/zero of=/nfsclient/test-file bs=100k count=1000
1000+0 records in
1000+0 records out
102400000 bytes (102 MB) copied, 0.818783 s, 125 MB/s
real 0m0.823s
user 0m0.000s
sys 0m0.300s
测试优化后文件写入速度
卸载原来的挂载之后,重新使用优化参数进行挂载,操作命令如下
[root@nfsclient nfsclient]# cd
[root@nfsclient ~]# umount -t nfs 192.168.186.136:/nfs/test/ /nfsclient/
umount: /nfsclient/: not mounted
[root@nfsclient ~]# df -mh
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 38G 5.0G 33G 14% /
devtmpfs 1.3G 0 1.3G 0% /dev
tmpfs 1.3G 0 1.3G 0% /dev/shm
tmpfs 1.3G 9.0M 1.3G 1% /run
tmpfs 1.3G 0 1.3G 0% /sys/fs/cgroup
/dev/sda1 297M 157M 141M 53% /boot
tmpfs 266M 28K 266M 1% /run/user/0
[root@nfsclient ~]# mount -t nfs -o noexec,nosuid,nodev,rw,rsize=65536,wsize=65536 192.168.186.136:/nfs/test/ /nfsclient/
[root@nfsclient ~]# df -mh
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 38G 5.0G 33G 14% /
devtmpfs 1.3G 0 1.3G 0% /dev
tmpfs 1.3G 0 1.3G 0% /dev/shm
tmpfs 1.3G 9.0M 1.3G 1% /run
tmpfs 1.3G 0 1.3G 0% /sys/fs/cgroup
/dev/sda1 297M 157M 141M 53% /boot
tmpfs 266M 28K 266M 1% /run/user/0
192.168.186.136:/nfs/test 38G 5.0G 33G 14% /nfsclient
测试优化后写入的速度操作如下:
[root@nfsclient ~]# time dd if=/dev/zero of=/nfsclient/test-file bs=100k count=1000
1000+0 records in
1000+0 records out
102400000 bytes (102 MB) copied, 0.529496 s, 193 MB/s
real 0m0.549s
user 0m0.000s
sys 0m0.102s
[root@nfsclient ~]#
俩个结果还是有一些区别的。对于批量写入大文件,服务器配置、网络环境都会产生一定的影响