Da'sBlog

linux用nfs共享目录文档

这里我们分成两台主机,一台web-html nfs客户端ip为192.168.1.100。一台web-php nfs服务端ip为192.168.1.101。

首先我们要判断是否安装rpc,它主要用于给nfs提供传输。客户端服务端都要装

一般系统都安装好装好了,没有就安装下

1
2
3
4
5
service portmap status
service rpcbind status
yum install nfs-utils //nfs软件

登陆客户端查看 nginx的id号

1
2
3
[root@Web-html nfs]# id nginx
uid=501(nginx) gid=501(nginx) groups=501(nginx)

登陆服务端,编辑/etc/exports,格式如下

<共享目录> 客户端1(选项) [客户端2(选项) …]
共享目录:NFS共享给客户机的目录。
客户端:网络中可以访问此目录的主机。多个客户端以空格分隔。
选项:设置目录的访问权限、用户映射等,多个选项以逗号分隔。

1
2
/www/apache2/sunhao/html 192.168.1.0/24(ro,sync,all_squash,anonuid=501,anongid=501)

选项说明
ro:共享目录只读;
rw:共享目录可读可写;
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端口连接服务器;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree_check(默认) :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;
no_subtree_check :即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

重启nfs挂载成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
service nfs start
exportfs -rv //nfs提供的检查挂载命令
[root@Web-php ~]# ps -ef | grep nfs
root 97898 2 0 17:21 ? 00:00:00 [nfsd4]
root 97899 2 0 17:21 ? 00:00:00 [nfsd4_callbacks]
root 97900 2 0 17:21 ? 00:00:00 [nfsd]
root 97901 2 0 17:21 ? 00:00:00 [nfsd]
root 97902 2 0 17:21 ? 00:00:00 [nfsd]
root 97903 2 0 17:21 ? 00:00:00 [nfsd]
root 97904 2 0 17:21 ? 00:00:00 [nfsd]
root 97905 2 0 17:21 ? 00:00:00 [nfsd]
root 97906 2 0 17:21 ? 00:00:00 [nfsd]
root 97907 2 0 17:21 ? 00:00:00 [nfsd]
root 98036 98010 0 17:23 pts/2 00:00:00 grep nfs

exportfs

不重启nfs服务应用更新,相关选项如下:
-a 全部挂载或卸载 /etc/exports中的内容
-r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
-v 在export的时候,将详细的信息输出到屏幕上。

showmount -e 登陆服务器端,查看挂载的目录

1
2
3
[root@Web-html]# showmount -e 192.168.1.101
Export list for 192.168.1.101:
/www/apache2/sunhao/html 192.168.1.0/24

如果提示失败,出现下面字样。说明hosts出现问题,查看后发现没有添加服务端的hosts。vim添加下就可以了。

1
2
3
4
5
6
7
[root@web-html ~]# showmount -e
clnt_create: RPC: Program not registered
[root@web-html ~]# more /etc/hosts
127.0.0.1 localhost.example localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.100 web-html
[root@web-html ~]#

如果还是不行,就关闭iptables或者修改下面介绍的配置文件。

登陆客户端服务器 挂载远程服务器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mount -t nfs 192.168.1.101:/www/apache2/sunhao/html/ /www/sunhao/html/
[root@web-html www]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
50G 4.4G 43G 10% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
/dev/sda1 477M 42M 411M 10% /boot
/dev/mapper/VolGroup-lv_home
5.5G 993M 4.2G 19% /home
/dev/mapper/VG_data-LV_data
196G 55G 132G 30% /www
192.168.1.101:/www/apache2/sunhao/html
196G 3.4G 183G 2% /www/ceshi

永久挂载和自动挂载

1
2
3
4
5
vi /etc/fstab
192.168.1.101:/www/apache2/sunhao/html/ /www/sunhao/html/ nfs defaults
保存退出
mount -a
// 自动挂载可以用autofs

卸载

1
2
3
4
umount /root/ceshi
发现自己在这个目录 所以无法卸载,退出当期那目录就好

当服务端开启iptables时候,客户端访问超时,这个时候需要修改nfs的配置

我们分析下原理

nfs本身不带网络传输的。都是通过rpc的111端口进行通信。

(1)客户端会向服务器端的RPC(port 111)发出NFS文件存取功能的询问请求。
(2)服务器端找到对应的已注册的NFS,默认nfsd2049 daemon端口后会回报给客户端。
(3)客户端了解正确的端口后,就可以直接与NFS守护(2049)进程来联机

所以111和2049是必须开通的

由于nfs服务需要开启 mountd,nfsd,nlockmgr,portmapper,rquotad这5个服务,需要将这5个服务的端口加到iptables里面

而nfs 和 portmapper两个服务是固定端口的,nfsd为2049,portmapper为111。其他的3个服务是用的随机端口,那就需要

