文件服務器之一: NFS 服務器

相關概念:node

1、什麼是NFS(Network File System)即網絡文件系統。NFS  使用內核功能,因此內核須要支持NFS。linux

主要功能:經過網絡,讓不一樣的機器、不一樣的OS 能夠共享彼此的文件。vim

協議詳解請參考百度百科連接:http://baike.baidu.com/view/44349.htmcentos

2、什麼是RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。服務器

協議詳解請參考百度百科連接:http://baike.baidu.com/view/7287257.htm?fromId=32726&redirected=seachword網絡

主要功能:指定每一個NFS對應的 port number,並通知客戶端,讓客戶端能夠鏈接到正確的端口上。app

由於NFS服務必須使用RFC服務,因此稱之爲RPC Server的一種,另外NIS也屬於RPC Server。tcp

Server/client都要開啓RFC 服務。啓動NFS以前,RPC要先啓動,不然NFS會沒法向RPC註冊。工具

客戶端有NFS文件訪問需求時,向服務器的請求數據的流程:測試

一、客戶端向服務器端的RPC(Port 111) 發出NFS文件訪問功能。

二、服務器端找到對應的已註冊的 NFS daemon 端口後,會通知客戶端。

三、客戶端找到正確端口後,能夠直接與NFS daemon。

3、NFS Server 端的配置

一、所須要軟件

RPC主程序: rpcbind

NFS主程序: nfs-utils

[root@jone ~]# yum -y install rpcbind  nfs-utils

二、NFS的軟件結構

主配置文件:/etc/exports

NFS文件系統維護命令:/usr/sbin/exportfs   共享 /etc/exports 更新的目錄資源、將NFS 共享的目錄卸載以及從新共享。

