NFS--網絡文件系統

nfs由SUN公司研製的UNIX表示層協議(presentation layer protocol),能使使用者訪問網絡上別處的文件就像在使用自己的計算機一樣。

NFS工作原理

什麼是NFS服務器

NFS就是Network File System的縮寫,它最大的功能就是可以通過網絡,讓不同的機器、不同的操作系統可以共享彼此的文件。

NFS服務器可以讓PC將網絡中的NFS服務器共享的目錄掛載到本地端的文件系統中,而在本地端的系統中來看,那個遠程主機的目錄就好像是自己的一個磁盤分區一樣,在使用上相當便利;

同一掛載點可以連接多個設備 /mnt/sr0 /dev/sda5

一個設備可以連接多個掛載點

NFS掛載原理
NFS服務器掛載結構圖:

在這裏插入圖片描述

  • 當我們在NFS服務器設置好一個共享目錄/home/public後,其他的有權訪問NFS服務器的NFS客戶端就可以將這個目錄掛載到自己文件系統的某個掛載點,這個掛載點可以自己定義,如上圖客戶端A與客戶端B掛載的目錄就不相同。
  • 並且掛載好後我們在本地能夠看到服務端/home/public的所有數據。如果服務器端配置的客戶端只讀,那麼客戶端就只能夠只讀。如果配置讀寫,客戶端就能夠進行讀寫。掛載後,NFS客戶端查看磁盤信息命令:#df –h。

RPC(Remote Procedure Call)遠程過程調用

  • 既然NFS是通過網絡來進行服務器端和客戶端之間的數據傳輸,那麼兩者之間要傳輸數據就要有想對應的網絡端口,NFS服務器到底使用哪個端口來進行數據傳輸呢?基本上NFS這個服務器的端口開在2049,
  • 但由於文件系統非常複雜。因此NFS還有其他的程序去啓動額外的端口,這些額外的用來傳輸數據的端口是隨機選擇的,是小於1024的端口;既然是隨機的那麼客戶端又是如何知道NFS服務器端到底使用的是哪個端口呢?這時就需要通過遠程過程調用(Remote Procedure Call,RPC)協議來實現了
    RPC服務(portmap 或rpcbind服務)

RPC 最主要的功能就是在指定每個 NFS 功能所對應的 port number ,並且回報給客戶端,讓客戶端可以連結到正確的port上去。

NFS通訊原理

RPC與NFS如何通訊

  • 因爲NFS支持的功能相當多,而不同的功能都會使用不同的程序來啓動,每啓動一個功能就會啓用一些端口來傳輸數據,因此NFS的功能對應的端口並不固定,客戶端要知道NFS服務器端的相關端口才能建立連接進行數據傳輸,而RPC就是用來統一管理NFS端口的服務,並且統一對外的端口是111,RPC會記錄NFS端口的信息,如此我們就能夠通過RPC實現服務端和客戶端溝通端口信息。

  • PRC最主要的功能就是指定每個NFS功能所對應的port number,並且通知客戶端,讓客戶端可以連接到正常端口上去

  • RPC又是如何知道每個NFS功能的端口呢?
    首先當NFS啓動後,就會隨機的使用一些端口,然後NFS就會向RPC去註冊這些端口,RPC就會記錄下這些端口,並且RPC會開啓111端口,等待客戶端RPC的請求,如果客戶端有請求,那麼服務器端的RPC就會將之前記錄的NFS端口信息告知客戶端。如此客戶端就會獲取NFS服務器端的端口信息,就會以實際端口進行數據的傳輸了。

提示:在啓動NFS SERVER之前,首先要啓動RPC服務(即portmap服務,下同)否則NFS SERVER就無法向RPC服務區註冊,另外,如果RPC服務重新啓動,原來已經註冊好的NFS端口數據就會全部丟失。因此此時RPC服務管理的NFS程序也要重新啓動以重新向RPC註冊。

特別注意:一般修改NFS配置文檔後,是不需要重啓NFS的,直接在命令執行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。

portmap

功能:主要是把RPC程序號轉化爲Internet的端口號。
特點:只在第一次建立連接時候幫助網絡應用程序找到正確的port,當雙方正確連接時,端 口就和應用綁定,portmap就無用。相當於媒婆。
如在window下進行查看:
在這裏插入圖片描述

NFS客戶端和NFS服務器的通信

在這裏插入圖片描述
RPC先啓動,NFS再向RPC去註冊。

1)首先服務器端啓動RPC服務,並開啓111端口
2)服務器端啓動NFS服務,並向RPC註冊端口信息
3)客戶端啓動RPC(portmap服務),向服務端的RPC(portmap)服務請求服務端的NFS端口
4)服務端的RPC(portmap)服務反饋NFS端口信息給客戶端。
5)客戶端通過獲取的NFS端口來建立和服務端的NFS連接並進行數據的傳輸。

