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服務只完成文件傳輸,其他的功能(例如鎖和認證等)是由其他的服務來完成;
關於RPC(Remote 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下測試是否可以成功創建文件;
聲明:本文爲學習筆記,內容參考多方資料,如涉及版權問題,請告知本人,謝謝!