共享存儲nfs介紹

一、實驗環境說明

NFS 服務端:
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# ip addr show|sed -rn '/inet[[:space:]]+127/! s/^[[:space:]]+inet[[:space:]]+(.*)\/[[:digit:]]+[[:space:]]+.*$/\1/p'
172.16.0.118

NFS客戶端:
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# ip addr show|sed -rn '/inet[[:space:]]+127/! s/^[[:space:]]+inet[[:space:]]+(.*)\/[[:digit:]]+[[:space:]]+.*$/\1/p'
172.16.0.120

NFS 客戶端和服務端SElinux都是關閉的。firewalld防火牆有開啓。

二、nfs概述和引入

https://baike.baidu.com/item/NFS/812203?fr=aladdin

NFS(Network File System) 是網絡文件系統,是FreeBSD支持的文件系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件一樣。

早期NFS是SUN公司設計的一種用於在各類unix主機之間共享文件系統的協議。它本身也屬於一種文件系統,我們之前接觸的大部分文件系統都在內核中實現,NFS也是在內核中實現。如果各類unix系統在其內核附帶了NFS協議的支持的功能的話,結合用戶空間某些特定的服務,NFS就可以工作起來了。NFS本身是在內核中,要依賴用戶空間中的程序。所以,對於在內核中實現了NFS協議功能的系統才能夠使用NFS,比如windows系統就不行。其實linux系統上是後來有對早期SUN公司的NFS協議的重新實現,而且兼容原生SUN公司研發的NFS協議。所以可以不加區分的說現在linux系統上的是SUN公司研發的那個NFS協議。現在NFS有4個版本,第一個版本是NFSv1,這個版本沒有走出過實驗室。第二個版本是NFSv2,早期設計考慮爲了性能,只支持udp協議,所以這個v2版本只支持udp協議,而且不支持kerberos進行集中的身份認證,所以相對來說不可靠而且不安全。第三個版本是NFSv3,它加入了對tcp協議的支持,而且部分功能實現了對kerberos的支持。第四個版本是NFSv4,這個版本纔算得上是真正意義上的各功能模塊完成了對kerberos的功能的支持,我們現在用的一般都是NFSv4版本。如圖所示,可以實際理解從NFS是衆多文件系統中的一種,可以通過VFS接口進行調用和轉化。
在這裏插入圖片描述

既然nfs是一種文件系統,而且是在內核中實現的功能,那麼它如何監聽用戶請求呢,因爲一般是用戶空間的進程向內核發起系統調用,申請註冊使用某個端口,通過主機和端口可以標識一個套接字,所以說套接字是用戶空間進程註冊監聽使用的。

nfs的工作嚴重依賴於RPC機制來進行數據傳輸。可以說RPC也屬於一種協議。PRC叫做遠程過程調用(Remote Procedure Call),也是SUN公司開發和提出的,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通信程序之間攜帶信息數據。在OSI網絡模型中,RPC跨越傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。RPC採用C/S模式。請求程序就是一個客戶端,而服務提供程序就是一個服務端。首先客戶端調用進程發送一個有進程參數的調用信息到服務進程,然後等待應答信息。在服務端,進程保證睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務端獲得進程參數,計算結果,發送答覆信息,然後等待下一個調試信息,最後,客戶端調用進程接受答覆,重新獲得進程結果,然後調用執行繼續進行。RPC調用過程大概如下圖所示:
在這裏插入圖片描述

其實可以把RPC的功能和pam,nsswitch以及xinetd進行類比,其實它無非也是個公共框架。配合nfs工作流程大概是:
在服務端,rpc監聽在某個套接字上,以接受客戶端請求,請求達到後(比如圖中的RPC call),rpc會去把請求的服務啓動,然後把請求轉交給那個服務(就是圖中的invoke service),由那個服務去調用客戶端請求的過程(就是圖中的call dispathch routine等步驟)。
然後,我們結合實際文件系統掛載目錄然後來梳理一下這個過程。如下圖所示:
在這裏插入圖片描述

