NFS搭建與自動掛載


NFS搭建與自動掛載
1、NFS文件共享服務器:
同步外網源,搭建共享服務,通過自動掛載實現掛載外網源,建立本地倉庫
NFS是network file sytem的縮寫,他最大的特點就是可以通過網絡,讓不同的機器,不同的系統實現文件共享。NFS客戶端可以將NFS服務器共享的目錄掛載在本地的文件系統中,訪問目錄就如同訪問自己本地目錄一樣。

1.1 NFS工作原理:
1. 首先NFS服務器端開啟rpcbind;
2. 然后服務端開啟NFS服務,這時NFS的各項功能都需要向RPC服務注冊,這時rpc會通知portmap模塊將可用的端口分配給statd,rquotad等;
3. 然后NFS客戶端RPC服務就會通過網絡向NFS服務端的RPC服務的111端口發出NFS文件存取功能的
詢問請求。
4. NFS服務端的RPC服務找到對應的已注冊的NFSdaemon端口后,通知NFS客戶端的RPC服務。
5. 此時NFS客戶端就可獲取到nfs服務端各個進程的正確端口,然后通過客戶端rpc就直接與NFS服務
器的rpc進行存取數據了(rpc知道了nfs的具體端口,就可以實現遠程調用,即傳輸)。

1.2 NFS安裝部署:
服務器和客戶端都關閉防火牆,裝好nfs服務組件:

nfs服務端:192.168.112.6
nfs客戶端:192.168.112.5
# 關閉防火牆:
systemctl stop firewalld && systemctl disable firewalld
iptables -L

# 臨時關閉selinux:
setenforce 0
getenforce
# 永久關閉selinux:
sed -i 's/=enforcring/=disabled/' /etc/selinux/config

# 安裝nfs服務組件:
yum -y install nfs-utils
rpm -q nfs-utils

1.2.1 配置服務端:
nfs服務端:192.168.112.6

新建共享文件夾
mkdir -p /data/jfedu
編輯/etc/exports文件
/data/jfedu  192.168.75.0/24(rw,sync)
# 格式:
# /data/jfedu  要共享的目錄,需要存在
# 192.168.75.0/24 誰能掛載使用,可以是網段,也可以指定具體ip
# (rw,sync) 掛載的一些參數,rw表示掛載為可讀可寫,sync表示同步

1.2.2 配置客戶端:
可用showmount搜索網絡中可用的共享文件
showmount -e 192.168.112.6
創建目錄,用於掛載
mkdir /data/nfs
掛載
mount -t nfs 192.168.75.130:/data/jfedu /data/nfs
#推薦使用:
mount -t nfs -o soft,timeo=1  192.168.112.6:/data/jfedu /data/nfs
soft: 軟掛載,遇到報錯會終止掛載,並返回信息,默認是硬掛載,一直嘗試掛載。
timeo: 超時時間,如果不設置,一直鏈接,可以設置小點

掛載完成之后,進入目錄,可能會發現無法對目錄中的文件進行修改。
這主要是因為客戶端訪問服務器時,身份被壓縮成nobody,相對服務器文件系統來說,就是其他用戶。
所以要想編輯,需要在服務端對文件授權或者更改exports文件,設置no_root_squash(不壓縮客戶端root身份)。

1.3 解讀exports文件:
/etc/exports文件內容格式:
<輸出目錄> [客戶端1 選項(訪問權限,用戶映射,其他)] [客戶端2 選項(訪問權限,用戶映射,其他)]
[root@master ~]# vim /etc/exports
/data/jfedu 192.168.112.5(rw,no_root_squash,sync)
/data/jfedu 192.168.112.7(ro)

1.3.1 . 輸出目錄:
輸出目錄是指NFS系統中需要共享給客戶機使用的目錄;
1.3.2 . 客戶端:
客戶端是指網絡中可以訪問這個NFS輸出目錄的計算機
客戶端常用的指定方式
• 指定ip地址的主機:192.168.0.200
• 指定子網中的所有主機:192.168.0.0/24 192.168.0.0/255.255.255.0
• 指定域名的主機:www.jfedu.com
• 指定域中的所有主機:*.jfedu.com
• 所有主機:*
1.3.3 . 選項:
選項用來設置輸出目錄的訪問權限、用戶映射等。

[root@localhost ~]# exportfs -v
/data/jfedu
192.168.75.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squa
sh,no_all_squash)

