Linux运维之NFS网络文件系统

一、实验环境(rhel7.0版本)

主机环境:rhel7.0

各主机信息

主机名IP
server172.25.254.1
client172.25.254.2

 

二、NFS 文件系统的相关概念

 

NFS  这个通过网络共享文件系统的服务在搭建的时候是很简单的,不过,它最大的问题在于“权限”。因为在客户端与服务器端必须具备相同的账号才能够访问某些目录与文件。另外,NFS 的启动需要通过所谓的远程过程调用(RPC),也就是说,我们并不是只要启动  NFS 就可以了,还需要启动 RPC 这个服务才行。

 

1、NFS 概述

 

NFS 就是 Network File System 的缩写,它最大的功能就是可以通过网络,让不同的机器,不同的操作系统可以共享彼此的文件。所以,也可以简单地将它看做是一个文件服务器。这个 NFS 服务器可以让 PC 将网络中的 NFS 服务器共享的目录挂载到本地端地文件系统中,而在本地端的系统中看来,那个远程主机的目录就好像是自己地一个磁盘分区一样,在使用上相当便利。

linux系统和windows系统之间共用的网络文件系统CIFS,主要用于客户端是windows的情况。在linux系统之间,所用的网络文件系统是NFS。

下文将对NFS的一些配置及用法进行介绍。

  • showmount 命令用于查询NFS服务器 
  • showmount   -d    NFS服务器的ip地址      ##仅显示已被NFS客户端挂载的共享目录;
  • showmount   -e    NFS服务器的ip地址      ##显示NFS服务器上所有的共享目录。

 

2、NFS 使用的通信协议是 RPC  Server

 

3、NFS 的服务端口

基本上,NFS 这个服务的端口开在 2049,但是由于文件系统非常复杂,因此 NFS 还有其他的程序去启动额外的端口,但这些额外的端口启动的端口号是什么呢?答案是“不知道”。因为默认  NFS 用来传输的端口是随机选择的,小于 1024 的端口。那客户端怎么知道服务器端使用哪个端口呢?此时就需要用远程过程调用(Remote  Procedure  Call,RPC)协议来辅助了。

 

4、RPC  概述

RPC 最主要的功能就是指定每个 NFS 功能所对应的  port  number,并且通知给客户端,让客户端可以连接到正确的端口上去。那 RPC 又是如何知道每个 NFS 的端口的呢?这是因为当服务器在启动 NFS 时会随机选取数个端口,并主动向 RPC 注册,因此 RPC 可以知道每个端口对应的 NFS 功能。然后 RPC 又是固定使用 port  111 来监听客户端的需求并向客户端响应正确的端口,因此使 NFS 的启动更为便捷了。

请注意,启动 NFS 之前,RPC 就要先启动了,否则 NFS 会无法向 RPC 注册。另外,RPC 若重新启动,原来注册的数据会见了,因此 RPC 重新启动后,它管理的所有服务都需要爱重新启动以重新向 RPC 注册。

当客户端有 NFS 文件访问需求时,它是如何向服务器端请求数据的呢?

  1. 客户端会向服务器端的 RPC(port  111)发出 NFS 文件访问功能的查询需求。
  2. 服务器端找到对应的已注册的  NFS  daemon 端口后,会通知给客户端。
  3. 客户端了解正确的端口后,就可以直接与 NFS daemon 连接。

不论是在客户端还是服务器端,要使用 NFS 时,两者都需要启动 RPC 才行。

 

5、NFS  使用的 daemons

NFS 服务器启动时至少需要两个 daemons,一个管理客户端是否能够登录的问题,一个管理客户端能够取得的权限。如果还想要管理 quota 的话,那么 NFS 还需要再加载其他的 RPC 程序。

 

6、NFS 的文件访问权限

不知道你有没有想过这个问题,假如我们在 NFS  client 上面以 student 这个用户身份去访问 /home/data/sharefile/ 这个来自 NFS  Server 所提供的文件系统,请问 NFS Server 所提供的文件系统会让我们以什么身份去访问?是 student 还是其他什么的?

为什么这么问呢?这是因为 NFS 本身的服务并没有进行用户身份验证,所以,当客户端以 student 的身份想要访问服务器端的文件系统时,服务器端会以客户端的用户 UID 与 GID 等身份来尝试读取服务器端的文件系统。这时产生了一个有趣的问题:如果客户端与服务器端的用户身份并不一致怎么办

