NFS:网络文件系统
网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(pressentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。是当前主流异构平台共享文件系统之一,主要应用在UNIX环境下。最早是由Sun Microsystems开发,现在能够支持在不同类型的系统之间通过网络进行文件共享,广泛应用在FreeBSD、SCO、Solaris等异构操作系统平台,允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,使得每个计算机的节点能够像使用本地资源一样方便地使用网上资源。换言之,NFS可用于不同类型计算机、操作系统、网络架构和传输协议运行环境中的网络文件远程访问和共享。
NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC采用了XDR的支持。XDR是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。
NFS的工作原理是使用客户端/服务器(C/S)架构,由一个客户端程序和服务器程序组成。服务器程序向其他计算机提供对文件系统的访问,其过程称为输出。NFS客户端程序对共享文件系统进行访问时,把它们从NFS服务器中“输送”出来。文件通常以块为单位进行传输。其大小是8KB(虽然它可能会将操作分成更小尺寸的分片)。NFS传输协议用于服务器和客户机之间文件访问和共享的通信,从而使客户机远程地访问保存在存储设备上的数据。
网络文件系统(NFS)是文件系统之上的一个网络抽象,来允许远程客户端以与本地文件系统类似的方式,来通过网络进行访问。虽然 NFS 不是第一个此类系统,但是它已经发展并演变成 UNIX系统中最强大最广泛使用的网络文件系统。NFS 允许在多个用户之间共享公共文件系统,并提供数据集中的优势,来最小化所需的存储空间。
特点
- 提供透明文件访问以及文件传输
- 容易扩充新的资源或软件,不需要改变现有的工作环境
- 高性能,可灵活配置
- 实验环境
- NFS server 192.168.10.2 CentOS7.5 共享目录 /data/nfs_rw /data/nfs_ro
- Client 192.168.10.6
- 首先 在 server10.2 上安装配置 NFS
- 使用 yum 方式安装 NFS
- yum -y install nfs-utils
- 编辑 NFS 配置文件 /etc/exports
- vim /etc/exports
- /data/nfs_ro 192.168.10.0/24(ro,sync)
/data/nfs_rw 192.168.10.0/24(rw,sync) - /data/nfs_r* 为共享目录
- 192.168.10.0/24 指明那些网段可以访问
- ro 代表只读,rw 代表可以读写
- sync 同步模式,内存中数据时时写入磁盘
- 分别创建共享目录,更改目录的属主属组为 nfsnobody(此用户为安装 NFS后自动创建的用户)
- mkdir /data/nfs_r{o,w} && chown -R nfsnobody:nfsnobody /data/nfs_r*
- 更改目录属性为 777 (即使给予了写入权限,nfs_ro 目录依然只读)
- chmod 777 /data/nfs_r*
- ls -ld /data/nfs_r*
drwxrwxrwx 2 nfsnobody nfsnobody 22 Feb 16 20:45 /data/nfs_ro
drwxrwxrwx 2 nfsnobody nfsnobody 22 Feb 16 20:46 /data/nfs_rw
- 确认无误启动 NFS
- 需要先启动 rpcbind 再启动 NFS
- 使用 showmount -e IP 可以查看共享目录信息
- 查看NFS服务是否向rpc注册端口信息,主端口号是:111
- rpcinfo -p 192.168.10.2
- exportfs命令:在启动了NFS之后又修改了/etc/exports,可以用exportfs命令来使改动立刻生效,该命令格式如下:
exportfs [-aruv] -a :全部mount或者unmount /etc/exports中的内容 -r :重新mount /etc/exports中分享出来的目录 -u :umount 目录 -v :在 export 的時候,将详细的信息输出到屏幕上
- 接下来在 Client 端安装、链接 NFS
- 使用 yum 方式安装 NFS
- 分别创建共享目录
- mkdir /data/nfs_r{o,w}
- Client 端不需要启动 NFS 只需要启动 rpcbind的即可
- systemctl start rpcbind
- 分别挂载共享目录,-t nfs 指明挂载方式为 NFS 共享
- mount -t nfs 192.168.10.2:/data/nfs_ro /data/nfs_ro
- mount -t nfs 192.168.10.2:/data/nfs_rw /data/nfs_rw
- 验证目录的读写权限,nfs_ro目录只能读,不能写入,nfs_rw目录读写正常
-
nfs性能优化
- 在Linux系统中,NFS客户端对于同时发起的NFS请求数量进行了控制,默认编译的内核中此参数值为2
- cat /proc/sys/sunrpc/tcp_slot_table_entries
- 执行以下命令,将同时发起的NFS请求数量修改为128
- echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
echo "options sunrpc tcp_max_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf - sysctl -w sunrpc.tcp_slot_table_entries=128
-
以下是一些 NFS 共享的常用参数:
- ro 只读访问。
rw 读写访问。
sync 资料同步写入到内存与硬盘当中。
async 资料会先暂存于内存当中,而非直接写入硬盘。
secure NFS 通过 1024 以下的安全 TCP/IP 端口发送。
insecure NFS 通过 1024 以上的端口发送。
wdelay 如果多个用户要写入 NFS 目录,则归组写入(默认)。
no_wdelay 如果多个用户要写入 NFS 目录,则立即写入,当使用 async 时,无需此设置。 - hide 在 NFS 共享目录中不共享其子目录。
no_hide 共享 NFS 目录的子目录。
subtree_check 如果共享/usr/bin 之类的子目录时,强制 NFS 检查父目录的权限(默认)。
no_subtree_check 和上面相对,不检查父目录权限。
all_squash 共享文件的 UID 和 GID 映射匿名用户 anonymous,适合公用目录。
no_all_squash 保留共享文件的 UID 和 GID(默认)。
root_squash root 用户的所有请求映射成如 anonymous 用户一样的权限(默认)。
no_root_squash root 用户具有根目录的完全管理访问权限。 -
- 选项使用方法示例:
cat /etc/exports
/tmp/a/no_root_squash *(rw,no_root_squash)
/tmp/a/sync 192.168.0.0/24(rw,sync)
/tmp/a/ro 192.168.1.64(ro)
/tmp/a/all_squash 192.168.0.0/24(rw,all_squash,anonuid=500,anongid=500)
/tmp/a/async 192.168.3.0/255.255.255.0(async)
/tmp/a/rw 192.168.3.0/255.255.255.0(rw) 192.168.4.0/255.255.255.0(rw)
/tmp/a/root_squash *(rw,root_squash) -
NFS 客户端挂载参数的优化:
NFS 高并发环境下的服务端重要优化(mount -o 参数)。
async:异步同步,此参数会提高 I/O 性能,但会降低数据安全(除非对性能要求很高,对数据可靠性不要求的场合。一般生产环境,不推荐使用)。
noatime:取消更新文件系统上的 inode 访问时间,提升 I/O 性能,推荐使用。
nodiratime:取消更新文件系统上的 directory inode 访问时间,提高系统性能。意味着当访问一个文件和目录的时候,access time 都不会更新
intr:可以中断不成功的挂载。
rsize/wsize:读取(rsize)/写入(wsize)的区块大小(block size),这个设置值可以影响客户端与服务端传输数据的缓冲存储量。一般来说,如果在局域网内,并且客户端与服务端都具有足够的内
存,这个值可以设置大一点,比如说 1048576(bytes),提升缓冲区块将可提升 NFS 文件系统的传输能力。但设置的值也不要太大,最好是实现网络能够传输的最大值为限。
-
内核优化:
vim /etc/sysctl.conf 修改/etc/sysctl.conf,在文件最后添加如下。
net.core.wmem_default = 8388608 内核默认写缓存
net.core.rmem_default = 8388608 内核默认读缓存
net.core.rmem_max = 16777216 内核最大读缓存
net.core.wmem_max = 16777216 内核最大写缓存
sysctl -p 使用 sysctl.conf 文件内的参数生效,执行命令输出的结果中的参数代表生效。
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
- 使用命令挂载
- mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072,intr 192.168.1.63:/media /opt
- 或者写到挂载文件里: /etc/fstab
192.168.2.2:/media /mnt nfs noatime,nodiratime,rsize=131072,wsize=131072,intr 0 0