NFS主要有3類選項:
訪問權限選項
• ro:設置輸出目錄只讀
• rw:設置輸出目錄讀寫
用戶映射選項
• all_squash:將遠程訪問的所有普通用戶及所屬組都映射為匿名用戶或用戶組(nfsnobody)不管訪問者是什么身份,包括root,全部壓縮至匿名用戶。;
• no_all_squash:與all_squash取反(默認設置),保留訪問用戶的身份uid以及gid,一般只能查看,不能修改,權限問題,但是可以強制保存。;
• root_squash:將root用戶及所屬組都映射為匿名用戶或用戶組(默認設置)如果客戶端用root身份訪問,則被壓縮成nobody,權限也將受到限制。;
• no_root_squash:與rootsquash取反,也就是不壓縮,客戶端使用root身份登錄,全有所有權限,很危險。;
• anonuid=xxx:將遠程訪問的所有用戶都映射為匿名用戶,並指定該用戶為本地用戶(UID=xxx);
• anongid=xxx:將遠程訪問的所有用戶組都映射為匿名用戶組賬戶,並指定該匿名用戶組賬戶為本地用戶組賬戶(GID=xxx);
其它選項
• secure:限制客戶端只能從小於1024的tcp/ip端口連接nfs服務器(默認設置);
• insecure:允許客戶端從大於1024的tcp/ip端口連接服務器;
• sync:將數據同步寫入內存緩沖區與磁盤中,效率低,但可以保證數據的一致性;
• async:將數據先保存在內存緩沖區中,必要時才寫入磁盤;
• wdelay:檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率(默認設置);
• no_wdelay:若有寫操作則立即執行,應與sync配合使用;
• subtree:若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限(默認設置);
• no_subtree:即使輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣可以提高效率;


1.4 NFS的常用目錄
/etc/exports NFS服務的主要配置文件
/usr/sbin/exportfs NFS服務的管理命令
/usr/sbin/showmount 客戶端的查看命令
/var/lib/nfs/etab 記錄NFS分享出來的目錄的完整權限設定值
/var/lib/nfs/xtab 記錄曾經登錄過的客戶端信息


