学习是一种信仰。
分类: 服务器与存储
2013-03-06 10:53:58
NFS文件系统
http://zhumeng8337797.blog.163.com/blog/static/1007689142011214635643/
NFS文件系统是什么?
NFS是网络文件系统(Network File System)的简称,是分布式计算系统的一个组成部分,可实现在异种网络上共享和装配远程文件系统。NFS由Sun公司开发,目前已经成为文件服务的一种标准(RFC1904,RFC1813)。其最大的功能就是可以通过网络,让不同操作系统的计算机可以共享数据,所以也可以将它看做是一个文件服务器。NFS文件服务器是Linux最常见网络的服务之一。尽管它的规则简单,却有着丰富的内涵。NFS 服务器可以看作是一个文件服务器,它可以让你的PC通过网络将远端的NFS 服务器共享出来的文件挂载到自己的系统中,在客户端看来使用NFS的远端文件就象是在使用本地文件一样。
NFS或许是使用RPC最突出的网络服务了。它允许你以访问任何本地文件一样的方法来访问远程主机上的文件。这是通过将客户端的内核功能(它使用远程文件系统)与服务器端的NFS服务器功能(它提供文件数据)相混合而成为可能的。这种文件访问对客户来说是完全透明的,并且可在各种服务器和各种主机结构上工作。
NFS提供的许多优点:
被所有用户访问的数据可以存放在一台中央主机上,由客户在引导启动时加载这个目录。例如,你可以将所有用户的帐目存放在一台主机上,让你的网络上的所有用户从那台主机上加载/home目录。如果也安装了NIS的话,用户就可以登录进任何系统上,而始终在一组文件上工作。
需要耗费大量磁盘空间的数据可以被保存在一台主机上。例如,所有有关LaTeX和METAFONT的文件和程序可以在一个地方保存和维护。
管理用的数据可以存放在单个主机上。不再需要使用rcp将相同的文件安装到20个不同的机器上。
NFS要使用的话需要什么?
1 portmap服务
2 nfs服务
3 设置 /etc/exports 文件
启动上述两个服务(需要的话可以设置开机启动):
[root@localhost nfs]# service portmap start
Starting portmap: [ OK ]
[root@localhost nfs]# service nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS daemon: [ OK ]
Starting NFS mountd: [ OK ]
[root@localhost nfs]# [ OK ]
/etc/exports 文件中的项的格式相当简单。要共享一个文件系统,只需要编辑 /etc/exports 并使用下面的格式给出这个文件系统(和选项)即可:
directory (or file system) client1 (option1, option2) client2 (option1, option2)
常用选项:
secure: 这个选项是缺省选项,它使用了 1024 以下的 TCP/IP 端口实现 NFS 的连接。指定 insecure 可以禁用这个选项。
rw: 这个选项允许 NFS 客户机进行读/写访问。缺省选项是只读的。
async: 这个选项可以改进性能,但是如果没有完全关闭 NFS 守护进程就重新启动了 NFS 服务器,这也可能会造成数据丢失。缺省设置为 sync。
no_wdelay: 这个选项关闭写延时。如果设置了 async,那么 NFS 就会忽略这个选项。
nohide: 如果将一个目录挂载到另外一个目录之上,那么原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需启用 hide 选项。
no_subtree_check: 这个选项关闭子树检查,子树检查会执行一些不想忽略的安全性检查。缺省选项是启用子树检查。
no_auth_nlm: 这个选项也可以作为 insecure_locks 指定,它告诉 NFS 守护进程不要对加锁请求进行认证。如果关心安全性问题,就要避免使用这个选项。缺省选项是 auth_nlm 或 secure_locks。
mp (mountpoint=path): 通过显式地声明这个选项,NFS 要求挂载所导出的目录。
fsid=num: 这个选项通常都在 NFS 故障恢复的情况中使用。如果希望实现 NFS 的故障恢复,请参考 NFS 文档。
用户映射的选项包括:
root_squash: 这个选项不允许 root 用户访问挂载上来的 NFS 卷。
no_root_squash: 这个选项允许 root 用户访问挂载上来的 NFS 卷。
all_squash: 这个选项对于公共访问的 NFS 卷来说非常有用,它会限制所有的 UID 和 GID,只使用匿名用户。缺省设置是 no_all_squash。
anonuid 和 anongid: 这两个选项将匿名 UID 和 GID 修改成特定用户和组帐号。
/etc/exports 的例子:
/opt/files 192.168.0.*
/opt/files 192.168.0.120
/opt/files 192.168.0.125(rw, all_squash, anonuid=210, anongid=100)
/opt/files *(ro, insecure, all_squash)
第一项将 /opt/files 目录导出给 192.168.0 网络中的所有主机。
下一项将 /opt/files 导出给一台主机:192.168.0.120。
第三项指定了主机 192.168.0.125,并将对文件的读写权限授权给 user id=210 且 group id=100 的用户。
最后一项针对一个公共目录,它只有只读权限并只能允许以匿名帐号的身份访问。
NFS 客户机
要使用 NFS 作为客户机,客户机机器必须要运行 rpc.statd 和 portmap 进程。可以执行一个简单的 ps -ef 命令来检查系统是否运行了这两个守护进程。如果它们正在运行(应该如此),那么就可以使用下面的通用命令来挂载服务器上导出的目录:
mount server:directory local mount point
通常来说,必须以 root 用户的身份来挂载文件系统。在远程计算机上,可以使用下面的命令(假设 NFS 服务器的 IP 地址是 192.168.0.100):
mount 192.168.0.100:/opt/files /mnt
您所使用的发行版可能会要求在挂载文件系统时指定文件系统的类型。如果出现这种情况,请执行下面的命令:
mount -t nfs 192.168.0.100:/opt/files /mnt
如果服务器端已经正确设置好了,那么远程文件系统应该可以毫无问题地加载。现在,执行 cd 命令切换到 /mnt 目录中,然后执行 ls 命令来查看文件。要永久挂载,必须编辑 /etc/fstab 文件,并创建一个类似于下面的项:
192.168.0.100:/opt/files /mnt nfs rw 0 0
使用说明:
1、exports参数说明
rw: 读写模式;
async: 异步磁盘读写;
anonu(g)id: 指定NFS在进行操作时所使用的匿名用户uid/gid
2、NFS 管理命令
showmount -e 在NFS Server上执行此命令显示NFS Server上所有的共享卷;
showmount -e 10.0.0.1 在NFS Client上执行此命令显示NFS Server上所有共享卷;
export -av 根据/etc/exports导出所有卷;
export -rv 重新导出所有卷,增加/etc/exports中的新项目、删除不存在的项目、更新改变的项目;
3、NFS 相关文件
/etc/exports
是NFS Server最基本的配置文件之一,文件中列出了共享的文件系统和允许访问这些文件系统的主机。
/proc/fs/nfs/exports
导出文件列表的内核视图,包括导出的参数。
/var/lib/nfs/etab
状态文件,其中列出了当前的高级列表。此文件包含了/etc/exports中相同格式的所有项目,同时包含了由exportfs -i手工导入的项目。
/var/lib/nfs/rmtab
状态文件,列出了挂接导出文件的远程客户机清单。
/var/lib/nfs/xtab
状态文件,当前底层导出清单。
4、/etc/exports 中client的书写规则
(1) 单个主机
可以用短名及完全限定名,或者用IP地址,例如student01、student01.flying.com.cn或者192.168.10.1都是合法的主机名。
(2) Net-Group
可以列出/etc/netgroup文件中或NFS网组映射中定义的整组主机。网组名以@开头。
(3) 通配符主机
*.discuz.net *.*.comsenz.com
(4) 掩码
192.168.1.0/255.255.255.0
5、起停顺序
启动:
portmap
nfslock
nfs
停止:
nfslock
nfs
portmap
6、安全性
portmap: 111
NFS: 2049
防止使用IP欺骗和RPC重定向技术通过lo回环进行攻击以及限定授权主机:
iptables -A INPUT -p udp -d 127.0.0.1 --dport 111 -j DROP
iptables -A INPUT -p udp -d 127.0.0.1 --dport 2049 -j DROP
iptables -A INPUT -p udp -s 10.0.0.2 --dport 111 -j ACCEPT
iptables -A INPUT -p udp -s 10.0.0.2 --dport 2049 -j ACCEPT