您好,登錄后才能下訂單哦!
NFS 即 網絡文件系統 (Network File System),是一種 分布式 文件系統協議,該協議允許客戶端主機可以像訪問本地文件系統一樣通過網絡訪問服務器端文件,即可以將遠程服務器文件直接 mount ( 掛載 )到本地的文件目錄結構中進行訪問。
一、軟件安裝
服務器端需要安裝 nfs-kernel-server 軟件包:
$ sudo apt-get update $ sudo apt-get install nfs-kernel-server
二、服務器配置
默認情況下,NFS 服務器上定義了某個共享目錄,則該目錄及其子目錄下的所有文件都可被訪問。
出于對安全的考慮,客戶端任何需要 超級用戶 (即 root 用戶,UID=0 & GID=0)權限的文件操作都默認映射到 UID=65534 和 GID=65534 的用戶,即 Ubuntu 系統中的 nobody:nogroup。
例如客戶端使用 root 權限在掛載的共享目錄中創建文件時,該文件的 屬主 和 屬組 自動變為 nobody:nogroup ,而非 root:root 。
1. 在服務器端創建共享目錄
sudo mkdir -p /var/nfs/gernel sudo mkdir -p /var/nfs/public sudo chown nobody:nogroup /var/nfs/gernel
2. 修改 exports 文件
為了使 NFS 服務器定義的共享文件可被指定的客戶端主機訪問,需要在服務器端的 /etc/exports
文件中添加對應的記錄。
該文件的格式如下:
Directory Host(Options ...) Host(Options) #comment
關于 /etc/exports
文件的詳細語法格式可參考 man exports
。
文件示例:
/var/nfs/gernel 192.168.56.0/24(rw,insecure,sync,no_subtree_check) /var/nfs/public *(ro,insecure,sync,no_subtree_check) /home/starky 192.168.56.1(rw,insecure,no_root_squash,sync,no_subtree_check)
第一條紀錄表示 192.168.56.0/24 子網 中的所有主機都可掛載 var/nfs/gernel
目錄并擁有讀寫( rw )權限
第二條紀錄表示 所有 主機都可掛載 /var/nfs/public
目錄且擁有 只讀 ( ro )權限
第三條紀錄表示客戶端 IP 地址為 192.168.56.1 的主機可以掛載 /home/starky
目錄并擁有 讀寫 權限,而且任何 root 權限(UID=0 , GID=0)的文件操作都不默認映射給 nobody:nogroup,而保持屬主(組)仍為 root( no_root_squash )
insecure選項:允許通過任意端口的遠程訪問
sync選項:強制 NFS 服務器在響應請求之前將文件的改動寫入磁盤(強調客戶端和服務端文件內容的一致性,但會降低文件操作的效率)。
no_subtree_check選項:禁用 subtree_check 。subtree_check 用來設置服務器在收到請求時,檢查該文件是否在指定目錄結構中依舊可用(該選項會在某些情況下發生錯誤:重命名某文件的同時,該文件在客戶端打開)。
三、客戶端掛載共享目錄
列出 nfs 服務器上的共享目錄
$ showmount -e 192.168.56.102 Exports list on 192.168.56.102: /home/starky 192.168.56.1 /var/nfs/public * /var/nfs/gernel 192.168.56.0/24
創建掛載點
sudo mkdir -p /mnt/nfs/gernel sudo mkdir -p /mnt/nfs/public sudo mkdir -p /mnt/nfs/starky
掛載遠程目錄
sudo mount 192.168.56.102:/var/nfs/gernel /mnt/nfs/gernel sudo mount 192.168.56.102:/var/nfs/public /mnt/nfs/public sudo mount 192.168.56.102:/home/starky /mnt/nfs/starky
權限測試
如截圖所示:
nfs 權限測試
NFS 的權限設定基于 Linux 文件系統的權限管理,即客戶端掛載遠程共享目錄后,會把它們當成本地磁盤目錄一樣對待,也是根據文件的屬主(組)及其對應的權限設定來限制訪問。
gernel 目錄的屬主(組)為 nobody:nogroup(65534:65534),所以雖然該目錄為讀寫權限,非 root 用戶無法執行新建操作。而 root 用戶由于 NFS 默認的安全機制,會自動映射到 nobody:nogroup。
由于我在客戶端和服務端都有一個名為 starky 的用戶,且它們的 UID:GID 都為1000:1000,所以服務端的 /home/starky
目錄可以直接被客戶端的 starky 用戶訪問。且由于 no_root_squash 選項,通過 sudo 命令創建的文件其屬主仍為 root(而不會再映射為 nobody)。
當然這會導致一些安全問題,比如多個客戶端同時都有 UID(GID)為1000的用戶(不管用戶名是什么),則這些用戶會共享服務端 /home/starky
目錄里的文件權限。
四、系統啟動時自動掛載共享目錄
可編輯 /etc/fstab
文件令掛載共享目錄的 mount 操作成為系統的固定配置(手動輸入的 mount 命令屬于臨時掛載,重啟會自動卸載),使得系統重啟后可以自動掛載遠程文件系統。 /etc/fstab
文件的示例內容如下:
# filesystem mountpoint fstype flags dump fsck 192.168.56.102:/var/nfs/gernel /mnt/nfs/gernel nfs rw,bg,intr,hard,nodev,nosuid 0 0 192.168.56.102:/var/nfs/public /mnt/nfs/public nfs4 ro,bg,intr,soft,nodev,nosuid 0 0 192.168.56.102:/home/starky /mnt/nfs/starky nfs rw,bg,intr,hard,nodev,nosuid 0 0 附錄:
附錄:
1. /etc/exports 文件中的 Host 格式
/etc/exports
文件的格式為: Directory Host(Options ...) Host(Options) #comment
其中的 Host 項用來指定可訪問對應共享目錄的主機,其格式可分為以下幾種:
單個主機
Host 項可以為一個或多個單獨的 TCP/IP 主機名或 IP 地址
admin admin.starky.net 192.168.56.101
IP 子網
10.0.0.0/255.0.0.0 172.16.0.0/255.255.0.0 192.168.56.0/24
TCP/IP 域
通過使用 通配符 ,可以指定某個特定域中的全部或部分主機
*.starky.net *craft.starky.net ???.starky.net
NIS 組
可以指定某個 NIS 組中所有主機的訪問權限,使用 @group
2. /etc/exports 文件中的 Options
選項 | 描述 |
---|---|
ro | 只讀權限 |
rw | 讀寫權限(默認) |
rw= list | 通過 list 指定具有寫權限的客戶端主機,其他主機則為只讀權限 |
root_squash | 將 UID 0 和 GID 0 映射到 anonuid 和 anongid(即 Ubuntu 系統中的 nobody 和 nogroup) |
no_root_squash | 允許需要 root 權限的文件操作,有安全風險 |
all_squash | 將所有的 UID 和 GID 映射到它們的匿名形式,主要針對不信任的主機 |
anonuid= xxx | 指定客戶端 root 權限的操作需要映射到的 UID(默認是65534) |
anongid= xxx | 指定客戶端 root 權限的操作需要映射到的 GID(默認是65534) |
insecure | 允許通過任意端口的遠程訪問 |
async | 服務器可以在寫入硬盤之前響應客戶端的寫入請求 |
wdelay | 通過延遲同步多個客戶端對文件的更新 |
sec= flavor | 指定共享目錄的安全驗證方法,包括 sys (UNIX 驗證), dh (DES), krb5i , krb5p 和 none (匿名訪問) |
3. NFS 掛載選項
選項 | 描述 |
---|---|
rw | 以讀寫模式掛載文件系統(rw 也需在服務端定義) |
ro | 以只讀模式掛載文件系統 |
bg | 如掛載失敗(服務器無響應),在后臺繼續嘗試并執行其他掛載請求 |
hard | 如果服務器無響應,重復發送請求直到服務器回復 |
soft | 如果服務器無響應,重復發送請求,超過一定時間后返回錯誤,而不會一直阻塞 |
intr | 允許用戶中斷阻塞的文件操作(并返回錯誤) |
nointr | 不允許用戶中斷客戶端的文件操作請求 |
retrans= n | 在 soft 模式下,指定返回錯誤前重復發送請求的次數 |
timeo= n | 設置超時后重復發送請求的時間間隔(單位 1/10 秒) |
rsize= n | 設置讀取 buffer 大小為 n bytes |
wsize= n | 設置寫入 buffer 大小為 n bytes |
sec= flavor | 設置安全驗證方法 |
proto= proto | 設置傳輸協議,NFSv4 必須為 TCP |
4. NFS 協議討論
傳輸協議
最初的 NFSv2 由于性能原因使用 UDP 協議,雖然 NFS 添加了自己的 包序列重組 和 錯誤檢查 功能,但 UDP 和 NFS 都不具備 阻塞控制 算法,所以在大型的互聯網絡環境中缺乏足夠的性能。
NFSv3 提供了 UDP 和 TCP 協議之間的選擇。NFSv4 只能使用 TCP 協議。
隨著 CPU,內存等硬件設備和網絡傳輸速度的提高,最初由于性能需求而傾向 UDP 協議的選擇也變得不再必要。
State
NFSv2 和 NFSv3 是 無狀態 的連接,服務端不會跟蹤客戶端對共享目錄的掛載情況,而是使用 "cookie" 來記錄一次成功的掛載。"cookie" 不會因為服務器重啟而刪除,可以用來在服務器掛掉之后保留客戶端的連接信息。
NFSv4 是 有狀態 的連接,客戶端和服務端都會維護文件操作紀錄及文件鎖的狀態。所以不再需要 "cookie" 的使用。
文件鎖
早期版本的 NFS 協議(v2 & v3)由于是 無狀態 的連接,它們并不清楚哪些主機正在使用哪些文件。但是文件鎖的實現又需要獲取狀態信息。所以早期協議中的文件鎖是獨立于 NFS 實現的。
而 NFSv4 將文件鎖的實現整合到了核心協議中,雖然此舉增加了復雜度,但同時也解決了早期版本中的很多問題。
但是為了兼容使用 V2 和 V3 協議的客戶端,獨立的 locked 和 statd 守護進程仍舊需要。
安全相關
NFS 協議最初在設計時并不關注安全性,NFSv4 通過引入對更強大的安全服務和身份驗證的支持,加強了該協議的安全性。
傳統的 NFS 協議大多使用 AUTH_SYS 驗證方式,基于 UNIX 的用戶和組標識。在這種方式下,客戶端只需要發送自己的 UID 和 GID 并與服務器上的 /etc/passwd
文件內容作對比,以決定其擁有怎樣的權限。
所以當多個客戶端存在 UID 相同的用戶時,這些用戶會擁有相同的文件權限。更進一步,擁有 root 權限的用戶可以通過 su 命令切換到任意 UID 登錄,服務器會因此給予其對應 UID 的權限。
為了防止上面的問題出現,服務器可選擇使用更健壯的驗證機制比如 Kerberos 結合 NFS PRCSEC_GSS。
NFS 共享目錄的訪問控制基于 /etc/exports
文件中定義的主機名或 IP 地址。但是客戶端很容易針對其身份和 IP 地址造假,這也會導致一些安全問題。
NFSv4 只使用 TCP 作為自己的傳輸協議,而且通常只開放 2049 端口進行數據傳輸。在配置防火墻時,除了放開 2049 端口的限制外,還要時刻注意數據傳輸的源地址和目標地址。
5. Windows 系統掛載共享目錄
win10 系統默認不能掛載 NFS 共享目錄,需要進入 控制面板 - 程序 - 程序和功能 - 啟用或關閉 Windows 功能 ,勾選上 NFS 服務 。
啟用 nfs 服務
之后就可以使用 mount 命令掛載共享目錄了。
mount 命令掛載共享目錄
只是 Windows 系統并不使用 Linux 那樣的用戶管理,導致掛載的共享目錄只能讀取而沒有寫入的權限。
無法寫入文件
解決辦法是在 注冊表 中新建兩個 DWORD 值,用作 匿名用戶 的 UID 和 GID。
默認參數下的掛載選項,UID 和 GID 都為 -2:
默認掛載選項
可進入 注冊表編輯器 ( regedit ),定位到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default ,新建兩個名為 AnonymousUid 和 AnonymousGid 的 DWORD(32位)值,改成自己需要用到的數字(我都改成了 0 ,即對應 Linux 系統中的 root 用戶。如需要改為 0 以外的數字,注意先轉換成 16 位)。
此時的掛載選項變為:
更改 UID 和 GID
如更改未生效,可重啟電腦。
參考資料
UNIX and Linux System Administration Handbook, 4th Edition
How to Mount an NFS Share Using a Windows 10 Machine
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。