1 NFS介绍
Network File System,网络文件系统。它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。NFS客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中。
NFS Network File System,通过网络,让不同主机系统之间可以共享目录和文件
NFS一般被用来存储共享视频,图片,附件等静态资源文件
网站BBS程序不要放文件在NFS共享里
mount /dev/sdb1 /mnt
mount 网络设备系统资源 /mnt
2 RPC
因为NFS支持的功能很多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定,会使用随机端口;因此会造成NFS客户端和NFS服务端通信障碍。
RPC服务就是用来解决这个困扰的,它会记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将端口和功能对应的信息传递给请求的NFS客户端。
3 NFS工作流程原理
当访问程序通过NFS客户端向NFS服务器端存取文件时,数据流程大致如下:
1、用户访问网站程序,由程序在NFS客户端发出存取请求,它的RPC服务向服务器端的RPC服务发出请求
2、服务器端的RPC服务找到对应的已注册的NFS端口,通知NFS客户端的RPC服务
3、此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据
4、NFS客户端把数据存取成功后,返回给前端访问程序,告知用户存取结果,作为网站用户,就完成了一次存取操作
因此,FNS的各项功能都需要向RPC服务注册,所以要先启动RPC服务,后启动NFS服务
4 NFS服务器端的设置和安装
4.1 NFS软件的3种安装方法
检查是否有安装:rpm -aq nfs-utils rpcbind
1)yum install nfs-utils rpcbind -y
2)通过系统光盘里的rpm包安装:命令:rpm -ivh nfs-utils-1.2.3-36.e16.x86_64.rpm
3)LANG=en
yum grouplist|grep -i nfs
yum groupinstall "NFS file server" -y
4.2 安装nfs-utils rpcbind(知名端口111)
yum install nfs-utils rpcbind –y
启动RPC服务
111端口为rpcbind服务对外提供服务的主端口
[root@nfs-server ~]# /etc/init.d/rpcbind status rpcbind 已停 [root@nfs-server ~]# /etc/init.d/rpcbind start 正在启动 rpcbind: [确定] [root@nfs-server ~]# /etc/init.d/rpcbind status rpcbind (pid 2035) 正在运行...
[root@nfs-server ~]# lsof -i :111 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 2035 rpc 6u IPv4 12735 0t0 UDP *:sunrpc rpcbind 2035 rpc 8u IPv4 12738 0t0 TCP *:sunrpc (LISTEN) rpcbind 2035 rpc 9u IPv6 12740 0t0 UDP *:sunrpc rpcbind 2035 rpc 11u IPv6 12743 0t0 TCP *:sunrpc (LISTEN) [root@nfs-server ~]# netstat -lntup|grep rpcbind tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2035/rpcbind tcp 0 0 :::111 :::* LISTEN 2035/rpcbind udp 0 0 0.0.0.0:111 0.0.0.0:* 2035/rpcbind udp 0 0 0.0.0.0:938 0.0.0.0:* 2035/rpcbind udp 0 0 :::111 :::* 2035/rpcbind udp 0 0 :::938 :::* 2035/rpcbind [root@nfs-server ~]# netstat -lntup|grep 111 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2035/rpcbind tcp 0 0 :::111 :::* LISTEN 2035/rpcbind udp 0 0 0.0.0.0:111 0.0.0.0:* 2035/rpcbind udp 0 0 :::111 :::* 2035/rpcbind [root@nfs-server ~]# chkconfig --list rpcbind rpcbind 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
启动NFS服务
[root@nfs-server ~]# /etc/init.d/nfs status rpc.svcgssd 已停 rpc.mountd 已停 nfsd 已停 rpc.rquotad 已停 [root@nfs-server ~]# /etc/init.d/nfs start 启动 NFS 服务: [确定] 关掉 NFS 配额: [确定] 启动 NFS mountd: [确定] 启动 NFS 守护进程: [确定] 正在启动 RPC idmapd: [确定] [root@nfs-server ~]# /etc/init.d/nfs status rpc.svcgssd 已停 rpc.mountd (pid 2141) 正在运行... nfsd (pid 2156 2155 2154 2153 2152 2151 2150 2149) 正在运行... rpc.rquotad (pid 2137) 正在运行... nfs的主端口2049 [root@nfs-server ~]# netstat -lntup|grep 2049 tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN - tcp 0 0 :::2049 :::* LISTEN - udp 0 0 0.0.0.0:2049 0.0.0.0:* - udp 0 0 :::2049 :::*
/etc/init.d/rpcbind start
/etc/init.d/nfs start
将此写入rc.local
4.3 NFS的配置文件exports
NFS的默认配置文件:/etc/exports,默认是空的
[root@nfs-server ~]# ls -l /etc/exports -rw-r--r--. 1 root root 0 1月 12 2010 /etc/exports [root@nfs-server ~]# cat /etc/exports
/exports文件的配置格式为:
NFS共享的目录 NFS客户端地址1(参1,参2) NFS客户端地址2(1,2)
NFS共享的目录 NFS客户端地址(参1,参2,…)
[root@nfs-server ~]# man exports EXAMPLE # sample /etc/exports file / master(rw) trusty(rw,no_root_squash) /projects proj*.local.domain(rw) /usr *.local.domain(ro) @trusted(rw) /home/joe pc001(rw,all_squash,anonuid=150,anongid=100) /pub *(ro,insecure,all_squash) /srv/www -sync,rw server @trusted @external(ro) /foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw) /build buildhost[0-9].local.domain(rw)
配置实例
/data 192.168.4.0/24(rw,sync,all_squash)
NFS配置权限设置的常用参数 /data 192.168.4.*(rw,sync)
rw Read-write 表示可读写权限
ro Read-only 只读权限
sync 请求或写入数据时,数据同步写入到NFS Server 同步写入
async 请求或写入数据时,先返回请求,再将数据写入到内存 异步写入
all_squash 不论登入NFS的使用者身份是什么,他的身份都会被压缩成为匿名使用者,通常就是nobody
平滑加载此服务 下面两个命令等价
[root@nfs-server ~]# exportfs -r
[root@nfs-server ~]# /etc/init.d/nfs reload
4.4 查看本机共享的记录
[root@nfs-server ~]# showmount -e 127.0.0.1 Export list for 127.0.0.1: /data 192.168.4.*
4.5 在本机测试挂载
[root@nfs-server ~]# mount -t nfs 192.168.4.120:/data /mnt [root@nfs-server ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 9.2G 1.8G 7.0G 20% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 194M 29M 155M 16% /boot 192.168.4.120:/data 9.2G 1.8G 7.0G 20% /mnt
5 NFS客户端配置
[root@lamp01 ~]# /etc/init.d/rpcbind start 正在启动 rpcbind: [确定] [root@lamp01 ~]# chkconfig rpcbind on [root@lamp01 ~]# vi /etc/rc.local 最好也放进/etc/rc.local [root@lamp01 ~]# /etc/init.d/rpcbind status rpcbind (pid 1729) 正在运行... [root@lamp01 ~]# [root@lamp01 ~]# showmount -e 192.168.4.120 Export list for 192.168.4.120: /data 192.168.4.* [root@lamp01 ~]# mount -t nfs 192.168.4.120:/data /mnt [root@lamp01 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 9.2G 1.8G 7.0G 20% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 194M 29M 155M 16% /boot 192.168.4.120:/data 9.2G 1.8G 7.0G 20% /mnt [root@lamp01 ~]# mount /dev/sda3 on / type ext4 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw) /dev/sda1 on /boot type ext4 (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) 192.168.4.120:/data on /mnt type nfs (rw,vers=4,addr=192.168.4.120,clientaddr=192.168.4.121)
默认没有写的权限,需要更改权限
[root@nfs-server /]# cat /var/lib/nfs/etab /data 192.168.4.*(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) [root@nfs-server /]# ls -ld /data/ drwxr-xr-x 2 root root 4096 6月 9 00:01 /data/ [root@nfs-server /]# grep 65534 /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@nfs-server /]# chown -R nfsnobody /data [root@nfs-server /]# ls -ld /data/ drwxr-xr-x 2 nfsnobody root 4096 6月 9 00:01 /data/
把挂载放进rc.local
[root@lamp01 mnt]# vim /etc/rc.local mount -t nfs 192.168.4.120:/data /mnt
6 NFS客户端挂载排错思路
1、首先确认NFS服务端配置和服务是否OK
[root@nfs-server ~]# showmount -e 127.0.0.1(localhost)
最好服务端自己挂载自己看看可不可以
mount -t nfs 192.168.4.120:/data /mnt
df -h
2、确认NFS客户端showmount是否OK
showmount -e 192.168.4.120
如果不行
1)ping NFS服务端IP检查链路
2)telnet服务端IP端口检查
telnet 192.168.4.120 111
7 NFS服务端配置步骤
1、安装软件:yum install nfs-utils rpcbind -y
2、启动服务(注意先后顺序)
/etc/init.d/rpcbind start
rpcinfo -p localhost <=======检查
/etc/init.d/nfs start
rpcinfo -p localhost <=======检查
3、设置开机自启动,扔到/etc/rc.local
chkconfig nfs on
chkconfig rpcbind on
4、配置NFS服务
echo "/data 192.168.4.0/24(rw,sync,all_squash)" >>/etc/exports
mkdir -p /data
chown -R nfsnobody.nfsnobody /data (查看nfs默认使用的用户及共享参数cat /var/lib/nfs/etab)
5、重新加载服务(平滑加载)
/etc/init.d/nfs reload <=====exportfs -r
6、检查或测试挂载
showmount -e localhost
monut -t nfs 192.168.4.120:/data /mnt
8 客户端配置步骤
1、安装软件:yum install nfs-utils rpcbind -y
2、启动rpcbind
/etc/init.d/rpcbind start
3、配置开机启动,扔到rc.local
chkconfig rpcbind on
4、测试服务端共享情况
showmount -e server_ip
5、挂载
mkdir -p /data
mount -t nfs server_ip:/data /data
6、测试读、写
7、把挂载的命令扔到rc.local使它开机挂载
9 企业生产环境nfs性能优化挂载的例子
1)禁止更新目录及文件时间戳挂载
mount -t nfs -o noatime,nodiratime 192.168.4.120:/data /mnt
2)安全的挂载方式
mount -t nfs -o nosuid,noexec,nodev,rw 192.168.4.120:/data /mnt
3)安全加优化的挂载方式
mount -t nfs -o
nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.4.120:/data /mnt
4)默认的挂载方式
mount -t nfs 192.168.4.120:/data /mnt
注意:非性能的参数越多,速度可能会越慢
10 重要问题
1、有关NFS客户端普通用户写NFS的问题
exports 加all_squash
2、NFS开机放到fstab也可行 前提是某些开机启动服务进程开启,会检测
cat /var/lib/nfs/etab 服务端查看NFS配置的参数细节
cat /proc/mounts 客户端查看挂载参数细节