NFS简介

3/28/2005来源:Solaris教程人气:17491

大家好 :
        下面是小弟写的一些介绍 NFS 的文章, 由於想参与网路管理的工作学长指派这一个主题给我报告, 由於本身对这方面并不太懂, 只是找一些书籍随便拼拼凑凑, 不知道有没有写到重点,或是一些要点没有提到,因此post出来希望熟悉NFS 的高手们能花一点时间看看我的文章  然後mail给我,指出错误的地方,或者直接reply也可以, 谢谢 !
        E-mail : u3430854@sparc20.ncu.edu.tw
===========================================================================
    ◎ What is NFS ?


         Network        File        System    

          NFS 是由SUN公司发展, 并於1984年推出, NFS是一个RPC service ,
     它使我们能够达到档案的共享, 它的设计是为了在不同的系统间使用, 所
     以它的通讯协定设计与主机及作业系统无关.当使用者想用远端档案时只
     要用"mount"就可把remote档案系统挂接在自己的档案系统之下,使得远端
     的档案使用上和local机器的档案没两样.

           machine  A                        machine  B
                /                               /

      bin     etc     usr               bin     etc      usr
                      man                          man     share     local


     假如我们在机器A上, 要把机器B上的 /usr/man 挂接到machine A 的
     /usr/man只要下

         mount  machine_name:/usr/man  /usr/home

     就可mount过来.而我们不只是可以mount目录,就是一个档也是可以的.在
     挂接之後我们只能对档案做reading (or writing) 的动作,而不能在
     remote machie上把此档或目录move,delete掉 , 但须注意的是如我们
     mount /usr 後 , 不能再mount /usr底下的目录, 否则会发生错误



   □ Servers & Clients
          NFS就是促使Servers上的档案能被其他的机器mount,而达到资源共享,
      享用这些档案的机器就可称为Client,一个client可以从server上mount一
      个档或是一个层次的目录(file hierarchies) . 然而事实上任何一台机器
      都可以做NFS server or NFS client ,甚至同时为NFS server and NFS
      client 也可以.



   □ Server's Exporting & Client's Mounting
          NFS server 所export 出来的档案或目录都记录在 /etc/exports 这
      一个档中,当我们启动NFS server 时 在 /etc/rc.local 的这一个script
      会自动的启动 exportfs 这一个程式 , 搜寻 /etc/exports 这一个档是否
      存在, 并且赋予正确的权限给所有export出去的 file hierarchies .
          但须注意的是,只有server所export出去的路径,NFS client才能够mount
     , 同样的当启动client时 , 系统会自动去mount所有server export的路径,
      而mount到的所有路径都会记录在 /etc/fstab 下 , 类似如下的fstab档

    /dev/sd0a  /      4.2 rw 1 1
    /dev/sd0h  /tmp   4.2 rw 1 3
    /dev/sd0g  /usr   4.2 rw 1 2
    /dev/fd0   /pcfs  pcfs rw,noauto 0 0
    sparc20:/swap /swap nfs rw,intr,bg,soft 0 0
    sparc17:/home /home nfs rw,intr,bg,soft 0 0
    sparc17:/home3 /home3 nfs rw,intr,bg,soft 0 0
    sparc14:/home4 /home4 nfs rw,intr,bg,soft 0 0
    sparc20:/home2 /home2 nfs rw,intr,bg,soft 0 0
    sparc20:/var/spool/mail /var/spool/mail nfs rw,intr,bg,soft 0 0
    rs970:/home1 /home1 nfs rw,intr,bg,soft 0 0

   ★ Noted :
         当client mount 到一个路径,绝对不是说copy server上的这一个路径
     到local的机器上,我们可以用 cd 进入这一个mount到的路径,就如同是使用
     local directory一样



   □ Setting Up a NFS Server
         1. 定义机器为 NFS file server
         2. 划分server's disk ,定义哪一些partitions 是要提供出来作为
            client 所共享的file system
         3. 在 Client Form 上定义每一台client 的参数
         4. 写出 /etc/exports  (一般系统都有一个default exports)
         5. 重新boot NFS server or 用指令 exportfs -a 输出所有的
            directories 并且用 nfsd 8 & 启动 nfsd守护程式,常驻在背景

    ※ ps. 一些细节
         1. 检查 /etc/exports 输出路径的权限,确定只有root能修改,
            all user只能read
         2. 用exportfs 去增加或删除directories
            exportfs -o access=engineering,ro=dancer /usr
            exportfs -u /usr
         3. 假如你的机器没有NIS(YP server)的服务,当更改资料时记得修改
               /etc/passwd
               /etc/group
               /etc/hosts
               /etc/ethers
         4. 为你自己的network 设置security

    exportfs的语法
      /usr/etc/exportfs   [ -avu ]   [ -o option ]  [ directory ]
          -a     : 把 /etc/exports 中所有路径export出去
          -u     : 把 export出去的路径卸下 , 如 exportfs -u /usr
          -o option :  如 exportfs -o ro /usr ,所有人对/usr 都为read only
                       option 还有 root = hostname , access = client
                                   access = netgroup

    For example :
              exportfs -a  把exports中的路径全部export出去
              exportfs -o access=engineering:other  /usr
                /usr 这路径export後只有engineering and other 这两个
                group 能够 read & write
              exportfs -o access=oak,ro=dancer  /usr
                设定dancer 这台client 对 /usr 为read only ,且只有
                oak这一个 group 能做read


           /etc/exports  档的□例

    ●  syntax : directory          -option[,option]
                                     (设定两个group能rw)
      /usr                     -access=engineering:accounting
      /home                    -access=engineering:accounting
      /var/spool/mail                -access=engineering:accounting
      /export/exec/sun3              -access=engineering:accounting
      /export/exec/sun3.sunos.4.1    -access=engineering:accounting
      /export/exec/kvm/sun3.sunos.4.1  -access=engineering:accounting
      /export/root/birch          -access=birch,root=birch
      /export/swap/birch          -access=birch,root=birch
      /export/root/oak          -access=oak,root=oak
      /export/swap/oak          -access=oak,root=oak
      /export/root/willow         -access=willow,root=willow
      /export/swap/willow         -access=willow,root=willow
      /export/root/pine           -accsee=pine,root=pine
      /export/swap/pine           -accsee=pine,root=pine
   (access=client , root=hostname 如此只有这一台client的superuser有权力rw)

   □ Setting Up a NFS Client

        1. 宣告机器为没有磁碟机或没有资料的Client,在使用SunInstall之前
        2. 编辑好 /etc/fstab 这一个档,确定要mount的路径都在fstab中
        3. 依照fstab所设的内容,在Client上设定好Mount points
           (mount_points 就是用mkdir 设exports所输出的路径)
        4. 确定我们所要mount的路径,都有出现在 /etc/exports 中
        5. 可以启动mount去连结server上的directories   ( mount -a )


        /etc/fstab   档的□例
    ● syntax  filesystem  directory  type  options  freq  pass
        oak:/export/root/boomer  /  nfs  rw  0  0
                                            ^^^
                                      因为档案在server上,not on client
                                      所以client的设定为0
        oak:/export/exec/sun3           /usr  nfs  ro  0  0
        oak:/export/exec/kvm/sun3       /usr/kvm nfs ro  0  0
        oak:/usr/share                  /usr/share  nfs  ro  0  0
        oak:/home/oak           /home/oak  nfs  rw,bg  0  0



    § mount 的语法

   ● syntax : mount -t type [-rv] -o [option] server:pathname /mount_point
   MOUNT :
           mount -a     把/etc/fstab 中所列的路径全部挂上
           mount -o ro,soft,bg dancer:/usr/local /usr/local/dancer
                  把dancer server 的/usr/local mount 到 client的
                  /usr/local/dancer 并且是read only

          -t type : 你所要mount的型别, 如 nfs or 4.2
              -r  : 所mount的路径定为read only
              -v  : mount过程的每一个动作,都有messages 传回到萤幕上
             hard : 重复要求,直到server回应为止,但如server一直不回应
                   the server may be down !
             soft : 当client的请求得不到回应,retry one time 後 传回
                   error message
             bg   : 当第一次请求不成功,第二次的mount将放到背景执行
             fg   : retries mount 都一直在提示符号下进行
            intr  : 当正在进行 NFS 请求时,允许用键盘中断

      mount 成功时的message
                  NFS server hostname ok
       mount fail
                NFS server hostname not responding, still trying
         . . .hostname server not reponding:  RPC: Timed out


    § UNMOUNT :

            umount mount_point
            umount -a      卸下所有已经mount上的路径


