一、NFS百科
NFS,是Network File System的简写,即网络文件系统。网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。(百度百科)
NFS由SUN公司开发,目前有三个版本,分别为NFSv2,NFSv3,NFSv4。
NFSv2是一个老版本,被众多系统支持,因此兼容性很好。
NFSv3做了一些改进,其中包括,更快的速度,支持更大的单个文件,更多便于排错的信息及成果信息反馈,以及对于TCP协议的支持。
NFSv4提供了有状态的连接,更容易追踪连接状态,增强了安全性。
CentOS6.x默认使用版本4提供NFS网络文件系统共享服务。CentOS 6.x系统由rpcbind服务提供RPC协议的支持,目前NFSv4虽然已经不再需要与rpmbind直接交互,但rpm.mount依然是NFSv4所必须的服务。所以,如果在CenOS 6.x 实现NFS共享,需要启动NFS与rpmbind服务。(所需软件包括nfs-utils、rpcbind)
NFS默认监听在TCP 2049端口。
NFS工作原理图
图示说明:portmap为CentOS 5.x系列的服务进程,对应CentOS 6.x系列的rpcbind
二、配置文件说明/etc/export
1.每个共享的文件系统需要独立一行条目
2.配置文件中支持通配符。
3.语法格式
共享路径 客户端主机1(权限) 客户端主机2(权限)---可选
三、客户端主机权限说明
NFS选项 | 功能描述 |
ro |
只读 |
rw | 读写 |
sync | 同步写操作 |
async | 异步写操作 |
wdelay | 延迟写操作 |
root_squash | 屏蔽远程root权限 |
no_root_squash | 不屏蔽远程root权限 |
all_squash | 屏蔽所有的远程用户权限 |
权限说明:
1. sync在确保数据真正写入存储设备后才返回成功信息。而async是在没有完全把数据写入存储之前就返回成功信息给客户端,此时的数据实际还存放在内存中。
2. wdelay 决定了先将数据写入内存,再写入磁盘,然后将多个写入请求合并后写入磁盘。这样可以减少对磁盘IO的次数,从而优化性能。但有可能造成非正常关闭NFS时丢失数据。
而no_wdelay恰恰相反。但是该选项与async一起使用时将不会生效。因为async是基于wdelay实现对客户端的一种响应功能。
3. NFS默认会屏蔽root用户的权限,root_squash会自动将root映射到本地匿名账户,通过anounuid可以指定匿名账户ID,默认ID为65534,也就是nfsnobody账户。
no_root_squash可以防止上述映射而保留root权限。all_squash可以屏蔽所有账户权限,将用户对NFS的访问映射为服务器本地的匿名账户。默认情况下,普通账户的权限是保留的,也就是没有进行squash屏蔽操作。
四、实施案例
需求:某linux校区需要建立自己的共享文件中心。目录规划如下:
/data/shell 教师专用,用来存放教师资源:shell练习脚本,学生待发作业等.
/data/soft 学生专用,用来存放学生实验所需软件,以及课后习题。
一、实验环境:
系统版本:CentOS 6.4
NFS Server:192.168.0.96
NFS Client: 192.168.0.97(老师) 192.168.1.33(学生)
教师及学校DMZ区网段:192.168.0.0/24
学生网段:192.168.1.0/24
二、部署
NFS Server端部署
1.安装nfs服务端程序
[root@NFS-Server ~]# yum -y install nfs-utils rpcbind [root@NFS-Server ~]# rpm -qa|grep nfs-utils nfs-utils-lib-1.1.5-6.el6.x86_64 nfs-utils-1.2.3-39.el6.x86_64 [root@NFS-Server ~]# rpm -qa|grep -E "nfs-utils|rpcbind" rpcbind-0.2.0-11.el6.x86_64 nfs-utils-lib-1.1.5-6.el6.x86_64 nfs-utils-1.2.3-39.el6.x86_64 [root@NFS-Server ~]# mkdir -p /data/{shell,soft}
2. 编辑配置文件
[root@NFS-Server ~]# cat /etc/exports #Teachers source and power /data/shell 192.168.0.*(rw,no_root_squash,sync) #Students source and power /data/soft 192.168.1.*(ro,root_squash,async) 192.168.0.*(rw,no_root_squash,sync)
3. 启动nfs服务
[root@NFS-Server ~]# /etc/init.d/rpcbind start Starting rpcbind: [ OK ] [root@NFS-Server ~]# /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ] #注意启动顺序,如果顺序反了,会有如下提示 [root@NFS-Server ~]# /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS mountd: [FAILED] Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused) rpc.nfsd: unable to set any sockets for nfsd [FAILED]
4. 创建测试资源
[root@NFS-Server ~]# cd /data/soft/ [root@NFS-Server soft]# touch httpd.tar.gz [root@NFS-Server soft]# cd ../shell/ [root@NFS-Server shell]# touch useradd.sh
NFS Client-Teacher端访问资源
1. 查询服务端共享信息
[root@NFS-Teacher ~]# showmount -e 192.168.0.96 Export list for 192.168.0.96: /data/soft 192.168.0.*,192.168.1.* /data/shell 192.168.0.*
2. 创建本地挂载点,并挂载
[root@NFS-Teacher ~]# mkdir -p /data/{shell,soft} [root@NFS-Teacher ~]# mount 192.168.0.96:/data/soft /data/soft [root@NFS-Teacher ~]# mount 192.168.0.96:/data/shell /data/shell [root@NFS-Teacher ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 9.7G 1.5G 7.7G 17% / tmpfs 116M 0 116M 0% /dev/shm /dev/sda1 194M 26M 159M 14% /boot 192.168.0.96:/data/soft 9.7G 4.2G 5.0G 46% /data/soft 192.168.0.96:/data/shell 9.7G 4.2G 5.0G 46% /data/shell
3. 查看本地是否存在测试资源
[root@NFS-Teacher ~]# ls /data/*/* /data/shell/useradd.sh /data/soft/httpd.tar.gz
4. 测试权限匹配问题
[root@NFS-Teacher ~]# cd /data/soft/ [root@NFS-Teacher soft]# touch nginx.tar.gz [root@NFS-Teacher soft]# touch ../shell/nginx_status.sh [root@NFS-Teacher soft]# ls /data/*/* /data/shell/nginx_status.sh /data/shell/useradd.sh /data/soft/httpd.tar.gz /data/soft/nginx.tar.gz
5.实现开机自动挂载/etc/fstab(不建议你这样做,因为如果写到fstab里,而NFS服务器端或者因为网络问题连接异常,可能导致无法开机。)
[root@NFS-Teacher soft]# grep -Ev "^#|^$" /etc/fstab UUID=d20dea81-455b-4d96-a986-9282054d2885 / ext4 defaults 1 1 UUID=34dcffb0-1454-458e-879c-3aeaf9d6c83a /boot ext4 defaults 1 2 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 192.168.0.96:/data/shell /data/shell nfs defaults 0 0 192.168.0.96:/data/soft /data/soft nfs defaults 0 0
上述的挂载方法最好可以写
[root@localhost ~]# mkdir /data/{shell,soft} [root@localhost ~]# mount 192.168.0.96:/data/soft /data/soft [root@localhost soft]# mount 192.168.0.96:/data/shell /data/shell mount: 192.168.0.96:/data/shell failed, reason given by server: Permission denied
到rc.local里,这样更为方便
[root@NFS-Teacher soft]# grep -Ev "^#|^$" /etc/rc.local touch /var/lock/subsys/local mount 192.168.0.96:/data/soft /data/soft mount 192.168.0.96:/data/shell /data/shell
NFS Client-Student端访问资源
1. 查询服务端共享信息
[root@localhost ~]# showmount -e 192.168.0.96 Export list for 192.168.0.96: /data/soft 192.168.0.*,192.168.1.* /data/shell 192.168.0.*
2. 创建本地挂载点,并挂载
[root@localhost ~]# mkdir /data/{shell,soft} [root@localhost ~]# mount 192.168.0.96:/data/soft /data/soft [root@localhost soft]# mount 192.168.0.96:/data/shell /data/shell mount: 192.168.0.96:/data/shell failed, reason given by server: Permission denied
# 报错原因分析:NFS服务端exports文件中,shell仅仅共享到教师网段192.168.0.0/24,因此会提示Permission Deny信息。
# 另外需要注意的是:如果你的客户端是centos5.x系列,那么需要提前开启portmap服务,否则会提示如下错误:
[root@localhost ~]# mount 192.168.0.96:/data/soft /data/soft mount.nfs: Input/output error
3. 测试权限
[root@localhost soft]# touch update.sh touch: cannot touch `update.sh‘: Read-only file system
# 报错原因分析:exports中定义了ro只读权限,因此客户端只有不具备write权限。上述报错为正常现象
至此,NFS整个搭建流程结束。
有些时候我们可能遇到这样的情况,就是某个挂载点目录已经不需要了,需要卸载,但是出现如下情况:
[root@localhost ~]# umount /data/soft/ umount: /data/soft: device is busy umount: /data/soft: device is busy
解决方法如下:
第一种: [root@localhost ~]# umount /data/soft/ umount: /data/soft: device is busy 解决方法: [root@localhost ~]# fuser -m -v /data/soft/ USER PID ACCESS COMMAND /data/soft/: root 13268 ..c.. bash [root@localhost ~]# kill -9 13268 [root@localhost ~]# umount /data/soft/ 第二种: [root@localhost ~]# fuser -km /data/soft/ /data/soft/: 13448c [root@localhost ~]# umount /data/soft/ 第三种: [root@localhost ~]# umount -lf /data/soft/
最犀利的是第三种方法,灰常灰常经典,一条命令解决。在这里特别感谢“老男孩老师”的倾囊相授!老师的博文地址:http://oldboy.blog.51cto.com
欢迎大家点击学习老师的技术,更重要的是思想。
另外补充一些NFS的相关命令知识
1. NFS文件系统的挂载
# mount -t nfs -o 选项 $IP:$DIR $LOCALDIR
选项:
Intr:当服务器宕机时,允许中断NFS请求
nfsvers=version:指定使用哪个版本的NFS协议,version可以是2,3 ,4
noacl:关闭ACL,仅与老版本系统兼容时使用
nolock:关闭文件锁机制,仅用来连接老版本NFS服务器
noexec:在挂载的文件系统中屏蔽可执行的二进制程序
port=num:指定NFS服务器端口号
rsize=num:设置最大数据块大小,调整NFS读取数据的速度.单位为字节
wsize=num:设置最大数据块大小,调整NFS写入数据的速度.单位为字节
tcp:使用tcp协议挂载
udp:使用udp协议挂载
2. NFS服务相关的几个命令
1)、exportfs 命令
-r 重新读取/etc/exports
-a 全部共享或者全部取消共享
-u 取消共享,与-a一起使用可以取消全部共享文件系统
-v 显示详细信息
2)、nfsstat 查看NFS共享状态
-s,--server 默认显示服务器端与客户端状态,使用该参数后将仅显示服务器端状态
-c,--client 仅显示客户端状态
-n,--nfs 仅显示NFS状态,默认显示NFS与RPC状态
-n n为数字2,3,4,仅显示NFS版本为n的状态细细ni
-m 显示挂载信息
-l 以列表形式显示信息
本文参考了百度百科,《linux运维之道》,请尊重技术人员版权远,每次声明出自哪儿,这样让人家原作者心里也舒服,毕竟他传授过你知识,算的上是一位前辈,一位老师了。
如有不明白的地方,欢迎留言一起探讨,本人也是很菜的一只鸟儿。
本文出自 “技术成就未来” 博客,请务必保留此出处http://jishuweiwang.blog.51cto.com/6977090/1390579