Centos6.4 NFS服务器的搭建
NFS作为一个大家所熟知的共享文件存储系统,伴随了我们的成长,随着公司规模的越来越大,NFS的使用也越来越少更多的是使用分布式来存储数据,但是我们还有很多小的环境是需要NFS的,所以这里还是要记录一下。
一、NFS的介绍
1.1 RPC介绍
http://blog.csdn.net/mindfloating/article/details/39474123
这篇文章讲的RPC还是很详细的,我们这里要知道的就是RPC是用来做远程调用的。
1.2 NFS工作原理
首先nfs服务端要先启用rpc服务,现在Centos 6系列以后,服务器为rpcbind服务。因为nfs是开启一些随机的端口,所以nfs开启的这些端口会在rpc服务里面进行注册。然后客户端通过挂载将nfs共享的目录挂载到本地的一个存在的空目录上面。然后当出现操作的时候,客户端会将请求发送给本地的VFS虚拟文件系统,也就是nfs网络文件系统,通过nfs内核将请求发送给服务端的rpc端口也就是111端口,然后rpc会将服务器nfs对应的端口返回给客户端,然后客户端会再次与nfs服务器的指定端口进行交互。将客户端一系列的open()、read()、write()函数调用传递给服务器,让服务端在本地执行。
二、NFS服务器的搭建
第一步:yum安装软件包
# yum install rpcbind nfs-utils #前者为rpc服务,后者为nfs服务
第二步:启动相关服务
# /etc/init.d/rpcbind start #优先启动rpc服务
# /etc/init.d/nfs restart #后启动nfs服务
第三步:配置相关文件
# cat /etc/exports #这就是nfs的配置文件,只能对ip进行限制,格式为要挂载目录 IP(参数设置)
/share_data 192.168.1.0/24(rw,sync) #,最前面为要挂载的目录,如果允许所有,主机名可以用*代替,并且IP(),中间不能有空格
# /etc/init.d/nfs reload #修改nfs配置,不要重启服务,只需要重新加载便可
#cat /var/lib/nfs/etab #可以通过查看这个配置文件查看详细的设置参数
# chown nfsnobody:nfsnobody /share_data #因为上面配置文件的设置,如果这里不对此共享目录授权,客户端将没有写权限
第四步:客户端挂载测试
# showmount -e 192.168.1.108 #showmount命令为查看,这就将nfs服务端共享的目录以及时权限设置查看出来了
Export list for 192.168.1.108:
/share_data 192.168.1.0/24
# mount -t nfs 192.168.1.108:/share_data /share_data #这是nfs的挂载命令,最后那个目录为我们客户端本地的目录
#通过上述命令我们可以看到目录已经挂载,并且可以进行读写操作,用户属主属组为nfsnobody:nfsnobody
下面是一些NFS共享的常用参数:
博文来自:www.51niux.com
三、NFS相关命令讲解
第一个命令:rpcinfo,rpcinfo实用工具显示那些使用portmap注册的程序的信息,并向程序进行RPC调用,检查它们是否正常运行。
# rpcinfo -p 192.168.1.108 #格式为rpcinfo -p IP或者localhost
program vers proto port service
100000 4 tcp 111 portmapper #rpc的111端口
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 60403 status
100024 1 tcp 45271 status
100011 1 udp 875 rquotad #磁盘配合管理进程
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 40724 mountd #接收客户端的挂载请求,端口半随机,向RPC服务注册使用的
100005 1 tcp 38292 mountd
100005 2 udp 50382 mountd
100005 2 tcp 49288 mountd
100005 3 udp 59166 mountd
100005 3 tcp 43123 mountd
100003 2 tcp 2049 nfs #nfs的主程序,端口是固定的2049
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 41783 nlockmgr #nlockmgr锁机制,当服务器端在编写文档时,禁止客户端的访问
100021 3 udp 41783 nlockmgr
100021 4 udp 41783 nlockmgr
100021 1 tcp 48941 nlockmgr
100021 3 tcp 48941 nlockmgr
100021 4 tcp 48941 nlockmgr
第二个命令:showmount -e IP地址
showmount -a #在服务端上面操作可以查看有哪些客户端挂载信息
第三个命令:exportfs命令
如果修改了/etc/exports文件后不需要重新激活nfs,只要重新扫描一次/etc/exports文件,并且重新将设定加载即可:
# exportfs [-aruv]
参数说明如下。
1)-a:全部挂载(或卸载)/etc/exports文件内的设定。
2)-r:重新挂载/etc/exports中的设置,此外同步更新/etc/exports及/var/lib/nfs/etab中的内容。
3)-u:卸载某一目录。
4)-v:在export时将共享的目录显示在屏幕上。
第四个命令:nfsstat 查看NFS的运行状态,对于调整NFS的运行有很大帮助。
# man netstat #只写出主要的信息
选项
-s,--server
仅打印服务器端统计信息。默认值是同时打印服务器和客户端统计信息。
-c,--client
仅打印客户端统计信息。
-n,-nfs
仅打印NFS统计信息。默认为打印NFS和RPC信息。
-2仅打印NFS v2统计信息。默认值是仅打印有关NFS版本的信息
具有非零计数。
-3只打印NFS v3统计信息。默认值是仅打印有关NFS版本的信息
具有非零计数。
-4仅打印NFS v4统计信息。默认值是仅打印有关NFS版本的信息
具有非零计数。
-m,--mounts
打印有关每个挂接的NFS文件系统的信息。
如果使用此选项,将忽略所有其他选项。
-r,-rpc
仅打印RPC统计信息。
- 设施
显示指定设施的统计信息,其必须为以下之一:
nfs NFS协议信息,由RPC调用拆分。
rpc常规RPC信息。
net网络层统计信息,例如接收到的数据包数量,TCP连接数量等。
fh服务器文件句柄缓存的使用信息,包括查找的总数和
点击和未命中的数量。
rc服务器的请求回复缓存中的用法信息,包括查找的总数和
点击和未命中的数量。
all显示所有上述设施。
-v,-verbose
这相当于-o all。
-l,--list
以列表形式打印信息。
-S,--since文件
而不是打印当前统计信息,nfsstat从文件导入统计信息并显示差异
在这些和当前的统计之间。有效的输入文件可以是/ proc / net / rpc / nfs的形式
(原始客户端统计信息),/ proc / net / rpc / nfsd(原始服务器统计信息)或来自nfsstat本身的保存输出
和/或服务器状态)。保存的nfsstat输出文件中缺少的任何统计信息将被视为零。
-Z [interval],--sleep = [interval]
nfsstat不打印当前统计信息并立即退出,而是拍摄当前的快照
统计和暂停,直到它收到SIGINT(通常来自Ctrl-C),此时它需要另一个
快照并显示两者之间的差异。如果指定interval,nfsstat将打印
自上一个报告以来发出的NFS调用数。每个间隔将重复打印统计数据
秒。
# nfsstat -l -4 #示例
nfs v4 server total: 253
------------- ------------- --------
nfs v4 server null: 4
nfs v4 server compound: 249
nfs v4 servop total: 580
------------- ------------- --------
nfs v4 servop access: 16
nfs v4 servop close: 3
nfs v4 servop getattr: 160
nfs v4 servop getfh: 24
nfs v4 servop lookup: 18
nfs v4 servop open: 52
nfs v4 servop open_conf: 3
nfs v4 servop putfh: 203
nfs v4 servop putrootfh: 13
nfs v4 servop readdir: 5
nfs v4 servop renew: 25
nfs v4 servop restorefh: 3
nfs v4 servop savefh: 36
nfs v4 servop setattr: 3
nfs v4 servop setcltid: 8
nfs v4 servop setcltidconf: 8
第五个命令: nfsiostat
Sysstat家族包括一个名叫nfsiostat的实用程序,它和iostat有诸多类似之处,它允许你监控NFS文件系统上的读写情况,其用法也和iostat类似,最基本的命令用法是跟上几个参数和两个数字,这两个数字分别表示:(1)nfsiostat输出的间隔时间,(2)运行nfsiostat的次数,如果第二个数字留空,nfsiostat会一直执行下去,直到你按下^c停止它。
下面是参数:
选项
-a或--attr
显示与属性高速缓存相关的统计信息
-d或-dir
显示与目录操作相关的统计信息
-h或--help
显示帮助消息和退出
-l LIST或--list = LIST
仅打印第一个LIST装载点的统计信息
-p或--page
显示与页面缓存相关的统计信息
-s或--sort
按ops /秒排序NFS装载点
-version
显示程序的版本号并退出
# nfsiostat -a 1 10 #用法实例,-a显示所有,1秒一次,执行10次
192.168.1.108:/share_data/ mounted on /share_data:
op/s rpc bklog
0.01 0.00
getattr: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms)
0.001 0.000 0.352 0 (0.0%) 0.000 0.000
access: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms)
0.000 0.000 0.000 0 (0.0%) 0.000 0.000
博文来自:www.51niux.com
四、NFS相关防火墙设置
我们一般说的NFS都是关闭防火墙的,但是NFS服务器端会开启一些随机端口,如何固定mountd,nfs,nlockmgr,portmapper,rquotad端服务口并开启防火墙呢?
首先nfs端口为2049,rpc端口为111,这两个服务的端口是固定的,其他三个服务用的是随机端口,我们来者之这三个服务为固定端口。
第一步:# vi /etc/sysconfig/nfs
#RQUOTAD_PORT=875
#LOCKD_TCPPORT=32803
#LOCKD_UDPPORT=32769
#MOUNTD_PORT=892
将上面注释掉的四句话改为下面四句话:
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30003
MOUNTD_PORT=30004
第二步:# /etc/init.d/nfs restart #重启nfs服务
第三步:# rpcinfo -p 查看一下,是否生效
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 30001 rquotad
100011 2 udp 30001 rquotad
100011 1 tcp 30001 rquotad
100011 2 tcp 30001 rquotad
100005 1 udp 30004 mountd
100005 1 tcp 30004 mountd
100005 2 udp 30004 mountd
100005 2 tcp 30004 mountd
100005 3 udp 30004 mountd
100005 3 tcp 30004 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 30003 nlockmgr
100021 3 udp 30003 nlockmgr
100021 4 udp 30003 nlockmgr
100021 1 tcp 30002 nlockmgr
100021 3 tcp 30002 nlockmgr
100021 4 tcp 30002 nlockmgr
第四步:开启防火墙并在客户端测试
# /etc/init.d/iptables start
# mount -t nfs 192.168.1.108:/share_data /share_data #客户端测试 结果连接超时
mount.nfs: Connection timed out
第五步:设置防火墙并在客户端测试
下面是防火墙添加执行的命令:
https://blog.51niux.com/?id=100 #请参考这篇文章在最底部有设置进行设置
# iptables-save>/etc/sysconfig/iptables #让防火墙设置重启后依旧生效
客户端再次挂载测试:
博文来自:www.51niux.com
五、NFS客户端开机自动挂载
第一种方法:设置/etc/fstab
# cat /etc/fstab |grep -v "^#" #更改/etc/fstab文件
UUID=c444367d-596a-434a-afb7-326d236e156a / ext4 defaults 1 1
UUID=e5b8b36d-53f9-480d-86c0-83aa88f74753 /boot ext4 defaults 1 2
UUID=2656bc74-9647-4944-8b20-4c9cd1fc893f swap swap defaults 0 0
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.1.108:/share_data /share_data nfs rw,tcp,intr 0 0 #加入下面这句话
#下面是关于fstab格式的解释:
第一列:是挂载分区或者设备名
第二列:挂载点
第三列:filesystem:磁盘文件系统的格式,包括ext2、ext3、reiserfs、nfs、vfat等
第四列:parameters:文件系统的参数
第五列:能否被dump备份命令作用:dump是一个用来作为备份的命令。通常这个参数的值为0或者1
0:代表不要做dump备份
1:代表要每天进行dump的操作
2: 代表不定日期进行dump的操作
第六列:是否检验扇区:开机的过程中,系统默认会以fsck检验我们系统是否为完整(clean)。
0:不要检查
1:最早检查(一般根目录会选择)
2:1级别检验完成之后进行检验
注:
使用设备名和label及uuid作为标识的不同:
使用设备名称(/dev/sda)来挂载分区时是被固定死的,一旦磁盘的插槽顺序发生了变化,就会出现名称不对应的问题,因为这个名称是会改变的。。以前一台宿主机由于盘符有的做了raid有的没有做raid,后来更换硬盘,盘符名称发送了变化,还做了lvm,当时很恶心。
不过使用label挂载就不用担心插槽顺序方面的问题。不过要随时注意你的Label name。至于UUID,每个分区被格式化以后都会有一个UUID作为唯一的标识号。使用uuid挂载的话就不用担心会发生错乱的问题了。
# blkid /dev/sda1 #可以查看某个盘符的UUID
/dev/sda1: UUID="c000214c-c3df-4fc4-aa48-d8f738623caf" TYPE="ext4"
# dumpe2fs -h /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name: <none> #label name
Last mounted on: /boot #最后的挂载点
Filesystem UUID: c000214c-c3df-4fc4-aa48-d8f738623caf #UUID
第二种方法:添加/etc/rc.local
# vi /etc/rc.local #添加下面两句
#nfs mount
/bin/mount -t nfs 192.168.1.108:/share_data /share_dat
注:
Centos7系统的rc.local发送了变化。把启动的命令添加到:cat /etc/rc.d/rc.local 此文件中,并且还要chmod+x /etc/rc.d/rc.local ,不然配置不生效。
第三种方法:autofs
autofs跟其他的挂载不一样,是需要的时候才会进行挂载,也就是平时不挂载,只有你去cd或者ls之类的去找这个挂载目录的时候,才会预挂载一下。
第一步:安装软件
# yum install autofs -y
第二步:修改配置文件
#vi /etc/auto.master
/- /etc/auto.nfs #这句话意思是要挂载到根下面,并且配置参数的文件为/etc/auto.nfs
# cat /etc/auto.nfs #这个文件是没有的,自行创建
/share_data -fstype=nfs 192.168.1.108:/share_data #挂在目录 挂载文件格式 挂载来源
第三步:# /etc/init.d/autofs restart 启动autofs服务
第四步:测试
先查看一下我们没有cd到哪个挂载目录之前/分区的目录情况
然后我们进行操作之后的状态
注:
# cat /etc/autofs.conf
timeout = 300 #配置文件里面定义了300秒超时
六、windows7挂载NFS
打开控制面板==》程序==》打开和关闭Windows功能
cmd工具查看:
挂载:
注:但是你进入这个挂载盘只可以查看,没有写权限,所以你得对文件夹授予777权限,这样windows机器才能去目录里面进行写入操作,所以你可以在这个挂载盘里面创建一个目录授予777权限,让windows用户进行读写操作。但是这个目录谁都可以修改并删除了,也就不好玩了。
解除挂载:
这篇文章记录的略显简陋,随着技术的进步,现在好多复杂点的地方就用分布式来取代了,所以这里nfs的主从,drbd数据同步之类的,就不在这篇博文中记录了。
nfs就是在一些小规模的web站点集群中做静态资源共享,或者其他一些负载压力不大的情况下,还是比较实用的,一般也用于同一机房中。
nfs的用户是uid的形式,所以如果客户端与服务端的用户uid不一致,可能会造成文件在不同的服务器上面显示的用户名称不一致的情况,所以可能涉及到用统一的身份认证服务器什么的。但是作为一个标准化的运维流程,我们服务集群,每一个节点的用户以及uid都是按照统一规范走的,所以运维一定要规范、统一、标准化,这样会避免很多不必要的麻烦。