Linux NFS
一:概念:
NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
最早由sun公司开发,是类unix系统间实现磁盘共享的一种方法。
缺点:
1:nfs属于本地文件系统,在高并发场景和大存储量下,需要使用分布式存储mfs, FastDFS, tfs(taobao)等。
2:客户端的数据都是通过明文传送。客户端没有用户认证机制,安全性能一般,所以建议一般在局域网内使用。
3:容易发生单点故障,即server服务器宕机所有的客户端都不能访问。
使用场景:web集群中NFS服务器主要用于存储用户上传的信息,方便集群中机器获取用户数据。如图片 附件 头像 视频 音频。
二:工作原理
NFS服务依赖于RPC(Remote Procedure Call)服务。nfsd默认端口2049,实际使用过程中因为需要提供不同的服务,因此NFS启动时还会随机调用系统的空闲端口。在centos5.x中默认调用1024以下端口,centos6.x后默认调用的端口号一般较大,30000以上。因为NFS随机端口的原因所以需要RPC服务来和client端确认传输端口等。
因为NFS服务启动时需要向RPC注册端口信息,所以RPC要在NFS服务启动之前启动。
在NFS server上创建用于共享的目录/data/nfs/,client用mount将/data挂载到自己本地一个目录上,挂载目录可以和/data名称不同。将挂载信息写入本机开机启动文件里 如 /etc/rc.local,客户端无需启动NFS服务,但需要启动RPC服务。
三:实现
主机 |
角色 |
ip |
Redhat6.4 |
NFS server |
192.168.57.132 |
Redhat6.4 |
NFS client |
192.168.57.129 |
|
|
|
1:安装软件
NFS server需要至少安装两个软件nfs-utils 和rpcbind。客户端只要安装rpcbind。
rpm -qa nfs-utils rpcbind
安装完nfs服务一般会自动生成配置文件exports,如果没有就自己创建一个 /etc/exports
2:服务端安装软件
[[email protected] nfs]# rpm -qa nfs-utils rpcbind --我这里使用rpm来查看软件包是否安装了
nfs-utils-1.2.3-36.el6.x86_64
rpcbind-0.2.0-11.el6.x86_64
[[email protected] nfs]# yum install -y nfs-utils rpcbind --如果没有安装使用yum安装,我在这里yum源已经配置好了直接安装,而且已经安装过了。
Loaded plugins: refresh-packagekit, security
file:///media/cdrom/repodata/repomd.xml: [Errno 14] Could not open/read file:///media/cdrom/repodata/repomd.xml
Trying other mirror.
Setting up Install Process
Package 1:nfs-utils-1.2.3-36.el6.x86_64 already installed and latest version
Package rpcbind-0.2.0-11.el6.x86_64 already installed and latest version
Nothing to do
创建共享目录,将文件所有者指定为nfsnobody。nfsnobody用户在安装nfs时会自动创建。如果不指定共享用户,则nfs系统在分配权限时会以用户uid为主,客户端如果用root账户会在服务器被自动降级至nfsnobody。
[[email protected] nfs]# cat /etc/passwd | grep nfs
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin --可以看到的确nfsnobody用户在安装nfs时会自动创建
--创建共享目录,将文件所有者指定为nfsnobody
[[email protected] nfs]# mkdir -p /data/nfs/
[[email protected] nfs]# chown -R nfsnobody:nfsnobody /data/nfs
3:服务端配置文件
格式:共享目录 指定共享对象(共享参数)
例: /data 192.168.1.0/24(rw,sync)
将 /data 共享给192.168.1.x ,客户端权限rw
其中共享对象可以用通配符,比如 * 代表所有地址。
配置参数:
rw: 读写
ro :只读
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:是大数据时使用,是先写到缓存区,必要时再写到磁盘里。
all_squash:所有访问用户都映射为匿名用户或用户组;
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
root_squash(默认):将来访的root用户映射为匿名用户或用户组;
no_root_squash:来访的root用户保持root帐号权限;
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree_check :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;
no_subtree_check(默认):即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
配置server参数(修改完/etc/exports下面的参数之后重启服务)
#vi /etc/exports
/data/nfs 192.168.57.132 (rw)
[[email protected] nfs]# service rpcbind start
[[email protected] nfs]# service nfs start
启动服务:注意先启动rpcbind再启动nfs
[[email protected] nfs]# service rpcbind restart
Stopping rpcbind: [ OK ]
Starting rpcbind: [ OK ]
[[email protected] nfs]# service nfs restart
Shutting down NFS daemon: [ OK ]
Shutting down NFS mountd: [ OK ]
Shutting down NFS quotas: [ OK ]
Shutting down NFS services: [ OK ]
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Stopping RPC idmapd: [ OK ]
Starting RPC idmapd: [ OK ]
Starting NFS daemon: [ OK ]
查询nfs挂载,showmount -e 192.168.57.132 后面可以接ip来查看。
[[email protected] nfs]# showmount -e 192.168.57.132
Export list for Database1:
/data/nfs 192.168.57.129
NFS服务开启后,查看共享目录参数
[[email protected] nfs]# cat /var/lib/nfs/etab
/data/nfs 192.168.57.129(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
让nfs服务开机启动
[[email protected] nfs]# chkconfig rpcbind on
[[email protected] nfs]# chkconfig nfs on
[[email protected] nfs]# chkconfig --list rpcbind
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[[email protected] nfs]# chkconfig --list nfs
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
4:客户端配置
安装rpcbind和nfs,启动rpcbind,nfs可以不启动。客户端挂载nfs共享目录
[[email protected] nfs]# yum install -y nfs-utils rpcbind
[[email protected] nfs]# service rpcbind start
[[email protected] nfs]# mount -t nfs 192.168.57.132:/data/nfs /nfs --挂载nfs server的/data/nfs 到/nfs
mount.nfs: /nfs is busy or already mounted
[[email protected] nfs]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_database1-lv_root
23G 15G 6.2G 71% /
tmpfs 1004M 424M 580M 43% /dev/shm
/dev/sda1 485M 55M 405M 12% /boot
/dev/sr0 3.5G 3.5G 0 100% /media/OL6.4 x86_64 Disc 1 20130225
192.168.57.132:/data/nfs
23G 22G 0 100% /nfs
注:一般不将nfs挂载信息写入fstab,因为nfs依赖于rpc服务,rpc服务启动晚于fstab时会出错。可以将挂载信息写入 /etc/rc.local
[[email protected] nfs]# vi /etc/rc.local
mount -t nfs 192.168.57.132:/data/nfs /nfs
关于默认账户
nfs客户端写数据除了nfs配置文件要有rw权限,对于目录也要有对应操作权限。
如果/data/nfs目录没有给写入权限,即使exports里设置了rw也是没有权限写入的。客户端默认操作账户为nfsnobody。
[[email protected] nfs]# cat /var/lib/nfs/etab
/data/nfs 192.168.57.129(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
查看/var/lib/nfs/etab其中 anonuid=65534,anongid=65534 为默认账户uid,即nfsnobody的默认uid。
客户端挂载优化参数
noatime 不更新文件的inode访问时间戳,文件很多时此参数可以提高效率。
nodiratime 不更新目录的访问时间戳,同上。
nosuid 关闭挂载目录的suid
noexec 不允许执行二进制文件。shell脚本无法直接使用,但是用sh xxx.sh依然可以调用。
rsize 系统每次读取的最大字节,centos6.5默认131072,此参数过小会影响系统的I/O效率.
wsize 系统每次写入的最大字节,同上
defaults 使用默认的选项。默认选项为rw、suid、dev、exec、anto nouser与async。
例: mount -o nosuid noexec noatime -t nfs 192.168.1.240:/data/nfs /mnt
卸载挂载点,如果提示 /mnt: device is busy ,可以用lf参数强制卸载
umount -lf /mnt