NFS

NFS(Network File System):由Sun公司開發,最早的v1版本只在其自己的系統上使用,從v2開始,Sun將其向外公佈;

NFS的功能:通過網絡,讓不用的機器、不同的操作系統分享彼此個別的數據;可以將其簡單看做是一個文件共享服務器,將服務器上的共享目錄掛載到本地,讓其在本地看來,就像是自己的;

NFS提供的服務:1,在目錄中查找文件;2,列出目錄中的文件;3,管理目錄;4,取得各文件的屬性;5,文件的讀寫操作;

NFS的一些特性

     1,NFS工作在OSI第七層,基於RPC實現;

     2,NFS監聽的端口:tcp/udp 2049,用於傳輸的端口是隨機選擇小於1024的端口(小於1024的端口只有管理用戶有權使用),由於其功能較多,還需要其他的服務來啓動額外端口;

     3,NFS認證用戶時,無法根據用戶名判斷,而是根據UID映射來完成,只要客戶端使用的UID和服務器上的UID相同,即客戶端擁有此UID(服務器上UID)相同的權限;

     4,由於其使用UID映射來完成用戶認證,所以使用root用戶時,root的權限會被降低爲nobody;

     5,NFS工作在文件系統上,而文件系統屬於內核中的功能,所以NFS是在內核空間中實現(samba在用戶空間實現);

     6,爲了避免讀寫衝突,NFS使用了鎖機制,客戶端需要向服務器請求到鎖,才能讀寫數據;

     7,NFS服務只完成文件傳輸,其他的功能(例如鎖和認證等)是由其他的服務來完成;

關於RPCRemote Procedure Call Protocol):遠程過程調用協議,由SUN公司提出,是一種計算機通信協議,該協議允許運行於一臺計算機的程序調用另一臺計算機的子程序,而程序員無需額外的爲這個交互作用編程(即不需要了解底層網絡技術的協議);

     功能:由客戶端對服務器發出一個執行若干過程的請求,並用客戶端提供的參數,執行結果將返回給客戶端;

     工作原理

          1,調用客戶端句柄,執行傳送參數;

          2,調用本地系統內核發送網絡消息;

          3,消息傳送到遠程主機;

          4,服務器句柄得到消息並取得參數;

          5,執行遠程過程;

          6,執行的過程將結果返回服務器句柄;

          7,服務器句柄返回結果,調用遠程系統內核;

          8,消息傳回本地主機;

          9,客戶端句柄由內核接收消息;

          10,客戶接收句柄返回的數據;

     監聽端口:rpc服務的監聽端口是半隨機的,rpcbind監聽tcp/udp 111,而rpc.ststd和rpc.mountd監聽的端口爲隨機端口;

爲什麼NFS需要RPC?

     由於NFS支持的功能很多,而不同的功能需要啓動不同的程序,每啓動一個功能就會啓動一些端口來傳輸數據,因此NFS的功能所對應的端口採用隨機端口,而客戶端要想連接到服務器,就需要RPC服務;NFS在啓動時,會開啓一些隨機端口,並主動向RPC註冊,RPC就知道每個端口對應的NFS功能,由此,RPC在NFS中最重要的功能就是指定每個NFS功能所對應的端口,並返回給客戶端(RPC使用固定端口tcp/udp111監聽客戶端請求);

     注意

          1,在啓動NFS之前,要先啓動RPC,否則NFS無法向RPC註冊;

          2,RPC重啓時,原本的註冊數據會被清空,因此RPC重啓後,它所管理的服務需要重新啓動來向RPC註冊;

          3,RPC在rhel5中,服務啓動腳本爲/etc/rc.d/init.d/portmap,在rhel6中爲/etc/rc.d/init.d/rpcbind;

NFS客戶端向服務器存取數據的過程

     1,客戶端向服務器的RPC(111端口)發出NFS存取功能的請求;

     2,服務器端找到對應的已註冊的NFS daemon端口後,返回給客戶端;

     3,客戶端獲得端口後,直接與NFS daemon建立連接;

NFS啓動的daemons

由於NFS服務只完成文件傳輸,其他的功能是由其他的服務來完成,所以NFS服務器啓動至少需要兩個daemons,一個管理客戶端是否能登陸,一個管理客戶端能夠取得的權限;

