免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 806 | 回复: 0
打印 上一主题 下一主题

NFS服务器架设(Unix Like服务器间共享文件) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-28 15:47 |只看该作者 |倒序浏览
NFS(Network File System)网络文件系统,主要用在Unix Like主机间共享文件。NFS服务器可以让你将网络远端的NFS主机共享的目录挂载到本地端,在本地端机器上看远程NFS共享的目录就像本地端自己的一个分区一样。

NFS与RPC:
NFS (NFS守护进程打开端口2049)支持的功能很多,每启用一个功能,就会随机打开一个小于1024的未用端口,这样就造成客户端由于不知道NFS启动的端口号而不能连上NFS服务器。所以NFS服务器需要依赖于RPC服务,NFS启动时主动向RPC注册端口号,并且RPC在111端口(portmap)监听客户端的请求,当有NFS服务请求来临时,RPC负责告诉客户端NFS服务各功能的对应端口号。
注意:在NFS启动前请先启动RPC服务(service portmap start),然后再启动NFS。如果RPC服务重启,也必须重启NFS服务,以便于NFS重新注册其端口到RPC。

当客户端有存取NFS文件需求时,他会如何想服务器端请求资料?

  • 客户端向RPC(port 111)发出存取NFS服务器上文件的询问要求;
  • RPC找到NFS服务器注册的端口号返回给客户端;
  • 客户端通过NFS的端口号去连接NFS daemon。

注意:由上图可知不管是NFS服务器端还是客户端都需要启动RPC服务。
NFS启动的daemon:

NFS 又被称为RPC Server,他的主要任务是进行文件系统的共享,所以通常会涉及到文件权限。NFS服务启动时至少要启动两个daemon,一个管理客户端是否能够登陆问题,一个管理客户端能够存取的权限。如果要做磁盘配额(quota)的话还要启动其他daemon。

  • rpc.nfsd:这个daemon主要用来管理客户端是否能够登陆NFS服务器的,其中包括验证登陆者的ID。
  • rpc.mountd:这个daemon主要用来管理NFS服务器的文件权限。当客户端顺利通过rpc.nfsd的验证后,还要验证文件的使用权限,它会去读/etc/exports配置文件来对比客户端的权限,通过后方可存取NFS的文件(通常NFS文件的使用权限由/etc/exports配置文件里设置的权限和文件本身的权限决定。)。
  • rpc.lockd(非必要):这个daemon主要用来管理管理文件的锁定。因为当多个人同时写一个文件时可能会造成问题。rpc.lockd必须同时在客户端和服务器端同时启用才行。通常它还与rpc.statd同时启用。
  • rpc.statd(非必要)这个daemon主要用来检查文件的一致性。当客户端由于同时对一个文件进行写操作而造成问题时,rpc.statd会试图检查并修复此文件。这个功能也必须在客户端和服务器端同时启用才能生效。
NFS服务器认证与文件存取权限
1、客户端访问NFS时使用什么身份?

当用户dmtsai访问NFS服务器上的文件时,NFS服务器会检测此用户的UID和GID在其/etc/passwd和/etc/group中是否存在,如果存在,客户端尝试以此UID和GID进行访问;如果不存在将以nobody(或者nfsnobody)身份访问。如果是root则默认会被映射到匿名用户(nobody),因为此用户权限太大,可能会对NFS服务器造成破坏。
2、NFS服务器必须开放文件权限(在/etc/exports中进行设定)。
3、在实际的文件系统中具有相应的权限。
如果你想有某文件的写入权限,你必须具备(1)、有登陆NFS服务器权限(UID);(2)、NFS服务器设定此UID有写入权限;(3)、实际文件系统中此UID有写入权限。
NFS服务器设置
确保以下两个安装包被安装:

  • RPC主程序:portmap(一般默认安装),NFS需要注册其端口到portmap中,所以启动NFS前请先启动portmap。
  • NFS主程序:nfs-utils主要提供rpc.nfsd和rpc.mountd这两个daemon及相关文档等。
