一:概念:
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
,client 用 mount
将 /data
挂载到自己本地一个目录上,挂载目录可以和 /data
名称不同。将挂载信息写入本机开机启动文件里 如 /etc/rc.local
客户端无需启动 NFS 服务,但需要启动 RPC 服务。
实现
主机 | 角色 | ip |
---|---|---|
cnetos6.5 | NFS server | 192.168.1.240 |
centos6.5 | NFS client | 192.168.86.131 |
三、安装软件
NFS server 需要至少安装两个软件 nfs-utils 和 rpcbind。客户端只要安装 rpcbind。
rpm -qa nfs-utils rpcbind
安装完 nfs 服务一般会自动生成配置文件 exports,如果没有就自己创建一个 /etc/exports
yum install -y nfs-utils rpcbind
cat /etc/exports
创建共享目录,将文件所有者指定为 nfsnobody
。nfsnobody
用户在安装 nfs
时会自动创建。
如果不指定共享用户,则 nfs
系统在分配权限时会以用户 uid
为主,客户端如果用 root
账户会在服务器被自动降级至 nfsnobody
。
mkdir -p /data/nfs
chown -R nfsnobody:nfsnobody /data/nfs
四、server 配置文件
格式:共享目录 指定共享对象(共享参数)
例: /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 参数
#nfs dir /data/nfs
/data/nfs 192.168.1.0/24(rw)
/data/nfs 192.168.86.131(rw)
#也可以写成一行
/data/nfs 192.168.1.0/24(rw) 192.168.86.131(rw,sync)
启动服务:注意先启动 rpcbind
再启动 nfs
[root@localhost data]# service rpcbind start
Starting rpcbind: [ OK ]
[root@localhost data]# service nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
查询 nfs
挂载,showmount -e 192.168.1.240
后面可以接 ip 来查看。
[root@localhost data]# showmount -e
Export list for localhost:
/data/nfs 192.168.1.0/24,192.168.86.131
NFS 服务开启后,查看共享目录参数
[root@localhost data]# cat /var/lib/nfs/etab
/data/nfs 192.168.86.131(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
/data/nfs 192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
让 nfs 服务开机启动
[root@localhost ~]# chkconfig rpcbind on
[root@localhost ~]# chkconfig nfs on
[root@localhost ~]# chkconfig --list rpcbind
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@localhost ~]# chkconfig --list nfs
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
五、客户端配置
安装 rpcbind
和 nfs
,启动 rpcbind
,nfs
可以不启动。
客户端挂载 nfs 共享目录
mount -t nfs 192.168.1.240:/data/nfs /nfs #挂载 nfs server 的/data/nfs 到/nfs
[root@centos68 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.5G 2.0G 7.1G 22% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 33M 147M 19% /boot
/dev/sdb1 4.8G 11M 4.6G 1% /data
192.168.1.240:/data/nfs
2.9G 2.7G 126M 96% /nfs # nfs 挂载信息
注:一般不将 nfs 挂载信息写入 fstab
,因为 nfs
依赖于 rpc
服务,rpc
服务启动晚于 fstab
时会出错。可以将挂载信息写入 /etc/rc.local
vim /etc/rc.local
#mount nfs_data
mount -t nfs 192.168.1.240:/data/www/image/ /data/www/image/
mount -t nfs 192.168.1.240:/data/www/user/ /data/www/user/
关于默认账户
nfs 客户端写数据除了 nfs 配置文件要有 rw 权限,对于目录也要有对应操作权限。
如果/data/nfs 目录没有给写入权限,即使 exports 里设置了 rw 也是没有权限写入的。客户端默认操作账户为 nfsnobody。
[root@localhost ~]# cat /var/lib/nfs/etab
/data/nfs 192.168.86.131(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
/data/nfs 192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
查看 /var/lib/nfs/etab
其中 anonuid=65534
,anongid=65534
为默认账户 uid
,即 nfsnobody
的默认 uid
。
查看已挂载设备挂载参数 cat /proc/mounts
[root@localhost ~]# cat /proc/mounts |grep 192
192.168.1.240:/data/nfs /mnt nfs4 rw,noexec,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.240,minorversion=0,local_lock=none,addr=192.168.1.240 0 0
客户端挂载优化参数
字段 | 说明 |
---|---|
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