linux搭建nfs服务

NFS(Network File System)网络文件系统。它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

一、centos

1. 服务端安装并配置

1.1 安装

1
2
3
4
#关闭防火墙
$ service firewalld stop
#安装nfs
$ yum install nfs-utils nfs4-acl-tools net-tools -y

1.2 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#创建共享目录,由于客户端挂载的用户是nfsnobody用户,如果要让客户端可读可写,需要这里是使用root用户建立的目录,所以要给其他用户 7 rwx 的权限
$ mkdir -p /mnt/nfs && chown -R root.root /mnt/nfs/ && chmod 757 /mnt/nfs

#配置NFS共享目录,共享本机/mnt/nfs目录给所有网络主机(共享给具体的网络主机的话,可以将*改成具体ip或者网段配置)
##()里的配置参数可选,数量无关,位置无关,但是如果要配置名称一定要写对,多个参数用,分割
$ cat >> /etc/exports <<EOF
/mnt/nfs *(rw,no_root_squash,async)
EOF

#重新加载nfs服务配置(每次修改都要执行)
$ exportfs -r #或者重启nfs服务systemctl restart nfs
$ service nfs restart

#显示共享详细情况
$ exportfs -v #或者showmount -e

exports文件配置介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/home/nfs   :共享的目录
* :指定哪些用户可以访问
* 所有可以ping同该主机的用户
192.168.1.* 指定网段,在该网段中的用户可以挂载
192.168.1.12 只有该用户能挂载
(rw,sync,no_root_squash): 权限
选项说明
ro:共享目录只读;
rw:共享目录可读可写;
sync:同步,将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
all_squash:所有访问用户都映射为匿名用户或用户组;
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
root_squash(默认):将来访的root用户映射为匿名用户或用户组;
no_root_squash:来访的root用户保持root帐号权限;
anonuid=<UID>:指定匿名访问用户的本地用户UID,默认为nfsnobody(65534);
anongid=<GID>:指定匿名访问用户的本地用户组GID,默认为nfsnobody(65534);
secure(默认):限制客户端只能从小于1024的tcp/ip端口连接服务器;
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree_check(默认) :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;
no_subtree_check :即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

exportfs命令工具:

exportfs用于管理NFS文件系统的命令工具,可在不直接编辑/etc/exports文件的情况下方便的管理NFS。这命令还没研究透,后面有时间再好好补齐。

-a 打开或者取消所有目录的共享
-i <文件> 指定配置文件
-r 更新配置,重新读取/etc/exports
-u 卸载指定目录
-o 使用指定参数
-v 显示共享详细情况

更多:exportfs命令维护NFS服务端当前导出表。其中导出主表存放在/var/lib/nfs/etab文件中(这个文件有最详细的配置,比如有的参数用户没有指定,那么nfs会自动生成对应的默认参数)。当客户端
发送一个NFS MOUNT请求时,rpc.mountd进程会读取该文件。

http://linux.51yip.com/search/exportfs

https://www.cnblogs.com/xzlive/p/9766388.html

2. 客户端安装并挂载

2.1 安装

1
2
3
4
#关闭防火墙
$ service firewalld stop
#安装nfs
$ yum install nfs-utils nfs4-acl-tools net-tools -y

2.2 挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#查看服务端的共享目录 showmount -e + nfs服务主机IP
#比如服务端的IP为192.168.1.161
$ showmount -e 192.168.1.161
#创建挂载点(目录)
$ mkdir /mnt/nfs/
#将服务端的共享目录挂载到本地的创建挂载点(这样该目录实际存放的数据就只存储在服务端的磁盘里,而不会再客户端磁盘里)
$ mount -o rw 192.168.1.161:/mnt/nfs /mnt/nfs/

