首页 > 代码库 > NFS文件共享
NFS文件共享
源自《Linux 运维之道》丁一明编著 一书的总结
NFS(Network File System)即是网络文件系统,是由Sun公司开发的一种通过网络方式共享文件系统的通用共享解决方案。目前有NFS三个版本,分别是NFSv2、NFSv3、NFSv4。CentOS6.5版本默认使用NFSv4,NFS监听在TCP2049端口。
在linux中,访问信息管理可以由特定服务器管理,也可以委托给RPC(Remote Procedure Call)来帮助自己管理。RPC协议为远程通信程序管理通信双方所需的基本信息,这样NFS服务就可以专注于如何共享数据,至于通信的连接以及连接的基本信息,这全权委托给RPC管理,CentOS6.5系统由rpcbind服务提供RPC协议的支持,虽然NFSv4不再需要和rpcbind直接交互,但是rpc.moundtd依然是NFSv4所必需的服务。所以需要nfs-utils、rpcbind。
NFS服务器通过/etc/exports配置文件设定哪些客户端可以访问哪些NFS共享文件系统。格式:共享路径 客户端主机1 (选项)客户端主机2 (选项)……
其中客户端主机可以是一个网段、单台主机或主机名。
选项可以不用设置,用默认的ro、sync、wdelay、root_squash。具体选项
ro:共享目录只读;
rw:共享目录可读可写;
all_squash:所有访问用户都映射为匿名用户或用户组;
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
root_squash(默认):将来访的root用户映射为匿名用户或用户组;
no_root_squash:来访的root用户保持root帐号权限;
anonuid=<UID>:指定匿名访问用户的本地用户UID,默认为nfsnobody(65534);
anongid=<GID>:指定匿名访问用户的本地用户组GID,默认为nfsnobody(65534);
secure(默认):限制客户端只能从小于1024的tcp/ip端口连接服务器;
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree_check(默认) :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;
no_subtree_check :即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
案例:
其中/var/web/可以被192.168.118.250异步写,并且不屏蔽root用户对web目录的访问,/var/cloud为任何主机都可以同步制度访问。配置细节:
[root@localhost tempal]# yum -y install nfs-utils rpcbind
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* extras: mirrors.aliyun.com
* updates: mirrors.hust.edu.cn
Setting up Install Process
Package 1:nfs-utils-1.2.3-39.el6.i686 already installed and latest version
Package rpcbind-0.2.0-11.el6.i686 already installed and latest version
Nothing to do
[root@localhost tempal]# rpm -qa |grep nfs-utils
nfs-utils-lib-1.1.5-6.el6.i686
nfs-utils-1.2.3-39.el6.i686
[root@localhost tempal]# rpm -qa |grep rpcbind
rpcbind-0.2.0-11.el6.i686
[root@localhost tempal]# useradd -u 1003 jerry
[root@localhost tempal]# mkdir /var/{web,cloud}
[root@localhost tempal]# chmod a+w /var/web
[root@localhost tempal]# vim /etc/exports
[root@localhost tempal]# cat /etc/exports
/var/web/ 192.168.118.250(rw,async,no_root_squash)
/var/cloud/ 192.168.118.0/255.255.255.0(ro,sync)
[root@localhost tempal]# /etc/init.d/rpcbind restart
Stopping rpcbind: [ OK ]
Starting rpcbind: [ OK ]
[root@localhost tempal]# /etc/init.d/nfs restart
Shutting down NFS daemon: [FAILED]
Shutting down NFS mountd: [FAILED]
Shutting down NFS quotas: [FAILED]
Shutting down RPC idmapd: [FAILED]
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
[root@localhost tempal]# chkconfig rpcbind on
[root@localhost tempal]# chkconfig nfs on
[root@localhost tempal]# showmount -e 192.168.118.253
Export list for 192.168.118.253:
/var/cloud 192.168.118.0/255.255.255.0
/var/web 192.168.118.250
客户端192.168.118.254设置,该客户端只读共享,默认root权限会自动映射为nfsnobody帐号,普通帐号权限将保留。具体操作:
tempal@ubuntu:~$ sudo su
[sudo] password for tempal:
root@ubuntu:/home/tempal# mkdir /var/cloud
root@ubuntu:/home/tempal# useradd -u 1003 jerry
root@ubuntu:/home/tempal# mount 192.168.118.253:/var/cloud /var/cloud
root@ubuntu:/home/tempal# cd /var/cloud
root@ubuntu:/var/cloud# touch root.txt
touch: 无法创建"root.txt": 只读文件系统
客户端192.168.118.250设置,默认可以读写,并且具有root帐号。具体操作:
[root@test tempal]# yum -y install nfs-utils rpcbind
Loaded plugins: fastestmirror, refresh-packagekit, security
Determining fastest mirrors
* base: mirrors.hust.edu.cn
* extras: mirrors.hust.edu.cn
* updates: mirrors.hust.edu.cn
base | 3.7 kB 00:00
base/primary_db | 3.5 MB 00:29
extras | 3.4 kB 00:00
extras/primary_db | 18 kB 00:00
updates | 3.4 kB 00:00
updates/primary_db | 3.4 MB 00:24
Setting up Install Process
Package 1:nfs-utils-1.2.3-39.el6.i686 already installed and latest version
Package rpcbind-0.2.0-11.el6.i686 already installed and latest version
Nothing to do
[root@test tempal]# showmount -e 192.168.118.253
Export list for 192.168.118.253:
/var/cloud 192.168.118.0/255.255.255.0
/var/web 192.168.118.254
[root@test tempal]# mkdir /var/web
[root@test tempal]# useradd -u 1003 jerry
[root@test tempal]# mount 192.168.118.253:/var/web /var/web
[root@test tempal]# chmod a+w /var/web
[root@test tempal]# cd /var/web ; touch centos_test.txt
[root@test web]# ll /var/web/
总用量 0
-rw-r--r--. 1 root root 0 6月 22 00:37 centos_test.txt
[root@test web]# su - jerry
[jerry@test ~]$ cd /var/web/
[jerry@test web]$ touch jerry.txt
[jerry@test web]$ ls -l
总用量 0
-rw-r--r--. 1 root root 0 6月 22 00:37 centos_test.txt
-rw-rw-r--. 1 jerry jerry 0 6月 22 00:38 jerry.txt
NFS高级设置:
(一) NFS的服务进程
nfs:NFS服务主进程
nfslock:为nfs文件系统提供锁机制
rpcbind:提供地址和端口注册服务
rpc.mountd:被nfs用来处理NFSv2和NFSv3的mount请求
rpc.nfsd:动态处理客户端请求
lockd:lockd是内核线程,在服务器端和客户端运行,用来实现NLM网络协议,允许NFSv2和NFSv3客户端对文件加锁。
rpc.statd:该进程实现网络状态监控(NSM)协议
rpc.rquotad:该进程提供用户配额信息。
rpc.idmapd:提供NFSv4名称映射,/etc/idmapd.conf是它的配置文件。
(二) NFS客户端配置
主要是mount命令
#mount –t nfs –o 选项 服务主机:/服务器共享目录 /本地挂载目录
具体挂载选项如下:
ro 以只读模式加载。
rw 以可读写模式加载。
sync 以同步方式执行文件系统的输入输出动作。
async 以非同步的方式执行文件系统的输入输出动作。
defaults 使用默认的选项。默认选项为rw、suid、dev、exec、anto nouser与async。
atime 每次存取都更新inode的存取时间,默认设置,取消选项为noatime。
noatime 每次存取时不更新inode的存取时间。
dev 可读文件系统上的字符或块设备,取消选项为nodev。
nodev 不读文件系统上的字符或块设备。
exec 可执行二进制文件,取消选项为noexec。
noexec 无法执行二进制文件。
auto 必须在/etc/fstab文件中指定此选项。执行-a参数时,会加载设置为auto的设备,取消选取为noauto。
noauto 无法使用-a参数来加载。
suid 启动set-user-identifier(设置用户ID)与set-group-identifer(设置组ID)设置位,取消选项为nosuid。
nosuid 关闭set-user-identifier(设置用户ID)与set-group-identifer(设置组ID)设置位。
user 普通用户可以执行加载操作。
nouser 普通用户无法执行加载操作,默认设置。
remount 重新加载设备。通常用于改变设备的设置状态。
rsize 读取数据缓冲大小,默认设置1024。
wsize 写入数据缓冲大小,默认设置1024。
fg 以前台形式执行挂载操作,默认设置。在挂载失败时会影响正常操作响应。
bg 以后台形式执行挂载操作。
hard 硬式挂载,默认设置。如果与服务器通讯失败,让试图访问它的操作被阻塞,直到服务器恢复为止。
soft 软式挂载。如果服务器通讯失败,让试图访问它的操作失败,返回一条出错消息。这项功能对于避免进程“挂”在无关紧要的安装操作上来说非常有用。
retrans=n 指定在以软方式安装的文件系统上,在返回一条出错消息之前重复发出请求的次数。
nointr 不允许用户中断,默认设置。
intr 允许用户中断被阻塞的操作(并且让它们返回一条出错消息)。
timeo=n 设置请求的超时时间(以十分之一秒为单位)。
tcp:使用tcp协议挂载
udp:使用udp协议挂载
注:
automounter专用参数
fstype= 用于指定一个文件系统的类型(如果要挂载的文件系统不是NFS的话),mount是不能用的。
还可以使用autofs自动挂载
CentOS安装:[root@test ~]# yum -y install autofs
Ubuntu安装:root@ubuntu:/var/cloud# apt-get install autofs
编辑主配置文件/etc/auto.master,在末尾添加需挂载的目录信息。
格式为:本机挂载主目录 对应的加载配置文件名 -挂载参数
挂载参数同mount的挂载参数,多个参数以逗号分隔。此处的挂载参数可以与对应的加载配置文件中定义的参数产生叠加作用。
示例:
vim /etc/auto.master
#本机挂载主目录为/var/web,与之对应的加载配置文件为/etc/auto.nfs. --timeout参数部分,则默认为600秒(10分钟).
/var/web /etc/auto.nfs --timeout=600
保存退出
编辑加载配置文件,添加需要挂载的文件系统。
格式为:挂载目录 -挂载参数 挂载文件系统
挂载参数同mount的挂载参数,多个参数以逗号分隔。
示例:
vim /etc/auto.nfs
web -rw,bg,soft,rsize=32768,wsize=32768,nosuid,noexec,nodev 192.168.118.253:/var/web
保存退出
重启autofs
/etc/init.d/autofs restart
开机自动启动
[root@test ~]# chkconfig autofs on
(三) 使用NFS命令工具
exportfs命令:可以允许root在不重启NFS服务的情况下选择共享或者取消部分共享目录。
选项: -r 重新读取/etc/exportfs文件
-a 全部共享或全部取消共享
-u 取消共享,与-a一起使用可以取消全部共享文件系统
-v显示详细信息
nfstat命令:查看NFS共享状态
-s,--server 仅显示服务器端状态,默认服务器和客户端都显示
-c,--client 仅显示客户端状态
-n 数字2、3、4,表示nfs版本号
Rpcinfo命令:生成RPC信息报表
-m 显示挂载信息
-l 列表形式显示信息
-m显示指定主机rpcbind操作信息表
-p显示指定主机RPC注册信息
-s显示指定主机所有注册RPC的信息程序,不指定主机时默认显示本机信息
(四) 在防火墙后端运行NFS
运行命令rpcinfo –p,查看端口占用情况:
可以看到nfs占用端口2049,portmapper占用111端口,rquotad占用875端口,mountd和nlockmgr 两个个占用端口不固定。将不固定端口的两个进程设置为固定的。
#vim /etc/services
mountd 39102/tcp #mountd add by Temapl
mountd 39102/udp #mountd add by Temapl
nlockmgr 41393/tcp #nlockmgr add by Tempal
nlockmgr 41393/udp #nlockmgr add by Tempal
重启nfs服务:service nfs restart
编辑路由表
#vim /etc/sysconfig/iptables
在最下面添加内容
-A INPUT -s 192.168.118.0/24 -m state --state NEW -p tcp --dport 111 -j ACCEPT
-A INPUT -s 192.168.118.0/24 -m state --state NEW -p tcp --dport 875 -j ACCEPT
-A INPUT -s 192.168.118.0/24 -m state --state NEW -p tcp --dport 2049 -j ACCEPT
-A INPUT -s 192.168.118.0/24 -m state --state NEW -p tcp --dport 39102 -j ACCEPT
-A INPUT -s 192.168.118.0/24 -m state --state NEW -p tcp --dport 41393 -j ACCEPT
-A INPUT -s 192.168.118.0/24 -m state --state NEW -p udp --dport 111 -j ACCEPT
-A INPUT -s 192.168.118.0/24 -m state --state NEW -p udp --dport 875 -j ACCEPT
-A INPUT -s 192.168.118.0/24 -m state --state NEW -p udp --dport 2049 -j ACCEPT
-A INPUT -s 192.168.118.0/24 -m state --state NEW -p udp --dport 39102 -j ACCEPT
-A INPUT -s 192.168.118.0/24 -m state --state NEW -p udp --dport 41393 -j ACCEPT
最后重启防火墙:service iptables restart