==========================================================================


   ◎ How NFS Work ?

        当我们启动 NFS file server 时,/etc/rc.local 会自动启动exportfs这
    一个程式,指定可以export的档案或目录,而我们所能mount的也只能是其所指定
    的目录.


   □  NFS 架设在 XDR/RPC的协定之上

     XDR : (eXternal Data RePResentation)  外部资料表示法
      XDR(eXternal Data Representation) 提供一种方法把资料从一种格式转换
      成另一种标准资料格式表示法,确保在不同的电脑,作业系统及电脑语言中,所
      有资料代表的意义都是相同的

     RPC : (Remote Procedure Calls) 远端程序呼叫
      RPC(Remote Procedure Calls) 远端程序呼叫, 请求远端电脑给予服务. 委
      托器(client)就会透过网路传送RPC到远端电脑,请求服务.
      (一般 local machine : client     remote machine : server )



   □ NFS 如何运用 RPC 传送资料


                客户端process               主服务端process
                 ┌————┐               ┌—————┐
                 │ 客户端 │               │ 主服务站 │
                 │routines│               │ routines │
                 └—┬——┘               └┬————┘
     本地程序呼叫    │  《                   │      《
                 (1) │  │ (10)          (6) │      │ (5)
                     》  │                   》      │
                 ┌———┴┐               ┌————┴┐
                 │ 客户端 │               │ 主服务端 │
                 │  stub  │               │   stub   │
                 └—┬——┘               └┬————┘
     系统呼叫        │  《                   │      《
                (2)  │  │ (9)           (7) │      │ (4)
                     》  │                   》      │
                 ┌———┴┐       (8)     ┌————┴┐
                 │network │ <——————┤ network  │
                 │routines├——————> │ routines │
                 └————┘       (3)     └—————┘
               本地系统核心     网路通讯      远端系统核心

     (1) client 送出讯息,请求服务
     (2) client stub (客户株) 把client 送出的参数转换成XDR---标准资料
         格式并用系统呼叫(system call) 把讯息送到网路上
     (3) 讯息经过网路送达远端主机系统
     (4) 远端主机将接受到的讯息传给server stub (服务站株)
     (5) 把XDR形式的资料,转换成符合主机端的格式,取出client发出的服务
         请求参数,送给server
     (6) -- (10) 则是逆向而行 , server 送出服务给 client



   □ rc.local 启动守护程式

      一个NFS server 要 inet , portmap , nfs , mount 此四个守护程式,保
   持在背景执行的状态下才能运作. (if running NIS must add ypbind daemon)

   ◆  当启动 NFS file server 时,

      the   /etc/rc.local script   会做如下的动作
          1. 执行exportfs , 读取server's /etc/exports 告诉kernel
             所要输出的file hierarchies 和 存取的权限
              ( exportfs -a )
          2. 启动 rpc.mountd daemon 和 nfsd daemon (通常是 8 个)
               ( rpc.mountd  -n      nfsd 8 &   echo  -n 'nfsd' )


    ◆  当启动 NFS client 时

       rc.local  会做如下的动作
          1. 启动 boid daemons 处理读写的程序
                (biod 8   echo -n ' biod' )
          2. 执行 mount -vat nfs 读取client's /etc/fstab 并且 mount 所
             有属於 NFS-type 的files


   □ NFS daemons (守护程式) 的功用

    nfsd, biod, rpc.mountd, inetd, portmap  都可在/usr/etc 下找到

    nfsd :   依client 对档案系统的需求情况, 而启动
                  " file system request daemon "
             应付client 的需求,而一般file system request daemon 的数目
             是 " 8 ", 这也就是我们在rc.local 中写 " nfsd 8 & "的原因了

    biod :   此指令是在NFS client上用的 , 用来启动
                 " asynchronous block I/O daemon"
             用来建立buffer cache , 处理在client上的读写

    mountd : mountd 是一台 RPC server ,启动rpc.mountd daemon後 它会读取
            /etc/xtab 查看哪一台client正在mount 哪一个file system,并回
            应client 所要mount 的路径
            (mountd处理的过程可用 showmount 来看)

    inetd : inetd (Internet services daemon) , 当系统启动时rc.local
            会启动inetd 读取 inetd.conf 这一个 configuration-file ,
            读取网路上所有 server's address , 连结启动inetd.conf中所
            有的server , 当client 请求服务时, inetd 就会为clinet 启动
            相关的server daemon 负责任务, 如user 用 telnet 时 , 则
            inetd 启动telnetd 迎合user telnet 的需求, 其馀像 ftp ,
            finger , rlogin 之类的应用程式 , inetd 也都会启动相对应的
            daemons, ftpd, fingerd, rloingd
    portmap :  portmap 是一台server , 主要功能 转换 TCP/IP 通讯协定的
               port number 变成 RPC program number , 因为这样clinet才能
               做RPC calls

               一般 RPC server 是被inetd 所启动的, 所以portmap 必须
               在inetd之前启动, 否则无法做 RPC call



   □ NFS 的网路安全的

          NFS 使server上的档案能被client所取用, 乍看之下好像server 上
      的档案任何人都可取用没什麽保护性, 其实不是如此的. 一开始server
      要 exportfs 之前在 /etc/exporrc 中就已经设定了档案的使用权限, 像
          /usr/src -access=engineering:accounting
      就是限定只有 rcgineering 和 accounting 这两台 client 才能 mount
      /usr/src
          /usr/src  -access=oak,root=oak
      这是说只有 oak 这台 cilent 能 mount这一个路径 且只有 oak client's
      superuser 才能行使 read & write 的权力

         另外管理者为了维护 exported 和 mounted 的安全, 一定要建
     立公共(public)和私人(secret)的 key(passWord), 然而这些安全性
     问题是要建立在 NIS (network infomation system) 上的, 有一个
     /etc/publickey档 ,里面记录了public and secret keys , 而这些key
     是依照 machine_name 和 user_name ,以16 进位码表示出来的, 管理
     者可在有NIS的机器上用
         newkey -u username     给予user login 权力
         newkey -h hostname     造出login 此机器时所需的password

         在NFS刚安装时  user 是 "nobody" 任何人都可以进入, 所以管理者
     一定要做修改, 以保护资料的安全.

     当使用者为 nobody 时 publickey 的内容
         netname   user's public key    : user's secret key
          nobody  3d91f44568fbbefada5a7:7675cd9b8753b5db09dabf12

        在管理者给予user权力之後, user 就可使用 chkey 修改自己的
     secret key 创造自己的帐号路口,

        willow% chkey
        Generating new key for username
        password  : 
        Sending key change request to server ...
        Done.
        willow%

         所设定的password 是使用者位於 NIS 中的加密键 , 当我们login 时
     NIS 就会将此密码解开,(因为publickey中是以16进位码记录) , 存放到
     keyserv 里加以保管, 再将加密键传给client , 当client 发出请求时 ,
     此键会附在每个NFS 请求上一起送到 NFS server 上, 当加密键和server上
     所保存的keyserv核对无错後, 请求就会被接受





    □ When fail to  mount server

         1. 用 rpcinfo -p server_name 去查看此server是否存在
         2. 用 rpcinfo -u server_name mount 查看mountd daemon 是否有
            在server上执行
         3. 假如server 都没问题,检查 server 和 client 之间的
            Ethernet connetions
         4. 在client 上 用 ps ax 看portmap and several biod daemons
            running or not !
            (rpcinfo : 用来对 RPC server 做 RPC 呼叫,回传远端程序呼叫
                       过程中的讯息)

       一些mount 失败的错误讯息

       1.  /etc/mtab :  No such file or directory
               mtab 这一个路径或是档案必须存在,在mount之前
       2.  mount : ... Block device required
               远端的机器名称可能打错了
       3.  mount: ... not found in /etc/fstab
               fstab 一定要存在,client 上 /etc下
       4.  ... not in hosts database
               /etc/hosts 没有这一个 hosts database , 或是
               NIS 的daemon, ypbind 没有在执行
       5.  Must be root to use mount
                一般都只有 root 才能mount ,所以mount之前先成
                为superuser
       6.  Stale NFS file handle
                当我们已经mount 上的file or directory  ,在server
                上突然被remove or unexport ,就会出现此讯息