#测试挂载是否成功
$ df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 495636 0 495636 0% /dev
tmpfs 507412 0 507412 0% /dev/shm
tmpfs 507412 6924 500488 2% /run
tmpfs 507412 0 507412 0% /sys/fs/cgroup
/dev/mapper/centos-root 3655680 2234020 1421660 62% /
/dev/sda1 1038336 138812 899524 14% /boot
tmpfs 101484 0 101484 0% /run/user/0
192.168.1.161:/mnt/nfs 3655680 2157824 1497856 60% /mnt/nfs

#在客户端测试创建文件,然后到服务端看共享的目录是否有客户端创建的文件即可
$ touch /mnt/nfs/helloworld.txt
$ ls -l /mnt/nfs/
总用量 0
-rw-r--r-- 1 root root 0 11月 28 23:34 helloworld.txt

3. NFS权限

服务端要共享目录,必定存在权限问题,该目录是否要公开,是否可读可写可执行,是否每个人都能看…等等这些都是重点考虑的事情。比如共享目录被设置成777,那么任意用户就都可读可写可执行。下面将设置为750权限,那么就只能是指定用户可读可写可执行,用户组可读可写,而其他用户都没权限读写和执行。

3.1 服务端操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#修改nfs配置文件(1、共享目录可读可写;2、将来访的root用户不保留root性质而是映射为nfsnobody匿名用户或用户组;3、将数据先保存在内存缓冲区中,必要时才写入磁盘)
$ echo "/mnt/nfs *(rw,root_squash,async)" > /etc/exports
#重载nfs配置文件
$ exportfs -r

#创建tomcat用户组和用户 并指定gid和uid
$ groupadd tomcat -g 501 && useradd -m -g tomcat -u 501 tomcat && passwd tomcat
#给目录及其子目录所有文件tomcat权限
$ chgrp -R tomcat /mnt/nfs/ && chown -R tomcat:tomcat /mnt/nfs/
#tomcat用户可读可写可执行,tomcat用户组可读可执行,其他用户无权限操作(注意:如果没有执行权限客户端无法cd进目录)
$ chmod -R 750 /mnt/nfs/

#切换到tomcat用户,然后创建一个测试文件
$ su tomcat
$ echo "tomcat server" > /mnt/nfs/tomcat-server.txt

💁‍♂提示:

1
2
3
4
#如果需要刪除用戶组,可执行如下命令
$ groupdel tomcat
#如果需要刪除用戶,可执行如下命令(刪除用戶及其主目录可执行userdel tomcat -r)
$ userdel tomcat

3.2 客户端操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#客户端也要要创建同样的tomcat用户才能使用服务端中共享目录tomcat的所有权限
$ groupadd tomcat -g 501
$ useradd -m -g tomcat -u 501 tomcat && passwd tomcat
#此外为了测试还创建一个tomcat用户组的tomcat2用户,以及非tomcat用户组的test2用户
$ useradd -m -g tomcat -u 502 tomcat2 && passwd tomcat2
$ groupadd test2 -g 5002 && useradd -m -g test2 -u 5002 test2 && passwd test2

#然后进入/mnt/nfs/目录用不同用户测试
$ su tomcat
[tomcat@box-centos7x64-docker-1 mnt]$ cat /mnt/nfs/tomcat-server.txt
tomcat server
[tomcat@box-centos7x64-docker-1 mnt]$ echo "tomcat-client" > /mnt/nfs/tomcat-client.txt
[tomcat@box-centos7x64-docker-1 mnt]$

$ su tomcat2
[tomcat2@box-centos7x64-docker-1 mnt]$ cat /mnt/nfs/tomcat-server.txt
tomcat server
[tomcat2@box-centos7x64-docker-1 mnt]$ echo "tomcat2-client" > /mnt/nfs/tomcat2-client.txt
bash: /mnt/nfs/tomcat2-client.txt: 权限不够
[tomcat2@box-centos7x64-docker-1 mnt]$

$ su test2
[test2@box-centos7x64-docker-1 mnt]$ cat /mnt/nfs/tomcat-server.txt
cat: /mnt/nfs/tomcat-server.txt: 权限不够
[test2@box-centos7x64-docker-1 mnt]$ echo "test2-client" > /mnt/nfs/test2-client.txt
bash: /mnt/nfs/test2-client.txt: 权限不够
[test2@box-centos7x64-docker-1 mnt]$

