20171016 網絡文件共享(二) NFS服務

  • NFS服務介紹
  • NFS配置文件
  • NFS工具
  • 自動掛載
  • 實驗:實現基于NFS共享的LAMP wordpress的應用

一、NFS服務介紹

(一)NFS簡介

  • NFS(Network File System):網絡文件系統,用戶和程序可以像訪問本地文件一樣訪問遠端系統上的文件

  • NFS基于RPC(Remote Procedure Call)遠程過程調用實現,RPC基于C/S架構實現

  • NFS優勢:節省本地存儲空間

  • NFS發展:目前為v4版本,實現了偽根,增強了安全特性(kerberos)

(二)NFS服務

  • 軟件包:nfs-utils,默認系統安裝

  • Kernel支持:nfs.ko

  • 服務開啟、關閉

    • CentOS 7:systemctl start|stop nfs-server
    • CentOS 6: service nfs start|stop
  • 端口:2049(nfsd),其它端口由portmap/rpcbind(111)分配

    • 使用ss -ntlp命令查看端口,端口111的進程為rpcbind
    • 使用rpcinfo -p查看rpc注冊程序,端口111的進程為portmapper
    • CentOS6開始portmap進程由rpcbind代替
  • 配置文件:/etc/exports, /etc/exports.d/*.exports

  • 相關軟件包:rpcbind(必須),tcp_wrappers

  • NFS服務主要進程

    • rpc.nfsd:最主要的NFS進程,管理客戶端是否可登錄
    • rpc.mountd:掛載和卸載NFS文件系統,包括權限管理
    • rpc.lockd:非必要,管理文件鎖,避免同時寫出錯
    • rpc.statd:非必要,檢查文件一致性,可修復文件
  • 日志:/var/lib/nfs/

二、NFS配置文件

(一)配置文件格式

  • 格式:/dir 主機1(opt1,opt2) 主機2(opt1,opt2)...

  • /dir: 共享目錄路徑

  • 主機格式

    • 單個主機:ipv4, ipv6, FQDN
    • IP networks:兩種掩碼格式均支持
      172.18.0.0/255.255.0.0
      172.18.0.0/16
    • wildcards:主機名通配,例如*.magedu.com,不能應用于IP地址
    • anonymous:表示使用*通配所有客戶端
  • 每個條目指定目錄導出到的哪些主機,及相關的權限和選項

    • 默認選項:(ro,sync,root_squash,no_all_squash)
    • ro,rw:只讀和讀寫
    • async:異步,數據變化后不立即寫磁盤,性能高
    • sync:同步,數據在請求時立即寫入共享,安全性高
    • no_all_squash:保留遠程用戶建立共享文件的UID和GID
    • all_squash:所有遠程用戶(包括root)都映射成nfsnobody
    • root_squash:遠程root映射為nfsnobody,UID為65534
    • no_root_squash:遠程root映射成root用戶,優先級低于all_squash
    • anonuid和anongid:指明匿名用戶映射為特定用戶UID和組GID,而非nfsnobody,可配合all_squash使用

(二)實驗1:建立NFS共享目錄/app/nfsfile1, /app/nfsfile2

  • 實驗要求
    /app/nfsfile1目錄:192.168.136.0網段的主機可以登錄,支持讀寫,所有用戶都映射為testuser
    /app/nfsfile2 目錄:只有192.168.136.129主機可以登錄,支持讀寫,遠程root映射為root用戶

  • 實驗步驟:

// 建立testuser用戶
useradd testuser
id testuser
uid=1002(testuser) gid=1002(testuser) groups=1002(testuser)

// 編輯NFS服務配置文件
vim /etc/exports.d/nfsfile1.exports
/app/nfsfile1 192.168.136.0/24(rw,all_squash,anonuid=1002,anongid=1002)

vim /etc/exports.d/nfsfile2.exports
/app/nfsfile2 192.168.136.129(rw,no_root_squash)

// 建立相關共享文件目錄
mkdir /app/nfsfile1
mkdir /app/nfsfile2
touch /app/nfsfile1/file1
touch /app/nfsfile2/file2
setfacl -R -m u:testuser:rwx /app/nfsfile1

// 重新載入配置
exportfs -r
exportfs -v
  • 實驗測試:

    • 掛載共享目錄/app/nfsfile1,可以看到root和普通用戶都映射為testuser用戶(uid=1002, gid=1002)
    • 掛載共享目錄/app/nfsfile2,可以看到非192.168.136.129的主機不能成功掛載;掛載成功后,root用戶沒有被映射為nobody,而普通用戶由于之前在NFS服務器上未設置寫權限,無權建立文件,說明NFS服務支持讀寫需要NFS服務和服務器文件系統兩方面同時授權才可以

(三)實驗2:實現NFS偽根

  • NFS客戶端通常需要分別掛載NFS服務器上的共享目錄

  • 在NFS服務器建立偽根目錄,將需要共享的目錄全部掛載到偽根目錄上,即可實現NFS客戶端一次性將不同目錄掛載到一個掛載點上

  • 實驗:通過NFS偽根一次性掛載共享目錄/app/ftpsite和/var/log

// 建立偽根目錄
mkdir /exports
mkdir /exports/ftpsite
mkdir /exports/log

// 將共享目錄掛載到偽根目錄的子目錄
mount -B /app/ftpsite /exports/ftpsite/
mount -B /var/log /exports/log/
setfacl -m u:nfsnobody:rwx /app/ftpsite     // 給遠程主機root用戶開放寫權限

// 編輯配置文件
vim /etc/exports
/exports *(fsid=0,rw,crossmnt)
/exports/ftpsite *(rw)
/exports/log    *(ro)

// 配置文件生效
exportfs -r

可以看到,/exports目錄充當了偽根,實現多個目錄一次掛載,并且每個目錄的配置都生效了:ftpsite目錄可以寫入,log目錄不可以寫入文件

三、NFS工具

  • rpcinfo

    • rpcinfo -p hostname:詳細列明RPC注冊程序
    • rpcinfo -s hostname:簡略列明RPC注冊程序
  • exportfs

    • -v:查看本機所有NFS共享
    • -r:重讀配置文件并共享目錄
    • -a:輸出本機所有共享
    • -au:停止本機所有共享
  • showmount -e hostname:顯示遠程主機NFS共享目錄

四、自動掛載

(一)autofs服務簡介

  • autofs服務:按需要掛載,在空閑時自動卸載
  • 由autofs包提供
  • 自動掛載的配置文件:/etc/auto.master
  • 文件系統在失活的指定間隔5分鐘后會自動卸載

(二)autofs配置

(1)相對路徑描述
  • 格式:
    /etc/auto.master文件格式:掛載點的目錄名 /etc/auto.direct
    /etc/auto.direct文件格式:掛載點的基名 被掛載目錄或設備
    注釋:/etc/auto.direct文件僅為示例,文件名稱沒有要求

  • 相對路徑時支持含通配符的目錄名:* server:/export/&

(2)絕對路徑描述
  • 格式:
    /etc/auto.master文件格式:/- /etc/auto.direct
    /etc/auto.direct文件格式:掛載點路徑 被掛載目錄或設備
(3)實驗:利用autofs實現遠程家目錄的自動掛載
  • 本實驗由2臺主機完成:
    主機1:NFS服務器
    主機2:NFS客戶端,安裝autofs服務,CentOS 7系統
    主機3:NFS客戶端,安裝autofs服務,CentOS 6系統

  • 步驟1:NFS服務器上設置共享家目錄

mkdir -p /app/homedir/{wang,mage}
cp -r /etc/skel/.[^.]* /app/homedir/wang/
cp -r /etc/skel/.[^.]* /app/homedir/mage/
  • 步驟2:查詢NFS客戶端上用戶wang和mage的uid和gid
// 主機2上的用戶ID情況
id wang
uid=1001(wang) gid=1001(wang) groups=1001(wang)
id mage
uid=1002(mage) gid=1002(mage) groups=1002(mage)
// 主機3上的用戶ID情況
id wang
uid=502(wang) gid=502(wang) groups=502(wang)
id mage
uid=503(mage) gid=503(mage) groups=503(mage)
  • 步驟3:NFS服務器上根據不同系統的用戶ID情況,分別給共享家目錄添加權限
useradd -u 1001 wang
useradd -u 1002 mage
useradd -u 502 wang6
useradd -u 503 mage6
setfacl -R -m u:wang:rwx /app/homedir/wang/
setfacl -R -m u:wang6:rwx /app/homedir/wang/
setfacl -R -m u:mage:rwx /app/homedir/mage/
setfacl -R -m u:mage6:rwx /app/homedir/mage/
  • 步驟4:NFS服務器上編輯NFS配置文件并更新讀入配置
vim /etc/exports.d/wang.exports
/app/homedir/wang *(rw)
vim /etc/exports.d/mage.exports
/app/homedir/mage *(rw)

exportfs -r
  • 步驟5:NFS客戶端上配置autofs服務
// 兩臺主機均執行以下操作
vim /etc/auto.master
/home   /etc/auto.direct             // 添加一行
vim /etc/auto.direct
* 192.168.136.230:/app/homedir/&     // 添加一行
// 按照系統執行
systemctl restart autofs             // CentOS 7
service autofs restart               // CentOS 6
  • 測試:

    • 在主機2(CentOS 7)上進入/home/wang目錄,切換至wang賬號,建立wangfile文件
    • 在主機3(CentOS 6)上進入/home/wang目錄,可以看到wangfile文件,但由于本機沒有uid=1001的賬號,故UID直接顯示數字
    • 在主機3(CentOS 6)上進入/home/mage目錄,切換至mage賬號,建立magefile文件
    • 在主機2(CentOS 7)上進入/home/mage目錄,可以看到magefile文件,但由于本機沒有uid=503的賬號,故UID直接顯示數字
    • 使用NFS建立遠程家目錄,如果可能,最好統一不同系統下相同用戶的uid,便于后期管理

五、實驗:實現基于NFS共享的LAMP wordpress的應用

(一)實驗環境:本實驗需要4臺主機

  • 主機1:httpd服務器1,IP: 192.168.136.230
  • 主機2:httpd服務器2,兼做mysql數據庫,IP: 192.168.136.130
  • 主機3:NFS服務器,存儲httpd服務器網頁數據,包含WordPress應用,IP: 192.168.136.229
  • 主機4:DNS服務器,IP: 192.168.136.129

(二)步驟1:在主機3上配置nfs服務

mkdir -p /app/www/html
setfacl -R -m u:apache:rwx /app/www/html
service nfs start
vim /etc/exports
/app/www/html 192.168.136.0/24(rw,all_squash,anonuid=48,anongid=48)
exportfs -r
exportfs -v

(三)步驟2:在主機1, 2上配置httpd服務,安裝php-fpm

// 以下步驟在主機1, 2上操作相同
yum install httpd php-fpm
vim /etc/fstab

vim /etc/httpd/conf.d/fcgi.conf
DirectoryIndex index.php
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1向代理
systemctl start php-fpm.service 
systemctl start httpd

(三)步驟3:在主機2上安裝mysql服務

yum install mariadb-server
systemctl start mariadb
mysql_secure_installation

(四)步驟4:在主機3的httpd共享目錄上測試與php與mysql的連接

vim /var/www/html/index.php
<?php
$mysqli=new mysqli("192.168.136.130","root","centos");
if(mysqli_connect_errno()){
  echo "連接數據庫失敗!";
  $mysqli=null;
  exit;
}
echo "連接數據庫成功!";
$mysqli->close();
phpinfo();
?>

(五)步驟5:在主機3的httpd共享目錄上安裝WordPress

tar -xvf wordpress-4.8.1-zh_CN.tar.gz -C /var/www/html/

(六)步驟6:在主機4上實現DNS服務

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容