就像你(客戶端)去相親,需要去相親的人很多,男男女女都有,但是呢,你一個人不知道去哪裏找到同樣有相親需求的女生(NFS服務),所以你去找媒婆(RPC),那些有需求的女生先前都在媒婆這裏說好了,有男的來相親你就把我推薦給他(NFS向RPC註冊)
現在,你去找媒婆,媒婆將女生介紹給你給你女生微信(端口號),然後你加上微信,你儂我儂的,好上了(和客戶端建立連接了),媒婆就甩在一邊了。

NFS的優缺點

優點

a.節省本地存儲空間將常用的數據存放在一臺服務器可以通過網絡訪問
b.簡單容易上手
c.方便部署非常快速,維護十分簡單

缺點

a.侷限性容易發生單點故障,及server機宕機了所有客戶端都不能訪問
b.在高併發下NFS效率/性能有限
c.客戶端沒用用戶認證機制,且數據是通過明文傳送,安全性一般(一般建議在局域網內使用)
d.NFS的數據是明文的,對數據完整性不做驗證
e.多臺機器掛載NFS服務器時,連接管理維護麻煩

NFS的配置

NFS的基本文件內容

要部署NFS服務,必須安裝兩個軟件包:
nfs-utils:NFS主程序,rpcbind:PRC主程序

查看是否包含軟件包,沒有需要安裝。
[root@localhost ~]# rpm -qa | egrep "nfs|rpcbind"
nfs-utils-1.3.0-0.54.el7.x86_64
libnfsidmap-0.25-19.el7.x86_64
rpcbind-0.2.0-44.el7.x86_64

進程:

 rpc.nfsd:NFS守護進程
 程序實現的是用戶空間層的NFS服務,主要功能由nfsd內核模塊來處理。用戶空間程序主要指定內核空間層服務監聽在哪個套接字上,使用多少個內核線程。

 rpc.mountd:管理文件系統和服務
 服務提供輔助服務,用於處理NFS客戶端的mount請求。

可以根據 man rpc.nfsd  查看具有的功能

查看註冊信息

rpcinfo實用工具

顯示那些使用portmap註冊的程序的信息,並向程序進行RPC調用,檢查它們是否正常運行。

