1. 程式人生 > >網絡文件共享服務-NFS

網絡文件共享服務-NFS

ext total -s setfacl 同步 bind def 表示 form

NFS服務
NFS:
    Network File System 網絡文件系統,基於內核的文件系統。
    Sun公司開發,通過使用NFS,用戶和程序可以像訪問本地文件一
    樣訪問遠端系統上的文件,基於RPC(Remote Procedure Call
    Protocol遠程過程調用)實現

RPC:
    采用C/S模式。客戶機請求程序調用進程發送一個有進程參數
    的調用信息到服務進程,然後等待應答信息。在服務器端,進程保
    持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器
    獲得進程參數,計算結果,發送答復信息,然後等待下一個調用信
    息,最後,客戶端調用進程接收答復信息,獲得進程結果,然後調
    用執行繼續進行

NFS優勢:
    節省本地存儲空間,將常用的數據,如home目錄,存放在
    NFS服務器上且可以通過網絡訪問,本地終端將可減少自身存儲空
    間的使用

NFS文件系統

技術分享圖片

NFS各個版本的對比

技術分享圖片

NFS服務介紹

? 軟件包:nfs-utils
? Kernel支持:nfs.ko
? 端口:2049(nfsd), 其它端口由portmap(111)分配
? 配置文件:/etc/exports,/etc/exports.d/*.exports
? CentOS7不支持同一目錄同時用nfs和samba共享,因為使用鎖機制不同
? 相關軟件包:rpcbind(必須),tcp_wrappers
? CentOS6開始portmap進程由rpcbind代替
? NFS服務主要進程:
    rpc.nfsd 最主要的NFS進程,管理客戶端是否可登錄
    rpc.mountd 掛載和卸載NFS文件系統,包括權限管理
    rpc.lockd 非必要,管理文件鎖,避免同時寫出錯
    rpc.statd 非必要,檢查文件一致性,可修復文件
? 日誌:/var/lib/nfs/

配置防火墻

?配置防火墻,開放NFS服務(centos 6上需要操作,centos7不需要)
?配置NFS使用固定端口
?vim /etc/sysconfig/nfs
    RQUOTAD_PORT=875
    LOCKD_TCPPORT=32803
    LOCKD_UDPPORT=32769
    MOUNTD_PORT=892
    STATD_PORT=662
    STATD_OUTGOING_PORT=2020
?防火墻除開放上述端口,還需開放TCP和UDP的111和2049共4個端口

NFS配置文件

1、導出的文件系統的格式:
    /dir 主機1(opt1,opt2) 主機2(opt1,opt2)...
2、#開始為註釋
3、主機格式:
    單個主機:ipv4,ipv6,FQDN
    IP networks:兩種掩碼格式均支持
        172.18.0.0/255.255.0.0
        172.18.0.0/16
    wildcards:主機名通配,例如*.magedu.com,IP不可以
    netgroups:NIS域的主機組,@group_name
    anonymous:表示使用*通配所有客戶端

4、每個條目指定目錄導出到的哪些主機,及相關的權限和選項
    默認選項:(ro,sync,root_squash,no_all_squash)
    ro,rw 只讀和讀寫
    async 異步,數據變化後不立即寫磁盤,性能高
    sync(1.0.0後為默認)同步,數據在請求時立即寫入共享
    no_all_squash (默認)保留共享文件的UID和GID
    all_squash 所有遠程用戶(包括root)都變成nfsnobody
    root_squash (默認)遠程root映射為nfsnobody,UID為65534,早期版本是
    4294967294 (nfsnobody)
    no_root_squash 遠程root映射成root用戶
    anonuid和anongid 指明匿名用戶映射為特定用戶UID和組GID,而非
    nfsnobody,可配合all_squash使用

NFS工具

rpcinfo
    rpcinfo -p hostname
    rpcinfo –s hostname 查看RPC註冊程序
exportfs
    –v 查看本機所有NFS共享
    –r 重讀配置文件,並共享目錄
    –a 輸出本機所有共享
    –au 停止本機所有共享
showmount -e hostname

mount.nfs 掛載工具

NFSv4支持通過掛載NFS服務器的共享“根”,從而瀏覽NFS服務器上的共享目錄列表
    mount nfsserver:/ /mnt/nfs

客戶端NFS掛載

基於安全考慮,建議使用nosuid,nodev,noexec掛載選項
NFS相關的掛載選項:
    fg(默認)前臺掛載,bg後臺掛載
    hard(默認)持續請求,soft 非持續請求
    intr 和hard配合,請求可中斷
    rsize和wsize 一次讀和寫數據最大字節數,rsize=32768
    _netdev 無網絡不掛載
示例:
mount -o rw,nosuid,fg,hard,intr 192.168.137.56:/testdir /mnt/nfs/
開機掛載:
    /etc/fstab
    192.168.137.56:/public /mnt/nfs nfs defaults 0 0

nfs簡單示例

安裝nfs服務
    [root@node6 ~]#yum -y install nfs-utils
創建共享目錄
    [root@node6 ~]#mkdir /data/volume{1..6}
創建共享的配置文件
    [root@node6 ~]#vim /etc/exports.d/volume1.exports
    /data/volume1 192.168.137.0/24 (ro)
啟動服務
    [root@node6 ~]#systemctl start nfs

客戶端測試,不過客戶端也需要安裝相對應的工具
    [root@node7 ~]#yum -y install nfs-utils

在客戶端上查看服務器端有哪些掛載
    [root@node7 ~]#showmount -e 192.168.137.56
    Export list for 192.168.137.56:
    /data/volume1 (everyone)
把服務器共享的目錄掛載到本地
    [root@node7 ~]#mount -t nfs 192.168.137.56:/data/volume1 /mnt

在服務器上增加/data/volume1的acl權限給ilinux,然後切換到ilinux,在/data/volume1上創建測試文件
    [root@node6 ~]#setfacl -m u:ilinux:rwx /data/volume1
    [root@node6 ~]#su - ilinux 
    [ilinux@node6 ~]$cd /data/volume1/
    [ilinux@node6 /data/volume1]$ls
    [ilinux@node6 /data/volume1]$touch a.txt
    [ilinux@node6 /data/volume1]$ll
    total 0
    -rw-rw-r-- 1 ilinux ilinux 0 Oct 23 13:47 a.txt
客戶端上查看剛在服務器上創建的文件、並測試是否有寫權限
    [root@node7 /mnt]#ll 
    total 0
    -rw-rw-r-- 1 1001 1001 0 Oct 23 13:47 a.txt
    [root@node7 /mnt]#touch 1
    touch: cannot touch ‘1’: Read-only file system

修改服務器共享目錄的權限,並更新
    [root@node6 ~]#vim /etc/exports.d/volume1.exports 
    /data/volume1 192.168.137.0/24(rw)  
    # exportfs -rav相當於systemctl reload nfs
    [root@node6 ~exportfs -ravs                       
    exporting 192.168.137.0/24:/data/volume1

客戶端測試寫權限,創建一個同服務器上的用戶ID一樣的本地用戶
[root@node7 /mnt]#useradd -u 1001  user1       
[root@node7 /mnt]#id user1
uid=1001(user1) gid=1001(user1) groups=1001(user1)
[root@node7 /mnt]#su - user1
[user1@node7 ~]$cd /mnt/
[user1@node7 /mnt]$ls
a.txt
[user1@node7 /mnt]$echo "first line" > a.txt 
#在本地看所屬主和屬組是user1其實正真的user是服務器端的ilinux用戶只不過他倆的ID號一樣而已
到了v4版之後能識別字符串同名,不過依然解決不了ID號一樣
[user1@node7 /mnt]$ll 
total 4
-rw-rw-r-- 1 user1 user1  0 Oct 23 14:19 2
-rw-rw-r-- 1 user1 user1 11 Oct 23 14:21 a.txt

允許客戶端root用戶來操作所有權限
[root@node6 ~]#vim /etc/exports.d/volume1.exports 
/data/volume1 192.168.137.0/24(rw,no_root_squash)

重新加載配置
    [root@node6 ~]#exportfs -ravs  
在客戶端測試
    [root@node7 /mnt]#touch 1
    [root@node7 /mnt]#rm -rf 1
    [root@node7 /mnt]#touch a.root
    [root@node7 /mnt]#

在客戶端上使用服務器上共享目錄充當數據庫的數據存儲路徑
    [root@node7 /mnt]#yum -y install mariadb-server
修改數據庫的配置文件把數據存放路徑改了
[root@node7 /mnt]#vim /etc/my.cnf
[mysqld]
datadir=/mnt/mysql
socket=/tmp/mysql.sock
skip_name_resolve=on

然後創建目錄,並把屬主和屬組改成mysql
[root@node7 /mnt]#mkdir /mnt/mysql
[root@node7 /mnt]#chown mysql.mysql /mnt/mysql/

然後啟動數據庫服務,查看mnt/mysql目錄
[root@node7 /mnt]#systemctl start mariadb
[root@node7 /mnt]#ls mysql/
aria_log.00000001  ibdata1      ib_logfile1  performance_schema
aria_log_control   ib_logfile0  mysql        test

把匿名用戶映射成指定用戶示例:
[root@node6 /data/volume1]#vim /etc/exports.d/volume1.exports 
/data/volume1 192.168.137.0/24(rw,all_squash,anonuid=1001,anongid=1001)
重新導出配置文件
[root@node6 /data/volume1]#exportfs -ra

客戶端新建用戶,然後用新建的用戶來創建文件驗證服務器上設置的權限
    [root@node7 /mnt]#useradd user2
    [root@node7 /mnt]#su - user2
    [user2@node7 ~]$cd /mnt/
    [user2@node7 /mnt]$touch  user2.txt
    [user2@node7 /mnt]$
    [user2@node7 /mnt]$ll
    total 4
    -rw-rw-r-- 1 user1 user1   0 Oct 23 14:19 2
    -rw-r--r-- 1 root  root    0 Oct 23 14:42 a.root
    -rw-rw-r-- 1 user1 user1  11 Oct 23 14:21 a.txt
    drwxr-xr-x 5 mysql mysql 159 Oct 23 14:46 mysql
    -rw-r--r-- 1 user1 user1   0 Oct 23 14:53 root.b
    -rw-rw-r-- 1 user1 user1   0 Oct 23 14:55 user2.txt

網絡文件共享服務-NFS