4 文件存储之 NFS
4.1 NFS 简介
4.1.1 NFS 发展史
NFS(Network File System)即网络文件系统,是 FreeBSD 支持的文件系统中的一种,它允许网络中 的计算机之间通过 TCP/IP 网络共享资源。在 NFS 的应用中,本地 NFS 的客户端应用可以透明地读写 位于远端 NFS 服务器上的文件,就像访问本地文件一样。其实大部分的网络文件共享都是基于TCP/IP(更加的安全)的,极有少部分并不是TCP/IP的,例如:TFTP(走的是UDP协议)等。
NFS 最早是由 Sun 公司发展出来的,后被逐渐完整以及整合至 Linux 内核。
4.1.2 NFS 功能
它就是是可以透过网络,让不同的主机、不同的操作系统可以共享存储
4.1.3 NFS 原理
NFS 在文件传送或信息传送过程中依赖于 RPC 协议。远程过程调用 (Remote Procedure Call) 是能使 客户端执行其他系统中程序的一种机制,所以只要用到 NFS 的地方都要启动 RPC 服务,不论是 NFS SERVER 或者 NFS CLIENT 。这样 SERVER 和 CLIENT 才能通过 RPC 来实现 PROGRAM PORT 的对应。可以这么理解 RPC 和 NFS 的关系:NFS 是一个文件系统,而 RPC 是负责数据信息的传输,NFS 本身只是文件数据的控制和配置。
4.1.4 NFS 优点
- 节省本地存储空间,将常用的数据存放在一台 NFS 服务器上且可以通过网络访问,那么本地终端 将可以减少自身存储空间的使用
- 用户不需要在网络中的每个机器上都建有 Home 目录,Home 目录可以放在 NFS 服务器上且可 以在网络上被访问使用
- 一些存储设备 CDROM 和 Zip 等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量
4.1.5 NFS 特点
- NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源
- 在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样
- NFS 适用于Linux与Unix之间实现文件共享,不能实现Linux与Windows间的文件共享功能
- NFS 是运行在应用层的协议,其监听于2049/TCP 和 2049/UDP套接字上
- NFS 服务只能基于IP进行认证
4.2 NFS 安装构建及配置
4.2.1 安装软件包介绍
- nfs-utils:这个是 NFS 服务主程序(包含 rpc.nfsd、rpc.mountd、daemons)
- rpcbind:这个是 CentOS6.X 的 RPC 主程序(CentOS5.X 的为 portmap),是Linux(CentOS / RHEL)内核本身自带的功能。
实验环境:两台服务器
10.10.10.11
10.10.10.12
4.2.2 配置文件 /etc/exports 书写规则
/etc/exports 文件的配置格式为:
-
NFS共享目录 NFS客户端地址1(参数 1,参数 2,参数 3…) 客户端地址 2(参数 1,参数 2,参数 3…) -
NFS共享目录 NFS客户端地址 (参数 1,参数 2,参数 3…) -
- NFS 共享目录: 共享目录是指 NFS 服务器共享给客户机使用的目录
- NFS 客户端: 客户端是指网络中可以访问这个 NFS 共享目录的计算机
- NFS 客户端常用的指定方式:
-
-
- 指定 ip 地址的主机:192.168.0.200
- 指定子网中的所有主机:192.168.88.0
- 指定域名的主机:www.baidu.com
- 指定域中的所有主机:*.baidu.com
- 所有主机:*
在 NFS 配置文件中是按行匹配的,一行就是一个完整的共享,另一行就是另外一个共享,以此类推。
相关的NFS命令
showmount [选项] [参数]
showmount -e ip
showmount -d ip
mount -t nfs ip:/file /file1
4.2.3 共享权限解释
/etc/exports 配置文件参数解释
rw:read-write,可读可写,注意,仅仅这里设置成读写客户端还是不能正常写入,还要正确地设置共享目录的权限 ;
ro:read-only,只读;
sync:文件同时写入硬盘和内存,更加的安全,使用的速度会较慢;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS 客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说, 也拥有 root 权限。显然开启这项是不安全的;
root_squash:NFS 客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说,拥 有匿名用户权限,通常他将使用 nobody 或 nfsnobody 身份 ;
all_squash:不论 NFS 客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
anonuid:匿名用户的 UID 值,通常是 nobody 或 nfsnobody,可以在此处自行设定;
anongid:匿名用户的 GID 值;
哪怕有一点的安全性提升,都需要管理员进行操作提升系统的安全性。
4.2.4 NFS Server 配置(10.10.10.11)
$ yum -y install rpcbind nfs-utils
$ mkdir /nfs1 /nfs2
$ chown -R nobody:nobody /nfs1 /nfs2
$ ls -ld /nfs1 /nfs2
drwxr-xr-x 2 nobody nobody 6 Sep 5 11:02 /nfs1
drwxr-xr-x 2 nobody nobody 6 Sep 5 11:02 /nfs2
$ vim /etc/exports
/nfs1 10.10.10.12(rw,async,no_root_squash)
/nfs2 10.10.10.0/24(ro,async,no_root_squash)
$ systemctl restart nfs && systemctl restart rpcbind
$ systemctl restart nfs
$ showmount -e 10.10.10.11
Export list for 10.10.10.11:
/nfs2 10.10.10.0/24
/nfs1 10.10.10.12
$ cp -a /etc/fstab /nfs1/
$ cp -a /var/log/messages /nfs2/
$ /etc/init.d/rpcbind status
LANG=en
$ rpcinfo -p localhost | grep nfs
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
$ lsof –i :111
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 714 rpc 6u IPv4 18451 0t0 UDP *:sunrpc
rpcbind 714 rpc 8u IPv4 18455 0t0 TCP *:sunrpc (LISTEN)
rpcbind 714 rpc 9u IPv6 18456 0t0 UDP *:sunrpc
rpcbind 714 rpc 11u IPv6 18458 0t0 TCP *:sunrpc (LISTEN)
4.2.5 NFS Client 配置(10.10.10.12)
$ showmount -e 10.10.10.11
Export list for 10.10.10.11:
/nfs2 10.10.10.0/24
/nfs1 10.10.10.12
$ mkdir -pv /nfs1 /nfs2
$ chown -R nobody:nobody /nfs1 /nfs2
$ mount -t nfs 10.10.10.11:/nfs1/ /nfs1/
$ mount -t nfs 10.10.10.11:/nfs2/ /nfs2/
$ ls -l /nfs1 /nfs2
/nfs1:
total 4
-rw-r--r-- 1 root root 583 Sep 5 11:11 fstab
/nfs2:
total 824
-rw------- 1 root root 841478 Sep 5 11:06 messages
$ mount | grep nfs
10.10.10.11:/nfs1 on /nfs1 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.12,local_lock=none,addr=10.10.10.11)
10.10.10.11:/nfs2 on /nfs2 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.12,local_lock=none,addr=10.10.10.11)
$ cat /nfs1/fstab
$ echo "Hello NFS FileSystem" > /nfs1/test.txt
$ cat /nfs1/test.txt
Hello NFS FileSystem
$ cat /nfs2/messages
$ echo "Hello NFS FileSystem" > /nfs2/test.txt
-bash: /nfs2/test.txt: Read-only file system
$ umount 挂载点
$ exportfs -au
$ vim /etc/fstab
10.10.10.11:/nfs1 /nfs1 nfs defaults 0 0
$ mount -a
$ reboot
...
$ mount | grep nfs
10.10.10.11:/nfs1 on /nfs1 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.12,local_lock=none,addr=10.10.10.11)
4.2.6 NFS 相关命令介绍
4.2.6.1 exportfs 命令
管理NFS共享文件系统列表
补充说明
exportfs 命令用来管理当前NFS共享的文件系统列表。
参数:
-a 打开或取消所有目录共享。
-o options,...指定一列共享选项,与 exports(5) 中讲到的类似。
-i 忽略 /etc/exports 文件,从而只使用默认的和命令行指定的选项。
-r 重新共享所有目录。它使 /var/lib/nfs/xtab 和 /etc/exports 同步。
它将 /etc/exports 中已删除的条目从 /var/lib/nfs/xtab 中删除,将内核共享表中任何不再有效的条目移除。
-u 取消一个或多个目录的共享。
-f 在“新”模式下,刷新内核共享表之外的任何东西。 任何活动的客户程序将在它们的下次请求中得到 mountd添加的新的共享条目。
-v 输出详细信息。当共享或者取消共享时,显示在做什么。 显示当前共享列表的时候,同时显示共享的选项。
4.2.6.2 showmount 命令
显示NFS服务器加载的信息
补充说明
showmount命令 查询“mountd”守护进程,以显示NFS服务器加载的信息。
语法
showmount(选项)(参数)
选项
-d:仅显示已被NFS客户端加载的目录;
-e:显示NFS服务器上所有的共享目录。
参数
NFS服务器:指定NFS服务器的ip地址或者主机名。
|