在NFS server端,比如把本地磁盤的某個分區掛載到本地文件系統的某個目錄下,比如把/dev/sda1掛載到/shared,然後在用戶空間的應用程序向rpc server註冊,讓其代爲監聽到某個套接字上,此時這個rpc服務器對外的接口就表現爲NFS協議的NFS服務器。待rpc服務器收到數據後,還是會通過本地的系統調用去存儲數據(還是會通過本地內核所管理的文件系統去操作底層的數據存儲等)。
在NFS client端,對於NFS文件系統,最終都是要掛載使用的,而我們的NFS客戶端的內核中是有NFS模塊的,因此NFS客戶端本地的mount程序可以通過本地內核中NFS模塊向遠端NFS服務端發起連接請求,而後mount程序就將NFS共享的文件系統目錄掛載到本地上的某個目錄下了。比如掛載到/nfs目錄下。在NFS client上用戶空間的某個用戶進程,就可以對本地文件系統的目錄/nfs進行訪問,用戶權限允許的話,用戶進程就可以向這個目錄實現文件的增刪改查。但是寫入的文件不會在本地文件系統保留,即不是寫入本地的ext系列或XFS文件系統,而是通過VFS文件系統接口使用內核中NFS文件系統模塊向NFS服務器的rpc server發起遠程過程調用,然後rpc會把請求轉交給特定應用程序,後邊nfs server端的處理步驟上邊就有講解了。

三、nfs服務端和客戶端安裝以及說明

服務端和客戶端都要安裝上軟件包nfs-utils。

  • nfs-utils軟件包
Installed Packages
Name        : nfs-utils
Arch        : x86_64
Epoch       : 1
Version     : 1.3.0
Release     : 0.61.el7
Size        : 1.0 M
Repo        : installed
From repo   : base
Summary     : NFS utilities and supporting clients and daemons for the kernel NFS server
URL         : http://sourceforge.net/projects/nfs
License     : MIT and GPLv2 and GPLv2+ and BSD
Description : The nfs-utils package provides a daemon for the kernel NFS server and
            : related tools, which provides a much higher level of performance than the
            : traditional Linux NFS server used by most users.
            : 
            : This package also contains the showmount program.  Showmount queries the
            : mount daemon on a remote host for information about the NFS (Network File
            : System) server on the remote host.  For example, showmount can display the
            : clients which are mounted on that host.
            : 
            : This package also contains the mount.nfs and umount.nfs program.
說明:nfs-utils爲內核中的NFS 服務端提供守護進程,以及支持NFS客戶端的功能。還提供了一些相關的工具(
這些工具提供的NFS 服務器比大部分用戶使用的傳統linux的NFS服務器性能更高)。
工具包也包含showmount程序。showmount可以查詢遠程主機上的NFS服務端的掛載進程信息。可以在NFS客戶端主機上顯示遠程主機上NFS服務端的掛載(導出)的文件系統信息。

  • nfs-utils主要安裝文件:
