如何搭建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)

太平年代,很少有人生绝境。社会的每个角落,看得到自暴自弃,也看得到向光而行的生命力。

如果你也喜欢这篇文章,就给博主点个赞吧!

猜你喜欢

转载自blog.csdn.net/qq_42707739/article/details/105718966
今日推荐