zoukankan      html  css  js  c++  java
  • Linux课程笔记 NFS

    1. NFS原理描述

     主要功能是通过网络让不同的机器系统之间可以彼此共享文件或目录,允许NFS客户端将远端NFS服务器的共享目录挂载到本地的NFS客户端中。在本地NFS客户端的机器看来,NFS服务器端共享的目录就好像是自己的磁盘分区或者目录一样,一般用来存储共享视频,图片等静态数据。

    2. RPC(Remote  Procedure  Call)

    NFS支持的功能相当多,不同的功能使用不同的程序启动,随机取用一些未被使用的的小于1024的端口传输数据。

    RPC最主要的功能就是记录每个NFS功能所对应的的端口号,并且将该信息传递给NFS客户端,让客户端可以连接到正确的端口上去。NFS启动时会随机取用数个端口,并主动向RPC服务注册取用的相关端口信息,然后RPC服务使用固定的port 111来监听NFS客户端的请求,并将正确的NFS端口应答给客户端。

    提示:

        在启动NFS SERVER之前,首先要启动PRC服务(即portmap服务),否则NFS SERVER就无法向RPC服务注册。另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行/etc/init.d/nfs reload或exportfs  -rv即可使修改的/etc/exports生效。

    3. NFS工作原理简图

    4. NFS SERVER端设置

    4.1  查询系统版本

    [qinbf@test2 ~]$ cat /etc/redhat-release

    CentOS release 5.8 (Final)

    [qinbf@test2 ~]$ uname -r

    2.6.18-308.4.1.el5

    4.2 NFS软件

    要部署NFS服务,必须安装下面两个软件包:

    1)  nfs-utils:NFS主程序

    包括rpc.nfsd、rpc.mountd两个daemons等

    2)  portmap:RPC主程序

    4.3  查看NFS软件包

    [root@test2 ~]# rpm -qa nfs-utils portmap

    portmap-4.0-65.2.2.1

    nfs-utils-1.0.9-60.el5

    4.4  启动NFS相关服务
    4.4.1  启动portmap服务

       因为NFS及其辅助服务都是基于RPC协议的,所以要首先确保系统(客户端和服务端都要启动)中运行了portmap服务。

    [root@test2 ~]# service portmap status

    portmap 已停

    [root@test2 ~]# service portmap start

    启动 portmap:                                             [确定]

    [root@test2 ~]# service portmap status

    portmap (pid 2489) 正在运行...

       如果portmap服务未启动,执行命令rpcinfo  -p localhost会报如下错误:

    [root@test2 ~]# rpcinfo -p localhost

    rpcinfo:无法同 portmapper 交互: RPC:远程系统错误 - 拒绝连接

       正常情况下:

    [root@test2 ~]# rpcinfo -p localhost

       程序 版本 协议   端口

        100000    2   tcp    111  portmapper

        100000    2   udp    111  portmapper

    4.4.2  启动NFS服务

    [root@test2 ~]# /etc/init.d/nfs status

    rpc.mountd 已停

    nfsd 已停

    rpc.rquotad 已停

    [root@test2 ~]# /etc/init.d/nfs start

    启动 NFS 服务:                                            [确定]

    关掉 NFS 配额:                                            [确定]

    启动 NFS 守护进程:                                        [确定]

    启动 NFS mountd:                                          [确定]

    正在启动 RPC idmapd:                                      [确定]

    [root@test2 ~]# rpcinfo -p localhost

       程序 版本 协议   端口

        100000    2   tcp    111  portmapper

        100000    2   udp    111  portmapper

        100011    1   udp    773  rquotad

        100011    2   udp    773  rquotad

        100011    1   tcp    776  rquotad

        100011    2   tcp    776  rquotad

        100003    2   udp   2049  nfs

        100003    3   udp   2049  nfs

        100003    4   udp   2049  nfs

        100021    1   udp  51795  nlockmgr

        100021    3   udp  51795  nlockmgr

        100021    4   udp  51795  nlockmgr

        100003    2   tcp   2049  nfs

        100003    3   tcp   2049  nfs

        100003    4   tcp   2049  nfs

        100021    1   tcp  42098  nlockmgr

        100021    3   tcp  42098  nlockmgr

        100021    4   tcp  42098  nlockmgr

        100005    1   udp    809  mountd

        100005    1   tcp    812  mountd

        100005    2   udp    809  mountd

        100005    2   tcp    812  mountd

        100005    3   udp    809  mountd

        100005    3   tcp    812  mountd

    从NFS服务启动的提示,可以看出NFS默认需要启动的进程至少有:rpc.mountd,nfsd,rpc.rquotad。

    (1) nfsd(rpc.nfsd)

    这个daemon的主要功能是管理Client端是否能够登入主机,其中还包含登入者的判别。

    (2) rpc.mountd

    这个daemon的主要功能则是管理NFS的文件系统,当Client端顺利通过rpc.nfsd登入主机之后,在它可以使用NFS服务器提供的文件之前,还会经过文件使用权限的认证程序,它会去读NFS的配置文件/etc/exports来对比Client的权限,当通过这一关之后,Client端就可以取得使用NFS文件的权限。

     4.5. nfs服务开机自启动

    [root@test2 ~]# chkconfig --level 3 nfs on

    [root@test2 ~]# chkconfig --level 3 portmap on

    [root@test2 ~]# chkconfig --list |egrep "portmap|nfs"

    nfs             0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:关闭  6:关闭

    nfslock         0:关闭  1:关闭  2:关闭  3:关闭  4:启用  5:启用  6:关闭

    portmap         0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

    4.6. NFS配置文件路径

    NFS配置文件默认路径为:/etc/exports

    4.6.1 export文件格式

    /etc/exports文件配置格式为:

    NFS共享目录           客户端地址1(参数1,参数2)                  客户端地址2(参数1,参数2)

    1. NFS共享目录:为NFS服务端要共享的实际目录绝对路径
    2. 客户端地址:为服务授权的可访问共享目录的可兑换服务器地址,可以为单独的IP地址或域名,也可以为整个网段地址,还可以用*来匹配所有服务器
    3. 参数集:对授权的客户端的访问权限设置

    生产常见的配置实例:

    常用格式说明

    要共享的目录  客户端IP 地址或IP段

    配置例一

    /ett/oldboy   10.0.0.0/24(rw,sync)  #注意红色部分没有空格

    配置例二

    /home/ryan  10.0.0.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000) 

    配置例三

    /home/oldboy 10.0.0.15(ro) #只读共享

    4.7. NFS权限设置

    参数名称

    参数用途

    rw

    表示读写权限

    ro

    表示只读权限

    sync

    请求或写入数据时,数据同步写入到NFS Server的硬盘后再返回

    async

    请求或写入数据时,先返回请求,再将数据写入到内存和缓存中。此参数可以提升NFS性能,但是会降低数据安全,不建议使用

    no_root_squash

    访问NFS Sever共享目录的用户如果是root的话,它对该共享目录就有root权限。避免使用

    root_suqash

    对于访问NFS Server共享目录的用户如果是root的话,则它的权限被压缩成匿名用户,同时它的UID和GID会变成nobody或nfsbody

    all_squash

    不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nobody或nfsnobody账号,在多个NFS客户端同时读写NFS Sever数据时,这个参数很有用

    anonuid

    参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nobody或nfsbody的UID值,当然我们也可以自行设置这个UID值,但是UID必须存在于/etc/passwd中。

    anongid

    同anonuid,区别就是把uid换成gid

    提示:

    1. 大家可以通过执行man export查阅更多关于exports参数说明;
    2. 配置好nfs服务后,通过cat /var/lib/nfs/etab命令可以看到NFS配置默认自带的参数
    3. 通过cat /var/lib/nfs/rmtab查看有哪些客户端挂载到服务端
    4.8. 开机挂载NFS

    我们可以把共享的目录在/etc/fstab中进行配置,这样在开机启动就会自动加载mount的整个命令,而不需要开机再手工执行mount命令了,在/etc/fstab中加入如下配置即可:

    192.168.1.3:/qinbf   /mnt      nfs        defaults  1  1

    在生产环境中,对于共享的NFS目录,一般不会配置到/etc/fstab里,因为在客户端主机重启时,如果因为网络等原因连接不上nfs server时,就会导致客户端主机无法启动的厄运发生。一般会把mount -t nfs 192.168.1.3:/qinbf  /mnt  命令放到rc.local中来实现开机挂载,但是也会引起重启NFS客户端后,可能挂载NFS不成功。

    4.9.  卸载NFS挂载目录

    强制卸载NFS挂载的:umount  -lf  /mnt

    无法卸载NFS挂载的原因:1)当前处于挂载点,必须要先退出才能卸载。2)nfs

     server 挂了,nfs client会有问题

    4.10. NFS实例

    [root@test2 ~]# mkdir /qinbf

    [root@test2 ~]# echo "/qinbf  192.168.1.0/24(rw,sync)">>/etc/exports

    [root@test2 ~]# cat /etc/exports

    /qinbf  192.168.1.0/24(rw,sync)

    [root@test2 ~]# /etc/init.d/nfs reload   #不需要restart

    [root@test3 ~]# showmount -e 192.168.1.3  #查看服务端有哪些目录可以挂载

    Export list for 192.168.1.3:

    /qinbf 192.168.1.0/24

    [root@test3 ~]# cd /mnt   #未挂载前,此目录为空

    [root@test3 mnt]# ll

    总计 0

    [root@test2 ~]# mkdir -p /qinbf/test/student    #对服务端进行一系列端的创建目录和文件的操作

    [root@test2 ~]# cd /qinbf

    [root@test2 qinbf]# touch aaa.txt

    [root@test2 qinbf]# ll

    总计 12

    -rw-r--r-- 1 root root    0 06-25 23:28 aaa.txt

    drwxr-xr-x 3 root root 4096 06-25 23:28 test

    [root@test2 qinbf]# cd ..

    [root@test2 /]# ll -d /qinbf

    drwxr-xr-x 3 root root 4096 06-25 23:28 /qinbf

    [root@test3 ~]# mount -t nfs 192.168.1.3:/qinbf  /mnt  #将服务端目录挂载到本地/mnt目录

    [root@test3 ~]# cd /mnt/

    [root@test3 mnt]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.7G  7.5G  19% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/qinbf    9.7G  2.3G  7.0G  25% /mnt  #挂载成功

    [root@test3 mnt]# ll -a

    总计 28

    drwxr-xr-x  3 root root 4096 06-25 23:28 .

    drwxr-xr-x 25 root root 4096 06-26 07:18 ..

    -rw-r--r--  1 root root    0 06-25 23:28 aaa.txt

    drwxr-xr-x  3 root root 4096 06-25 23:28 test

    [root@test3 mnt]# mkdir client2   #在/etc/export文件已经有w权限,本地却不能创建目录

    mkdir: 无法创建目录 “client2”: 权限不够

    [root@test2 /]# chmod o+w /qinbf -R  #实际上,如果服务端本身没对外开放w权限,客户端也是没有w权限的

    [root@test3 mnt]# mkdir client2

    [root@test3 mnt]# ll

    总计 28

    -rwxr-xrwx 1 root      root         0 06-25 23:28 aaa.txt

    drwxr-xrwx 2 nfsnobody nfsnobody 4096 06-25 23:42 client1

    drwxr-xr-x 2 nfsnobody nfsnobody 4096 06-26 00:25 client2  #O位给了w,创建成功

    drwxr-xrwx 3 root      root      4096 06-25 23:28 test

    [root@test3 mnt]# umount /mnt  #当前的目录为mnt,所以无法卸载

    umount: /mnt: device is busy

    umount: /mnt: device is busy

    [root@test3 mnt]# cd

    [root@test3 ~]# umount /mnt  #退出挂载目录即可卸载

    [root@test3 ~]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    或者

    [root@test3 mnt]# umount -lf /mnt   #强制卸载的方法

    [root@test3 mnt]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    5. NFS客户端mount挂载参数

    由于NFS共享的是图片、视频之类的数据,所以不必使用到suid,exec等权限,因此在挂载的时候,可以使用这样的命令:

    mount  -t nfs -o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.1.3:/qinbf /qinbf  #hard和init参数可以让在nfs服务出现异常的时候,按下ctrl+c退出。

    6. NFS生产案例

    实现把NFS服务端的/data目录共享指定主机,要求在在NFS客户端可读可写入数据,写入的数据能在NFS SERVER端看到,请给出操作步骤或者设置方法。

    要点:无论什么版本的系统,nfs服务默认的配置里匿名UID和GID都为65534。32位bit的系统中的nfsnobody用户默认的UID恰好和nfs服务默认的匿名UID相同。

    方法一:

    确认系统是32位或者nfsnobody用户默认的UID是65534,就可以使用下面这种方法。

    首先检查各台服务器的NFS服务状态:(test2是server,test3是client,test4是client)

    [root@test2 ~]# grep nfsnobody  /etc/passwd

    nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

    [root@test3 ~]# /etc/init.d/portmap status

    portmap 已停

    [root@test3 ~]# /etc/init.d/portmap start

    启动 portmap:[确定]

    [root@test3 ~]# /etc/init.d/nfs start

    nfs      nfslock 

    [root@test3 ~]# /etc/init.d/nfs start

    启动 NFS 服务: [确定]

    关掉 NFS 配额:[确定]

    启动 NFS 守护进程:[确定]

    启动 NFS mountd:[确定]

    正在启动 RPC idmapd:[确定]

    [root@test3 ~]# chkconfig --level 3 portmap on

    [root@test3 ~]# chkconfig --list |grep portmap

    portmap         0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:关闭  6:关闭

    [root@test3 ~]# chkconfig --level 3 nfs on

    [root@test3 ~]# chkconfig --list |grep nfs

    nfs             0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:关闭  6:关闭

    nfslock         0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

    然后设置NFS SERVER

    [root@test2 ~]# echo "/data 192.168.1.0/24(rw,sync)"> /etc/exports

    [root@test2 ~]# tail /etc/exports                                 

    /data 192.168.1.0/24(rw,sync)

    [root@test2 ~]# 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)

    在客户端机器上检测服务端设置情况

    [root@test3 ~]# showmount -e 192.168.1.3

    Export list for 192.168.1.3:

    /data 192.168.1.0/24

    [root@test4 ~]# showmount -e 192.168.1.3

    Export list for 192.168.1.3:

    /data 192.168.1.0/24

    在客户端机器上挂载服务端目录:

    [root@test3 ~]# cd /mnt

    [root@test3 mnt]# ll

    总计 0

    [root@test3 mnt]# mount -t nfs 192.168.1.3:/data /mnt

    [root@test3 mnt]# ll /mnt

    总计 24

    drwxr-xr-x 3 root root  4096 2012-06-08 htdocs

    drwx------ 2 root root 16384 2012-05-28 lost+found

    [root@test3 mnt]# mkdir test

    mkdir: 无法创建目录 “test”: 权限不够

    这是因为在server端/data这个目录的权限是755,当客户端机器创建目录,会转化成server端的nfsnoby用户创建,而other位没有w权限,故无权限创建目录。

    [root@test2 /]# chmod o+w /data

    [root@test3 mnt]# mkdir test

    [root@test3 mnt]# ll

    总计 32

    drwxr-xr-x 3 root      root       4096 2012-06-08 htdocs

    drwx------ 2 root      root      16384 2012-05-28 lost+found

    drwxr-xr-x 2 nfsnobody nfsnobody  4096 07-19 08:11 test

    [root@test4 ~]# cd /mnt

    [root@test4 mnt]# ll

    总计 32

    drwxr-xr-x 3 root      root       4096 2012-06-08 htdocs

    drwx------ 2 root      root      16384 2012-05-28 lost+found

    drwxr-xr-x 2 nfsnobody nfsnobody  4096 07-19 08:11 test

    方法二:

    如果系统是64bit  5.x

    需要在/etc/exports中添加参数

    (rw,sync,all_squash,anonuid=4294967294,anongid=4294967294)

    方法三:

    万能的方法:所有的nfs的客户端和服务端都要建立oldboy用户及oldboy组,并指定ID。此方法不适用于服务器数量很大的情况。

    [root@test2 /]# groupadd -g 1207 oldboynfs

    [root@test2 /]# useradd -u 1207 -g 1207 oldboynfs

    [root@test3 mnt]# groupadd -g 1207 oldboynfs

    [root@test3 mnt]# useradd -u 1207 -g 1207 oldboynfs

    [root@test4 mnt]# groupadd -g 1207 oldboynfs

    [root@test4 mnt]# useradd -u 1207 -g 1207 oldboynfs

    [root@test2 /]# mkdir /oldboynfs

    [root@test2 /]# ll -d /oldboynfs/

    drwxr-xr-x 2 root root 4096 07-19 08:29 /oldboynfs/

    [root@test2 /]# chown -R /oldboynfs/

    [root@test2 /]# tail -1 /etc/exports

    /oldboynfs 192.168.1.0/24(rw,sync,all_squash,anonuid=1207,anongid=1207)

    [root@test2 /]# /etc/init.d/nfs reload

    [root@test3 mnt]# cd ..

    -bash: cd: ..: Stale NFS file handle  #因为之前的挂载/data我已经注销了,所以无法退出当前目录。

    [root@test3 mnt]# umount /mnt

    umount: /mnt: device is busy

    umount: /mnt: device is busy  

    [root@test3 mnt]# umount -lf /mnt   #强制卸载

    [root@test3 mnt]# cd ..

    [root@test3 /]# mount -t nfs 192.168.1.3:/oldboynfs /mnt

    [root@test3 /]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    #对test4进行同样的操作

    [root@test4 /]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  2.3G  7.0G  25% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  20% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    [root@test2 /]# cat /var/lib/nfs/rmtab   #挂载目录历史

    192.168.1.4:/qinbf:0x00000001

    192.168.1.4:/data:0x00000001

    192.168.1.5:/data:0x00000001

    192.168.1.4:/oldboynfs:0x00000001

    192.168.1.5:/oldboynfs:0x00000001

    设置开机挂载

    把/bin/mount -t nfs 192.168.1.3:/oldboynfs /mnt写进/etc/rc.local

    7.人为模拟错误的学习方法

    7.1 在客户端不卸载已挂载目录的前提下,观察停止各项服务对nfs服务的影响
    7.1.1  停止客户端的portmap服务,测试是否影响已经运行的nfs服务

    [root@test3 ~]# /etc/init.d/portmap stop

    停止 portmap:                                             [确定]

    [root@test3 ~]# cd /mnt

    [root@test3 mnt]# ll

    总计 8

    drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:09 test1

    [root@test4 ~]# cd /mnt

    [root@test4 mnt]# ll

    总计 8

    drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:09 test1

    #客户端机器test3停掉portmap服务之后,仍然可以创建目录test,并在同样是客户端机器test4中看到信创建的目录test,说明停止portmap服务不影响已经运行的nfs服务。

    7.1.2  挂载server端的/oldboynfs目录之前,停止客户端机器的nfs服务(portmap服务仍然运行),观察挂载能否成功

    [root@test3 /]# /etc/init.d/portmap status

    portmap (pid 2680) 正在运行...

    [root@test3 /]# /etc/init.d/nfs status   

    rpc.mountd (pid 2809) 正在运行...

    nfsd (pid 2806 2805 2804 2803 2802 2801 2800 2799) 正在运行...

    rpc.rquotad (pid 2794) 正在运行...

    [root@test3 /]# umount /mnt

    [root@test3 /]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    [root@test3 /]# /etc/init.d/nfs stop

    关闭 NFS mountd:                                          [确定]

    关闭 NFS 守护进程:                                        [确定]

    关闭 NFS quotas:                                          [确定]

    [root@test3 /]# mount -t nfs 192.168.1.3:/oldboynfs /mnt

    [root@test3 /]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    #证明客户端机器挂载server的目录时,并不需要运行nfs服务。

    7.2  停止客户端的portmap服务和nfs服务,重启server端的nfs服务,观察对已经运行的nfs服务有何影响。

    [root@test3 mnt]# /etc/init.d/portmap status

    portmap (pid 2680) 正在运行...

    [root@test3 mnt]# /etc/init.d/nfs status

    rpc.mountd (pid 3063) 正在运行...

    nfsd (pid 3060 3059 3058 3057 3056 3055 3054 3053) 正在运行...

    rpc.rquotad (pid 3048) 正在运行...

    [root@test3 mnt]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    [root@test3 mnt]# /etc/init.d/portmap stop

    停止 portmap:                                             [确定]

    [root@test2 oldboynfs]# rpcinfo -p localhost   

       程序 版本 协议   端口

        100000    2   tcp    111  portmapper

        100000    2   udp    111  portmapper

        100011    1   udp   1006  rquotad

        100011    2   udp   1006  rquotad

        100011    1   tcp   1009  rquotad

        100011    2   tcp   1009  rquotad

        100003    2   udp   2049  nfs

        100003    3   udp   2049  nfs

        100003    4   udp   2049  nfs

        100021    1   udp  38753  nlockmgr

        100021    3   udp  38753  nlockmgr

        100021    4   udp  38753  nlockmgr

        100003    2   tcp   2049  nfs

        100003    3   tcp   2049  nfs

        100003    4   tcp   2049  nfs

        100021    1   tcp  50878  nlockmgr

        100021    3   tcp  50878  nlockmgr

        100021    4   tcp  50878  nlockmgr

        100005    1   udp   1021  mountd

        100005    1   tcp    600  mountd

        100005    2   udp   1021  mountd

        100005    2   tcp    600  mountd

        100005    3   udp   1021  mountd

        100005    3   tcp    600  mountd

    [root@test2 oldboynfs]# /etc/init.d/nfs restart

    关闭 NFS mountd:                                          [确定]

    关闭 NFS 守护进程:                                        [确定]

    关闭 NFS quotas:                                          [确定]

    关闭 NFS 服务:                                            [确定]

    启动 NFS 服务:                                            [确定]

    关掉 NFS 配额:                                            [确定]

    启动 NFS 守护进程:                                        [确定]

    启动 NFS mountd:                                          [确定]

    [root@test2 oldboynfs]# rpcinfo -p localhost  

       程序 版本 协议   端口

        100000    2   tcp    111  portmapper

        100000    2   udp    111  portmapper

        100011    1   udp    692  rquotad

        100011    2   udp    692  rquotad

        100011    1   tcp    695  rquotad

        100011    2   tcp    695  rquotad

        100003    2   udp   2049  nfs

        100003    3   udp   2049  nfs

        100003    4   udp   2049  nfs

        100021    1   udp  56852  nlockmgr

        100021    3   udp  56852  nlockmgr

        100021    4   udp  56852  nlockmgr

        100003    2   tcp   2049  nfs

        100003    3   tcp   2049  nfs

        100003    4   tcp   2049  nfs

        100021    1   tcp  45426  nlockmgr

        100021    3   tcp  45426  nlockmgr

        100021    4   tcp  45426  nlockmgr

        100005    1   udp    707  mountd

        100005    1   tcp    710  mountd

        100005    2   udp    707  mountd

        100005    2   tcp    710  mountd

        100005    3   udp    707  mountd

    100005    3   tcp    710  mountd

    #注意观察nfs服务重启前后,向portmap注册端口的变化,nfs和portmap的端口没变,其他的全部都改变了。

    [root@test3 mnt]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    #先停止portmap服务,并未对已挂载的目录产生影响。

    [root@test3 mnt]# mkdir test3

    [root@test3 mnt]# ll

    总计 24

    drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:09 test1

    drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:28 test2

    drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:36 test3

    [root@test3 mnt]# /etc/init.d/nfs stop

    关闭 NFS mountd:                                          [确定]

    关闭 NFS 守护进程:                                        [确定]

    关闭 NFS quotas:                                          [确定]

    [root@test3 mnt]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    [root@test3 mnt]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    [root@test3 mnt]#

    [root@test3 mnt]#

    [root@test3 mnt]# mkdir test5

    [root@test3 mnt]# ll

    总计 40

    drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:09 test1

    drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:28 test2

    drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:36 test3

    drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:49 test4

    drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:50 test5

    #重启并没有中断已经运行的nfs服务,目录仍然可以挂载写入。

    7.3 卸载已经挂载的目录,然后停止客户端服务,观察是否能够重新挂载
    7.3.1 卸载已经挂载的目录,停止portmap服务,观察能否重新挂载。

    [root@test3 ~]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    [root@test3 ~]# /etc/init.d/portmap status  

    portmap (pid 3443) 正在运行...

    [root@test3 ~]# /etc/init.d/nfs status  

    rpc.mountd (pid 3489) 正在运行...

    nfsd (pid 3486 3485 3484 3483 3482 3481 3480 3479) 正在运行...

    rpc.rquotad (pid 3474) 正在运行...

    [root@test3 ~]# umount /mnt

    [root@test3 ~]# /etc/init.d/portmap stop

    停止 portmap:                                             [确定]

    [root@test3 ~]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    [root@test3 ~]# mount -t nfs 192.168.1.3:/oldboynfs /mnt

    [root@test3 ~]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    7.3.2 卸载已经挂载的目录,停止客户端的portmap服务,并重启server端的nfs服务,观察客户端能否重新挂载。

    [root@test3 ~]# umount /mnt

    [root@test2 ~]# /etc/init.d/nfs restart

    关闭 NFS mountd:                                          [确定]

    关闭 NFS 守护进程:                                        [确定]

    关闭 NFS quotas:                                          [确定]

    关闭 NFS 服务:                                            [确定]

    启动 NFS 服务:                                            [确定]

    关掉 NFS 配额:                                            [确定]

    启动 NFS 守护进程:                                        [确定]

    启动 NFS mountd:                                          [确定]

    [root@test3 ~]# mount -t nfs 192.168.1.3:/oldboynfs /mnt

    [root@test3 ~]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    #客户端停掉portmap服务之后,重启server端的nfs,能够重新挂载目录

    7.3.3 卸载已经挂载的目录,停止portmap服务和nfs服务,nfs服务,重启server端的nfs服务,观察能否重新挂载

    [root@test3 /]# /etc/init.d/portmap status

    portmap 已停

    [root@test3 /]# /etc/init.d/nfs status

    rpc.mountd 已停

    nfsd 已停

    rpc.rquotad 已停

    [root@test3 /]# umount /mnt

    [root@test3 /]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    [root@test3 /]# mount -t nfs 192.168.1.3:/oldboynfs /mnt

    [root@test3 /]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    #可以重新挂载

    7.4 停止server端的nfs服务,观察对已经挂载目录的影响

    [root@test2 ~]# /etc/init.d/nfs stop

    关闭 NFS mountd:                                          [确定]

    关闭 NFS 守护进程:                                        [确定]

    关闭 NFS quotas:                                          [确定]

    关闭 NFS 服务:                                            [确定]

    [root@test3 mnt]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    hello,world!

    #停止server端的nfs服务,客户端的挂载马上出现窗口死掉的异常,重启server端的nfs服务之后即可恢复。

    或者在挂载的时候加上参数-o  hard,intr,按下ctrl+c即可退出窗口死掉的异常

    回到最原始的测试:在不启动客户端的portmap和nfs服务,能否挂载server端的目录时,我发现答案是:可以!!  

    [root@test3 /]# /etc/init.d/portmap status

    portmap 已停

    [root@test3 /]# /etc/init.d/nfs status   

    rpc.mountd 已停

    nfsd 已停

    rpc.rquotad 已停

    [root@test3 /]# mount -t nfs 192.168.1.3:/oldboynfs /mnt

    [root@test3 /]# df -h

    文件系统              容量  已用 可用 已用% 挂载点

    /dev/sda2             9.7G  1.6G  7.7G  17% /

    /dev/sda3             4.9G  139M  4.5G   3% /data

    /dev/sda1              99M   18M   76M  19% /boot

    tmpfs                 249M     0  249M   0% /dev/shm

    192.168.1.3:/oldboynfs

                          9.7G  2.3G  7.0G  25% /mnt

    8.NFS的优缺点

    8.1  NFS的优点

    1.简单

    2.方便

    3.可靠

    8.2  NFS的局限

    1.局限性是存在单点故障,如果nfs server挂了,所有的客户端不能访问共享目录,负载均衡及高可用方案可以弥补

    2.在高并发的场合,NFS的性能有限

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

    4.NFS数据是明文的,完整性不作验证

    5.多机器挂载服务器时,连接管理维护麻烦。尤其是NFS服务端除了问题之后,所有客户端都挂掉状态(可用autofs解决)

    8.3 exportfs

    exportfs命令可以不通过配置文件/etx/exports,直接在命令行中配置挂载。

    [root@test2 ~]# mkdir /ex

    [root@test2 ~]# export

    export    exportfs 

    [root@test2 ~]# export

    export    exportfs 

    [root@test2 ~]# exportfs -o sync,all_squash,mp,fsid=2 192.168.1.3:/ex

    [root@test2 ~]# showmount -e 192.168.1.3

    Export list for 192.168.1.3:

    /ex        192.168.1.3

    /oldboynfs 192.168.1.0/24

     

    9. NFS调优

    调优的步骤:

    1. 测量当前的网络、服务器和每个客户端的执行效率
    2. 分析收集来的数据并画出图表。查找出特殊情况,例如很高的磁盘和CPU占用、很高的磁盘使用时间
    3. 调整服务器
    4. 重复第一到第三直到到达你渴望的性能

    与NFS性能有关的问题有很多,通常要考虑的有以下这些选择:

    1. WSIZE,RSIZE参数

    WSIZE,RSIZE对于NFS的效能有很大的影响,设定了server端和client端之间来往数据块的大小,如果挂载时,使用了这两个参数,可以让客户端读取和写入数据时,一次性可以读写更多的数据包

    1. noatime、nodiratime

    读写磁盘的时候,不更新文件的时间戳,减少和和磁盘的交互

    可以通过time命令来检查添加参数之后,执行效率。

  • 相关阅读:
    Saltstack安装及入门
    网络-flannel及calico
    vxlan 协议
    5G系统架构
    5G及移动边缘计算(MEC)学习笔记(3)
    linux 环境变量
    Python 包管理工具
    linux 后台运行程序
    训练测试样本划分
    kmeans 聚类 k 值优化
  • 原文地址:https://www.cnblogs.com/fengze/p/6752564.html
Copyright © 2011-2022 走看看