[root@localhost ~]# rpm -ql nfs-utils
/etc/exports.d #掛載配置文件目錄,還有一個主配置/etc/exports,這個配置是由setup程序提供的
/etc/gssproxy/24-nfs-server.conf
/etc/modprobe.d/lockd.conf
/etc/nfs.conf	#nfs守護進程和工具的通用配置的配置文件
/etc/nfsmount.conf #nfs掛載的配置文件。三部分組成:Mount,Server以及Global
/etc/request-key.d/id_resolver.conf 
/etc/sysconfig/nfs  #nfs-config.service服務的配置文件
/sbin/mount.nfs #nfs的掛載程序
/sbin/mount.nfs4 #nfs的掛載程序,linux內核版本2.6.32之後,mount.nfs4與mount.nfs沒有區別,都可以掛載所
#有NFS版本,不過在linux內核版本2.6.32之前,mount.nfs4必須掛載到NFS的第四版本的文件通,mount.nfs可
#以掛載NFS第二版和第三版的文件系統。
/sbin/osd_login 
/sbin/rpc.statd # 維持nfs狀態相關的一個程序
/sbin/umount.nfs #卸載nfs文件系統的程序
/sbin/umount.nfs4 #卸載nfs文件系統的程序
/usr/lib/systemd/scripts/nfs-utils_env.sh #一個bash腳本,可以爲nfs-config.service提供環境變量相關的
/usr/lib/systemd/system-generators/nfs-server-generator
/usr/lib/systemd/system-generators/rpc-pipefs-generator
/usr/lib/systemd/system/auth-rpcgss-module.service
/usr/lib/systemd/system/nfs-blkmap.service
/usr/lib/systemd/system/nfs-client.target
/usr/lib/systemd/system/nfs-config.service
/usr/lib/systemd/system/nfs-idmap.service
/usr/lib/systemd/system/nfs-idmapd.service
/usr/lib/systemd/system/nfs-lock.service
/usr/lib/systemd/system/nfs-mountd.service
/usr/lib/systemd/system/nfs-secure.service
/usr/lib/systemd/system/nfs-server.service
/usr/lib/systemd/system/nfs-utils.service
/usr/lib/systemd/system/nfs.service
/usr/lib/systemd/system/nfslock.service
/usr/lib/systemd/system/proc-fs-nfsd.mount
/usr/lib/systemd/system/rpc-gssd.service
/usr/lib/systemd/system/rpc-statd-notify.service
/usr/lib/systemd/system/rpc-statd.service
/usr/lib/systemd/system/rpc_pipefs.target
/usr/lib/systemd/system/rpcgssd.service
/usr/lib/systemd/system/rpcidmapd.service
/usr/lib/systemd/system/var-lib-nfs-rpc_pipefs.mount
/usr/sbin/blkmapd #與
/usr/sbin/exportfs #維護導出的NFS文件系統表的程序
/usr/sbin/mountstats #分別顯示每個客戶端掛載的信息的程序
/usr/sbin/nfsdcltrack NFSv4客戶端的一個追蹤標記程序
/usr/sbin/nfsidmap #用於上層調用的一個id和用戶名中間相互映射的程序
/usr/sbin/nfsiostat #使用/etc/self/mountstats文件來評估NFS掛載點的iostat信息(CPU的統計信息,以及輸入輸出設別的統計信息等)
/usr/sbin/nfsstat #列出NFS的統計信息的程序
/usr/sbin/rpc.gssd #PRCSEC_GSS守護進程
/usr/sbin/rpc.idmapd #idmapd守護進程
/usr/sbin/rpc.mountd #NFS掛載的守護進程
/usr/sbin/rpc.nfsd #NFS服務端的程序
/usr/sbin/rpcdebug
/usr/sbin/showmount #NFS服務端顯示NFS掛載的信息的程序
/usr/sbin/sm-notify #發送重啓通知的程序
/usr/sbin/start-statd
#中間省略安裝文檔文件(說明文檔和man手冊等)
/var/lib/nfs 
/var/lib/nfs/etab
/var/lib/nfs/rmtab
/var/lib/nfs/rpc_pipefs
/var/lib/nfs/statd
/var/lib/nfs/statd/sm
/var/lib/nfs/statd/sm.bak
/var/lib/nfs/state
/var/lib/nfs/v4recovery
/var/lib/nfs/xtab
  • 安裝軟件包截圖
    在這裏插入圖片描述

四、nfs配置

(1) 服務端啓動服務服務

大概有這些服務或者其他的unit:
[root@localhost ~]# cat txt
auth-rpcgss-module.service
nfs-blkmap.service
nfs-client.target
nfs-config.service
nfs-idmap.service
nfs-idmapd.service
nfs-lock.service
nfs-mountd.service
nfs-secure.service
nfs-server.service
nfs-utils.service
nfs.service
nfslock.service
proc-fs-nfsd.mount
rpc-gssd.service
rpc-statd-notify.service
rpc-statd.service
rpc_pipefs.target
rpcgssd.service
rpcidmapd.service
var-lib-nfs-rpc_pipefs.mount

