首页 > 代码库 > nfs网络文件系统服务介绍与实战第二部

nfs网络文件系统服务介绍与实战第二部

本博文议程如下:


1、生产情况应用案例


2NFS客户端可挂载的参数


3、人为模拟错误的学习方法


4NFS在网站架构中的位置


5NFS的优缺点


议程1、生产情况实际案例概述:

实现当多台客户端同时挂载一台NFS Server时,无论从哪个客户端写入数据,其他客户端同样可以读写,即让所有NFS客户端写入到NFS Server的文件或目录在NFS Server上的用户和组都是同一个名称nfsnobody 。请给出操作步骤,并加以说明。

实现NFS服务端的/data目录共享,指定主机(自己设置),要求在NFS客户端可读可写入数据,写入的数据可以在NFS Server端看到,请给出操作步骤或配置方法?

解答:

要点:无论什么版本的操作系统,NFS服务默认的配置里匿名uidgid都为65534

wKiom1Nik8HzDAbgAAKWqSS0OEQ238.jpg

查看3台机器上查看nfsnobody用户的uidgid分别是多少?是不是相同?

[root@nfs-server ~]# grep nfsnobody /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs-client1 ~]# grep nfsnobody /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs-client2 ~]# grep nfsnobody /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

首先让服务端的portmap启动起来

[root@nfs-server ~]# /etc/init.d/portmap status
portmap (pid 3658) is running...

其次让服务端的NFS启动起来,NFS一定要确保在portmap服务启动之后再启动

[root@nfs-server ~]# /etc/init.d/nfs status
rpc.mountd (pid 3748) is running...
nfsd (pid 3745 3744 3743 3742 3741 3740 3739 3738) is running...

为了确保NFSportmap之后启动的,让NFS服务重新启动一下即可

[root@nfs-server ~]# /etc/init.d/nfs restart
Shutting down NFS mountd:                                  [  OK  ]
Shutting down NFS daemon:                                  [  OK  ]
Shutting down NFS services:                                [  OK  ]
Starting NFS services:                                     [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]

分别把portmapNFS设置为开机自启动

[root@nfs-server ~]# chkconfig portmap on
[root@nfs-server ~]# chkconfig nfs on
[root@nfs-server ~]# chkconfig --list|egrep"portmap|nfs" 
nfs             0:off   1:off  2:on    3:on    4:on   5:on    6:off
nfslock         0:off  1:off   2:off   3:on   4:on    5:on    6:off
portmap         0:off  1:off   2:on    3:on   4:on    5:on    6:off

小细节:上面把portmapNFS都设置成开机自启动了,那么开机的时候到底是哪个先启呢?我们来对比两者的启动脚本来进行深度剖析

wKiom1NilGfjFTVjAAHELxI9yBA955.jpg

[root@nfs-server ~]# more /etc/init.d/nfs #查看NFS服务的启动脚本

wKioL1NilHbgjmA8AAHjKLzpuHI704.jpg

接下来就可以共享本地的/data目录给NFS客户端了

[root@nfs-server ~]# vim /etc/exports
[root@nfs-server ~]# cat /etc/exports
/data/ 192.168.1.0/24(rw,sync)
#<==rw表示让客户端可读写,sync表示当客户端把数据写入到服务端的时候,同时写入到硬盘里面。

配置好之后重新加载NFS服务即可

[root@nfs-server ~]# /etc/init.d/nfs reload
注意:这样配置的前提是要确保NFS服务端和客户端的nfsnobody所对应的uid和gid都是65534,这样就能够保证,NFS所有的客户端在往服务端写数据的时候,都会写同一个uid和gid,A服务写一个文件和B服务写一个文件他俩所对应的用户是相同的,此时A写,B可以删,那么这种机制具体是在哪里控制的呢?
[root@nfs-server ~]# cat /var/lib/nfs/etab
/data   192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
#<==红色部分为手动配置部分,其他均为系统默认附加上去的配置

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开始测试

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开启客户端portmap服务并加入开机自启动