常見的daemons

     rpc.nfsd:最主要的NFS服務,其功能就是管理客戶端是否能夠使用服務器文件系統掛載信息等,還包括登陸用戶的ID判斷;

     rpc.mountd:用於管理NFS文件系統,包括權限等;該服務會讀取/etc/exports來比對客戶端的權限,判斷其是否有權限使用共享的資源;

     rpc.lockd(非必須):管理文件的鎖;rpc.lockd必須要同時在客戶端與服務器端都開啓,rpc.lockd常與rpc.statd同時啓用;

     rpc.statd(非必須):用於檢查文件的一致性,與rpc.lockd有關,如果因爲客戶端同時使用同一個文件造成可能有所損壞時,rpc.statd可以檢測並嘗試恢復該文件;與rpc,lockd一樣,需要服務器端與客戶端同時啓動才生效;

     這幾個RPC程序,都已經寫入到兩個基本的服務器啓動腳本了:/etc/init.d/nfs和/etc/init.d/nfslock;

NFS的權限問題

前面提到過NFS的認證是通過UID映射來完成的,因此:

     1,如果服務器上沒有這個UID,則會以nobody的身份來訪問;

     2,除了用戶權限外,還需要

          a)NFS服務器有開放可寫入權限(/etc/exports);

          b)實際的文件或目錄具有可寫入的權限;

     3,爲了保證安全,可以使用NIS或LDAP集中管理用戶賬號;

關於鎖

     在計算機中,鎖是在執行多線程時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足,分爲共享鎖和獨佔鎖;

          1,共享鎖(S鎖):一個事務對資源加上共享鎖後,其他的事務只能對該資源再加共享鎖,不能加獨佔鎖;獲准共享鎖的事務只能讀數據,不能修改數據;

          2,獨佔鎖(排他鎖,X鎖):如果事務對資源加上強制鎖後,其他事務不能再對該資源加任何類型的鎖;獲准排他鎖的事務可以讀寫數據;

安裝和使用NFS

安裝:由於nfs是內核自帶的功能,因此不需要額外進行安裝,但還需要安裝以下兩個軟件:

     rpcbind:RPC主程序,該服務負責端口的註冊(對應)等工作;再次強調,rhel5以前稱爲:portmap;

     nfs-utils:爲nfs提供額外的功能,如rpc.nfsd即rpc.mountd這兩個NFSdaemons與其他相關的文件、說明文件、執行文件等;