当我们以 student (UID  为 1000)这个一般身份用户去访问服务器端的文件时,需要先注意到的是:文件系统的 inode 所记录的属性为 UID、GID,而非账号与属组名。那一般  Linux 主机会主动以自己的 /etc/passwd、/etc/group 来查询对应的用户名、族名。所以当 student 进入到该目录后,会参照 NFS  Client 的用户名与组名。但是由于该目录的文件主要来自  NFS Server,所以可能就会出现以下几种情况。

  • NFS  Server /NFS  Client 刚好有相同的账号与用户组

        此时用户可以直接以 student 的身份访问服务器所提供的共享文件系统。

  • NFS  Server 的 1000 这个 UID 账号对应为 xin

        若 NFS 服务器上的 /etc/passwd 里面 UID 501 的用户名称为 xin,则客户端的 student 可以访问服务器端的  xin 这个用户的文件,只因为两者具有相同的 UID 而已。这就造成很大的问题。

  • NFS  Server 并没有 1000 这个 UID

        此时 student 的身份在该目录下会被压缩成匿名用户,一般 NFS 的匿名以嗯户会把 65534 作为其 ID,早期的 Linux distribution 中这个 65534 的账号名称通常是 nobody,Redhat 则取名为 nfsnobody。不过,有时也有特殊情况,例如在服务器端共享 /tmp 的情况下,student 的身份还是会保持 1000,但建立的各项数据在服务器端来看,就会属于无属主的数据。

  • 如果用户身份是 root

        在默认的情况下,root 的身份会被主动压缩成为匿名用户。

 

7、NFS 所需软件及其软件结构

 

(1)所需软件

  1. RPC 主程序:rpcbind
  2. NFS 主程序:nfs-utils

 