注:rpcbind安裝成功後默認已經開啓,並且爲開機自動啓動。如果沒有啓動的話,我們來重新啓動rcpbind服務
[root@localhost ~]# systemctl restart  nfs
[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
    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  51013  nlockmgr
    100021    3   udp  51013  nlockmgr
    100021    4   udp  51013  nlockmgr
    100021    1   tcp  42162  nlockmgr
    100021    3   tcp  42162  nlockmgr
    100021    4   tcp  42162  nlockmgr
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100024    1   udp  46048  status
    100024    1   tcp  47468  status
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd

lsof(list open files)

是一個列出當前系統打開文件的工具

[root@localhost ~]# lsof -i:111
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 740  rpc    6u  IPv4  18187      0t0  UDP *:sunrpc
rpcbind 740  rpc    8u  IPv4  18194      0t0  TCP *:sunrpc (LISTEN)
rpcbind 740  rpc    9u  IPv6  18195      0t0  UDP *:sunrpc
rpcbind 740  rpc   11u  IPv6  18197      0t0  TCP *:sunrpc (LISTEN)
lsof的一些常用操作##同樣可以使用man手冊進行查看
lsof
1.列出所有打開的文件:
lsof
備註: 如果不加任何參數,就會打開所有被打開的文件,建議加上一下參數來具體定位
2. 查看誰正在使用某個文件
lsof   /filepath/file
3.遞歸查看某個目錄的文件信息
lsof +D /filepath/filepath2/
備註: 使用了+D,對應目錄下的所有子目錄和文件都會被列出
4. 比使用+D選項,遍歷查看某個目錄的所有文件信息 的方法
lsof | grep ‘/filepath/filepath2/’
5. 列出某個用戶打開的文件信息
lsof  -u username
備註: -u 選項,u其實是user的縮寫
6. 列出某個程序所打開的文件信息
lsof -c mysql
備註: -c 選項將會列出所有以mysql開頭的程序的文件,其實你也可以寫成lsof | grep mysql,但是第一種方法明顯比第二種方法要少打幾個字符了
7. 列出多個程序多打開的文件信息
lsof -c mysql -c apache
8. 列出某個用戶以及某個程序所打開的文件信息
lsof -u test -c mysql
9. 列出除了某個用戶外的被打開的文件信息
lsof   -u ^root
備註:^這個符號在用戶名之前,將會把是root用戶打開的進程不讓顯示
10. 通過某個進程號顯示該進行打開的文件
lsof -p 1
11. 列出多個進程號對應的文件信息
lsof -p 123,456,789
12. 列出除了某個進程號,其他進程號所打開的文件信息
lsof -p ^1
13 . 列出所有的網絡連接
lsof -i
14. 列出所有tcp 網絡連接信息
lsof  -i tcp
15. 列出所有udp網絡連接信息
lsof  -i udp
16. 列出誰在使用某個端口
lsof -i :3306
17. 列出誰在使用某個特定的udp端口
lsof -i udp:55
特定的tcp端口
lsof -i tcp:80
18. 列出某個用戶的所有活躍的網絡端口
lsof  -a -u test -i
19. 列出所有網絡文件系統
lsof -N
20.域名socket文件
lsof -u
21.某個用戶組所打開的文件信息
lsof -g 5555
22. 根據文件描述列出對應的文件信息
lsof -d description(like 2)
23. 根據文件描述範圍列出文件信息
lsof -d 2-3

Netsata

命令用於顯示各種網絡相關信息,如網絡連接,路由表,接口狀態 (Interface Statistics),masquerade 連接,多播成員 (Multicast Memberships) 等等。
是一個監控TCP/IP網絡的非常有用的工具,它可以顯示路由表、實際的網絡連接以及每一個網絡接口設備的狀態信息。Netstat用於顯示與IP、TCP、UDP和ICMP協議相關的統計數據,一般用於檢驗本機各端口的網絡連接情況。

-a 顯示所有連線中的Socket 
-p 顯示正在使用Socket的程序識別碼和程序名稱 
-u 顯示UDP傳輸協議的連線狀況 
-i 顯示網絡界面信息表單 
-n 直接使用IP地址,不通過域名服務器 
##
[root@localhost ~]# netstat -i    顯示網卡列表
Kernel Interface table
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
ens33     1500     4291      0      0 0          9396      0      0      0 BMRU
lo       65536      368      0      0 0           368      0      0      0 LRU
virbr0    1500        0      0      0 0             0      0      0      0 BMU

[root@localhost ~]# netstat -a  顯示詳細的網絡狀況

[root@localhost ~]#netstat -nu  顯示當前用戶的udp連接
[root@localhost ~]# netstat -nt  顯示tcp連接
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0     36 192.168.168.157:22      192.168.168.1:57368     ESTABLISHED

[root@localhost ~]# netstat -apu    顯示udp端口的使用,同理-apt爲查看tcp端口。
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 0.0.0.0:mdns            0.0.0.0:*                           749/avahi-daemon: r
udp        0      0 0.0.0.0:mountd          0.0.0.0:*                           3734/rpc.mountd
udp        0      0 0.0.0.0:58141           0.0.0.0:*                           749/avahi-daemon: r
udp        0      0 0.0.0.0:51013           0.0.0.0:*                           -
udp        0      0 0.0.0.0:xact-backup     0.0.0.0:*                           740/rpcbind
udp        0      0 localhost:940           0.0.0.0:*                           3732/rpc.statd
udp        0      0 0.0.0.0:46048           0.0.0.0:*                           3732/rpc.statd
udp        0      0 0.0.0.0:nfs             0.0.0.0:*                           -
udp        0      0 localhost.locald:domain 0.0.0.0:*                           1732/dnsmasq
udp        0      0 0.0.0.0:bootps          0.0.0.0:*                           1732/dnsmasq
udp        0      0 0.0.0.0:sunrpc          0.0.0.0:*                           740/rpcbind
udp6       0      0 [::]:60971              [::]:*                              3732/rpc.statd
udp6       0      0 [::]:mountd             [::]:*                              3734/rpc.mountd
udp6       0      0 [::]:xact-backup        [::]:*                              740/rpcbind
udp6       0      0 [::]:33733              [::]:*                              -
udp6       0      0 [::]:nfs                [::]:*                              -
udp6       0      0 [::]:sunrpc             [::]:*                              740/rpcbind

[root@localhost ~]# netstat -lntup   組合
##說明: l:listening   n:num   t:tcp  u:udp  p:process
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      738/rpcbind
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1739/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1278/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1283/cupsd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1632/master
tcp6       0      0 :::111                  :::*                    LISTEN      738/rpcbind
tcp6       0      0 :::22                   :::*                    LISTEN      1278/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      1283/cupsd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1632/master
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           785/avahi-daemon: r
udp        0      0 0.0.0.0:909             0.0.0.0:*                           738/rpcbind
udp        0      0 192.168.122.1:53        0.0.0.0:*                           1739/dnsmasq
udp        0      0 0.0.0.0:67              0.0.0.0:*                           1739/dnsmasq
udp        0      0 0.0.0.0:111             0.0.0.0:*                           738/rpcbind
udp        0      0 0.0.0.0:38004           0.0.0.0:*                           785/avahi-daemon: r
udp6       0      0 :::909                  :::*                                738/rpcbind
udp6       0      0 :::111                  :::*

[root@localhost ~]# netstat -ap | grep ssh   #找出程序運行的端口
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      1278/sshd
tcp        0      0 localhost.localdoma:ssh gateway:50418           ESTABLISHED 2184/sshd: root@pts
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      1278/sshd
unix  2      [ ]         DGRAM                    32366    2184/sshd: root@pts
unix  3      [ ]         STREAM     CONNECTED     24164    1278/sshd

[root@localhost ~]# netstat -tlunp | grep rpcbind ##程序運行端口
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      738/rpcbind
tcp6       0      0 :::111                  :::*                    LISTEN      738/rpcbind
udp        0      0 0.0.0.0:909             0.0.0.0:*                           738/rpcbind
udp        0      0 0.0.0.0:111             0.0.0.0:*                           738/rpcbind
udp6       0      0 :::909                  :::*                                738/rpcbind
udp6       0      0 :::111                  :::*                                738/rpcbind

[root@localhost ~]# netstat -tlunp | grep -E '(rpc|nfs)'   ##nfs服務開啓的端口
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      738/rpcbind
tcp6       0      0 :::111                  :::*                    LISTEN      738/rpcbind
udp        0      0 0.0.0.0:909             0.0.0.0:*                           738/rpcbind
udp        0      0 0.0.0.0:111             0.0.0.0:*                           738/rpcbind
udp6       0      0 :::909                  :::*                                738/rpcbind
udp6       0      0 :::111                  :::*

ps–Process Status

ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,就是執行ps命令的那個時刻的那些進程,如果想要動態的顯示進程信息,就可以使用top命令。

a  顯示所有進程
-a 顯示同一終端下的所有程序
-A 顯示所有進程
c  顯示進程的真實名稱
-N 反向選擇
-e 等於“-A”
e  顯示環境變量
f  顯示程序間的關係
-H 顯示樹狀結構
r  顯示當前終端的進程
T  顯示當前終端的所有程序
u  指定用戶的所有進程
-au 顯示較詳細的資訊
-aux 顯示所有包含其他使用者的行程 
-C<命令> 列出指定命令的狀況
--lines<行數> 每頁顯示的行數
--width<字符數> 每頁顯示的字符數
--help 顯示幫助信息
--version 顯示版本顯示

#Head標頭:
USER    用戶名
UID    用戶ID(User ID)
PID    進程ID(Process ID)
PPID    父進程的進程ID(Parent Process id)
SID    會話ID(Session id)
%CPU    進程的cpu佔用率
%MEM    進程的內存佔用率
VSZ    進程所使用的虛存的大小(Virtual Size)
RSS    進程使用的駐留集大小或者是實際內存的大小,Kbytes字節。
TTY    與進程關聯的終端(tty)
STAT    進程的狀態:進程狀態使用字符表示的(STAT的狀態碼)
	 R 運行    Runnable (on run queue)            正在運行或在運行隊列中等待。
	 S 睡眠    Sleeping                休眠中, 受阻, 在等待某個條件的形成或接受到信號。
	 I 空閒    Idle
	 Z 僵死    Zombie(a defunct process)        進程已終止, 但進程描述符存在, 直到父進  程調用wait4()系統調用後釋放。
	 D 不可中斷    Uninterruptible sleep (ususally IO)    收到信號不喚醒和不可運行, 進程必須等待直到有中斷髮生。
	 T 終止    Terminate                進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後停 止運行運行。
	 P 等待交換頁
	 W 無駐留頁    has no resident pages        沒有足夠的記憶體分頁可分配。
	 X 死掉的進程
	 < 高優先級進程                    高優先序的進程
	 N 低優先    級進程                    低優先序的進程
	 L 內存鎖頁    Lock                有記憶體分頁分配並縮在記憶體內
	 s 進程的領導者(在它之下有子進程);
START    進程啓動時間和日期
TIME    進程使用的總cpu時間
COMMAND    正在執行的命令行命令
NI    優先級(Nice)
PRI    進程優先級編號(Priority)
WCHAN    進程正在睡眠的內核函數名稱;該函數的名稱是從/root/system.map文件中獲得的。
FLAGS    與進程相關的數字標識

[root@localhost ~]# ps -A   ##顯示所有進程
   PID TTY          TIME CMD
     1 ?        00:00:02 systemd
     2 ?        00:00:00 kthreadd
     3 ?        00:00:00 ksoftirqd/0
     5 ?        00:00:00 kworker/0:0H
     7 ?        00:00:00 migration/0
     8 ?        00:00:00 rcu_bh
     9 ?        00:00:01 rcu_sched
    10 ?        00:00:00 lru-add-drain
    11 ?        00:00:00 watchdog/0
    13 ?        00:00:00 kdevtmpfs
    14 ?        00:00:00 netns
    15 ?        00:00:00 khungtaskd
。。。。省略

[root@localhost ~]# ps -u root   指定用戶的進程

[root@localhost ~]# ps -ef    組合,進程和環境變量
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 18:49 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0 18:49 ?        00:00:00 [kthreadd]
root          3      2  0 18:49 ?        00:00:00 [ksoftirqd/0]
root          5      2  0 18:49 ?        00:00:00 [kworker/0:0H]
root          7      2  0 18:49 ?        00:00:00 [migration/0]
root          8      2  0 18:49 ?        00:00:00 [rcu_bh]
root          9      2  0 18:49 ?        00:00:01 [rcu_sched]
root         10      2  0 18:49 ?        00:00:00 [lru-add-drain]

[root@localhost ~]# ps -ef | grep rpcbind    ##組合查看指定進程
rpc         738      1  0 18:49 ?        00:00:00 /sbin/rpcbind -w
root       2500   2192  0 19:12 pts/0    00:00:00 grep --color=auto rpcbind
[root@localhost ~]# ps -ef | grep -E 'rpc|nfs'
root        712      2  0 18:49 ?        00:00:00 [rpciod]
rpc         738      1  0 18:49 ?        00:00:00 /sbin/rpcbind -w
root       2510   2192  0 19:13 pts/0    00:00:00 grep --color=auto -E rpc|nfs

[root@localhost ~]# ps aux  列出正在內存中運行的程序
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.1  0.3 128208  6816 ?        Ss   18:49   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    18:49   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    18:49   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   18:49   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    18:49   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    18:49   0:00 [rcu_bh]
root          9  0.1  0.0      0     0 ?        R    18:49   0:01 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S<   18:49   0:00 [lru-add-drain]
root         11  0.0  0.0      0     0 ?        S    18:49   0:00 [watchdog/0]
root         13  0.0  0.0      0     0 ?        S    18:49   0:00 [kdevtmpfs]
root         14  0.0  0.0      0     0 ?        S<   18:49   0:00 [netns]
root         15  0.0  0.0      0     0 ?        S    18:49   0:00 [khungtaskd]
root         16  0.0  0.0      0     0 ?        S<   18:49   0:00 [writeback]
root         17  0.0  0.0      0     0 ?        S<   18:49   0:00 [kintegrity

[root@localhost ~]# ps -axjf    列出類似的程序樹顯示
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
     0      2      0      0 ?            -1 S        0   0:00 [kthreadd]
     2      3      0      0 ?            -1 S        0   0:00  \_ [ksoftirqd/0]
     2      5      0      0 ?            -1 S<       0   0:00  \_ [kworker/0:0H]
     2      7      0      0 ?            -1 S        0   0:00  \_ [migration/0]
     2      8      0      0 ?            -1 S        0   0:00  \_ [rcu_bh]
     2      9      0      0 ?            -1 R        0   0:01  \_ [rcu_sched]
     2     10      0      0 ?            -1 S<       0   0:00  \_ [lru-add-drain]
     2     11      0      0 ?            -1 S        0   0:00  \_ [watchdog/0]
     2     13      0      0 ?            -1 S        0   0:00  \_ [kdevtmpfs]
     2     14      0      0 ?            -1 S<       0   0:00  \_ [netns]

[root@localhost ~]# ps aux | egrep '(cron|syslog)'  找出與 cron 與 syslog 這兩個服務有關的 PID 號碼
root        831  0.0  0.0   6608   292 ?        Ss   18:49   0:00 /usr/sbin/mcelog --ignorenodev --daemon --syslog
root       1284  0.0  0.3 216376  6268 ?        Ssl  18:49   0:00 /usr/sbin/rsyslogd -n
root       1312  0.0  0.0 126284  1696 ?        Ss   18:49   0:01 /usr/sbin/crond -n
gdm        1960  0.0  0.3 1252032 6304 ?        S<l  18:50   0:00 /usr/bin/pulseaudio --start --log-target=syslog
root       2554  0.0  0.0 112704  1000 pts/0    R+   19:18   0:00 grep -E --color=auto

[root@localhost ~]# ps -l   此次登錄的pid顯示
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   2192   2184  0  80   0 - 29054 do_wai pts/0    00:00:00 bash #代表使用者是超級用戶
0 R     0   2563   2192  0  80   0 - 38300 -      pts/0    00:00:00 ps

[root@localhost ~]# ps -aux > ps001.txt   將進程顯示並輸出到指定文件
[root@localhost ~]# cat ps001.txt
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.1  0.3 128208  6816 ?        Ss   18:49   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    18:49   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    18:49   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   18:49   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    18:49   0:00 [migration/0]

[root@localhost ~]# ps -o pid,ppid,pgrp,session,tpgid,comm #輸出指定字段
   PID   PPID   PGRP   SESS  TPGID COMMAND
  2192   2184   2192   2192   2665 bash
  2665   2192   2665   2192   2665 ps
  1. 進程
    nfsd 最主要的NFS服務提供程序,這個daemon主要的功能就是管理客戶端是否能夠使用服務器文件系統掛載信息,其中還包含判斷這個登錄用戶的ID。
    rpc.mountd
    這個daemon主要功能則是管理NFS的文件系統。當client端順利通過rpc.nfsd登入主機後,在它可以使用NFS服務器提供規定文件之前,還會經過文件使用權限的認證程序。它會去讀取NFS的配置  
    文件/etc/exports來對比客戶端的權限,當通過這一關之後,client端也就取得使用NFS文件的權限。
    rpc.statd(非必要)
    這個daemon可以用來檢查文件的一致性,若發生因爲客戶端同時使用同一個文件造成文件損壞時,rpc.statd可以用來檢測並嘗試恢復該文件
  2. 常用目錄和文件
    /etc/exports
    /usr/sbin/exportfs
    /usr/sbin/showmount
    /var/lib/nfs/*tab
    etab 記錄NFS分享出來的目錄的完整權限設定值
    xtab 記錄曾經鏈接到此NFS主機的相關客戶端數據
  3. 配置文件
    /etc/exports
    格式
    共享目錄 客戶端(選項)--------(訪問權限,用戶映射,其他) rwx u+s g+s o+t
		輸出目錄:	需要共享的目錄路徑
		客戶端:	服務的用戶對象
		選項:	共享的權限,緊跟客戶端列
例:  ro      rw 
cat /etc/exports
/test   *(ro)  
Ro
rw
#共享/test目錄,*所有用戶(ro)權限爲只讀權限
  1. 客戶端
    指定ip地址的主機:192.168.171.144
    指定子網中的所有主機:192.168.171.0/24,192.168.171.0/255.255.255.0
    指定域名的主機:www.baidu.com
    指定域中的所有主機:.baidu.com
    所有主機:
    i 張三 李四 S
  2. 選項
 /test/1    root root
	訪問權限選項:
			rw	表示可讀寫
			ro	Read-only表示只能讀權限
			sync	請求或者寫入數據時,數據同步寫入到NFS server的硬盤中後纔會返回
			no_root_squash	訪問nfs server共享目錄的用戶如果是root的話,它對該目錄具有root權限。這個配置原本爲無盤用戶準備的。用戶應避免使用!
			 root_squash:在登入 NFS 主機使用分享之目錄的使用者如果是 root 時,那麼這個使用者的權限將被壓縮成爲匿名使用者,通常他的 UID 與 GID 都會變成 nobody 那個系統賬號的身份。	
			all_squash	不管訪問nfs server共享目錄的用戶身份如何包括root,它的權限都將被壓縮成爲匿名用戶,同時他們的udi和gid都會變成nobody或nfsnobody賬戶的uid,gid。在多個nfs客戶端同時讀寫nfs server數據時,這個參數很有用可以確保大家寫入的數據的權限是一樣的。
			no_all_squash	 但不同系統有可能匿名用戶的uid,gid不同。因爲此處我們需要服務端和客戶端之間的用戶是一樣的。比如說:服務端指定匿名用戶的UID爲2000,那麼客戶端也一定要存在2000這個賬號纔可以
			anonuid	anonuid就是匿名的uid和gid。說明客戶端以什麼權限來訪問服務端,在默認情況下是nfsnobody。Uid65534.
			anongid	同anongid,就是把uid換成gid而已
其他選項:
atime 在每一次數據訪問是,同步更新每次的訪問的inode的時間,默認是atime,在高併發的情況下,建議加上noatime來取消默認這個選項,以達到IO,優化目的,auto 能夠被自動掛載
******defaults 這是缺省值,rw,suid,dev,exec,auto,nouser,async 
exec  運行可以執行二進制文件,取消這個參數會提升系統安全性
nodiratime 不更新文件愛你係統上的directory inode訪問時間,高併發時候建議使用此選型
noauto  不自動掛載
noexec  即使設置了noexec shell php 程序還是可以執行
nosuid 禁止已給普通用戶掛載文件系統, 
secure:限制客戶端只能從小於1024的tcp/ip端口連接nfs服務器(默認設置);
insecure:允許客戶端從大於1024的tcp/ip端口連接服務器;
sync:將數據同步寫入內存緩衝區與磁盤中,效率低,但可以保證數據的一致性;
async:將數據先保存在內存緩衝區中,必要時才寫入磁盤;
wdelay:檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率(默認設置);
no_wdelay:若有寫操作則立即執行,應與sync配合使用;
subtree:若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限(默認設置);
no_subtree:即使輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣可以提高效率;

NFS掛載案例

基礎操作

服務端:
[root@localhost ~]# systemctl stop firewalld.service##關閉防火牆
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl restart rpcbind  先重啓rpcbind 
[root@localhost ~]# systemctl restart nfs      再重啓讓nfs去rpc註冊

[root@localhost ~]# vim /etc/exports     //編輯配置文件內容,分享/data 權限是ro
[root@localhost ~]# cat /etc/exports
/data *(ro)
[root@localhost ~]# mkdir /data

[root@localhost ~]# exportfs -ra     //重新掛載
##
a 全部掛載(或卸載)/etc/exports檔案內的設定 
r 重新掛載/etc/exports 裏面的設定,也同步的更新/etc/exports和/var/lib/nfs/xtab裏面的內容 
u 卸載某一目錄 
v 在export的時候,將分享的目錄顯示到熒屏上 
#exportfs -rv//重新export一次 
#exportfs -au//全部卸載 
##
[root@localhost ~]# showmount -e   查看nfs的掛載
Export list for localhost.localdomain:
/data *
[root@localhost ~]# echo haha >> /data/haha  //創建文件便於查看掛載
[root@localhost data]# ll
total 4
-rw-r--r--. 1 root root 5 Apr 24 20:25 haha

客戶端:
[root@localhost ~]# showmount -e 192.168.168.157 
Export list for 192.168.168.157:
/data *
[root@localhost ~]# vim /etc/fstab
192.168.168.157:/data   /mnt                    nfs     defaults        0 0
[root@localhost ~]# mount 192.168.168.157:/data /mnt  掛載服務器data目錄到/mnt下。
查看進行驗證
[root@localhost ~]# ll /mnt
total 4
-rw-r--r--. 1 root root 5 Apr 24 20:25 haha

並且權限是:read-only  只讀。,無法創建,刪除。
[root@localhost ~]# cd /mnt
[root@localhost mnt]# touch xixi
touch: cannot touch ‘xixi’: Read-only file system

二:
服務端:
[root@localhost ~]# vim /etc/exports  修改文件的掛載者訪問權限
[root@localhost ~]# cat /etc/exports
/data *(rw)

修改文件的權限
[root@r ~]# ll -d /data
drwxr-xr-x. 2 root root 17 2月  11 10:28 /data
[root@localhost /]# chmod 757 /data
[root@localhost /]# ll -d /data
drwxr-xrwx. 2 root root 18 Apr 24 20:25 /data
#文件權限有了,訪問權限有了,就可以在客戶端進行刪除了

客戶端:
[root@localhost mnt]# ll
total 4
-rw-r--r--. 1 root root 5 Apr 24 20:25 haha
[root@localhost mnt]# rm -rf haha
[root@localhost mnt]# ll
total 0
[root@localhost mnt]# touch xixi  客戶端創建文件
[root@localhost mnt]# ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 24 21:28 xixi
[redhat@localhost mnt]$ touch heihei  切換到普通用戶創建
[redhat@localhost mnt]$ ll
total 0
-rw-rw-r--. 1 redhat    redhat    0 Apr 24 21:32 heihei
-rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 24 21:28 xixi

服務端查看:
[root@localhost data]# ll
total 0
-rw-rw-r--. 1 redhat    redhat    0 Apr 24 21:32 heihei
-rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 24 21:28 xixi  ##root用戶映射爲匿名用戶

確保大家的權限都是一致的。
[root@localhost data]# cat /etc/exports 服務端修改權限
/data *(rw,all_squash)

[redhat@localhost mnt]$ touch 111   客戶端創建文件

[root@localhost data]# ll    服務端查看,即創建者都是匿名狀態
total 0
-rw-rw-r--. 1 nfsnobody nfsnobody 0 Apr 24 21:37 111
-rw-rw-r--. 1 redhat    redhat    0 Apr 24 21:32 heihei
-rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 24 21:28 xixi

實例練習

在這裏插入圖片描述

思路:
 1.服務器修改配置文件,使配置文件符合題目要求
 2.創建所需要共享的文件和用戶所屬
 3.在客戶端創建文件和用戶,用於掛載服務器的文件和訪問服務端的文件。

服務端:
1.編輯配置文件
[root@localhost ~]# cat /etc/exports
/nfs/shared *(ro)
/nfs/upload 192.168.168.0/24(rw,all_squash,anonuid=210,anongid=210)
/home/tom 192.168.168.158(ro)

2.創建文件,shared文件和upload文件
[root@localhost ~]# mkdir /nfs/shared -pv
mkdir: created directory ‘/nfs’
mkdir: created directory ‘/nfs/shared’
[root@localhost ~]# cd /nfs/shared/
[root@localhost shared]# mkdir {1..5}
[root@localhost shared]# ll
total 0
drwxr-xr-x. 2 root root 6 Apr 25 01:07 1
drwxr-xr-x. 2 root root 6 Apr 25 01:07 2
drwxr-xr-x. 2 root root 6 Apr 25 01:07 3
drwxr-xr-x. 2 root root 6 Apr 25 01:07 4
drwxr-xr-x. 2 root root 6 Apr 25 01:07 5
[root@localhost shared]# mkdir /nfs/upload
[root@localhost shared]# cd /nfs/upload/
[root@localhost upload]# touch {1..3}
[root@localhost upload]# ll
total 0
-rw-r--r--. 1 root root 0 Apr 25 01:08 1
-rw-r--r--. 1 root root 0 Apr 25 01:08 2
-rw-r--r--. 1 root root 0 Apr 25 01:08 3
創建用戶:
[root@localhost upload]# groupadd -g 210 nfs-upload
[root@localhost upload]# useradd -u 210 -g 210 nfs-upload
[root@localhost upload]# chmod o+w /nfs/upload/   修改目錄權限,使得可以修改其中內容
[root@localhost upload]# useradd -u 2222 tom  創建tom用戶,需要userid值相同纔可訪問tom家目錄
[root@localhost upload]# chmod 700 /home/tom  修改tom用戶家目錄權限
[root@localhost ~]# exportfs -rv   重新加載

3.客戶端驗證測試,先創建文件,掛載測試
[root@localhost ~]# mkdir /nfs/{shared,upload,tom} -pv   #創建文件用於掛載nfs文件
mkdir: created directory ‘/nfs’
mkdir: created directory ‘/nfs/shared’
mkdir: created directory ‘/nfs/upload’
mkdir: created directory ‘/nfs/tom’
[root@localhost ~]# mount 192.168.168.157:/nfs/shared /nfs/shared/  ##進行文件掛載。
[root@localhost ~]# mount 192.168.168.157:/nfs/upload/ /nfs/upload/
[root@localhost ~]# mount 192.168.168.157:/home/tom /nfs/tom/

[root@localhost ~]# cd /nfs/   #測試,
[root@localhost nfs]# ll
total 0
drwxr-xr-x. 7 root root 51 Apr 25 01:07 shared
drwx------. 3 2222 2222 78 Apr 25 01:15 tom
drwxr-xrwx. 2 root root 33 Apr 25 01:08 upload
[root@localhost nfs]# cd shared/   ##可以進入shared文件
[root@localhost shared]# ll
total 0
drwxr-xr-x. 2 root root 6 Apr 25 01:07 1
drwxr-xr-x. 2 root root 6 Apr 25 01:07 2
drwxr-xr-x. 2 root root 6 Apr 25 01:07 3
drwxr-xr-x. 2 root root 6 Apr 25 01:07 4
drwxr-xr-x. 2 root root 6 Apr 25 01:07 5
[root@localhost shared]# rm -rf 1  #不能刪除
rm: cannot remove ‘1’: Read-only file system
[root@localhost shared]# mkdir 6 #不能創建,因爲是隻讀模式,
mkdir: cannot create directory ‘6’: Read-only file system

[root@localhost shared]# cd ..
[root@localhost nfs]# cd upload/  #進入upload進行測試
[root@localhost upload]# ll
total 0
-rw-r--r--. 1 root root 0 Apr 25 01:08 1
-rw-r--r--. 1 root root 0 Apr 25 01:08 2
-rw-r--r--. 1 root root 0 Apr 25 01:08 3
[root@localhost upload]# rm -rf 1  可以刪除和創建,權限是rw
[root@localhost upload]# touch 4
[root@localhost upload]# ll
total 0
-rw-r--r--. 1 root root 0 Apr 25 01:08 2
-rw-r--r--. 1 root root 0 Apr 25 01:08 3 
-rw-r--r--. 1  210  210 0 Apr 25 01:39 4  並且創建後顯示的uid和gid是210

[root@localhost upload]# cd ..
[root@localhost nfs]# cd tom  #進入tom目錄進行測試,root用戶無法進入tom目錄
-bash: cd: tom: Permission denied
[root@localhost nfs]# useradd -u 2222 tom    #創建用戶tom,uid值需要和服務端創建的id值相同
[root@localhost nfs]# su - tom
[tom@localhost ~]$ cd /nfs/tom/  #通過tom用戶測試,成功
[tom@localhost tom]$ ll
total 0
[tom@localhost tom]$ touch 1   #創建文件,不可,只有tom用戶可以查看,僅可查看
touch: cannot touch ‘1’: Read-only file system
[tom@localhost tom]$ id tom
uid=2222(tom) gid=2222(tom) groups=2222(tom)

太平年代,很少有人生絕境。社會的每個角落,看得到自暴自棄,也看得到向光而行的生命力。

如果你也喜歡這篇文章,就給博主點個贊吧!

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