檔案掛載(一)- Linux掛載Linux資料夾

語言: CN / TW / HK

一、概述

工作中經常會出現不同伺服器、不同作業系統之間資料夾互相掛載的情形,例如檔案伺服器或資料備份伺服器。

掛載一般來說就是以下四種類型:

同類型作業系統

a. linux掛載linux資料夾

b. windows掛載windows資料夾

不同型別作業系統

c. linux掛載windows資料夾

d. windows掛載linux資料夾

linux掛載linux資料夾採用nfs(Network File System),本文將介紹此種類型。

二、搭建

實驗的環境 兩臺Linux:CentOS7.3

Server端:192.168.56.77 檔案實際存放的伺服器

Client端:192.168.56.88 掛載的伺服器,即將server端的共享資料夾掛載到client端

兩端都安裝nfs服務

# yum install -y nfs-utils

【Server端】

關閉防火牆以及Selinux

# systemctl stop firewalld
# systemctl disable firewalld
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

建立共享目錄

# mkdir /opt/test  
# chmod 777 /opt/test

修改nfs配置

# vi /etc/exports
/opt/test 192.168.56.88(rw,all_squash,anonuid=1001,anongid=1002,async)  # anonuid和anongid表示所有在Client端建立的檔案,最後的所屬使用者和組為1001、1002,而不是匿名使用者nfsnobody。

啟動nfs服務

# service nfs start

【Client端】

建立掛載目錄,並掛載遠端資料夾

# mkdir /u01  
# mount -t nfs 192.168.56.77:/opt/test /u01

檢視該目錄的使用情況

# df -h /u01
Filesystem               Size  Used Avail Use% Mounted on
192.168.56.77:/opt/test   25G   16G  8.1G  66% /u01

建立檔案,可以看到檔案的所屬使用者和所屬組分別為1001、1002,這個其實就是對應的server端/etc/exports設定

# touch abc
# ll
-rw-r--r--. 1 1001 1002 0 Dec 22 05:41 abc

如果想讓系統自動掛載,可以設定crontab開機掛載,但不建議加到/etc/fstab中,因為如果server端的nfs有問題,client端的伺服器重啟將會啟動很長時間。

配置檔案/etc/exports注意事項

  1. 192.168.56.88(rw...)表示只共享給192.168.56.88這個ip,還可以寫成192.168.56.*表示共享給這個網段,寫成*(rw...)表示共享給所有網段。
  2. 如果配置檔案/etc/exports中沒有anonuid和anongid,新建的檔案,使用者和組將會變成nfsnobody,具體all_squash這個引數的解釋,請看文章的後面的內容。

三、問題彙總

問題1:server端nfs服務關閉,導致client端無法訪問共享目錄

【Server端】

關閉nfs服務

# service nfs stop

【Client端】

執行ls /卡死,df也卡死,即所有涉及到/u01的操作都會卡死。執行以下命令檢視所有nfs掛載

# mount -l |grep nfs
192.168.56.77:/opt/test on /u01 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.56.88,local_lock=none,addr=192.168.56.77)

同時檢視作業系統後臺日誌/var/log/message,可以定位到是192.168.56.77這臺伺服器的nfs出了故障。重新啟動server端的nfs服務,client端等待一段時間就可正常操作了。

Dec 30 05:01:42 localhost kernel: nfs: server 192.168.56.77 not responding, still trying

如果因為nfs服務的問題導致執行命令一直卡死,這不太友好。因為nfs在掛載的時候,預設採用的硬掛載的方式,如果採用軟掛載的方式,執行命令超時前端會有報錯提示,而不是一直堵塞。

測試:

重新啟動server端的nfs服務service nfs start

client重新掛載mount -t nfs -o soft,timeo=10,retry=2 192.168.56.77:/opt/test /u01

關閉Server端的nfs服務service nfs stop

client端執行命令不會一直堵塞,而是會報錯誤。

# df -h
df: ‘/u01’: Input/output error
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/vg-lvroot   25G  1.2G   23G   6% /
devtmpfs               910M     0  910M   0% /dev
tmpfs                  920M     0  920M   0% /dev/shm
tmpfs                  920M  8.4M  912M   1% /run
tmpfs                  920M     0  920M   0% /sys/fs/cgroup
/dev/sda1              988M  110M  812M  12% /boot
tmpfs                  184M     0  184M   0% /run/user/0

問題2:許可權問題

在配置檔案/etc/exports中

all_squash:將遠端訪問的所有普通使用者及所屬組都對映為匿名使用者或使用者組(nfsnobody),除非在配置中有指定uid和gid

no_all_squash:不將遠端訪問的所有普通使用者及所屬組都對映為匿名使用者或使用者組,即使用檔案建立者本身的uid和gid號(預設設定)

root_squash:將root使用者及所屬組對映為匿名使用者或使用者組(預設設定)

no_root_squash:不將root使用者及所屬組對映為匿名使用者或使用者組

這裡面不同的引數設定,都會對檔案的許可權產生影響,你有時會發現即使是root使用者也沒有許可權去刪除檔案的時候,就可以看看這些引數,是否是將root許可權對映成了匿名使用者。基於篇幅,這裡就不做演示了。

[[email protected] /u01]# rm -rf yangdir/yangsub 
rm: cannot remove ‘yangdir/yangsub’: Permission denied

問題3:nfs埠問題

上面我們搭建nfs的時候,直接關閉了server端的防火牆,但是如果防火牆開啟,是否還能正常掛載呢,如果不行,那又需要開通什麼埠呢?

server端開啟防火牆

# systemctl start firewalld

client端掛載,命令會一直卡死。

# mount -t nfs 192.168.56.77:/opt/test /u01

server端開通埠2049

開埠命令:firewall-cmd --zone=public --add-port=2049/tcp --permanent

重啟防火牆:systemctl restart firewalld

檢視開通埠:firewall-cmd --list-ports

PS:看到有的文章中寫還需要開通111埠,但是實際測試下來,只開通2049埠就可以正常掛載了。

四、總結

  1. nfs掛載可以採用軟掛載的方式
  2. nfs檔案許可權可以通過/etc/exports設定
  3. nfs埠為2049