(2)软件结构

  • 主要配置文件:/etc/exports

        这个文件就是 NFS 的主要配置文件。不过,系统并没有默认值,所以这个文件不一定会存在,可能必须要使用 vim 主动地建立起这个文件

  • NFS 文件系统维护命令:/usr/sbin/exportfs

        这个是维护 NFS 共享资源地命令,我们可以利用这个命令重新共享 /etc/exports  更新地目录资源、将 NFS Server 共享地目录卸载或重新共享等,这是 NFS 系统里面相当重要地一个命令。

  • 共享资源的日志文件:/var/lib/nfs/*tab

        在 NFS 服务器中,日志文件都放置到 /var/lib/nfs 目录中,在该目录下有两个比较重要的日志文件,一个是 etab,主要记录了 NFS 所共享出来的目录的完整权限设置值;另一个是 xtab,则记录了曾经链接到此 NFS 服务器地相关客户端数据。

  • 客户端查询服务器共享资源的命令:/usr/sbin/showmount

        这是另一个重要的 NFS 命令。exportfs 用在 NFS Server 端,而 showmount 则主要在 client 端。这个 showmount 可以用来查看  NFS 共享出来的目录资源。

 

8、/etc/exportfs 配置文件的语法与参数

NFS  服务器的搭建很简单,你只要编辑好主要配置文件 /etc/exportfs 之后,先启动 rpcbind (若已经启动了,就不需要重新启动),然后再启动 nfs ,NFS 就成功了。不过这样的设置能否对客户端生效?那就需要考虑权限方面的配置能力了。

[root@server ~]# vim /etc/exports
[共享目录]     [主机名(权限)]

主机名的设置主要有以下几种方式:

  1. 可以使用完整的 IP 或者是网络号,例如 192.168.100.10 或 192.168.100.0/24,或 192.168.100.0/255.255.255.0 都可以接受。
  2. 可以使用主机名,但这个主机名必须要在 /etc/hosts 内,或可使用 DNS 找到该名称才行。反正重点是可找到 IP 就行。如果是主机名的话,那么可以支持通配符,例如“*”或“?”均可接受。

至于权限方面(就是小括号内的参数),常见的参数如下表所示:

参数值内容说明

rw

ro

该目录共享的权限是可读写(read-write)或只读(read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。

sync

async

sync 代表数据会同不写入到内存或硬盘中,async 则代表数据会暂存于内存当中,而非直接写入硬盘。

no_root_squash

root_squash

客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?默认的情况下,客户端 root 的身份会由  root_squash 的设置压缩成 nfsnobody,如此对服务器的系统会较有保障。但如果想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就需要开放 no_root_squash 才行。
all_squash不论登录 NFS 的用户身份为何,他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody)。

anonuid

anongid

anon 意指 anonymous(匿名用户)前面关于 *_squash 提到的匿名用户的 UID 设置值通常为 nobody(nfsnobody),但是你可以自行设置这个 UID 的值。当然,这个 UID 必须要存在于 /etc/passwd 当中.anonuid 指的是 UID 而 anongid 则是组的 GID。

 

三、NFS 的安装和配置

 

服务端——172.25.254.1:

 

1、安装nfs服务

yum install nfs-utils -y

 

2、开启nfs服务,并设置nfs服务开机自启动

systemctl start nfs-server

systemctl enable nfs-server

 

3、关闭防火墙,并设置防火墙开机不自启动;或者配置防火墙

 

【1】、方法一:关闭防火墙,并设置防火墙开机不自启动

systemctl  stop  firewalld

systemctl  disable  firewalld

 

【2】、方法二:或者对防火墙进行配置(这里的配置比较特殊:对防火墙进行配置时,不仅仅加入nfs服务,还要加入另外三个服务。)

firewall-cmd   --list-all

firewall-cmd  --permanent --add-service=nfs

firewall-cmd  --permanent --add-service=ntp

firewall-cmd  --permanent --add-service=mountd

firewall-cmd  --permanent --add-service=rpc-bind

firewall-cmd --reload

 

4、"vim /etc/exports"。这是编写共享目录的文件,这个文件是空的,需要自己填写。

如下图所示,建立一个共享目录"/xin",在里面建立 三个文件"xinfile{1..3}",

在"/etc/exports"文件中写入"/xin  *(sync,ro)",

表示共享"/xin";"*"表示,所有主机均可使用;(sync)是共享权限为文件同步;ro表示只读。

保存退出后输入"exportfs -rv"刷新,建议不要重启服务,因为重启速度比较慢。

 

 

客户端——172.25.254.2:

 

1、

"showmount   -e   IP"。可以查看这个IP是否有共享文件,

例如输入"showmount   -e   172.25.254.1"就可以看到上述设置的共享目录"/xin"。

 

2、

"mount   172.25.254.1:/xin   /media"。与CIFS网络文件系统不同,NFS不能通过登陆来查看共享内容,只能进行挂载。

 

如何设置开机自动挂载呢?

系统重启之后,可以看到仍然挂载。

 

四、客户端的自动挂载和自动卸载

 

挂载一般是需要手动挂载和取消挂载的,在使用完后需要取消挂载,这无疑增加了操作的复杂程度,如果忘记取消挂载也会占用系统资源,带来麻烦。如果可以自动挂载和取消就可以避免这个问题了。

 

在客户端装载软件可以实现这个功能。"yum install autofs  -y",在客户端安装 autofs 软件可以实现共享目录的自动挂载和自动取消挂载。

 

客户端——172.25.254.2:

 

1、安装软件

yum  install  autofs  -y

 

2、开启autofs服务

"systemctl start autofs",开启这个服务后,会自动生成一个"/net"目录,

"cd /net/172.25.254.1/xin"可以直接看到共享目录。而且也可以看到自动挂载在了这个目录"/net"下。

 

3、自动卸载

cd  退出刚刚的目录(默认停留300秒,之后,自动卸载)

这是由配置文件决定的

 

4、修改自动卸载的时间

 "vim /etc/sysconfig/autofs"。

第13行的"timeout"后面的值表示自动取消挂载的时间,

并重启服务"systemctl  restart  autofs"

如下图所示,将其设置为"3",则表示退出这个目录3秒后自动取消挂载。

 

五、客户端的指定挂载目录和挂载参数

 

客户端的自动挂载不仅仅可以挂载在"/net"下,也可以自己设置目录挂载点。

  • 自动挂载器是一个监视目录的守护进程,并在目标子目录被引用时,自动执行预定义的挂载。
  • 自动挂载器由autofs服务脚本管理。
  • 自动挂载器由auto.master配置文件进行配置,该文件引用了一个按惯例称作/etc/auto.misc。
  • /misc是定义的自动mount的挂载点,/etc/auto.misc里定义了mount的动作。

 

客户端——172.25.254.2:

 

1、

例如欲将共享目录"/xin"挂载在客户端的"/pub/xin/sharedir"目录下(这里需要注意的是,该目录不用自己手动建立,编辑好配置文件之后,重启autofs服务,该目录就会自动建立)。在配置文件"/etc /auto.master"中编辑"/pub/xin     /etc/auto.pub",

如下图所示,"/pub/xin"为目标挂载点的上级目录,"/etc/auto.pub"为记录配置共享目录目标挂载点文件。

 

2、

"vim /etc/auto.pub"。在这个文件中写入"sharedir     172.25.254.1:/xin"这是配置共享目录目标挂载点。

重启服务后,进入"/pub/xin/sharedir"就可以自动挂载了,挂载之后可以利用命令"mount"查看挂载参数(不写参数的时候:默认是rw和vers=4)

离开这个目录3秒之后会自动取消挂载。

可以看到挂载参数:rw,version=4.0

 

3、指定挂载参数

"vim /etc/auto.pub"。在这个文件中写入"sharedir    -ro,vers=3     172.25.254.1:/xin"

重启服务后,进入"/pub/xin/sharedir"就可以自动挂载了,挂载之后可以利用命令"mount"查看挂载参数

当然,也可以只指定一个参数(-ro或者vers=3)

可以看到挂载参数发生了变化。

 

六、NFS 服务之文件权限,文件所有人和所属组及单独指定权限,所有人和所属组

 

1、文件的权限(只有服务端和客户端都指定读写权限时,客户端才能进行读写操作)

 

服务端——172.25.254.1:

 

(1)

配置文件中输入"sync"代表文件同步,还可以输入"rw"代表开启读写权限"ro"表示只读

更多的权限设置可以通过"man 5 exports"查看。

 

(2)修改共享目录本身(/xin)的权限为777

 

客户端(不指定参数默认是:-rw,vers=4)——172.25.254.2:

 

(1)修改自动挂载的参数,使得其为rw(读写挂载),并重启服务生效

 

(2)测试:

如下图所示,客户端在挂载了共享目录后,在其中建立一个文件"file",这个文件的所有人是"nfsnobody",这是NFS的匿名用户。

 

2、文件的所有人和所属组

 

 可以对配置文件做以下设置来改变建立文件的所有人:

 

(1)将文件的所有人改为root

 

服务端——172.25.254.1:(读写权限必须打开,同时保证对目录也有写的权限)

 

【1】、在配置文件中的权限内输入"no_root_squash"

如下图所示,挂载后建立一个文件"file2",可以看到,文件"file2"的所有人和所属组都为root。

 

客户端——172.25.254.2:(读写权限必须打开)

 

【1】、测试:

 

(2)指定文件的所有人(指定所有人的uid,该uid对应的用户可以不存在,不存在时,识别的是uid的数字)

 

服务端——172.25.254.1:(读写权限必须打开,同时保证对目录也有写的权限)

 

【1】、

 在配置文件中的权限内输入"anonuid=xxxx",例如输 入"anonuid=6672"。刷新后挂载,建立文件"client_file3"和目录"client_dir3",在客户端可以看到,文件的所有人为"6672"(因为该uid对应的用户不存在,所以识别为数字),所属组为"nfsnobody"。在服务端,因为student用户组的uid为6672,因此在服务端可以看到文件的所有人为"uid=6672"的student用户。

值的注意的是:必须将 no_root_squash 删除。

 

 

客户端——172.25.254.2:(读写权限必须打开)测试

 

 

服务端——172.25.254.1:(读写权限必须打开,同时保证对目录也有写的权限)查看

 

 

(3)指定文件的所属组

 

在配置文件中的权限内输入"anongid=xxxx",例如输 入"anongid=6666"。刷新后挂载,建立文件"client_file4"和目录"client_dir4",在客户端可以看到,文件的所属组为"6666"(因为没有用户的组的gid为6666,所以识别为数字)。在服务端可以看到文件的所属组为"6666"(因为没有用户的组的gid为6666)

 

服务端——172.25.254.1:(读写权限必须打开,同时保证对目录也有写的权限)

 

 

客户端——172.25.254.2:(读写权限必须打开)测试

 

 

服务端——172.25.254.1:(读写权限必须打开,同时保证对目录也有写的权限)查看

 

 

(4)同时指定文件的所有人和所属组

 

在配置文件中的权限内输入"anonuid=xxxx,anongid=xxxx",例如输入"anonuid=6672,anongid=6673"。 刷新后挂载,建立文件"client_file5"和目录client_dir5,在客户端可以看到,文件的所有人为"6672",所有组为"6673"(因为没有用户的uid为6672,所以识别为数字,没有用户的gid为6673,所以识别为数字),在服务端可以看到文件的所有人为"uid=6672"的student用户,所有组为"gid=6673"的xin组。

 

服务端——172.25.254.1:(读写权限必须打开,同时保证对目录也有写的权限)

 

 

客户端——172.25.254.2:(读写权限必须打开)测试

 

 

服务端——172.25.254.1:(读写权限必须打开,同时保证对目录也有写的权限)查看

 

 

3、单独指定权限,所有人和所属组

 

服务端——172.25.254.1:

 

 

客户端1——172.25.254.2:测试

 

 

客户端2——172.25.254.1:测试

 

 

服务端——172.25.254.1:查看

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值