1.5 NFS的共享權限和訪問控制
1.5.1 NFS有很多默認的參數,打開/var/lib/nfs/etab 查看分享出來的/data/nfs/ 完整權限設定值。
[root@localhost nfs]# cat /var/lib/nfs/etab
/data/jfedu 192.168.112.5(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,ro,secure,root_squash,no_all_squash)
/data/jfedu 192.168.112.7(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
默認就有sync,wdelay,hide 等等,no_root_squash 是讓root保持權限,root_squash 是把root映射成nobody,no_all_squash 不讓所有用戶保持在掛載目錄中的權限。所以,root建立的文件所有者是nfsnobody。

[root@localhost ~]# cd /data/nfs
[root@localhost nfs]# mkdir lyd
mkdir: cannot create directory ‘lyd’: Permission denied
[root@localhost nfs]# mkdir lyd
[root@localhost nfs]# touch 1.txt
[root@localhost nfs]# ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Aug 4 15:27 1.txt
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Aug 4 15:26 lyd

[root@localhost nfs]# useradd bob
[root@localhost nfs]# passwd bob
[root@localhost nfs]# su - bob
[bob@localhost ~]$ cd /mnt/nfs
[bob@localhost nfs]$ ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Aug 4 15:27 1.txt
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Aug 4 15:26 lyd
[bob@localhost nfs]$ mkdir bob
[bob@localhost nfs]$ touch bob.txt
[bob@localhost nfs]$ ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Aug 4 15:27 1.txt
drwxrwxr-x. 2 bob bob 6 Aug 4 15:31 bob
-rw-rw-r--. 1 bob bob 0 Aug 4 15:31 bob.txt
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Aug 4 15:26 lyd

1.5.2 關於權限的分析
  1. 客戶端連接時候,對普通用戶的檢查
    a. 如果明確設定了普通用戶被壓縮的身份,那么此時客戶端用戶的身份轉換為指定用戶;
    b. 如果NFS server上面有同名用戶,那么此時客戶端登錄賬戶的身份轉換為NFS server上面的同名用戶;
    c. 如果沒有明確指定,也沒有同名用戶,那么此時 用戶身份被壓縮成nfsnobody;
  2. 客戶端連接的時候,對root的檢查
    a. 如果設置no_root_squash,那么此時root用戶的身份被壓縮為NFS server上面的root;
    b. 如果設置了all_squash、anonuid、anongid,此時root 身份被壓縮為指定用戶;
    c. 如果沒有明確指定,此時root用戶被壓縮為nfsnobody;
    d. 如果同時指定no_root_squash與all_squash 用戶將被壓縮為 nfsnobody,如果設置了anonuid、anongid將被壓縮到所指定的用戶與組;

 

1.6 報錯處理:
1.6.1 客戶端掛載時報錯bad superblock:
[root@node2 ~]# mount 192.168.75.121:/data/jfedu /mnt
mount: wrong fs type, bad option, bad superblock on 192.168.75.121:/data/jfedu,
   missing codepage or helper program, or other error
   (for several filesystems (e.g. nfs, cifs) you might
   need a /sbin/mount.<type> helper program)
# 解決辦法:
yum install nfs-utils -y

1.6.2 客戶端掛載時報錯access denied:
[root@node2 ~]#mount 192.168.75.121:/data/jfedu /mnt
mount.nfs: access denied by server while mounting 192.168.75.121:/data/jfedu
ps: 客戶端IP不在/etc/exports文件中,會報此錯。

1.6.3 卸載時報錯:
umount.nfs4: /data/jfedu: device is busy
# 解決辦法:
umount -l /data/jfedu  強行解除掛載
或者使用
fuser -m /data/jfedu 將會顯示使用這個模塊的pid
fuser -mk /data/jfedu 將會直接kill那個pid

1.6.4 使用showmount -e ip檢測服務端服務器情況的是,會出現clnt_create: RPC: Program not registered
#這個錯誤,表示rpc程序為注冊成功,解決方案就是:
以此關閉nfs和rpcbind
[root@localhost nfs]# systemctl stop nfs
[root@localhost nfs]# systemctl stop rpcbing
再依次啟動服務:(注意先啟動rpc)
[root@localhost nfs]# systemctl start rpcbind
[root@localhost nfs]# systemctl start nfs

1.7相關命令
1.7.1 exportfs
如果我們在啟動了NFS之后又修改了/etc/exports,是不是還要重新啟動nfs呢?這個時候我們就可以用exportfs 命令來使改動立刻生效,該命令格式如下:
  # exportfs [-aruv]
  -a 全部掛載或卸載 /etc/exports中的內容
  -r 重新讀取/etc/exports 中的信息 ,並同步更新/etc/exports、/var/lib/nfs/xtab
  -u 卸載單一目錄(和-a一起使用為卸載所有/etc/exports文件中的目錄)
  -v 在export的時候,將詳細的信息輸出到屏幕上。
具體例子:
  # exportfs -au 卸載所有共享目錄,在NFS 服務器上使用,客戶端沒有作用。服務端執行后,客戶端會卸載共享目錄,代表umount
  # exportfs -rv 重新共享所有目錄,並輸出詳細信息NFS服務端使用重新掛載。服務端執行后,客戶端會重新掛載共享目錄。
1.7.2 nfsstat
查看NFS的運行狀態,對於調整NFS的運行有很大幫助。
1.7.3 rpcinfo
查看rpc執行信息,可以用於檢測rpc運行情況的工具,利用rpcinfo -p 可以查看出RPC開啟的端口所提供的程序有哪些。
1.7.4 showmount
  -a 顯示已經於客戶端連接上的目錄信息
  -e IP或者hostname 顯示此IP地址分享出來的目錄
1.7.5 netstat
可以查看出nfs服務開啟的端口,其中nfs 開啟的是2049,portmap 開啟的是111,其余則是rpc開啟的。
最后注意兩點,雖然通過權限設置可以讓普通用戶訪問,但是掛載的時候默認情況下只有root可以去掛載,普通用戶可以執行sudo。
NFS server 關機的時候一點要確保NFS服務關閉,沒有客戶端處於連接狀態!通過showmount -a 可以查看,如果有的話用kill killall pkill 來結束,(-9 強制結束)

總結:
1、安裝 NFS服務
yum install -y nfs-utils
2、編譯nfs配置文件
vi /etc/exports
/data/jfedu  192.168.75.0/24(rw,sync)
3、創建共享目錄
mkdir -p /data/jfedu
4、啟動NFS服務,先啟動rpcbind 在啟動nfs服務(服務端操作)
systemctl start rpcbind.service
systemctl start nfs.service
5、創建掛載目錄
mkdir -p /data/nfs
6、掛載(客戶端操作)
mount -t nfs 128.196.126.142:/home/ap/nas_a /home/ap/nas_a


2、自動掛載

nfs自動掛載技術:
autofs服務程序與mount命令不同之處在於它是一種守護進程,只有檢測到用戶試圖訪問一個尚未掛載
的文件系統時才自動的檢測並掛載該文件系統。
autofs非常方便,主要有兩點:
1、設置開機不一定要掛載的目錄,當用的時候才實現自動掛載。
2、用戶不使用自動掛載的目錄一段的時間,會自動卸載。(默認時間為5分鍾),可以在autofs.conf設置

2.1 安裝autofs服務:
# 在客戶端執行以下命令:
yum install autofs -y

2.2 編輯/etc/auto.master:
# 添加以下行:
vim /etc/auto.master:
/data /etc/auto.nfs

/data是總的訪問目錄(客戶端的目錄) /etc/auto.nfs是對總訪問目錄的描述,用於子目錄的編輯,用戶權限分離

2.3 編輯nfs.misc:
vim /etc/auto.nfs
nfs -fstype=nfs,rw,sync 192.168.112.6:/data/jfedu

2.4 啟動auofs服務:
systemctl start autofs

2.5 驗證權限:
## 登錄不同目錄驗證權限:
[root@localhost ~]# ls /data/nfs
[root@localhost ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 485992 0 485992 0% /dev
tmpfs 497836 0 497836 0% /dev/shm
tmpfs 497836 13912 483924 3% /run
tmpfs 497836 0 497836 0% /sys/fs/cgroup
/dev/sda3 28833020 2391972 26441048 9% /
/dev/sda1 508580 129696 378884 26% /boot
tmpfs 99568 0 99568 0% /run/user/0
192.168.112.6:/data/jfedu 28833024 2248832 26584192 8% /data/nfs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM