NFS文件系統
NFS服務
- NFS:Network File System 網絡文件系統,基於內核的文件系統。Sun公司開發,經過使用NFS,用戶和程序能夠像訪問本地文件同樣訪問遠端系統上的文件,基於RPC(Remote Procedure Call Protocol遠程過程調用)實現
- RPC採用C/S模式,客戶機請求程序調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行
- NFS優點:節省本地存儲空間,將經常使用的數據,如home目錄,存放在NFS服務器上且能夠經過網絡訪問,本地終端將可減小自身存儲空間的使用
NFS文件系統
- locate nfs.ko
- locate xfs.ko
- 內核級的性能更好
- 能夠多個客戶端掛載
- 每一個客戶端看到的是一樣的內容,都是來自於 nfs 服務器
NFS的工做做原理
- nfs 很特殊,用的端口號不是一個,也不是固定端口,它的端口不少,並且每次重啓會發生變化
- 客戶端想去連 nfs 服務器就比較困難了,找一個代理人RPC(portmap)
- nfs 起來的時候會把本身用的端口號註冊到 RPC 服務上
- RPC服務的端口是固定的,走tcp的111端口
- 客戶端 與 rpc 服務協商,而後鏈接 nfs 服務端
- 在cetnos6上中止 rpcbind服務,重啓nfs服務就不會起來
NFS服務介紹
- 軟件包:nfs-utils
- Kernel支持:nfs.ko
- 端口:2049(nfsd), 其它端口由portmap(111)分配
- 配置文件:/etc/exports,/etc/exports.d/*.exports
- CentOS7不支持同一目錄同時用nfs和samba共享,由於使用鎖機制不一樣
- 相關軟件包:rpcbind(必須),tcp_wrappers
- CentOS6開始portmap進程由rpcbind代替
- NFS服務主要進程
- rpc.nfsd 最主要的NFS進程,管理客戶端是否可登陸
rpc.mountd 掛載和卸載NFS文件系統,包括權限管理
rpc.lockd 非必要,管理文件鎖,避免同時寫出錯
rpc.statd 非必要,檢查文件一致性,可修復文件
- 日誌:/var/lib/nfs/
NFS配置文件
- 導出的文件系統的格式:
- /dir 主機1(opt1,opt2) 主機2(opt1,opt2)...
- #開始爲註釋
- 主機格式
- 單個主機:ipv4,ipv6,FQDN
IP networks:兩種掩碼格式均支持
172.18.0.0/255.255.0.0
172.18.0.0/16
wildcards:主機名通配,例如*.benet.com,IP不能夠
netgroups:NIS域的主機組,@group_name
anonymous:表示使用*通配全部客戶端
NFS配置文件
- 每一個條目指定目錄導出到的哪些主機,及相關的權限和選項
- 默認選項:(ro,sync,root_squash,no_all_squash)
ro,rw 只讀和讀寫
async 異步,數據變化後不當即寫磁盤,性能高
sync(1.0.0後爲默認)同步,數據在請求時當即寫入共享
no_all_squash (默認)保留共享文件的UID和GID
all_squash 全部遠程用戶(包括root)都變成nfsnobody
root_squash (默認)遠程root映射爲nfsnobody,UID爲65534,早期版本是4294967294 (nfsnobody)
no_root_squash 遠程root映射成root用戶
anonuid和anongid 指明匿名用戶映射爲特定用戶UID和組GID,而非nfsnobody,可配合all_squash使用
NFS工具
- rpcinfo
- rpcinfo -p hostname
- rpcinfo –s hostname 查看RPC註冊程序
- exportfs
- –v 查看本機全部NFS共享
- –r 重讀配置文件,並共享目錄
- –a 輸出本機全部共享
- –au 中止本機全部共享
- showmount -e hostname
- mount.nfs 掛載工具
客戶端NFS掛載
-
NFS相關的掛載選項:man 5 nfsnode
-
基於安全考慮,建議使用nosuid,nodev,noexec掛載選項安全
-
mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/服務器
-
172.16.0.1:/public /mnt/nfs nfs defaults 0 0網絡
nfs 配置實例
- nfs 服務器端
- yum install rpcbind nfs-utils -y
- systemctl start nfs-server
- mkdir /data/nfs1
- vim /etc/exports
- exportfs -r
- nfs 客戶端
- yum install nfs-utils -y
- showmount -e 192.168.209.7
- mkdir /mnt/nfs-client1
- mount 192.168.209.7:/data/nfs1 /mnt/nfs-client1
- 當向 /mnt/nfs-client1上寫數據時報錯
- 修改 nfs 服務器的配置
- exportfs -r
- 在客戶端測試
那麼客戶端訪問 /mnt/nfs-client1 究竟是以什麼身份呢?app
- 在服務端給 /data/nfs1 777 的權限,再次重讀配置文件
- 在客戶端 建立文件
- 在服務器端查看權限的狀況
- 客戶端訪問 /mnt/nfs-clinet1 的實際是以 nfsnobody的身份運行的,這稱爲權限的壓榨 root_squash,默認普通用戶不壓榨
- 客戶端訪問nfs服務器的身份是以 uid 爲標準的,是一一對應的關係,若是服務器端沒有與客戶端一致的uid,則會顯示 uid號
- 客戶端訪問 nfs 服務器共享的資源,若是兩個用戶的uid同樣就會認爲是同一個用戶,這比較混亂,這也是 nfs 服務的一個最大的缺點。
- 所以,在生產中要實現賬號的統一管理。
- 能夠對客戶端訪問服務器端的資源都以一我的的身份運行(all_squash,anonuid=2000,anongid=2000)
- 服務器端共享資源,共享給誰,客戶端能夠查看,若是共享的是指定某一個ip,那麼客戶端只要將本身的ip改爲與服務器的共享的ip同樣就能夠了。