先把这3个服务的端口设置成固定的。

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
[root@web-html etc]# cat /etc/sysconfig/nfs
#
# Define which protocol versions mountd
# will advertise. The values are "no" or "yes"
# with yes being the default
#MOUNTD_NFS_V2="no"
#MOUNTD_NFS_V3="no"
#
#
# Path to remote quota server. See rquotad(8)
# rquotad:处理当用户通过nfsmount到远程服务器时的配额
#RQUOTAD="/usr/sbin/rpc.rquotad"
# Port rquotad should listen on.
#RQUOTAD_PORT=875
# Optinal options passed to rquotad
#RPCRQUOTADOPTS=""
#
#
# Optional arguments passed to in-kernel lockd
#LOCKDARG=
# TCP port rpc.lockd should listen on.
#LOCKD_TCPPORT=32803
# UDP port rpc.lockd should listen on.
#LOCKD_UDPPORT=32769
#
#
# Optional arguments passed to rpc.nfsd. See rpc.nfsd(8)
# Turn off v2 and v3 protocol support
#RPCNFSDARGS="-N 2 -N 3"
# Turn off v4 protocol support
#RPCNFSDARGS="-N 4"
# Number of nfs server processes to be started.
# The default is 8.
#RPCNFSDCOUNT=8
# Stop the nfsd module from being pre-loaded
#NFSD_MODULE="noload"
# Set V4 and NLM grace periods in seconds
#
# Warning, NFSD_V4_GRACE should not be less than
# NFSD_V4_LEASE was on the previous boot.
#
# To make NFSD_V4_GRACE shorter, with active v4 clients,
# first make NFSD_V4_LEASE shorter, then restart server.
# This will make the clients aware of the new value.
# Then NFSD_V4_GRACE can be decreased with another restart.
#
# When there are no active clients, changing these values
# can be done in a single server restart.
#
#NFSD_V4_GRACE=90
#NFSD_V4_LEASE=90
#NLM_GRACE_PERIOD=90
#
#
#
# Optional arguments passed to rpc.mountd. See rpc.mountd(8)
#RPCMOUNTDOPTS=""
# Port rpc.mountd should listen on.
# rpc.mountd:负责NFS的档案系统,当CLIENT端通过rpc.nfsd登陆SERVER后,对clinet存取server的文件进行一系列的管理 必须
#MOUNTD_PORT=892
#
#
# Optional arguments passed to rpc.statd. See rpc.statd(8)
#STATDARG=""
# Port rpc.statd should listen on.
#STATD_PORT=662
# Outgoing port statd should used. The default is port
# is random
#STATD_OUTGOING_PORT=2020
# Specify callout program
#STATD_HA_CALLOUT="/usr/local/bin/foo"
#
#
# Optional arguments passed to rpc.idmapd. See rpc.idmapd(8)
#RPCIDMAPDARGS=""
#
# Set to turn on Secure NFS mounts.
#SECURE_NFS="yes"
# Optional arguments passed to rpc.gssd. See rpc.gssd(8)
#RPCGSSDARGS=""
# Optional arguments passed to rpc.svcgssd. See rpc.svcgssd(8)
#RPCSVCGSSDARGS=""
#
# To enable RDMA support on the server by setting this to
# the port the server should listen on
#RDMA_PORT=20049

NFS需要启动的DAEMONS:参考NFS daemons
pc.nfsd:由nfsd的主要功能是处理内核模块。用户空间程序只指定什么样的服务应该侦听套接字的内核,什么NFS版本,它应该支持,并应该使用多少的内核线程。 必须
portmap:处理RPC程序客户端和服务器端的端口对应 必须
rpc.mountd:负责NFS的档案系统,当CLIENT端通过rpc.nfsd登陆SERVER后,对clinet存取server的文件进行一系列的管理 必须
lockd:处理通过RPC包的锁定请求
statd:为nfs锁定服务提供crash恢复功能
rquotad:处理当用户通过nfsmount到远程服务器时的配额
守护进程启动顺序:rpc.portmap, rpc.mountd, rpc.nfsd, rpc.statd, rpc.lockd (新版本会自动跟着nfsd启动起来), rpc.rquotad

其实默认开通2049和111就可以连接上,如果需要开通别的需求,就要固定别的端口了

1
2
3
4
5
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 2049 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 2049 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 111 -j ACCEPT
1
2
3
4
5
6
7
8
9
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 875 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 2049 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 876 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 2049 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 875 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 876 -j ACCEPT

如果服务器突然挂掉,这里我们模拟一下 通过service nfs stop

这个时候客户机通过df -h 或者直接访问目录会卡死

我们可以通过 mount 查询到客户机挂载的地址

通过输入 umont -f /目录 强制卸载

如果一次不行,多执行几遍就好了

坚持原创技术分享,您的支持将鼓励我继续创作!