初始狀態是:
[root@localhost ~]# while read name;do echo "$name:"&&systemctl status $name; done<txt
auth-rpcgss-module.service:
● auth-rpcgss-module.service - Kernel Module supporting RPCSEC_GSS
   Loaded: loaded (/usr/lib/systemd/system/auth-rpcgss-module.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-blkmap.service:
● nfs-blkmap.service - pNFS block layout mapping daemon
   Loaded: loaded (/usr/lib/systemd/system/nfs-blkmap.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
nfs-client.target:
● nfs-client.target - NFS client services
   Loaded: loaded (/usr/lib/systemd/system/nfs-client.target; enabled; vendor preset: disabled)
   Active: inactive (dead)
nfs-config.service:
● nfs-config.service - Preprocess NFS configuration
   Loaded: loaded (/usr/lib/systemd/system/nfs-config.service; static; vendor preset: disabled)
   Active: inactive (dead) since Thu 2018-12-20 13:35:42 CST; 7min ago
 Main PID: 12729 (code=exited, status=0/SUCCESS)

Dec 20 13:35:42 localhost.localdomain systemd[1]: Starting Preprocess NFS configuration...
Dec 20 13:35:42 localhost.localdomain systemd[1]: Started Preprocess NFS configuration.
nfs-idmap.service:
● nfs-idmapd.service - NFSv4 ID-name mapping service
   Loaded: loaded (/usr/lib/systemd/system/nfs-idmapd.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-idmapd.service:
● nfs-idmapd.service - NFSv4 ID-name mapping service
   Loaded: loaded (/usr/lib/systemd/system/nfs-idmapd.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-lock.service:
● rpc-statd.service - NFS status monitor for NFSv2/3 locking.
   Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-mountd.service:
● nfs-mountd.service - NFS Mount Daemon
   Loaded: loaded (/usr/lib/systemd/system/nfs-mountd.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-secure.service:
● rpc-gssd.service - RPC security service for NFS client and server
   Loaded: loaded (/usr/lib/systemd/system/rpc-gssd.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-server.service:
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
nfs-utils.service:
● nfs-utils.service - NFS server and client services
   Loaded: loaded (/usr/lib/systemd/system/nfs-utils.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs.service:
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
nfslock.service:
● rpc-statd.service - NFS status monitor for NFSv2/3 locking.
   Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
   Active: inactive (dead)
proc-fs-nfsd.mount:
● proc-fs-nfsd.mount - NFSD configuration filesystem
   Loaded: loaded (/usr/lib/systemd/system/proc-fs-nfsd.mount; static; vendor preset: disabled)
   Active: inactive (dead)
    Where: /proc/fs/nfsd
     What: nfsd
rpc-gssd.service:
● rpc-gssd.service - RPC security service for NFS client and server
   Loaded: loaded (/usr/lib/systemd/system/rpc-gssd.service; static; vendor preset: disabled)
   Active: inactive (dead)
rpc-statd-notify.service:
● rpc-statd-notify.service - Notify NFS peers of a restart
   Loaded: loaded (/usr/lib/systemd/system/rpc-statd-notify.service; static; vendor preset: disabled)
   Active: inactive (dead)
rpc-statd.service:
● rpc-statd.service - NFS status monitor for NFSv2/3 locking.
   Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
   Active: inactive (dead)
rpc_pipefs.target:
● rpc_pipefs.target
   Loaded: loaded (/usr/lib/systemd/system/rpc_pipefs.target; static; vendor preset: disabled)
   Active: inactive (dead)
rpcgssd.service:
● rpc-gssd.service - RPC security service for NFS client and server
   Loaded: loaded (/usr/lib/systemd/system/rpc-gssd.service; static; vendor preset: disabled)
   Active: inactive (dead)
rpcidmapd.service:
● nfs-idmapd.service - NFSv4 ID-name mapping service
   Loaded: loaded (/usr/lib/systemd/system/nfs-idmapd.service; static; vendor preset: disabled)
   Active: inactive (dead)
var-lib-nfs-rpc_pipefs.mount:
● var-lib-nfs-rpc_pipefs.mount - RPC Pipe File System
   Loaded: loaded (/usr/lib/systemd/system/var-lib-nfs-rpc_pipefs.mount; static; vendor preset: disabled)
   Active: inactive (dead)
    Where: /var/lib/nfs/rpc_pipefs
     What: sunrpc   

服務初始註冊狀態:(雖然portmapper已經命名稱rpcbind,這裏的service名字還是portmapper)
[root@localhost ~]# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
[root@localhost ~]# ss -tnl
State      Recv-Q Send-Q                                                                                      Local Address:Port                                                                                        Peer Address:Port 
LISTEN     0      128                                                                                                     *:111                                                                                                    *:*     
LISTEN     0      128                                                                                                     *:22                                                                                                     *:*     
LISTEN     0      100                                                                                             127.0.0.1:25                                                                                                     *:*     
LISTEN     0      128                                                                                                    :::111                                                                                                   :::*     
LISTEN     0      128                                                                                                    :::22                                                                                                    :::*     
LISTEN     0      100                                                                                                   ::1:25                                                                                                    :::*   

沒有開啓nfs之前,內核模塊並沒有nfs:
[root@localhost ~]# lsmod |grep nfs
[root@localhost ~]# 


服務端啓動nfs服:
[root@localhost ~]# systemctl start nfs.service
[root@localhost ~]# systemctl status nfs.service
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Thu 2018-12-20 13:45:24 CST; 4s ago
  Process: 9751 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 9749 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 9748 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 9813 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl restart gssproxy ; fi (code=exited, status=0/SUCCESS)
  Process: 9797 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 9795 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 9797 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Dec 20 13:45:24 localhost.localdomain systemd[1]: Starting NFS server and services...
Dec 20 13:45:24 localhost.localdomain systemd[1]: Started NFS server and services.

再看註冊的服務:
[root@localhost ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  54405  status
    100024    1   tcp  40615  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  52176  nlockmgr
    100021    3   udp  52176  nlockmgr
    100021    4   udp  52176  nlockmgr
    100021    1   tcp  51506  nlockmgr
    100021    3   tcp  51506  nlockmgr
    100021    4   tcp  51506  nlockmgr

啓動後內核中有了nfs模塊:
nfsd                  290215  13 
auth_rpcgss            59343  1 nfsd
nfs_acl                12837  1 nfsd
lockd                  93977  1 nfsd
sunrpc                295293  19 nfsd,auth_rpcgss,lockd,nfs_acl

(2) 配置NFS服務導出的文件系統

配置文件:/etc/exports或/etc/exports.d/*   (配置文件默認爲空)
如果要配置,可以參考 man exports,裏面有配置實例說明:
# sample /etc/exports file
/               master(rw) trusty(rw,no_root_squash)
/projects       proj*.local.domain(rw)
/usr            *.local.domain(ro) @trusted(rw)
/home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
/pub            *(ro,insecure,all_squash)
/srv/www        -sync,rw server @trusted @external(ro)
/foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
/build          buildhost[0-9].local.domain(rw)

總體表現形式可以總結爲,可以共享多個文件系統目錄,每行定義一個:
/PATH/TO/SOME_DIR 	clients1(export_options, ...)  clients2(export_options, ...)

(1) 第一個參數指定一個NFS server上文件系統的路徑,表示要共享的文件系統目錄。這個路徑如果是提供
給其他非單一客戶端掛載使用的,應該考慮到空間,性能等。最好是單獨的硬盤的單獨分區。比如共享的目錄爲
/shared;
(2) 第二個或第三等,可以允許設置多個訪問端口,針對不同來源的客戶端掛載時候有不同的權限等設置,我們
示例假設只設置一個client。注意clients與小括號間不能有空格,否則會有語法錯誤。
(3) client設置值
(a) 單個主機(single host):ipv4地址,ipv6地址,FQDN(域名);
例如:172.16.0.120 , fe80::20c:29ff:fe4d:d522,node2.yanhui.com
(b) 一個網絡地址(network):address/netmask,子網掩碼支持長格式和短格式;
例如:172.16.0.0/16,172.16.0.0/255.255.0.0
(c) 主機通配名(wildcards):例如*.yanhui.com;
NIS域內的主機組(netgroups):@group_name;
(d) 匿名的(anonymous):使用*通配所有主機;
說明:爲了安全,生產環境共享出去的NFS文件系統,應該精細的控制客戶端訪問的地址。a,b,c三種形式比較常見。

每個客戶端後邊使用小括號引用起來的(導出)選項之間以逗號隔開,不能有空格。
(4) 常用導出的通用選項
ro:只讀共享;
rw:讀寫共享;
sync:同步;(同步的話對io性能要求較高)
async:異步;
secure:客戶端端口小於1024,否則就要使用insecure選項。
等等,還有很多

(5) 常用導出的用戶ID映射選項
root_squash:壓縮root用戶,一般指將其映射爲nfsnobody;
no_root_squash:不壓縮root用戶;
all_squash:壓縮所有用戶;
anonuid and anongid:將壓縮的用戶映射爲此處指定的用戶; 

NFS server配置實例1:

[root@localhost ~]# mkdir -p /shared
[root@localhost ~]# vim /etc/exports
[root@localhost ~]# cat /etc/exports
/shared 172.16.0.0/16(rw,sync,all_squash)
[root@localhost ~]# 

重啓或重載服務:
[root@localhost ~]# systemctl restart nfs.service
[root@localhost ~]# systemctl status nfs.service
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Thu 2018-12-20 21:01:15 CST; 23s ago
  Process: 10812 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 10809 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 10807 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 10842 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl restart gssproxy ; fi (code=exited, status=0/SUCCESS)
  Process: 10826 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 10824 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 10826 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Dec 20 21:01:15 localhost.localdomain systemd[1]: Starting NFS server and services...
Dec 20 21:01:15 localhost.localdomain systemd[1]: Started NFS server and services.


這裏爲了方便就直接關閉防火牆或者把nfs服務器對外開放了:
[root@localhost ~]# firewall-cmd --list-all --permanent
public (default)
  interfaces: 
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 
	
[root@localhost ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eno16777736
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 
  
開放nfs服務:
[root@localhost ~]# firewall-cmd --add-service=nfs --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eno16777736
  sources: 
  services: dhcpv6-client nfs ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

查看啓動的端口信息(ss -tnl或ss -tnlp):
[root@localhost ~]# ss -tnl
State      Recv-Q Send-Q                                           Local Address:Port                                             Peer Address:Port 
LISTEN     0      64                                                           *:2049                                                        *:*     
LISTEN     0      128                                                          *:40615                                                       *:*     
LISTEN     0      64                                                           *:43881                                                       *:*     
LISTEN     0      128                                                          *:111                                                         *:*     
LISTEN     0      128                                                          *:20048                                                       *:*     
LISTEN     0      128                                                          *:22                                                          *:*     
LISTEN     0      100                                                  127.0.0.1:25                                                          *:*     
LISTEN     0      64                                                          :::2049                                                       :::*     
LISTEN     0      128                                                         :::111                                                        :::*     
LISTEN     0      128                                                         :::20048                                                      :::*     
LISTEN     0      64                                                          :::60145                                                      :::*     
LISTEN     0      128                                                         :::22                                                         :::*     
LISTEN     0      128                                                         :::50360                                                      :::*     
LISTEN     0      100                                                        ::1:25                                                         :::*  

使用showmount工具查看:
[root@localhost ~]# showmount -e   #NFS服務端上執行
Export list for localhost.localdomain:
/shared 172.16.0.0/16

(3) 客戶端掛載使用

使用mount.nfs或mount -t nfs來掛載。其使用形式大概如下:
mount -t nfs servername:/path/to/share /path/to/mount_point  [-rvVwfnsh ] [-o options]

其中mount -t nfs可以替換爲mount.nfs;
servername表示NFS server的ip;
/path/to/share表示共享的文件愛你係統目錄;
/path/to/mount_point表示NFS client上文件系統的掛載點;
後邊還可以跟選項。可以參考man nfs中的相關選項介紹,NFSv2,NFSv3相比NFSv4有獨立的選項,NFSv4相較以前的版本也有獨立的選項。這裏不詳細介紹了。

在NFS client上執行,假設掛載到/data目錄下
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount -t nfs 172.16.0.118:/shared /data 
可以使用df或mount命令查看:
[root@localhost ~]# df -h | tail -1
172.16.0.118:/shared      50G  1.1G   49G   3% /data

[root@localhost ~]# mount |tail -1
172.16.0.118:/shared on /data type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.0.120,local_lock=none,addr=172.16.0.118)

默認創建文件:
[root@localhost data]# touch yanhui.txt
touch: cannot touch ‘yanhui.txt’: Permission denied
說明:爲什麼,讀寫掛載的文件系統沒有寫入權限呢?
默認我的NFS server共享文件系統的掛載選項中有個參數"all_squash",所有客戶端的用戶寫入都會
在NFS server上映射成匿名用戶,如果不指定,就是默認的nfsnobody,來NFS server上看看nfsnobody
對共享的文件系統的權限
[root@localhost ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
[root@localhost ~]# ls -ld /shared/
drwxr-xr-x 2 root root 6 Dec 20 16:06 /shared/
上面共享目錄,普通用戶根本沒有寫入選項。所以上面會提示權限拒絕(NFS共享權限和文件系統權限的交集纔是最終的權限)。

推薦解決方案1:
直接在NFS server上讓nfsnobody這個默認用戶對文件系統目錄擁有讀寫權限。可以使用acl權限設置來完成,示例代碼:
[root@localhost ~]# ls -ld /shared/
drwxr-xr-x 2 root root 6 Dec 20 23:07 /shared/
[root@localhost ~]# setfacl -m u:nfsnobody:rwx /shared
#修改設置acl權限,讓nfsnobody用戶對/shared目錄擁有讀寫權限。
[root@localhost ~]# getfacl -p /shared
# file: /shared
# owner: root
# group: root
user::rwx
user:nfsnobody:rwx
group::r-x
mask::rwx
other::r-x

[root@localhost ~]# ls -ld /shared
drwxrwxr-x+ 2 root root 6 Dec 20 23:07 /shared
#上面後邊多了一個符號"+"就表示這個目錄擁有acl權限設置。

重新測試寫入:
[root@localhost data]# echo "git clone" > yanhui.txt
[root@localhost data]# ls -l
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
服務端上查看:
[yanhui@localhost ~]$ ls -l /shared/
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
[yanhui@localhost ~]$ cat /shared/yanhui.txt 
git clone

解決方法2:直接改文件目錄屬主或屬組的形式,這個就不演示了,和設置acl沒區別
解決方法3:把NFS server的共享掛載選項的all_squash改成no_root_squash或root_squash,推薦改成
root_squash,這樣一來就只有root用戶被映射成普通用戶,其他普通用戶可以寫入。

NFS server上創建一個普通用戶centos,NFS client上創建一個普通用戶xiaotang。我故意把它們的uid設置成一樣。看看效果。
NFS 服務端修改掛載選項:
[root@localhost ~]# cat /etc/exports
/shared 172.16.0.0/16(rw,async,root_squash)
[root@localhost ~]# systemctl reload nfs.service

NFS client客戶端重新卸載後掛載:
[root@localhost ~]# umount /data
[root@localhost ~]# mount -t nfs 172.16.0.118:/shared /data 
[root@localhost ~]# mount | tail -1
172.16.0.118:/shared on /data type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.0.120,local_lock=none,addr=172.16.0.118)

NFS server創建用戶centos,指明uid爲10001:
[root@localhost ~]# useradd -u 10001 centos
[root@localhost ~]# id centos
uid=10001(centos) gid=10001(centos) groups=10001(centos)

NFS client創建用戶xiaotang,指明uid爲10001:
[root@localhost ~]# useradd -u 10001 xiaotang
[root@localhost ~]# id xiaotang
uid=10001(xiaotang) gid=10001(xiaotang) groups=10001(xiaotang)

NFS server端設置讓centos用戶擁有讀寫執行權限:
[root@localhost ~]# ls -ld /shared/
drwxrwxr-x+ 2 root root 23 Dec 20 23:13 /shared/
[root@localhost ~]# setfacl -m u:centos:rwx /shared/
[root@localhost ~]# getfacl -p /shared/
# file: /shared/
# owner: root
# group: root
user::rwx
user:centos:rwx
user:nfsnobody:rwx
group::r-x
mask::rwx
other::r-x

NFS client切換到普通用戶xiaotang,然後向/data寫入文件:
[xiaotang@localhost ~]$ ls -ld /data/
drwxrwxr-x 2 root root 23 Dec 20 23:13 /data/
[xiaotang@localhost ~]$ cd /data/
[xiaotang@localhost data]$ ls
yanhui.txt
[xiaotang@localhost data]$ touch file
[xiaotang@localhost data]$ ls -l
total 4
-rw-rw-r-- 1 xiaotang  xiaotang   0 Dec 20 23:22 file
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt

服務端上查看:
[root@localhost ~]# ls -l /shared/
total 4
-rw-rw-r-- 1 centos    centos     0 Dec 20 23:22 file
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
用戶是根據uid來對應的,這個實驗驗證了。

NFS client還是用root用戶向/data寫入:
[root@localhost ~]# echo "hello,world"0 > /data/mytxt
[root@localhost ~]# ls -l /data/mytxt 
-rw-r--r-- 1 nfsnobody nfsnobody 13 Dec 20 23:23 /data/mytxt
[root@localhost ~]# cat /data/mytxt
hello,world0

NFS server上查看:
[root@localhost ~]# ls -l /shared/
total 8
-rw-rw-r-- 1 centos    centos     0 Dec 20 23:22 file
-rw-r--r-- 1 nfsnobody nfsnobody 13 Dec 20 23:23 mytxt
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
[root@localhost ~]# cat /shared/mytxt 
hello,world0
因爲掛載權限root_squash的干預,root用戶被映射成了默認的nfsnobody用戶。這樣做是比較安全的。如果要
使用root用戶本身,可以修改掛載選項爲no_root_squash。

五、幾個比較常用的工具和常用選項說明

  • showmount
    showmount -e NFS_SERVER_IP: 查看指定的nfs server上導出的所有文件系統;(客戶端上執行)
    showmount -a:在nfs server上查看nfs服務的所有客戶端列表;(服務端上執行)

示例:

#NFS client上執行:
[root@localhost ~]# showmount -e 172.16.0.118
Export list for 172.16.0.118:
/shared 172.16.0.0/16

#NFS server上執行:
[root@localhost ~]# showmount -e
Export list for localhost.localdomain:
/shared 172.16.0.0/16

  • exportfs
    -r:重新導出;
    -a:所有文件系統;
    -v:詳細信息;
    -u:取消導出文件系統;
[root@localhost ~]# exportfs -v
/shared       	172.16.0.0/16(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@localhost ~]# exportfs -au   #這裏指定了-a選項,配合-u表示取消所有的文件系統導出,所有客端掛載都會斷開
[root@localhost ~]# exportfs -v
[root@localhost ~]# exportfs -r #這是重新導出,可以不用重啓或重載服務,會更新/etc/exports和/var/lib/nfs/xtab中的內容
[root@localhost ~]# exportfs -v
/shared       	172.16.0.0/16(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@localhost ~]# exportfs -u 172.16.0.0/16:/shared   #這是單獨卸載一個共享文件系統。標準語法爲:
exportfs -u host:/path
[root@localhost ~]# exportfs -v
[root@localhost ~]# exportfs -r
[root@localhost ~]# exportfs -v
/shared       	172.16.0.0/16(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章