共享資源的日誌文件:/var/lib/nfs/*tab     etab:記錄NFS共享目錄的完整權限設置值;另外一個xtab,記錄到鏈接到此NFS服務器的客戶端信息。

客戶端查詢服務器共享資源的命令:/usr/sbin/showmount

三、/etc/exports配置文件

[root@centos ~]# vi /etc/exports

    /tmp         192.168.11.0/24(ro)   *(rw)
*.ev.ncku.edu.tw(ro,sync) 
   [分享目錄]       [第一部主機(權限)]             [可用主機名]         [可用通配符]

每一行最前面是要分享出來的目錄。是以目錄爲單位啊! 而後這個目錄能夠依照不一樣的權限分享給不一樣的主機,像鳥哥上面的 例子說明是: 要將 /tmp 分別分享給三個不一樣的主機或網域的意思。記得主機後面以小括號 () 設計權限參數, 若權限參數不止一個時,則以逗號 (,) 分開。且主機名與小括號是連在一塊兒的!在這個檔案內也能夠利用 # 來批註呢。

至於主機名的設定主要有幾個方式:

一、可使用完整的 IP 或者是網域,例如 192.168.100.10 或192.168.100.0/24 ,或 192.168.100.0/255.255.255.0 均可以接受! 不可使用 192.168.100.* 。

二、也可使用主機名,但這個主機名必需要在 /etc/hosts 內,或可以使用 DNS找到該名稱才行!反正重點是可找到 IP 就是了。若是是主機名的話,那麼能夠支持通配符,例如 * 或 ? 都可接受。

Exports文件中的權限參數

選項                     說明

Ro                        該主機對該共享目錄有隻讀權限

Rw                       該主機對該共享目錄有讀寫權限

Root_squash          客戶機用root用戶訪問該共享文件夾時,將root用戶映射成匿名用戶

No_root_squash     客戶機用root訪問該共享文件夾時,不映射root用戶

All_squash             客戶機上的任何用戶訪問該共享目錄時都映射成匿名用戶

Anonuid                將客戶機上的用戶映射成指定的本地用戶ID的用戶

Anongid                將客戶機上的用戶映射成屬於指定的本地用戶組ID

Sync                     資料同步寫入到內存與硬盤中

Async                   資料會先暫存於內存中,而非直接寫入硬盤

Insecure                容許從這臺機器過來的非受權訪問

例題一:

讓 root 保留 root權限

答:[root@centos ~]# vi /etc/exports

/tmp        *(rw,no_root_squash)   任何人均可以使用  /tmp,主機名可使用通配符處理,重點是no_root_squash。

例題二:同一目錄針對不一樣範圍開放不一樣權限 
我要將一個公共的目錄 /home/public 公開出去,可是隻有限定個人局域網絡192.168.11.0/24 這個網域且加入 vbirdgroup 的用戶纔可以讀寫,其餘來源則只能讀取。 
答:

[root@centos ~]# mkdir /home/public

[root@centos ~]# groupadd vbirdgroup
[root@centos ~]# setfacl -m g:vbirdgroup:rwx /home/public 
[root@centos ~]# vim /etc/exports 
  /tmp           *(rw,no_root_squash) 
  /home/public  192.168.11.0/24(rw)     *(ro) 
# 繼續累加在後面,注意,我有將主機與網域分爲兩段 (用空白隔開) ! 

例題三:僅給某個單一主機使用的目錄設定 
我要將一個私人的目錄 /home/test 開放給 192.168.100.10 這個 Client 端的機器來使用時,該如何設定?假設使用者的身份是 dmtsai 才具備完整的權限時。
    答:

[root@centos ~]# mkdir /home/test 
[root@centos~]# setfacl -m u:dmtsai:rwx /home/test 
[root@centos ~]# vim /etc/exports

/tmp           *(rw,no_root_squash)

/home/public  192.168.11.0/24(rw)     *(ro)

/home/test     192.168.11.173(rw) 
# 只要設定 IP 正確便可!

這樣就設定完成了!並且,只有 192.168.11.173這部機器才能對 /home/test 這個目錄進行存取喔!

例題四:開放匿名登陸的狀況 
我要讓 *.centos.vbird 網域的主機,登入個人 NFS 主機時,能夠存取 /home/linux ,可是他們存數據的時候,我但願他們的 UID 與 GID 都變成 45 這個身份的使用者,假設我 NFS 服務器上的 UID 45 與 GID 45 的用戶/組名爲 nfsanon。 
答:

[root@centos~]# groupadd -g 45 nfsanon

[root@centos ~]# useradd -u 45 -g nfsanon nfsanon

[root@centos ~]# mkdir /home/linux

[root@centos ~]# setfacl -m u:nfsanon:rwx /home/linux

[root@centos ~]# vim /etc/exports 
/tmp           *(rw,no_root_squash)

/home/public  192.168.11.0/24(rw)     *(ro)

/home/test     192.168.11.173(rw)

/home/linux   *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)

     # 若是要開放匿名,那麼重點是 all_squash,而且要配合 anonuid 喔!

特別注意到那個 all_squash 與 anonuid, anongid 的功能!如此一來,當clientlinux.centos.vbird 登入這部 NFS 主機,而且在 /home/linux 寫入檔案時,該檔案的全部人與全部羣組,就會變成 /etc/passwd 裏面對應的 UID 爲 45 的那個身份的使用者了!

三、啓動NFS

/etc/init.d/rpcbind start

/etc/init.d/nfs start

/etc/init.d/nfslock start

查看NFS 開啓的端口

[root@centos ~]# netstat -tunlp | grep -E "(rpc|nfs)"

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1345/rpcbind       
tcp        0      0 0.0.0.0:54000               0.0.0.0:*                   LISTEN      3034/rpc.mountd    
tcp        0      0 0.0.0.0:60724               0.0.0.0:*                   LISTEN      1425/rpc.statd     
tcp        0      0 0.0.0.0:58105               0.0.0.0:*                   LISTEN      3034/rpc.mountd    
tcp        0      0 0.0.0.0:49257               0.0.0.0:*                   LISTEN      3034/rpc.mountd    
tcp        0      0 :::111                      :::*                        LISTEN      1345/rpcbind       
tcp        0      0 :::57367                    :::*                        LISTEN      1425/rpc.statd     
tcp        0      0 :::59611                    :::*                        LISTEN      3034/rpc.mountd    
tcp        0      0 :::44958                    :::*                        LISTEN      3034/rpc.mountd    
tcp        0      0 :::55489                    :::*                        LISTEN      3034/rpc.mountd    
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1345/rpcbind       
udp        0      0 0.0.0.0:753                 0.0.0.0:*                               1425/rpc.statd     
udp        0      0 0.0.0.0:49675               0.0.0.0:*                               3034/rpc.mountd    
udp        0      0 0.0.0.0:39183               0.0.0.0:*                               3034/rpc.mountd    
udp        0      0 0.0.0.0:672                 0.0.0.0:*                               1345/rpcbind       
udp        0      0 0.0.0.0:60470               0.0.0.0:*                               1425/rpc.statd     
udp        0      0 0.0.0.0:36158               0.0.0.0:*                               3034/rpc.mountd    
udp        0      0 :::49007                    :::*                                    1425/rpc.statd     
udp        0      0 :::111                      :::*                                    1345/rpcbind       
udp        0      0 :::672                      :::*                                    1345/rpcbind       
udp        0      0 :::34479                    :::*                                    3034/rpc.mountd    
udp        0      0 :::39476                    :::*                                    3034/rpc.mountd    
udp        0      0 :::40297                    :::*                                    3034/rpc.mountd 

主要的端口是:

rpcbind 啓動的 port 在 111 ,同時啓動在 UDP 與 TCP;
nfs 自己的服務啓動在 port 2049 上頭!

其餘 rpc.* 服務啓動的 port 則是隨機產生的,所以需向 port 111 註冊。

啓動nfs後又修改了/etc/exports,不用重啓該服務,使用exports命令便可:

Exports [-aruv]

-a    所有mount或umount文件/etc/exports中的內容

-r     從新mount文件/etc/exports中的共享內容

-u   umount目錄

-v    在export的時候,將詳細的信息輸出到屏幕上

例:

[root@localhost ~]#  exportfs –rv        所有從新export一次

[root@localhost ~]#  exportfs –au        所有卸載

4、NFS 客戶端的設置

一、客戶端先rpcbind服務。

[root@jone ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]

二、掃描NFS服務器目錄有那些,以及是否可用。

showmount –e  192.168.90.254 (服務器端IP)

三、客戶端創建掛載點目錄。

[root@jone ~]# mkdir -p /home/nfs/public/

四、使用mount 將服務器直接掛載到相關目錄。

mount -t nfs 192.168.90.254 :/home/public /home/nfs/public

五、查看是否掛載成功。

[root@jone ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                      8.5G  1.7G  6.4G  21% /
tmpfs                 246M     0  246M   0% /dev/shm
/dev/sda1             485M   32M  429M   7% /boot
192.168.90.254:/home/public
                       28G  790M   26G   3% /home/nfs/public

六、使用完畢以後可使用umount卸載

umount /home/nfs/pulic

PS:

一、用戶帳號。客戶端和服務器端的帳號不一致致使文件系統使用上的混亂,NFS比較大弊端。

二、NFS 服務器開放寫入權限(/etc/exports 設置有關)

三、文件權限具備可寫入(W)的權限。

常與NIS搭配使用。

自動掛載服務:autofs

 

創建主配置文件  /etc/auto.master

創建數據對應文件內(/etc/auto.nfs)的掛載信息與服務器對應的資源。

沒有測試成功,繼續測試。

 

鳥哥總結的重點,最好記住。

Network FileSystem (NFS) 可讓主機之間透過網絡分享彼此的檔案與目錄;
NFS 主要是透過 RPC 來進行 file share 的目的,因此 Server 與 Client的 RPC 必定要啓動才行!
NFS 的配置文件就是 /etc/exports 這個檔案; 
NFS 的權限能夠觀察 /var/lib/nfs/etab,至於的重要登陸檔能夠參考 /var/lib/nfs/xtab 這個檔案,還包含至關多有用的信息在其中!
NFS 服務器與客戶端的使用者帳號名稱、UID 最好要一致,能夠避免權限錯亂:
NFS 服務器預設對客戶端的 root 進行權限壓縮,一般壓縮其成爲nfsnobody 或 nobody。 
NFS 服務器在更動 /etc/exports 這個檔案以後,能夠透過 exportfs 這個 指令來從新掛載分享的目錄! 可使用 rpcinfo 來觀察 RPC program 之間的關係!!! 
NFS 服務器在設定之初,就必需要考慮到 client 端登入的權限問題,不少時候沒法寫入或者沒法進行分享,主要是 Linux 實體檔案的權限設定問題所致! 
NFS 客戶端能夠透過使用 showmount, mount 與 umount 來使用 NFS 主機提供的分享的目錄!
NFS 亦可使用掛載參數,如 bg, soft, rsize, wsize, nosuid, noexec, nodev 等參數, 來達到保護本身文件系統的目標!

 

本文主要內容來自:鳥哥的Linux私房菜服務器架設篇(第三版),這是一本很好的入門和工具書,有興趣的能夠查看。

相關文章
相關標籤/搜索