[root@nfs-client1 ~]# /etc/init.d/portmap restart
Stopping portmap:                                          [  OK  ]
Starting portmap:                                          [  OK  ]
[root@nfs-client1 ~]# chkconfig portmap on
[root@nfs-client1 ~]# chkconfig --list portmap
portmap         0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@nfs-client2 ~]# /etc/init.d/portmap restart
Stopping portmap:                                          [  OK  ]
Starting portmap:                                          [  OK  ]
[root@nfs-client2 ~]# chkconfig portmap on
[root@nfs-client2 ~]# chkconfig --list portmap
portmap         0:off   1:off   2:on    3:on    4:on    5:on    6:off

客户端mount服务端共享的目录

首先检查服务端是否已经提供了共享目录
[root@nfs-client1 ~]# showmount -e 192.168.1.50
Export list for 192.168.1.50:
/data 192.168.1.0/24
[root@nfs-client2 ~]# showmount -e 192.168.1.50
Export list for 192.168.1.50:
/data 192.168.1.0/24
NFS客户端挂载测试
[root@nfs-client1 ~]# mount -t nfs 192.168.1.50:/data /mnt/
[root@nfs-client1 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/data
               nfs    9.5G  151M  8.9G   2% /mnt
[root@nfs-client2 ~]# mount -t nfs 192.168.1.50:/data/ /mnt/
[root@nfs-client2 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/data/
               nfs    9.5G  151M  8.9G   2% /mnt

wKiom1NilVegXiJOAAG1ZyvuHpc680.jpg

wKioL1NilUmSb5pjAAEqMnPB8xQ468.jpg

wKiom1NilZ6xfCMsAAE2ehPEgrg560.jpg

wKioL1NilZLxolJLAAEBRqjxIss590.jpg

wKioL1NilcShorfKAAE54J9jx-o569.jpg

[root@nfs-client1 ~]# cd /mnt/
[root@nfs-client1 mnt]# touch {6..8}.txt
touch: cannot touch `6.txt‘: Permission denied
touch: cannot touch `7.txt‘: Permission denied
touch: cannot touch `8.txt‘: Permission denied
[root@nfs-client2 ~]# cd /mnt/
[root@nfs-client2 mnt]# touch {7..10}.txt
touch: 无法触碰 “7.txt”: 权限不够
touch: 无法触碰 “8.txt”: 权限不够
touch: 无法触碰 “9.txt”: 权限不够
touch: 无法触碰 “10.txt”: 权限不够
 [root@nfs-client2 mnt]# export LANG=c
[root@nfs-client2 mnt]# touch {7..10}.txt
touch: cannot touch `7.txt‘: Permission denied
touch: cannot touch `8.txt‘: Permission denied
touch: cannot touch `9.txt‘: Permission denied
touch: cannot touch `10.txt‘: Permission denied

为什么不允许NFS的客户端来读写呢?

应为客户端过来肯定要被映射成65534这个用户的uid65534就是nfsnobodyuid,对于nfsnobody这个用户来讲,它只能去读取这个文件,无法写入;所以能读取到该文件,但是写不了?

有两种方法可以解决上述客户端读写的问题?

第一种就是使用上面的把NFS服务端的共享的/data目录授权为777权限,此种方法从操作系统安全的角度来考虑是不合适的,对权限的控制不够精细,容易造成系统漏洞,比如提权等不安全的事件发生;第二种方法是授权NFS服务端的共享目录/datanfsnobody用户;

推荐采用第二种方法。

[root@nfs-server ~]# chown -R nfsnobody /data/
[root@nfs-server ~]# ls -ld /data/
drwxr-xr-x 2 nfsnobody root 4096 05-01 15:08 /data/
客户端再次进行测试:

wKiom1NiljTSyqETAAHg2I1AyG4980.jpg

wKioL1Nilijx1unBAAG5O2Gqozk220.jpg

实际生产环境的配置参数如下:
[root@nfs-server ~]# vim /etc/exports
 [root@nfs-server ~]# /etc/init.d/nfs reload
[root@nfs-server ~]# cat /etc/exports
#/data/ 192.168.1.0/24(rw,sync)
/data/ 192.168.1.0/24(rw,sync,all_squash)  # all_squash无论客户端是什么用户都压缩为nfsnobody用户来读写文件。
当然了这样做的前提是所有的客户端都拥有同一个uid的用户
[root@nfs-client1 ~]# groupadd nfstest1 -g 1668
[root@nfs-client1 ~]# useradd nfstest1 -u 1668 -g nfstest1
[root@nfs-client1 ~]# tail -1 /etc/passwd
nfstest1:x:1668:1668::/home/nfstest1:/bin/bash
[root@nfs-client1 ~]# id nfstest1
uid=1668(nfstest1) gid=1668(nfstest1) groups=1668(nfstest1) context=root:system_r:unconfined_t:SystemLow-SystemHigh
[root@nfs-client2 ~]# groupadd nfstest1 -g 1668
[root@nfs-client2 ~]# useradd nfstest1 -u 1668 -g nfstest1
[root@nfs-client2 ~]# tail -1 /etc/passwd
nfstest1:x:1668:1668::/home/nfstest1:/bin/bash
[root@nfs-client2 ~]# id nfstest1
uid=1668(nfstest1) gid=1668(nfstest1) groups=1668(nfstest1) context=root:system_r:unconfined_t:SystemLow-SystemHigh

关于NFS服务端认证的万能终极的方法详解:

1、所有的NFS客户端和服务端都建立nfstest1用户及nfstest1

建立nfstest1组并指定nfstest1的GID为1668客户端也要用同样命令创建
[root@nfs-server ~]# groupadd nfstest1 -g 1668
建立用户nfstest1,指定UID为1668并加入nfstest1组,客户端也用同样命令创建
[root@nfs-server ~]# useradd nfstest1 -u 1668 -g nfstest1
[root@nfs-server ~]# tail -n1 /etc/passwd
nfstest1:x:1668:1668::/home/nfstest1:/bin/bash
[root@nfs-server ~]# id nfstest1
uid=1668(nfstest1) gid=1668(nfstest1) groups=1668(nfstest1) context=root:system_r:unconfined_t:SystemLow-SystemHigh
不要忘记NFS Server本地的文件权限:
/data目录权限 chown -R nfstest1 /data,尽量不要使用chmod -R 777 /data

2、修改/etc/exports文件

/data 192168.1.0/24(rw,sync,all_squash,anonuid=1668,anongid=1668)

3/etc/init.d/nfsreload

4、客户端主机上,挂载NFS目录

mount -t nfs 192.138.1.50:/data /mnt

5、完整演示

NFS客户端先卸载之前挂载上去的目录
[root@nfs-client1 ~]# umount /mnt/
[root@nfs-client2 ~]# umount /mnt/
NFS服务端操作
[root@nfs-server ~]# vim /etc/exports
[root@nfs-server ~]# cat /etc/exports
#/data/ 192.168.1.0/24(rw,sync)
/nfstest1 192.168.1.0/24(rw,sync,all_squash,anonuid=1668,anongid=1668)
[root@nfs-server ~]# chown -R nfstest1 /nfstest1/
[root@nfs-server ~]# ls -ld /nfstest1 192.168.1.0/24(rw,sync,all_squash,anonuid=1668,anongid=1668)
drwxr-xr-x 2 nfstest1 root 4096 05-01 22:21 /nfstest1/
[root@nfs-server ~]# /etc/init.d/nfs reload #<===服务端重新读取配置文件
客户端挂载
[root@nfs-client1 ~]# showmount -e 192.168.1.50
Export list for 192.168.1.50:
/nfstest1 192.168.1.0/24
[root@nfs-client1 ~]# mount -t nfs 192.168.1.50:/nfstest1 /mnt/
[root@nfs-client1 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/nfstest1
               nfs     15G  2.3G   12G  17% /mnt
[root@nfs-client2 ~]# showmount -e 192.168.1.50
Export list for 192.168.1.50:
/nfstest1 192.168.1.0/24
[root@nfs-client2 ~]# mount -t nfs 192.168.1.50:/nfstest1 /mnt/
[root@nfs-client2 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/nfstest1
               nfs     15G  2.3G   12G  17% /mnt

wKiom1NilvqzQ8KBAAJQdAZO5Oc780.jpg

wKioL1NiluywduXTAAJ9fVL4iaE809.jpg

wKiom1NilzfQXpNyAAJN9YSXyWQ570.jpg

[root@nfs-server ~]# nl /var/lib/nfs/rmtab
     1  192.168.1.52:/data:0x00000003
     2  192.168.1.51:/data:0x00000001
     3  192.168.1.51:/nfstest1:0x00000001
     4  192.168.1.52:/nfstest1:0x00000001

此文件记录了哪些客户端来访问过NFS服务端共享的哪些目录,一般来讲通过此文件就就可以知道有哪些客户端在挂载我们的NFS服务的共享目录。

设置客户端开机启动挂载
[root@nfs-client1 ~]# which mount
/bin/mount
[root@nfs-client1 ~]# /bin/mount -t nfs 192.168.1.50:/nfstest1 /mnt/
mount.nfs: /mnt is already mounted or busy
[root@nfs-client1 ~]# vim /etc/rc.local
[root@nfs-client1 ~]# tail -n1 /etc/rc.local
/bin/mount -t nfs 192.168.1.50:/nfstest1 /mnt/
[root@nfs-client2 ~]# which mount
/bin/mount
[root@nfs-client2 ~]# vim /etc/rc.local
[root@nfs-client2 ~]# tail -n1 /etc/rc.local
/bin/mount -t nfs 192.168.1.50:/nfstest1 /mnt/

议程2NFS客户端可挂载的参数

NFS客户端mount挂载参数

一般来说,当NFS服务器提供的只是普通数据(图片,HTML,CSS,js,视频,附件等),应该不需要执行suid,exec等权限,因此在挂载的时候,可以这样执行命令:
mount -t nfs -o nosuid,noexec,rw,192.168.1.50:/data /mnt
这样一来,挂载的这个文件夹系统就只能作为数据存取之用,相对来说,对于客户端比较安全一些。
[root@nfs-client1 ~]# umount /mnt/
 [root@nfs-client1 ~]# mount -t nfs -o nosuid,noexec,nodev,rw,sync 192.168.1.50:/nfstest1 /mnt/
[root@nfs-client1 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/nfstest1
               nfs     15G  2.3G   12G  17% /mnt
[root@nfs-client1 ~]# mkdir /mnt/test`data +%F`
-bash: data: command not found
[root@nfs-client1 ~]# mkdir /mnt/`date +%F`
[root@nfs-client2 ~]# mount -t nfs -o nosuid,noexec,nodev,rw,sync 192.168.1.50:/nfstest1 /mnt/  
[root@nfs-client2 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/nfstest1
               nfs     15G  2.3G   12G  17% /mnt
 [root@nfs-client2 ~]# ll /mnt/
total 40
-rw-r--r-- 1 nfstest1 nfstest1    0 May  1 23:22 1.txt
-rw-r--r-- 1 nfstest1 nfstest1    0 May  1 23:23 2.txt
drwxr-xr-x 2 nfstest1 nfstest1 4096 May  1 23:48 2014-05-01
-rw-r--r-- 1 root     root        0 May  1 23:22 3.txt
-rw-r--r-- 1 root     root        0 May  1 23:22 4.txt
-rw-r--r-- 1 root     root        0 May  1 23:22 5.txt
-rw-r--r-- 1 root     root        0 May  1 23:22 6.txt
drwxr-xr-x 2 nfstest1 nfstest1 4096 May  1 23:47 test

wKioL1Nil4GwH0UnAAIG_PtPWMI021.jpg

wKiom1Nil8yyGzFQAAKiCtq6ydc985.jpg

mount -t nfs -o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.1.50:/nfstest1 /mnt
[root@nfs-client1 ~]# mount -t nfs -o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.1.50:/nfstest1 /mnt
[root@nfs-client1 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/nfstest1
               nfs     15G  2.3G   12G  17% /mnt
[root@nfs-client2 ~]# mount -t nfs -o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.1.50:/nfstest1 /mnt
[root@nfs-client2 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/nfstest1
               nfs     15G  2.3G   12G  17% /mnt
[root@nfs-client2 ~]# mount -a
[root@nfs-client2 ~]# mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda6 on /data type ext3 (rw)
/dev/sda5 on /app type ext3 (rw)
/dev/sda3 on /tools type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
192.168.1.50:/nfstest1 on /mnt type nfs (rw,noexec,nosuid,nodev,hard,intr,rsize=32768,wsize=32768,addr=192.168.1.50)

lips:NFS后续优化1

wKioL1NimAPQQKcLAACff3mgEys013.jpg

NFS后续优化2、修改内核参数

echo 262144>/proc/sys/net/core/rmem_default
echo 262144>/proc/sys/net/core/rmem_max
[root@nfs-client1 ~]# cat /proc/sys/net/core/rmem_default
129024
[root@nfs-client1 ~]# echo 262144  >/proc/sys/net/core/rmem_default
[root@nfs-client1 ~]# cat /proc/sys/net/core/rmem_default          
262144
[root@nfs-client1 ~]# cat /proc/sys/net/core/rmem_max
131071
[root@nfs-client1 ~]# echo 262144 >/proc/sys/net/core/rmem_max
[root@nfs-client1 ~]# cat /proc/sys/net/core/rmem_max         
262144
[root@nfs-client2 ~]#  echo 262144  >/proc/sys/net/core/rmem_default
[root@nfs-client2 ~]# cat /proc/sys/net/core/rmem_default
262144
[root@nfs-client2 ~]# echo 262144 >/proc/sys/net/core/rmem_max
[root@nfs-client2 ~]# cat /proc/sys/net/core/rmem_max
262144

NFS问题:umount: /mnt: device is busy解决办法

当无法卸载NFS挂载目录时,如下:
[root@nfs-client1 mnt]# umount /mnt/
umount: /mnt: device is busy
umount: /mnt: device is busy
原因及解决方法:
1、可能当前目录就是挂载的NFS目录(/mnt)
解决方法:退出挂载的目录/mnt,再执行umount /mnt卸载
2、比如NFS Server挂了,NFS client会出问题(df -Th 窗口会死掉)
解决方法:采用强制卸载方法umount -lf /mnt

wKiom1NimGuiSFzmAACe7NLvkDk320.jpg

议程3:人为模拟错误的学习方法(重中之重)

模拟错误(1)、:把NFS client1portmap服务停掉,然后再client1上,往里面写数据,可以写入吗?如果可以写入数据,那么client2上还可以看到吗?

[root@nfs-client1 ~]# /etc/init.d/portmap  stop
Stopping portmap:                                          [  OK  ]
[root@nfs-client1 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/nfstest1
               nfs     15G  2.3G   12G  17% /mnt
[root@nfs-client1 ~]# cd /mnt/
[root@nfs-client1 mnt]# mkdir test`date +%F`
[root@nfs-client1 mnt]# ll
total 48
-rw-r--r-- 1 nfstest1 nfstest1    0 May  1 23:22 1.txt
-rw-r--r-- 1 nfstest1 nfstest1    0 May  1 23:23 2.txt
drwxr-xr-x 2 nfstest1 nfstest1 4096 May  1 23:48 2014-05-01
-rw-r--r-- 1 root     root        0 May  1 23:22 3.txt
-rw-r--r-- 1 root     root        0 May  1 23:22 4.txt
-rw-r--r-- 1 root     root        0 May  1 23:22 5.txt
-rw-r--r-- 1 root     root        0 May  1 23:22 6.txt
drwxr-xr-x 2 nfstest1 nfstest1 4096 May  1 23:47 test
drwxr-xr-x 2 nfstest1 nfstest1 4096 May  2 00:28 test2014-05-02
[root@nfs-client2 ~]# cd /mnt/
[root@nfs-client2 mnt]# ll
total 48
-rw-r--r-- 1 nfstest1 nfstest1    0 May  1 23:22 1.txt
-rw-r--r-- 1 nfstest1 nfstest1    0 May  1 23:23 2.txt
drwxr-xr-x 2 nfstest1 nfstest1 4096 May  1 23:48 2014-05-01
-rw-r--r-- 1 root     root        0 May  1 23:22 3.txt
-rw-r--r-- 1 root     root        0 May  1 23:22 4.txt
-rw-r--r-- 1 root     root        0 May  1 23:22 5.txt
-rw-r--r-- 1 root     root        0 May  1 23:22 6.txt
drwxr-xr-x 2 nfstest1 nfstest1 4096 May  1 23:47 test
drwxr-xr-x 2 nfstest1 nfstest1 4096 May  2 00:28 test2014-05-02
[root@nfs-server ~]# ll /nfstest1/
总计 48
-rw-r--r-- 1 nfstest1 nfstest1    0 05-01 23:22 1.txt
drwxr-xr-x 2 nfstest1 nfstest1 4096 05-01 23:48 2014-05-01
-rw-r--r-- 1 nfstest1 nfstest1    0 05-01 23:23 2.txt
-rw-r--r-- 1 root     root        0 05-01 23:22 3.txt
-rw-r--r-- 1 root     root        0 05-01 23:22 4.txt
-rw-r--r-- 1 root     root        0 05-01 23:22 5.txt
-rw-r--r-- 1 root     root        0 05-01 23:22 6.txt
drwxr-xr-x 2 nfstest1 nfstest1 4096 05-01 23:47 test
drwxr-xr-x 2 nfstest1 nfstest1 4096 05-02 00:28 test2014-05-02
总结:把NFS client1的portmap服务停掉了,但是已有的服务通信还是正常的呢,这是为什么呢?
当服务端启动完毕之后,客户端的portmap先和服务端的portmap沟通,沟通之后由portmap向我汇报NFS的端口,此时客户端会直接和NFS打交道;此时客户端没有portmap服务也可以,因为在portmap服务在启动的一瞬间它的任务就已经完成了;所以说它能够进行沟通。
但是会有一个问题,放你把NFS卸载之后,[root@nfs-client1 ~]# umount /mnt/
重新挂载,因为portmap服务已经停止运行了,这个时候重新挂载,

wKioL1NimHzzExMLAAGv273FRnM082.jpg

wKiom1NimL_SXtYcAAFDszIyp8s851.jpg

wKioL1NimK3Dl-RkAAIlsJ-2Y4M381.jpg

当portmap服务开启之后很快就可以挂载了
[root@nfs-client1 ~]# /etc/init.d/portmap start
Starting portmap:                                          [  OK  ]
[root@nfs-client1 ~]# /bin/mount -t nfs 192.168.1.50:/nfstest1 /mnt/
[root@nfs-client1 ~]# mount -a
[root@nfs-client1 ~]# mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda6 on /data type ext3 (rw)
/dev/sda5 on /app type ext3 (rw)
/dev/sda3 on /tools type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
192.168.1.50:/nfstest1 on /mnt type nfs (rw,addr=192.168.1.50)

模拟错误(2)、把NFS Server端的portmap服务停掉

wKiom1NimQWiuO3dAACQp-9AQUs575.jpg

客户端采用mount默认卸载参数卸载不掉,需强制卸载才可以哦!
[root@nfs-client1 ~]# umount /mnt/
[root@nfs-client1 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/nfstest1
               nfs     15G  2.3G   12G  17% /mnt
[root@nfs-client1 ~]# umount -lf /mnt/
[root@nfs-client1 ~]# df -Th         
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm

wKiom1NimSehw1rNAADHHbO5140180.jpg

一般出现连接拒绝的原因不外乎是对方的防火墙策略设置、对方的端口和服务没有开启等导致的问题。
[root@nfs-server ~]# /etc/init.d/portmap  start
启动 portmap:                                             [确定]
[root@nfs-client1 ~]#  /bin/mount -t nfs 192.168.1.50:/nfstest1 /mnt/
mount: mount to NFS server ‘192.168.1.50‘ failed: RPC Error: Program not registered.
虽然portmap服务已经起来了,但是NFS 向portmap注册的端口信息已经丢失了
[root@nfs-server ~]# rpcinfo -p localhost
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
当NFS Server 端没注册端口了,NFS client 向NFS Server 要端口的时候,服务端就告诉你,你没向它注册,哈哈!出现这种情况,我们可能就大概知道是服务端的NFS 没向portmap注册。
[root@nfs-server ~]# /etc/init.d/nfs restart
Shutting down NFS mountd:                                  [  OK  ]
Shutting down NFS daemon:                                  [  OK  ]
Shutting down NFS services:                                [  OK  ]
Starting NFS services:                                     [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
[root@nfs-server ~]# rpcinfo -p localhost
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100021    1   udp  45436  nlockmgr
    100021    3   udp  45436  nlockmgr
    100021    4   udp  45436  nlockmgr
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100021    1   tcp  49972  nlockmgr
    100021    3   tcp  49972  nlockmgr
    100021    4   tcp  49972  nlockmgr
    100005    1   udp    771  mountd
    100005    1   tcp    774  mountd
    100005    2   udp    771  mountd
    100005    2   tcp    774  mountd
    100005    3   udp    771  mountd
    100005    3   tcp    774  mountd
OK,已经可以成功挂载了
[root@nfs-client1 ~]#  /bin/mount -t nfs 192.168.1.50:/nfstest1 /mnt/
[root@nfs-client1 ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext3     15G  2.3G   12G  17% /
/dev/sda6     ext3    9.5G  151M  8.9G   2% /data
/dev/sda5     ext3    9.5G  151M  8.9G   2% /app
/dev/sda3     ext3    9.5G  151M  8.9G   2% /tools
/dev/sda1     ext3    190M   12M  169M   7% /boot
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
192.168.1.50:/nfstest1
               nfs     15G  2.3G   12G  17% /mnt

模拟错误3、把NFS Server端的NFS服务停掉

wKioL1NimSmhjY43AACkypJlLdA355.jpg

wKioL1NimU2RwSkRAAD5WAcKtOw785.jpg

因为NFS Server端的NFS服务停止了之后,客户端通过portmap跟NFS服务端的portmap进行沟通之后,服务端的portmap告诉客户端NFS端口,然后客户端跟NFS Server端进行联机交换数据,那么,现在的情况是NFS 挂掉了,自然也就没法交换数据了;
解决方法:另开启一终端,使用下列命令强制卸载
[root@nfs-client1 ~]# umount -lf /mnt

议程4NFS在网站架构生产环境中的位置

wKiom1NimcLx_iJkAAKrDhUbe2Q891.jpg

议程5NFS的优缺点

NFS的优点:

1、简单-->容易上手掌握

2、方便-->部署快速,维护简单

3、可靠-->从软件层面上看,数据可靠性高,经久耐用

NFS的局限:

        1、局限性是存在单点故障,如果NFS Server宕机了,所有客户端都不能访问共享目录。

        2、在高并发的场合,NFS效率性能有限(一般几千万一下PV的网站不是瓶颈,处分是网站架构太差)

        3、客户端认证时基于ip和主机名的,安全性一般(用于内网问题不大)

        4NFS数据是明文的,对数据安全性不作验证

        5、多机挂载服务器时,连接管理麻烦。尤其NFS服务端出项问题后,所有客户端都挂掉状态(可使用autofs自动挂载解决)

生产应用场景:

中小型网站(2000W-2500WPV以下)线上使用,都有用武之地。门户网站也会有其他方面的应用,当然未必是线上存储使用。


本文出自 “追风” 博客,请务必保留此出处http://hanyanwei.blog.51cto.com/8672126/1405443