运维基础-存储03 NFS

1、NFS简介

  • 网络文件系统(NFS,Network File System),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),用户和程序可以像访问本地文件一样访问远端系统上的文件,使得每个计算机的节点能够像使用本地资源一样方便地使用网上资源。
  • NFS可用于不同类型计算机、操作系统、网络架构和传输协议运行环境中的网络文件远程访问和共享。广泛应用在FreeBSD、SCO、Solaris等异构操作系统平台,允许一个系统在网络上与他人共享目录和文件。

2、NFS的工作原理

1、NFS的架构

  • NFS的工作原理是使用客户端/服务器(C/S)架构,由一个客户端程序和服务器程序组成。
  • 服务器程序向其他计算机提供对文件系统的访问,其过程称为输出。NFS客户端程序对共享文件系统进行访问时,把它们从NFS服务器中“输送”出来。文件通常以块为单位进行传输。其大小是8KB(虽然它可能会将操作分成更小尺寸的分片)。
  • NFS传输协议用于服务器和客户机之间文件访问和共享的通信,从而使客户机远程地访问保存在存储设备上的数据。

2、NFS的组件

1、nfs-utils

  • 因为nfs自身是工作在内核中的,不能自己监听端口,因此需要nfs-utils替它监听端口。
  • 启动nfs-utils的nfs.service服务时会同时启动几个进程:
    • nfsd:(2049/tcp)最主要的NFS进程,管理客户端是否可登录。它和Linux核心一起工作来满足NFS客户端的动态需求。
    • rpc.mountd:(半随机端口)验证NFS客户端的连接请求和管理请求(对文件的操作)。这个进程由NFS服务自动启动,不需要用户的配置。(检查客户端ip地址是否是被允许连接的ip地址,rpc.mountd通过检查/etc/exports文件进行验证
    • rpc.statd:非必要,检查文件一致性,可修复文件。实现了网络状态监控(NSM)RPC协议,通知NFS客户端什么时候一个NFS服务器非正常重启动。这个进程被nfslock服务自动启动,不需要用户的配置
    • rpc.lockd:非必要,管理文件锁,避免同时写出错。它允许NFS客户端在服务器上对文件加锁。这个进程对应于nfslock服务。
    • rpc.rquotad:这个进程对于远程用户提供用户配额信息。这个进程被nfs服务自动启动,不需要用户的配置。

2、rpcbind是什么

  • rpcbind工具可以将RPC程序号码和通用地址互相转换。要让某主机能向远程主机的服务发起RPC调用,则该主机上的rpcbind必须处于已运行状态。
  • 当RPC服务启动后,它会告诉rpcbind它监听在哪个地址上,还会告诉它为服务准备好提供的PRC程序号码。当客户端要向某个给定的程序号码发起RPC调用时,它首先会联系服务端的rpcbind以确定请求应该发送到哪个地址上。
  • rpcbind工具应该在所有RPC管理的服务(rpc service)启动之前启动。一般来说,标准的rpc服务由端口监视器来启动,因此rpcbind必须在端口监视器被调用之前已经启动完成。
  • 当rpcbind工具已经启动后,它会检查特定的name-to-address的转换调用功能是否正确执行。如果失败,则网络配置数据库会被认为过期,由于RPC管理的服务在这种情况下无法正确运行,rpcbind会输出这些信息并终止。

2、安装并启动NFS

1、部署环境

  • 软件版本
    • nfs-utils-1.3.0-0.68.el7.1.x86_64
    • rpcbind-0.2.0-49.el7.x86_64
  • 系统环境
    • NFS服务端:192.168.248.130,CentOS Linux release 7.7.1908 (Core)
    • NFS客户端:192.168.248.131,CentOS Linux release 7.7.1908 (Core)

2、NFS的服务端

1、安装nfs-utils

]# yum install nfs-utils rpcbind    #centos7自带了rpcbind,rpc监听在111端口

2、配置共享

]# vim /etc/exports
/data130/ 192.168.0.0/16(rw)    #将服务器的/data130目录以读写的模式共享给192.168.0.0/16网段的主机
/data/ 192.168.248.131(ro)      #将服务器的/data目录以读写的模式共享给192.168.248.131主机


]# mkdir /data130
]# touch /data130/hh130
]# ll /data130/
-rw-r--r--. 1 root root 0 8月  22 20:43 hh130

3、启动服务

  • 先启动rpcbind.service,再启动nfs.service。
]# systemctl start rpcbind.service
]# systemctl start nfs.service

]# systemctl enable rpcbind.service
]# systemctl enable nfs.service

