Linux網絡文件系統NFS詳解
什麽是文件系統,NFS文件系統又是什麽?
簡單的說,文件系統就是通過軟件對磁盤上的數據進行組織和管理的一種機制,對其的一種封裝或透視。
你女朋友拍了美美的曖昧照片,放一個文件夾裏發送給了A服務器,當你來訪問的時候,被F5路由給B服務器了,然後你找不到資源了,你女朋友給你鬧,你就不性福了哈哈,所以我們很容易想到,是不是可以把文件上傳到一個公用的服務器上呢? 這樣不管訪問的是A還是B,讀、取文件都只存在一份。答案是肯定的,這個公用的服務器我們也稱之為文件服務器,NFS,Network File System。顧名思義,網絡文件系統,即通過網絡,對在不同主機上的文件進行共享。
NFS包括兩部分,服務端(servlet)及客戶端(client)
由於NFS服務功能很多,會有很多端口,這些端口還有可能不固定,(pc -ef | egrep nfs 我們可以看到nfs 不同的端口號)那麽客戶端就無法與服務器進行通信,因為程序間通信必須通過端口(tcp/udp都是端到端通信),那麽就需要一個中間的橋接機制,RPC進程即充當這樣一個角色,RPC的端口是一定的(111),當NFS啟動時,會向RPC進行註冊, (rpc 一定是在nfs啟動前,就已經啟動了,)那麽客戶端PRC就能與服務器RPC進行通信, 從而進行文件的傳輸。
當客戶端用戶打開一個文件或目錄時,內核會判斷,該文件是本地文件還是遠程共享目錄文件(如果是遠程共享文件就都掛載mount 到/etc/init.d/rc.local下面),如果是遠程文件則通過RPC進程訪問遠程NFS服務端的共享目錄,如果是本地文件,則直接打開。
ps -ef |egrep "rpc|nfs" < #這樣我們可以查看到的進程
NFS服務進程啟動說明表格 | |
服務(進程名字) | 用途說明 |
nfsd(rpc.nfsd) | rpc.nfsd主要功能就是管理NFS客戶端是否能夠登陸NFS服務器主機(登陸著id判別) |
mountd(rpc.mountd) | rpc.mountd管理nfs文件系統,當nfs客戶端順利通過rpc.nfsd服務端後,它可以使用NFS服務器提供數據,讀取NFS的配置文件/etc/exports來進行文件系統權限比對 |
rpc.statd | 檢查文件的一致性 |
這些進程都可以執行man 進程名 來查看進程的詳細功能 |
NFS配置文件
NFS配置文件定義
NFS的配置文件為 /etc/exports,內容格式如下:<共享目錄> 客戶端1(選項) [客戶端2(選項) ...] 共享目錄:NFS共享給客戶機的目錄。 客戶端 :網絡中可以訪問此目錄的主機。多個客戶端以空格分隔。
選項 :設置目錄的訪問權限、用戶映射等,多個選項以逗號分隔。 例如: /data 192.168.1.0/24(rw,insecure,sync,all_squash,anonuid= 65534,anongid=65534)
NFS配置文件路徑
NFS常用路徑 | 說明 |
/etc/exports | NFS服務主配置文件,配置NFS具體共享服務的地點,默認內容是空的 |
/usr/sbin/exports | NFS服務的管理命令
exportfs 不重啟nfs服務應用更新,相關選項如下: -a 全部掛載或卸載 /etc/exports中的內容 -r 重新讀取/etc/exports 中的信息 ,並同步更新/etc/exports、/var/lib/nfs/xtab -u 卸載單一目錄(和-a一起使用為卸載所有/etc/exports文件中的目錄) -v 在export的時候,將詳細的信息輸出到屏幕上。 nfsstat 查看NFS的運行狀態。 rpcinfo 查看rpc服務註冊情況。 相關選項: -p 顯示所有的端口與程序信息。 示例: rpcinfo -p localhost #列出本機的RPC註冊狀況。 showmount 查詢nfs共享目錄信息,相關選項如下: -a 顯示已經於客戶端連接上的目錄信息 -e IP或者hostname 顯示此IP地址分享出來的目錄 示例: showmount -e localhost #查詢本機nfs共享目錄情況 showmount -a localhost #查詢本機共享目錄連接情況 |
/usr/sbin/showmount | 用來查看客戶度那,查看NFS配置及掛載結果的命令 |
/var/lib/nfs/etab | NFS配置文件的完成參數設定的文件 |
NFS配置參數權限
rw 表示可讀寫權限。
sync 請求或寫入數據時,數據同步寫入到NFS Server的硬盤後才返回。
async 寫入數據時會先寫到內存緩沖區,直到硬盤有空檔才會在寫入磁盤,這樣可以提升寫入效率。風險是若服務器宕機或不正常關機,會損失緩沖區中未寫入硬盤的數據(解決辦法:服務器主板電池或UPS不間斷電源)。
all_squash 不管訪問NFS Server共享目錄的用戶身份如何,它的權限都將被壓縮為匿名用戶,同時它的UID和GID都會變成nfsnobody賬號身份,在生產環境中配置NFS的重要技巧:
1)確保所有客戶端服務器對NFS共享目錄具備相同的用戶訪問權限,all_squash把所有客戶端都壓縮成匿名用戶(UID相同),就是anonuid,anongid指定的UID和GID相同,
2)所有的客戶端和服務器端都需要有一個相同的UID和GID的用戶,nfsnodoby(UID必須相同)
anonuid 參數以anon*開頭即值anonymous匿名用戶,這個用戶的UID設置值通常為nfsnobody的UID值,當然我們也可以自行設置這個UID值。但是,UID必須存在於/etc/passwd中。在多個NFS Clients時,如多臺web server共享一個NFS目錄時,通過這個參數可以使得不同的NFS Clients寫入的數據對所有NFS Clients保持同樣的用戶權限,即為配置的匿名UID對應用戶權限,這個參數很有用。一般默認就好
anongid 同anonuid,區別是把uid(用戶id)換成gid(組id)
ro 表示只有只讀權限
sync是synchronized的縮寫,意為同步,async是asynchonous的縮寫意為異步,怎麽理解同步和異步的,比如:你女朋買了一張票等你下班一起看電影,她會親自給你電影票然後一起看電影,在比如生產者跟消費者,(要實現這個問題,需要用到多線程,要實現多線程,就需要繼承(extend)Thread類,實現Runnable,Future接口並寫run方法,,,咳咳咳跑題了)我們常常加同步鎖synchronized,這樣就是生產一個,消費一個(Linux分為實時同步和定時同步)。異步,在比如生產者跟消費者,生產100個產品,消費者只能消費50個,那麽就會把生產者的產品放在超市,消費者就會去超市買東西,
總結NFS服務的配置過程: --服務端--1)查看系統版本,並檢測有沒有安裝nfs和rpcbind服務,如果沒有安裝就執行:
yum install nfs-utils rpcbind -y
2.啟動服務(先啟動rpcbind)
/etc/init.d/rpcbind start3.設置開機自啟動
chkconfig nfs on
chkconfig rpcbind on
4.配置NFS服務
echo "/data 192.168.1.8/24(rw,sync)" mkdir -p /data chown -R nfsnobody.nfsnobody /data
5.重新加載服務
/etc/init.d/nfs reload <#相當於 exportfs -r
6.檢查或測試掛載
showmount -e localhost mount -t nfs 192.168.1.8:/data /mnt--客戶端- 1.安裝軟件
yum install -y nfs-utils rpcbind2.啟動rpcbind
/etc/init.d/rpcbind start3.配置開機自啟動
chkconfig rpcbind on4.測試服務端共享情況
show -e 192.168.1.85.掛載
mkdir -p /data mount -t nfs 192.168.1.8:/data /tmp如果客戶端沒有寫權限,就檢查共享文件的配置是否是rw權限,檢查共享的文件的本身是否是rw 權限(也就是檢查/data ls -li /data 如果不是655 就chmod 655 /data) 常見錯誤 1.df -h 檢查服務端的NFS服務是不是啟動成功, 2.確認NFS客戶端showmount是否OK。 3.確認rpcbind上是否有NFS註冊,(rpcbind必須先啟動) 3.確認網絡是否通暢 4.確認是否因為防火墻擋住(一般內網不需要開啟防火墻,在出口加防火墻就夠了)(/etc/init.d/iptables stop/start)
Linux網絡文件系統NFS詳解