查看服务安装情况:
[root@somode ~]# rpm -qa |grep portmap
portmap-4.0-65.2.2.1
[root@somode ~]# rpm -qa |grep nfs
nfs-utils-1.0.9-24.el5
nfs-utils-lib-1.0.8-7.2.z2
[root@somode ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1778/portmap      
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1778/portmap  
默认情况下portmap已经启动。
NFS套件结构:

  • /etc/exports:这个是NFS的配置文件,默认为空,需要自己配置。
  • /usr/sbin/exportfs:主要用在fwq端,当/etc/exports改变时重新共享目录或者可以将NFS共享的目录卸载。
  • /usr/sbin/showmount:主要用在客户端,用来查看NFS的共享目录。
  • /var/lib/nfs/*tab:NFS服务器的登陆档放在/var/lib/nfs/下,其中etab主要记录了NFS分享出来的目录的完整权限设定;xtab主要记录了曾经连接到此NFS主机的相应用户资料。

NFS的配置文件:/etc/exports
[root@somode ~]# vi /etc/exports
/home/public            220.231.31.0/24(rw)
#[分享目录]              [主机(权限列表)]
其中主机可以是一个IP或IP地址段,可用的主机名如localhost,也可以是域名如*.tech.net,对于域名可以使用通配符。
权限设定常见参数:

  • rw:read-write,可读写;
  • ro:read-only,只读;
  • sync:资料同步写入内存和硬盘中;
  • no_root_squash:如果是root登陆NFS是将具有root权限;
  • root_squash:如果是root登陆NFS是将被映射到nobody(或是nfsnobody)(默认值);
  • all_squash:不管用户登陆身份是什么都被映射到匿名用户(nobody)通常与anonuid和anongid连用,将所有用户映射到此UID和GID;
  • anonuid:当设置*_squash时,用户被映射到此UID。
  • anongid:同anonuid。

权限设置实例:
[root@somode ~]# vi /etc/exports
/home/public            192.168.0.0/24(rw,sync,no_root_squash)
/home/istone            192.168.0.0/24(rw)
/home/test               *.tech.net(rw,sync,all_squash,anonuid=501,anongid=501)
[root@somode ~]# ls -l /home/
婊璁?40
drwx------ 3 istone istone 4096 04-22 20:21 istone
drwxrwxrwx 2 root   root   4096 04-22 20:21 public
drwx------  3 test   test   4096 04-22 20:41 test
[istone@somode ~]$ id istone
uid=500(istone) gid=500(istone) groups=500(istone) context=root:system_r:unconfined_t:SystemLow-SystemHigh
[root@somode ~]# id test
uid=501(test) gid=501(test) groups=501(test) context=root:system_r:unconfined_t:SystemLow-SystemHigh
从192.168.0.0/24 这网段登陆NFS服务器的所有用户对/home/public有读写权限,且如果为人偶root用户将不会被映射为匿名用户;而只有gid为500的用户才能访问/home/istone ;当从*.tech.net登陆到NFS时将被映射为UID=501,GID=501的用户,且对/home/test目录有读写权限。
启动NFS服务
在启动NFS服务前请确保RPC服务(port 111)已经启动。
[root@somode ~]# /etc/init.d/nfs start
启动 NFS 服务:                                            [确定]
关掉 NFS 配额:                                            [确定]
启动 NFS 守护进程:                                        [确定]
启动 NFS mountd:                                          [确定]
[root@somode ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN      -                 #nfs的守护进程
tcp        0      0 0.0.0.0:1029                0.0.0.0:*                   LISTEN      -                  
tcp        0      0 0.0.0.0:619                 0.0.0.0:*                   LISTEN      3407/rpc.rquotad   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1778/portmap      #RPC的守护进程
tcp        0      0 0.0.0.0:722                 0.0.0.0:*                   LISTEN      1812/rpc.statd      
tcp        0      0 0.0.0.0:635                 0.0.0.0:*                   LISTEN      3423/rpc.mountd     
udp        0      0 0.0.0.0:2049                0.0.0.0:*                               -                  
udp        0      0 0.0.0.0:1026                0.0.0.0:*                               -                  
udp        0      0 0.0.0.0:716                 0.0.0.0:*                               1812/rpc.statd      
udp        0      0 0.0.0.0:719                 0.0.0.0:*                               1812/rpc.statd      
udp        0      0 0.0.0.0:616                 0.0.0.0:*                               3407/rpc.rquotad   
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1778/portmap         
udp        0      0 0.0.0.0:632                 0.0.0.0:*                               3423/rpc.mountd   

  • RPC启动的端口为:111;
  • NFS启动的端口为:2049;
  • 其他rpc.daemon启动的端口是随机产生的,需要向RPC注册。

[root@somode ~]# rpcinfo -p localhost   #使用rpcinfo来查看端口的注册情况。
   程序 版本 协议   端口
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp    719  status
    100024    1   tcp    722  status
    100011    1   udp    616  rquotad
    100011    2   udp    616  rquotad
    100011    1   tcp    619  rquotad
    100011    2   tcp    619  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100021    1   udp   1026  nlockmgr
    100021    3   udp   1026  nlockmgr
    100021    4   udp   1026  nlockmgr
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100021    1   tcp   1029  nlockmgr
    100021    3   tcp   1029  nlockmgr
    100021    4   tcp   1029  nlockmgr
    100005    1   udp    632  mountd
    100005    1   tcp    635  mountd
    100005    2   udp    632  mountd
    100005    2   tcp    635  mountd
    100005    3   udp    632  mountd
    100005    3   tcp    635  mountd
[root@linux ~]# showmount [-ae] [hostname|IP]
参数:
-a :显示当前主机客户端与 NFS 连接的共享状态;
-e :显示某主机 /etc/exports 所共享的目录。
#显示当前主机 /etc/exports 所共享的目录
[root@somode ~]# showmount -e localhost
Export list for localhost:
/home/test   192.168.0.0/24
/home/istone 192.168.0.0/24
/home/public 192.168.0.0/24
#检查/var/lib/nfs/etab,查看NFS共享目录的权限,很多为默认值。
[root@somode ~]# tail /var/lib/nfs/etab
/home/public    192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
/home/istone    192.168.0.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)
/home/test  192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=501,anongid=501)
[root@somode ~]# exportfs [-aruv]
参数:
-a :全部挂载(或卸载) /etc/exports 文件下的目录
-r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新/var/lib/nfs/etab和/var/lib/nfs/xtab 的內容!
-u :卸载某一目录
-v :在 export 的时候,将共享的目录显示在屏幕上!

范例一:重新挂载一次 /etc/exports 的设定
[root@somode ~]# exportfs -arv
exporting 192.168.0.0/24:/home/public
exporting 192.168.0.0/24:/home/istone
exporting 192.168.0.0/24:/home/test
范例二:全部都卸载
[root@linux ~]# exportfs -auv
NFS客户端设置
如何挂载NFS服务器共享的文件系统:
  • 确认本地端已经启动了portmap服务。
  • 扫描NFS服务器共享的目录有那些,并了解我们是否可以使用(showmount)。
  • 在本地端创建挂载点(mkdir)
  • 利用mount命令挂载NFS文件系统到本地端。在NFS服务器端查看配置文件
    [root@somode public]# cat /etc/exports
    /home/public            192.168.0.0/24(rw,sync,no_root_squash)
    /home/istone            192.168.0.0/24(rw)
    /home/test              192.168.0.0/24(rw,sync,all_squash,anonuid=501,anongid=501)

    在客户端查看NFS服务器发布的NFS共享目录

    [root@lib ~]# showmount -e somode.tech.net
    Export list for somode.tech.net:
    /home/test   192.168.0.0/24
    /home/istone 192.168.0.0/24
    /home/public 192.168.0.0/24
    # 创建挂载点
    [root@lib ~]# mkdir /home/nfs
    [root@lib ~]# mkdir /home/nfs/test
    [root@lib ~]# mkdir /home/nfs/public
    # 挂载NFS共享目录到本地
    [root@lib ~]# mount -t nfs 192.168.0.30:/home/public /home/nfs/public/
    [root@lib ~]# cd /home/nfs/public/
    [root@lib public]# touch test.txt
    [root@lib public]# ls -l
    total 0
    -rw-r--r--  1 root root 0 Apr 22 22:22 test.txt
    # 挂载NFS服务器下/home/istone/到home/nfs/istone/时被拒绝,因为当前用户是root,如果加入no_root_squash参数,root将能够挂载此目录。
    [root@lib ~]# mount -t nfs 192.168.0.30:/home/istone /home/nfs/istone/
    mount: 192.168.0.30:/home/istone failed, reason given by server: Permission denied
    # su到istone用户
    [istone@lib ~]$ id
    uid=500(istone) gid=500(istone) groups=500(istone)
    创建挂载点
    [istone@lib ~]$ mkdir /home/nfs/istone
    # 使用sudo命令挂载,普通用户不允许mount,修改/etc/sudoers(visudo -f /etc/sudoers,在最后添加一行:istone ALL=/bin/mount,/bin/umount)。
    [istone@lib ~]$ sudo mount -t nfs 192.168.0.30:/home/istone /home/nfs/istone
    [istone@lib ~]$ cd /home/nfs/istone/
    [istone@lib istone]$ touch a.txt
    [istone@lib istone]$ ll
    total 0
    -rw-rw-r--  1 istone istone 0 Apr 22 22:43 a.txt
    # 挂载NFS服务器下/home/public/到home/nfs/public/
    [istone@lib ~]$ sudo mount -t nfs 192.168.0.30:/home/public /home/nfs/public
    [istone@lib ~]$ cd /home/nfs/public/
    [istone@lib public]$ touch istone.txt
    [istone@lib public]$ ll
    total 0
    -rw-rw-r--  1 istone istone 0 Apr 22 22:50 istone.txt
    -rwxrwxrwx  1 root   root   0 Apr 22 22:22 test.txt
    # 挂载NFS服务器下/home/test/到home/nfs/test/
    [istone@lib ~]$ sudo mount -t nfs 192.168.0.30:/home/test /home/nfs/test/
    Password:
    [istone@lib ~]$ cd /home/nfs/test/
    [istone@lib test]$ touch b.txt
    # 注意:istone创建的文件确为test所有
    [istone@lib test]$ ll
    total 0
    -rw-rw-r--  1 test test 0 Apr 22 22:57 b.txt
    # 在NFS上查看test用户的ID

    [root@somode home]# id test
    uid=501(test) gid=501(test) groups=501(test)
    # 查看文件系统挂载情况
    [root@lib nfs]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
                           7063480   2578888   4125784  39% /
    /dev/sda1               101086     13238     82629  14% /boot
    none                    257200         0    257200   0% /dev/shm
    /dev/hdc               2357878   2357878         0 100% /media/cdrom
    192.168.0.30:/home/istone

                           4761856   3281376   1234688  73% /home/nfs/istone
    192.168.0.30:/home/public
                           4761856   3281376   1234688  73% /home/nfs/public
    192.168.0.30:/home/test
                           4761856   3281376   1234688  73% /home/nfs/test
    mount指令的常用参数:

    • suid/nosuid:保留/取消挂载文件系统的suid功能,默认保留。
    • rw/ro:是指挂载文件系统的权限,读写/只读,默认为rw。
    • dev/nodev:是否保留设备的特殊功能,只有/dev才有特殊装置,默认为dev。
    • exec/noexec:是否有执行权限,默认为exec,有执行权限。
    • user/nouser:是否允许使用者进行文件系统的挂载与卸载功能,默认是nouser。
    • auto/noauto:使用mount -a时是否会挂载此目录,如果不需要分区被随时挂载可以设为noauto,默认为auto。
    mount nfs的其它可选参数:
        * HARD mount和SOFT MOUNT:
            HARD: NFS CLIENT会不断的尝试与SERVER的连接(在后台,不会给出任何提示信息,在LINUX下有的版本仍然会给出一些提示),直到MOUNT上。
            SOFT:会在前台尝试与SERVER的连接,是默认的连接方式。当收到错误信息后终止mount尝试,并给出相关信息。
            例如:mount -F nfs -o hard 192.168.0.10:/nfs /nfs
            如果此时你用的是HARD方式的话,系统就会等待,直到能够重新与NFS SERVER建立连接传输信息。另外如果是非关键数据的话也可以使用SOFT方式。
        * rsize和wsize:
            文件传输尺寸设定:V3没有限定传输尺寸,V2最多只能设定为8k,可以使用-rsize(读出) and -wsize(写入)来进行设定。这两个参数的设定对于NFS的执行效能有较大的影响
        * bg:在执行mount时如果无法顺利mount上时,系统会将mount的操作转移到后台并继续尝试mount,直到mount成功为止。(通常在设定/etc/fstab文件时都应该使用bg,以避免可能的mount不上而影响启动速度)
        * fg:和bg正好相反,是默认的参数
        * intr:允许通知中断一个NFS调用。当服务器没有应答需要放弃的时候有用处。

    自动挂载:autofs
    当用户使用到此文件系统时才挂载,如长时间不用可自动卸载此文件系统。


    # 在autofs的主配置文件中添加NFS要挂在的顶级目录

    [root@lib ~]# vi /etc/auto.master
    /home/nfs       /etc/auto.nfs
    # 在制定文件中设置NFS挂载使用的下级目录
    [root@lib ~]# vi /etc/auto.nfs
    # [本地目录]    [挂载参数]                   [NFS共享目录]
    public  -rw,bg,soft,rsize=32768,wsize=32768 192.168.0.30:/home/public  #将192.168.0.30:/home/public挂载到本地的/home/nfs/public/
    istone  -rw,bg,soft,rsize=32768,wsize=32768 192.168.0.30:/home/istone
    test    -rw,bg,soft,rsize=32768,wsize=32768 192.168.0.30:/home/test
    # 启动autofs
    [root@lib ~]# /etc/init.d/autofs start
    Starting automount:                                        [  OK  ]
    [root@lib ~]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
                           7063480   2578896   4125776  39% /
    /dev/sda1               101086     13238     82629  14% /boot
    none                    257200         0    257200   0% /dev/shm
    /dev/hdc               2357878   2357878         0 100% /media/cdrom
    [root@lib ~]# cd /home/nfs/public  # 进入/home/nfs/public目录是NFS文件系统被自动挂载。
    [root@lib public]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
                           7063480   2578896   4125776  39% /
    /dev/sda1               101086     13238     82629  14% /boot
    none                    257200         0    257200   0% /dev/shm
    /dev/hdc               2357878   2357878         0 100% /media/cdrom
    192.168.0.30:/home/public
                           4761856   3281376   1234688  73% /home/nfs/public
    [root@lib public]# mount
    192.168.0.30:/home/public on /home/nfs/public type nfs (rw,bg,soft,rsize=32768,wsize=32768,addr=192.168.0.30)
    [root@lib public]# su - istone
    [istone@lib ~]$ cd /home/nfs/istone
    [istone@lib istone]$ df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
                           7063480   2578896   4125776  39% /
    /dev/sda1               101086     13238     82629  14% /boot
    none                    257200         0    257200   0% /dev/shm
    /dev/hdc               2357878   2357878         0 100% /media/cdrom
    192.168.0.30:/home/public
                           4761856   3281376   1234688  73% /home/nfs/public
    192.168.0.30:/home/istone
                           4761856   3281376   1234688  73% /home/nfs/istone
    参考资料:
    鸟哥的NFS服务器假设:http://linux.vbird.org/linux_server/0330nfs.php
    NFS-HowTo:http://nfs.sourceforge.net/nfs-howto/


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26560/showart_1913146.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP