- 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
- CentOS 7:
-
端口: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/