LINUX下的NFS介紹

來源:互聯網
上載者:User
◎ 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/home只要下

-

  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  檔案的例子(設定兩個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
  <hard>   mount fail

  NFS server hostname not responding, still trying
  <soft>  . . .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  : <enter 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 ,就會出現此訊息

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.