參考
http://cn.linux.vbird.org/linux_server/0330nfs.php#What_NFS_0
NFS介紹
介紹
NFS
是Network FileSystem
的縮寫,主要功能是通過網絡,讓不同的機器,不同的操作系統,可以彼此分享指定的資源文件,可簡單的認爲是一個文件服務器,可以將遠程NFS
服務器共享的目錄掛載到本地機器中,在本地機器看起來,被掛載的目錄就像是自己的一個磁盤分區一樣,使用非常方便。
上圖中的NFS
服務器設定好了要共享的目錄後,其他客戶端就可直接將該目錄掛載到自己系統上的某個掛載點,就可通過掛載點直接訪問服務器共享目錄中的數據了(前提權限要夠)
NFS數據獲取流程
背景
由於NFS
支持的功能較多,不通的功能都會使用不同的程序來啓動,而每一個程序都會啓動一些端口來傳輸數據,所以NFS
功能對應的端口沒有固定,而是隨機獲取一些小於1024的端口來用。所以當客戶端需要使用這些端口的時候,就需要遠程過程調用(RPC)的服務了。當NFS
服務器在啓動時,會將隨機獲取來的端口都註冊到RPC
中,因爲RPC
知道每個端口對應的NFS
功能,這樣當客戶端請求服務端時,只需要讓監聽在111端口的RPC
服務來返回客戶端正確的端口即可。
**注:**所以啓動NFS
之前,就需要啓動RPC
服務,否則NFS
無法向RPC
註冊,同時當RPC
重啓時,舊的註冊數據就會丟失,他管理的所有服務都需重新向RPC
註冊。
所以,當服務端將端口向RPC
註冊完成後,若有客戶端有NFS
數據存取需求時,執行流程如下:
- 客戶端會向服務器端的
RPC (port 111)
發出 NFS 檔案存取功能的詢問要求; - 服務器端找到對應的已註冊的端口後,會回報給客戶端;
- 客戶端了解正確的端口後,就可以直接與運行在該端口的程序來聯機。
主要配置文件
默認配置文件地址:/etc/exports
,該配置文件的內容需要自己手動寫入
語法和參數
[root@suhw ~]# vim /etc/exports
/tmp 192.168.100.0/24(ro) localhost(rw) *.ev.ncku.edu.tw(ro,sync)
[分享目錄] [第一部主機(權限)] [可用主機] [可用通配符]
詳細的用戶可參考示例。
權限參考參數,更全的介紹參考 man exports
參數值 | 內容說明 |
---|---|
ro | 該主機對共享目錄權限爲只讀權限 |
rw | 該主機對共享目錄權限爲讀寫權限 |
root_squash | 客戶端用root用戶訪問該共享文件夾時,將root用戶映射爲匿名用戶 |
no_root_squash | 客戶端用root用戶訪問該共享文件夾時,不映射root用戶,如果你想要開放客戶端使用 root 身份來操作服務器的文件系統,那麼這裏就得要開 no_root_squash 纔行! |
all_squash | 客戶機上的任何用戶訪問該共享目錄時都映射成匿名用戶 |
anonuid | 將客戶機上的用戶映射成指定的本地用戶ID的用戶 |
anongid | 將客戶機上的用戶映射成屬於指定的本地用戶組ID |
sync | 資料同步寫入到內存與硬盤中 |
async | 資料會先暫存於內存中,而非直接寫入硬盤 |
insecure | 允許從這臺機器過來的非授權訪問 |
舉例
- 將
/home/public
公開,但是隻有192.168.100.0/24
這個網段的用戶可以讀寫,其他來源只能讀取
/home/public 192.168.100.0/24(rw) *(ro)
- 將
/home/iso
目錄公開,允許所有人進行讀操作
/home/iso *(ro,insecure,no_root_squash)
注意no_root_squash
的功能。在這個例子中,如果你是客戶端,而且你是以 root 的身份登入你的 Linux 主機,那麼當你 mount 上我這部主機的/home/iso
之後,你在該 mount 的目錄當中,將具有root
的權限!
exportfs
指令
利用exportfs
可以重新分享/etc/exports
變更的目錄資源、將NFS Server
分享的目錄卸除或重新分享等等。
語法和參數
參數 | 作用 |
---|---|
-a | 打開或取消所有目錄共享 |
-o options | 指定一列共享選項 |
-i | 忽略 /etc/exports 文件,只使用默認的和命令行指定的選項 |
-r | 重新共享所有目錄,使/etc/exportfs生效 |
-u | 取消一個或多個目錄的共享 |
-v | 輸出詳細信息 |
-s | 顯示/etc/exports中的列表 |
查看分享資源記錄
在NFS
服務器的登陸文件都放置到/var/lib/nfs
目錄中,比較重要的有etab
etab
記錄了NFS
所分享出來的目錄的完整權限設定值
/home/iso (ro,sync,wdelay,hide,nocrossmnt,insecure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,insecure,no_root_squash,no_all _squash)
showmount
指令
exportfs
是用於在NFS server
端維護分享的資源,而shownmount
則是用於NFS client
端,該命令可以查看出NFS server
分享出的目錄資源
語法和參數
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
參數選項 | 作用 |
---|---|
-d or --directories | 顯示已被nfs客戶端加載的目錄 |
-e or --exports | 顯示nfs服務端上所有的共享目錄 |
掛載遠程目錄示例
NFS Server 配置
環境準備
要想對NFS server
配置首先需要rpcbind
和nfs-utils
可以使用rpm -qa | grep nfs-utils
查詢是否已經安裝該軟件,若沒安裝過執行下列命令
[root@suhw ~]# yum install -y nfs-utils
rpcbind
:NFS
可被視爲RPC
服務,而啓動RPC
服務之前,我們首先需要啓動rpcbind
[root@suhw ~]# systemctl start rpcbind
[root@suhw ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-06-16 10:26:08 CST; 2s ago
Process: 29537 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 29538 (rpcbind)
Tasks: 1
Memory: 660.0K
CGroup: /system.slice/rpcbind.service
└─29538 /sbin/rpcbind -w
Jun 16 10:26:07 suhw systemd[1]: Starting RPC bind service...
Jun 16 10:26:08 suhw systemd[1]: Started RPC bind service.
由於rpc
固定使用111
端口,所以可直接查看111端口是否處於監聽狀態
[root@suhw ~]# netstat -tulnp | grep 111
tcp6 0 0 :::111 :::* LISTEN 29538/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 29538/rpcbind
udp6 0 0 :::111 :::* 29538/rpcbind
啓動服務
確保rpcbind
啓動
#查看 rpcbind 狀態
[root@suhw ~]# systemctl status rpcbind
#若rpcbind未啓動,則start
[root@suhw ~]# systemctl start rpcbind
確保nfs
啓動
[root@suhw ~]# systemctl status nfs
#若nfs未啓動,則start
[root@suhw ~]# systemctl start nfs
配置文件編寫
允許10.91
開頭的地址共享/home/test
目錄,並具有可讀可寫操作
[root@suhw ~]# cat /etc/exports
/home/test 10.91.*(rw,sync,no_root_squash)
配置文件生效
使用上面介紹的用來管理當前NFS共享的文件系統列表的exportfs
命令
# 重新共享,使 exports 生效
[root@suhw ~]# exportfs -r
[root@suhw ~]# exportfs -s
/home/test 10.91.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
驗證
NFS
服務端配置完成後,先在服務端通過showmount
命令測試下是否已經共享成功
[root@suhw ~]# showmount -e localhost
Export list for localhost:
/home/test 10.91.*
此時查看之前說的``etab`就會發現多了一條記錄i
[root@suhw ~]# cat /var/lib/nfs/etab
/home/test 10.91.*(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)
在掛載目錄下創建個文件,方便一會觀察現象
[root@suhw ~]# touch /home/test/test.txt
NFS Cient配置
環境驗證
1、確認本地端已經啓動了 rpcbind 服務
[root@nfs-client ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-06-15 18:11:40 CST; 20h ago
Main PID: 1264 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─1264 /sbin/rpcbind -w
Jun 15 18:11:40 csmp-SP1Fusion systemd[1]: Starting RPC bind service...
Jun 15 18:11:40 csmp-SP1Fusion systemd[1]: Started RPC bind service.
2、確保安裝showmount
查看遠程服務器共享資源
[root@nfs-client ~]# showmount -e 10.91.156.174
Export list for 10.91.156.174:
/home/test 10.91.*/
進行掛載
1、在本地端建立預計要掛載的掛載點目錄
[root@nfs-client ~]# mkdir -p /home/test
2、利用 mount 將遠程主機直接掛載到相關目錄
[root@nfs-client ~]# mount 10.91.156.174:/home/test /home/test
3、查看掛載信息
[root@nfs-client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
'''
10.91.156.174:/home/test 17G 8.0G 9.1G 47% /home/test
驗證
查看本地掛載目錄下的內容即可
[root@nfs-client ~]# ll /home/test/
total 0
-rw-r--r-- 1 root root 0 Jun 16 14:47 test.txt
取消掛載
若不需要掛載時,使用umount
命令指定本地掛載目錄即可
[root@nfs-client ~]# umount /home/test