4、查看共享的信息

]# exportfs -v

3、NFS的客户端

1、安装rpcbind

]# yum install nfs-utils rpcbind    #客户端只安装nfs-utils不启动,方便使用查看命令。

2、启动rpcbind服务

]# systemctl start rpcbind.service

]# systemctl enable rpcbind.service

3、挂载NFS共享

showmount -e NFS_serverIP    #查看服务器输出的共享

]# mkdir /data131
]# mount -t nfs 192.168.248.130:/data130 /data131/

]# ll /data131/
-rw-r--r--. 1 root root 0 8月  22 20:43 hh130

3、NFS的共享配置

  • 文件/etc/exports包含NFS客户端可以访问的NFS服务器上的本地物理文件系统的表。文件的内容由服务器的系统管理员维护。
  • 空行被忽略。"#"是注释。条目可以使用反斜杠跨换行继续。
  • 对该文件更改后,请执行exportfs -ra或重启NFS服务器。

1、共享配置选项说明

  • 配置共享信息的文件
    • /etc/exports
    • /etc/exports.d/*
  • 基本格式
/PATH/TO/SOME_DIR clients1(export_options, ... ) clients2(export_options, ...)

1、NFS客户端(clients)可以通过多种方式指定

  • single host:完全限定域名(FQDN)、IPv4地址或IPv6地址的缩写名称指定主机。IPv6地址不能在/etc/exports中的方括号内,以免与字符类通配符匹配混淆。
  • IP networks:网络中的所有主机。
    • 通过IP/netmask来指定网络,其中netmask可以用点分十进制格式指定,也可以掩码长度指定。例如,'192.168.0.0/255.255.0.0'或'192.168.0.0/16'。
    • IPv6地址必须使用连续的掩码长度,并且不能在方括号内。
  • wildcards:机器名可以包含通配符*和?。例如,*.cs.foo.edu匹配cs.foo.edu域中的所有主机。
  • netgroups:NIS域内的主机组。例如,@group-name
  • anonymous:使用*匹配所有客户端(不要与上面的通配符条目混淆)

2、General Options(一般选项)

  • ro:只允许对这个NFS卷进行读。默认值
  • rw:允许对这个NFS卷进行读写。
  • async:异步。
    • 允许NFS服务器违反NFS协议,并在该请求所做的任何更改提交到稳定存储(例如磁盘驱动器)之前响应请求。
    • 使用此选项通常可以提高性能,但代价是服务器重启不干净(即崩溃)可能导致数据丢失或损坏。
  • sync:同步。
    • 只有在更改提交到稳定存储之后才回复请求。
    • 在nfs-utils到1.0.0的版本中,async选项是默认的。在1.0.0之后的所有版本中,sync是默认的
  • secure:客户端端口小于1024。在默认情况下是开启的。要关闭它,请指定insecure。
  • no_wdelay:
    • 如果同时设置了async,则此选项无效。
    • 默认NFS服务器可能会将多个写请求一起提交到磁盘,这可以提高性能。
    • 如果NFS服务器接收的主要是不相关的小请求,这种行为实际上可能会降低性能,因此可以使用no_wdelay来关闭它。
  • nohide:
    • 通常,如果服务器导出两个文件系统,其中一个被挂载到另一个上,那么客户机必须显式地挂载两个文件系统以获得对它们的访问权。如果它只挂载父文件系统,它将在挂载其他文件系统的地方看到一个空目录。文件系统是“隐藏的”。
    • 在某些情况下,这个选项可能非常有用,但是应该谨慎使用,并且只有在确认客户端系统能够有效地处理可能出现inode号相同的问题之后。

3、User ID Mapping(用户ID映射)

  • root_squash:将root用户映射到匿名用户,即压缩root用户的权限。root用户默认压缩,其他系统用户默认不压缩
  • no_root_squash:不压缩root用户。这个选项主要用于无磁盘客户机。(不安全,能不用就不用)
  • all_squash:将所有的用户映射到匿名用户,即压缩所有用户的权限。相反的选项是no_all_squash(默认)。
  • anonuid and anongid:将压缩的用户映射为此处指定的用户
  • 注意,压缩的是客户端用户在服务端的权限。例如,默认情况下,客户端的root用户,在服务端被压缩成匿名用户。

2、NFS实现共享示例

1、NFS服务端

]# vim /etc/exports

/data1/ 192.168.248.131(ro) 192.168.0.0/16(rw)          #192.168.0.0/16网络的主机可以访问/data1/,但192.168.248.131只能读取, 其余的可读可写
/data2/ 192.168.0.0/16(rw)                              #192.168.0.0/16网络的主机可以访问/data2/,且可读可写
/data3/ 192.168.0.0/16(rw,root_squash)                  #192.168.0.0/16网络的主机可以访问/data3/,且可读可写,显示定义压缩root用户权限
/data4/ 192.168.0.0/16(rw,no_root_squash)               #192.168.0.0/16网络的主机可以访问/data4/,可读可写,且不压缩root用户权限
/data5/ 192.168.0.0/16(rw,anonuid=1100,anongid=1100)    #192.168.0.0/16网络的主机可以访问/data4/,压缩所有用户的权限到指定的用户

]# exportfs -ra    #重新导出所有文件系统

]# exportfs -v     #查看共享详情
/data1  192.168.248.131(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
/data1   192.168.0.0/16(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/data2   192.168.0.0/16(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/data3   192.168.0.0/16(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/data4   192.168.0.0/16(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/data5   192.168.0.0/16(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash,anonuid=1100,anongid=1100)

2、NFS客户端

  • 挂载nfs的mount命令
mount -t nfs NFS_SERVER:/path/to/share /path/to/mount_point [-rw] [-o options]

示例1:只读和读写共享

###服务端,192.168.248.130
/data1/ 192.168.248.131(ro) 192.168.0.0/16(rw)

]# ll -d /data1
drwxr-xrwx. 2 root root 25 8月  24 20:43 /data1

###客户端,192.168.248.131
]# mount -t nfs 192.168.248.130:/data1/ /data1/
]# touch /data1/root131.txt
touch: 无法创建"/data1/root131.txt": 只读文件系统

###客户端,192.168.248.128
]# mount -t nfs 192.168.248.130:/data1/ /data1/
]# touch /data1/root128.txt

###服务端,192.168.248.130
]# ll /data1
-rw-r--r--. 1 nfsnobody nfsnobody 0 8月  24 20:43 root128.txt

示例2:不压缩和不压缩root用户权限

###服务端,192.168.248.130
/data3/ 192.168.0.0/16(rw,root_squash)
/data4/ 192.168.0.0/16(rw,no_root_squash)

]# ll -d /data3
drwxr-xr-x. 2 root root 6 8月  24 17:10 /data3
]# ll -d /data4
drwxr-xr-x. 2 root root 6 8月  24 17:10 /data4

###客户端,192.168.248.131
]# mount -t nfs 192.168.248.130:/data3 /data3
]# mount -t nfs 192.168.248.130:/data4 /data4

]# touch /data3/root131.txt
touch: 无法创建"/data3/root131.txt": 权限不够
]# touch /data4/root131.txt

###服务端,192.168.248.130
]# ll /data3
]# ll /data4
-rw-r--r--. 1 root root 0 8月  24 21:10 root131.txt

示例3:压缩的映射指定用户

###服务端,192.168.248.130
/data5/ 192.168.0.0/16(rw,anonuid=1100,anongid=1100)    #压缩的映射到1100的用户上,root用户默认压缩,其他用户默认不压缩。

]# ll -d /data5
dr-xr-xrwx. 2 root root 67 8月  24 17:41 /data5

###客户端,192.168.248.131
]# mount -t nfs 192.168.248.130:/data5 /data5

[root@localhost ~]# touch /data5/root131.txt
[centos72@localhost ~]$ touch /data5/centos131.txt

###服务端,192.168.248.130
[root@localhost ~]# ll  /data5
-rw-rw-r--. 1 centos71 centos71 0 8月  24 21:20 centos131.txt
-rw-r--r--. 1 hh1100   hh1100   0 8月  24 21:18 root131.txt    #用户hh1100的uid是1100

4、NFS 的档案访问权限

1、权限

  •  客户端拥有的权限是三者的交集:客户端的挂载时设定的权限、服务端共享的权限、客户端用户映射到服务端用户的权限。

2、用户映射

  • 服务器端会以客户端的使用者UID与GID等身份来尝试读取服务器端的文件系统。
  • 文件系统的inode所记录的属性为UID,GID而非账号与群组名。那一般Linux主机会主动的以自己的/etc/passwd,/etc/group来查询对应的使用者、组名。

客户端用户映射到服务端时,会有一下几种情况:

  • (1)客户端和服务端有相同的用户和组:
    • 客户端用户可以直接对服务器所提供的文件系统进行存取。
    • 例如,客户端有uid等于1101,用户名是hh0的用户;服务端也有uid等于1101,用户名是hh0的用户。
  • (2)客户端和服务端有相同的UID,但用户名不同:
    • 客户端用户可以存取服务端具有相同UID用户的文件,即客户端用户会拥有服务端相同UID用户的权限。
    • 例如,客户端有uid等于1102,用户名是hh2的用户;服务端也有uid等于1102,但用户名是hh1的用户。
  • (3)客户端用户的UID在服务端没有相同的UID:
    • 客户端用户会被压缩成匿名用户。
    • 早期的Linux匿名用户的UID是65534,用户名是nobody。CentOS的匿名用户的用户名是nfsnobody。
    • 例如,客户端有uid等于1103,用户名是hh3的用户;但服务端没有uid等于1103的用户。
  • (4)客户端用户是root用户时:
    • 每个Linux主机都有的UID为0的root。默认情况下,root用户会被压缩成匿名用户。

示例:

###服务端,192.168.248.130
/data10/ 192.168.0.0/16(rw)

]# ll -d /data10
drwxr-xrwx. 2 root root 71 8月  25 10:09 /data10

]# su -c 'touch /data10/sroot.txt' root
]# su -c 'touch /data10/shh1.txt' hh1
]# su -c 'touch /data10/shh2.txt' hh2
]# su -c 'touch /data10/shh3.txt' hh3

###客户端,192.168.248.131
]# su -c 'touch /data10/chh1.txt' hh1
]# su -c 'touch /data10/chh2c.txt' hh2c
]# su -c 'touch /data10/chh4.txt' hh4
]# su -c 'touch /data10/croot.txt' root


###查看/data10目录的内容###
###服务端,192.168.248.130
]# ll  /data10
-rw-r--r--. 1 hh1       hh1       0 8月  25 10:38 chh1.txt
-rw-r--r--. 1 hh2       hh2       0 8月  25 10:38 chh2c.txt
-rw-r--r--. 1      1104      1104 0 8月  25 10:38 chh4.txt    #服务端没有uid等于1104的用户
-rw-r--r--. 1 nfsnobody nfsnobody 0 8月  25 10:37 croot.txt   #客户端的root用户被压缩成匿名用户
-rw-r--r--. 1 hh1       hh1       0 8月  25 10:09 shh1.txt
-rw-r--r--. 1 hh2       hh2       0 8月  25 10:09 shh2.txt
-rw-r--r--. 1 hh3       hh3       0 8月  25 10:09 shh3.txt
-rw-r--r--. 1 root      root      0 8月  25 10:08 sroot.txt

###客户端,192.168.248.131
]# ll /data10
-rw-r--r--. 1 hh1       hh1       0 8月  25 10:38 chh1.txt
-rw-r--r--. 1 hh2c      hh2c      0 8月  25 10:38 chh2c.txt    #uid等于1102的用户,客户端是hh2c,服务端是hh2
-rw-r--r--. 1 hh4       hh4       0 8月  25 10:38 chh4.txt     #uid等于1104的用户,客户端是hh4,服务端没有
-rw-r--r--. 1 nfsnobody nfsnobody 0 8月  25 10:37 croot.txt    #客户端的root用户被压缩成匿名用户
-rw-r--r--. 1 hh1       hh1       0 8月  25 10:09 shh1.txt
-rw-r--r--. 1 hh2c      hh2c      0 8月  25 10:09 shh2.txt
-rw-r--r--. 1      1103      1103 0 8月  25 10:09 shh3.txt     #uid等于1103的用户,客户端没有
-rw-r--r--. 1 root      root      0 8月  25 10:08 sroot.txt    #服务端的root在客户端还是root

3、解决用户名映射不一致

  • 服务端和客户端有相同的uid和gid,若对应的用户名和组名不同,将各自解析(显示)对应的用户名和组名。

1、NIS

  • NIS(Network Information Service,网络信息服务)
  • NIS简化了UNIX和LINUX桌面客户的管理工作,客户端利用它可以使用中心服务器的管理文件。
  • 桌面系统的用户无需建立他们自己的/etc/passwd,他们只简单的使用维护在NIS服务器的文件即可。
  • NIS提供的/etc/passwd,/etc/group以及/etc/hosts等ASCII格式档案的信息,NIS Server会将前述几个ASCII档案内容复制成为DBM数据库格式的档案,当用户藉由个人计算机联机到NIS Client主机尝试登入时,NIS Client将会到NIS Server去查寻该用户的账号与密码,以做为用户登入验证的依据。
  • NIS Server将自己系统内的/etc/passwd,/etc/group,/etc/hosts等制作成为DBM的数据库格式档案;
  • NIS Client若有用户登入的要求时,会前往NIS Server搜寻数据库里面数据做为验证用。
  • 每次更动NIS Server上面的用户数据时,则NIS Server需要重新制作DBM数据库档案!
  • NIS和NFS经常一起使用

2、LDAP

  • LDAP(Lightweight Directory Access Protocol,轻型目录访问协议)
  • windows的域就是使用LDAP协议

3、压缩所有用户

  • 将所有的客户端用户都压缩到服务端的一个用户上。
  • 如果只是为了共享文件,且规模不大,没有必要使用NIS解决ID映射问题。

5、相关命令

1、exportfs命令

  • exportfs管理当前NFS共享的文件系统列表。
  • 用法
exportfs [-v]       #查看nfs的共享详情
exportfs -r [-v]    #重新加载/etc/exports
exportfs [-v] -u [client:/path ..]  
exportfs [-vi] [-o options,..] [client:/path ..]    #忽略/etc/exports文件,使用命令行指定
exportfs -f
  • 选项说明
    • -a:打开或取消所有目录共享。
    • -o options,...:指定一列共享选项,与 exports(5) 中讲到的类似。
    • -i:忽略 /etc/exports 文件,从而只使用默认的和命令行指定的选项。
    • -r:重新读取/etc/exports。取消不在/etc/exports中的共享。
    • -u:取消一个或多个目录的共享。
    • -f:在“新”模式下,刷新内核共享表之外的任何东西。 任何活动的客户程序将在它们的下次请求中得到 mountd 添加的新的共享条目。
    • -v:输出详细信息。当共享或者取消共享时,显示在做什么。 显示当前共享列表的时候,同时显示共享的选项。

示例1获取共享表

exportfs
exportfs -v

示例2共享目录

###编辑/etc/exports,并重读exportfs -r
vim /etc/exports
/data1/ 192.168.0.0/16(rw)
/data2/ 192.168.0.0/16(rw)

###忽略/etc/exports,使用命令行
exportfs -vi 192.168.0.0/16:/data3/

示例3取消共享

###编辑/etc/exports,并重读exportfs -r
vim /etc/exports
/data1/ 192.168.0.0/16(rw)

###使用命令行取消共享
exportfs -v -u 192.168.0.0/16:/data3/

2、showmount命令

  • showmount显示关于NFS服务器文件系统挂载的信息
  • 用法
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
  • 选项
    • -a或--all:以 host:dir 这样的格式来显示客户主机名和挂载点目录。
    • -d或--directories:仅显示被客户挂载的目录名。
    • -e或--exports:显示NFS服务器的输出清单。
    • -h或--help:显示帮助信息。
    • -v或--version:显示版本信。
    • --no-headers:禁止输出描述头部信息。

示例:

showmount -e NFS_serverIP    #在客户端上查看服务器共享信息

3、mount和umount

1、mount

  • 用法
mount [-lhV]
mount -a [选项]
mount [选项] <源> <目录>
mount [-fnrsvw] [-o option[,option]...]  device|dir
  • 选项说明
-h, --help              显示此帮助并退出
-V, --version           显示版本信息并退出

-a, --all               挂载/etc/fstab中的所有文件系统

-t, --types <列表>       指定档案系统的型态,通常不必指定。mount会自动选择正确的型态。
-r, --read-only         以只读方式挂载文件系统(同 -o ro)
-w, --rw, --read-write  以读写方式挂载文件系统(默认)
-o, --options <列表>     挂载选项列表,以英文逗号分隔
-v, --verbose           打印当前进行的操作

示例:

]# mount -a                                        #挂载/etc/fstab中的所有文件系统

]# mount -t nfs 192.168.248.130:/data10 /data10    #挂载

]# mount -lv 192.168.248.130:/data10               #查看192.168.248.130:/data10的信息

2、umount

  • umount卸载文件系统
  • 用法
umount [-hV]
umount [选项] <源> | <目录>
  • 选项
    • -f,--force:强制卸载(遇到不响应的NFS系统时)
    • -l,--lazy:立即断开文件系统,所有清理以后执行
    • -R,--recursive:递归卸载目录及其子对象
    • -r,--read-only:若卸载失败,尝试以只读方式重新挂臷
    • -h,--help:显示此帮助并退出
    • -V,--version:输出版本信息并退出
posted @ 2021-08-22 08:17  麦恒  阅读(227)  评论(0编辑  收藏  举报