💁‍♂提示:

卸载掉挂载的目录

1
2
#根据挂载点卸载
$ umount /mnt/nfs/

💁‍♂ 拓展:如果共享目录有777权限且不保留客户端root用户性质权限的话,那么在客户端使用不存在于服务端的用户(比如test2)在共享目录中创建的文件或者目录时的,则改文件或目录的文件创建者将会被nfs设置为nfsnobody匿名用户。

4. windows客户端挂载

可直接使用windows10 自带的nfs客户端服务功能,打开控制面板>>程序>>程序和功能>>启动或关闭Windows功能

1553224408192

1
$ mount 192.168.1.161:/mnt/nfs  k:

1553225441914

卸载挂载

1
2
$ umount  k:  #卸载挂载点k盘
#umount -f -a #会卸载全部挂载点(慎用,可能卸载掉其他非自己挂载的挂载点)

5. 端口配置

NFS 用到的服务有 portmapper nfs rquotad nlockmgr mountd 5个服务。通过命令 rpcinfo -p 可查看nfs使用的端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@0003 ~]# rpcinfo -p
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 15276 status
100024 1 tcp 59582 status
100005 1 udp 892 mountd
100005 1 tcp 892 mountd
100005 2 udp 892 mountd
100005 2 tcp 892 mountd
100005 3 udp 892 mountd
100005 3 tcp 892 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 32769 nlockmgr
100021 3 udp 32769 nlockmgr
100021 4 udp 32769 nlockmgr
100021 1 tcp 32803 nlockmgr
100021 3 tcp 32803 nlockmgr
100021 4 tcp 32803 nlockmgr

其中 portmapper nfs 服务端口是固定的分别是 111 2049

另外 rquotad nlockmgr mountd 服务端口是随机的。由于端口是随机的,这导致防火墙无法设置。

这时需要配置/etc/sysconfig/nfs使 rquotad nlockmgr(这个服务包含两个端口) mountd 的端口固定。

1
2
3
4
5
6
$ vim /etc/sysconfig/nfs
#找到以下几项,将前面的#号去掉。
RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892

重启nfs即可生效

1
$ service nfs restart

最后将5个服务固定的6个端口配置到防火墙即可,端口包括:111、875、892、2049、32769、32803

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ firewall-cmd --permanent --add-port=111/tcp
$ firewall-cmd --permanent --add-port=875/tcp
$ firewall-cmd --permanent --add-port=2049/tcp
$ firewall-cmd --permanent --add-port=32769/tcp
$ firewall-cmd --permanent --add-port=32803/tcp
$ firewall-cmd --permanent --add-port=892/tcp

$ firewall-cmd --permanent --add-port=111/udp
$ firewall-cmd --permanent --add-port=875/udp
$ firewall-cmd --permanent --add-port=2049/udp
$ firewall-cmd --permanent --add-port=32769/udp
$ firewall-cmd --permanent --add-port=32803/udp
$ firewall-cmd --permanent --add-port=892/udp

#重新加载配置
$ firewall-cmd --reload

参考:

http://www.blogjava.net/envoydada/archive/2012/03/14/371875.html

https://www.cnblogs.com/cheyunhua/p/12033457.html

https://blog.csdn.net/qq43748322/article/details/98484637

二、ubuntu

1
2
3
4
5
6
7
8
9
#1. 安装
$ sudo apt-get install nfs-common nfs-kernel-server
#2. 修改配置文件
$ sudo vim /etc/exports
/home/nfs *(rw,sync,no_root_squash)
#3. 加载配置文件
$ sudo exportfs -a
#4. 重启nfs服务
$ sudo /etc/init.d/nfs-kernel-server restart


----------- 本文结束 -----------




如果你觉得我的文章对你有帮助,你可以打赏我哦~
0%