NFS的軟件結構

     /etc/exports          主配置文件;

     /usr/sbin/exportfs          維護NFS分析資源的命令,可以用該命令重新共享/etc/exports修改後的目錄資源、將NFS Server共享的目錄卸載或重新共享等;

     /var/lib/nfs/*tab          共享資源的登錄文件,/var/lib/nfs中有兩個重要的登錄文件,一個是etab,主要記錄NFS共享出來的目錄的完整權限設置,另一個xtab記錄曾經鏈接到此NFS服務器的相關客戶端數據;

     /usr/sbin/showmoune          客戶端查詢服務器分享資源的命令,可用於查看NFS服務器共享出來的目錄資源;

/etc/exports配置文件的語法和參數

     export    host(options)          依次爲:共享的目錄     可連接的主機(選項或權限)

     主機定義的方式

          1,IP地址或網段:192.168.1.1,192.168.1.0/24,192.168.1.0/255.255.255.0;

          2,主機名,但這個主機名必須在/etc/hosts中,或可以用DNS解析,主機名支持通配符,如*或?等;

     選項

          rw或ro:目錄的權限是可讀寫或只讀,但最終能不能讀寫與文件系統的權限和用戶的權限也有關係;

          secure:默認已經啓用;限制客戶端只能使用小於1024的tcp/udp端口訪問請求;若不想加限制,則使用insecure;只有rhel6由該選項; 

          sync:數據同步寫入到內存和硬盤中(性能差,數據可靠性高);

          async:數據先保存在內存中,而非直接寫入硬盤(性能好,數據可靠性差);

          wdelay:寫入延遲,檢查是否有相關的寫操作,如果有則將這些寫操作一起執行(默認啓動);

          no_wdelay:有寫操作則立即執行,與sync配合使用;

          no_acl:關閉nfs的acl功能;

          root_squash:將root用戶的身份壓縮爲nobody;

          no_root_squash:不壓縮root的權限;

          all_squash:將所有訪問的用戶身份都壓縮爲nobody;

          no_all_squash:不壓縮所有用戶的身份(默認設置)

          anonuid=xxx:使用指定的用戶作爲匿名用戶(該用戶需要在本地存在);

          anongid=xxx:使用指定的組爲匿名組(該組需要在本地存在);

啓動NFS服務

     1,/etc/init.d/rpcbind start     如果事先已啓動,不需要再重新啓動;

     2,/etc/init.d/nfs start

維護NFS服務

exportfs:用於維護NFS服務器的輸出目錄列表;

     -a:輸出在/etc/exports中的所有目錄;

     -r:重新讀取/etc/exports中的設置,並立即生效,無需重啓NFS服務器,常和-a一起使用;

     -u:取消輸出(卸載某一目錄),常和-a一起使用;

     -v:顯示詳細信息(輸出的目錄列表);

查看NFS服務的相關信息

rpcinfo:查看rpc服務的相關信息;

     -p host:顯示指定主機上所有的port與porgram信息;

     -t host nfs:針對nfs這個程序檢查其相關的軟件版本信息(tcp);

     -u host nfs:針對nfs這個程序檢查其相關的軟件版本信息(udp);

     如果rpcinfo無法輸出,表示註冊的數據有問題,需要重啓rpcbind與nfs;

showmount:測試NFS服務器的輸出目錄狀態;

     -a:顯示指定的NFS服務器的所有客戶端主機及其所連接的目錄(即每一個掛載連接);

     -d:顯示指定的NFS服務器已經被客戶端掛載的所有目錄列表;

     -e:顯示指定服務器上所有輸出的共享目錄;

使用固定端口

如果需要使用固定端口(比如防火牆規則設置),可修改配置文件/etc/sysconfig/nfs,該配置文件定義了一些NFS的工作特性;

通常只需要修改三個服務的端口即可

     1,RQUOTAD_PORT=xxx

     2,LOCKD_TCPPORT=xxx

     3,LOCKD_UDPPORT=xxx

     4,MOUNTD_PORT=xxx

NFS服務器關機的注意事項

     1,如果有客戶端連接上服務器,關機可能會成爲“不可能的任務”,可能需要數小時才能正常關機,所以

     2,所以,要先關掉nfs和rpcbind這兩個服務,如果無法正確停止,用netstat -tlup找出PID,然後kill掉(注意數據安全);

客戶端掛載:mount -t nfs x.x.x.x:/dir /mnt;

客戶端掛載NFS也可以使用本地文件系統的掛載選項:如suid、rw、dev、exec、nouser、auto等(列出來的這些爲默認設置);

NFS的特殊掛載選項

     fg:掛載時,在前臺運行,直到成功或time out爲止(默認);

     bg:在後臺執行掛載操作,不會影響到前臺的程序操作;

     hard:如果客戶端與服務器之間有任何一部方脫機,RPC會持續呼叫,直到對方恢復爲止,會造成系統爆慢(默認);

     sort:如果任意一方脫機,RPC會在time out後重復呼叫,而非持續呼叫,因此係統的延遲不會太明顯;

     intr:在使用hard方式掛載時,加上intr,則當RPC持續呼叫中,該呼叫是可以被中斷的(默認不使用);

     rsize:讀的緩存大小,默認爲1024bytes;

     wsize:寫的緩存大小,默認爲1024bytes;

示例

     操作系統:CentOS 6.4 x86;

     服務器IP:192.168.159.128;

     客戶端IP:192.168.159.132;

     服務器端

          1,安裝NFS:yum -y install rpcbind nfs-utils

          2,編輯:vim /etc/exports

               #寫入

               /data   192.168.159.132(rw)

               保存退出;

          3,useradd -u 65533 nfs-user          創建一個nfs用戶:

          4,mkdir /data; chown -R nfs-user /data          創建對應的目錄,並賦予nfs-user權限;

          5,啓動服務

                    service rpcbind start

                    service nfs start

     客戶端

          1,showmount -e 192.168.159.128          查詢服務器上共享了哪些目錄;

          2,useradd -u 65533 nfs-user          創建一個用於使用nfs的用戶;

          3,mount -t nfs 192.168.159.128:/data /mnt          掛載nfs目錄到本地;

          4,su - nfs-user          切換至nfs用戶;

          5,cd /mnt          切換至nfs的掛載目錄;

          6,touch file1          創建一個文件,測試是否成功;

          7,使用root用戶,在mnt下測試是否可以成功創建文件;

聲明:本文爲學習筆記,內容參考多方資料,如涉及版權問題,請告知本人,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章