网络文件系统(NFS)从 20 世纪 80 年代中期开始就已成为免费操作系统的一部分,并且成为了专有 UNIX 系统的最爱。了解 NFS 方面的知识十分重要,其原因很简单:能够在 UNIX 网络之间实现无缝访问对于系统来说非常要害。在本文中我们将学习 NFS 最新的发行版 NFSv4 如何解决很多要害问题,尤其是版本 2 和版本 3 中都十分突出的安全性问题。我们很轻易把文件系统认为是想当然就有的。我们在计算机上工作,计算机让我们能够访问打印机、照相机、数据库、远程传感器、望远镜、编译器和移动电话。这些设备几乎没什么共性 —— 实际上,其中很多都是在 Internet 得到广泛应用之后才成为了现实的(例如,综合了小型计算机功能的照相机和移动电话)。然而,它们都需要某种类型的文件系统来安全地存储和访问数据。 通常来说,我们都不会真的去问这样的问题:数据、使用数据的应用程序以及将数据呈现给我们的接口是如何存储在计算机上的?很多用户都(不无道理地)将文件系统当作是一面将自己与以位和字节形式保存的原始数据分隔开来的墙。连接文件系统所使用的协议栈对于大部分用户来说通常都是一个黑盒子,实际上对于大部分程序员来说也是如此。在所有这些设备之间进行互联也就相当于启用了文件系统之间的通信。网络文件系统 从很多方面讲,通信都不仅仅是信息的长距离传输。网络协议也并不是使通用通信成为可能的惟一手段。究竟,每个计算机系统都必须将数据报翻译成另外一端的操作系统可以理解的内容。TCP 是一种高效的传输协议,但是它并没有被优化来协助快速文件访问和启用应用程序软件的远程控制。分布式计算和网络计算的比较 传统的网络协议对于计算在计算机之间(实际上是网络上)分发的方法所能做的贡献不多。只有那些蹩脚的程序员才会依靠于传输协议和光纤电缆来进行并行计算。相反,我们通常都依靠于一个连续模型,其中链接层的协议在连接初始化完成后进行接管,并要在网卡之间进行相当复杂的握手。并行计算和分布式文件系统都不再识别 ip 或以太网了。现在,只要事关性能,我们就可以忽略它们。然而,安全性问题却另当别论。 文件访问在计算机系统之间的组织方式仍然是个谜。现在,不管所访问的文件是在一台计算机上还是在多台合理分布的计算机上,对于访问系统来说都应该没什么区别。文件系统的语义和文件系统的数据结构现在已经成为了两个完全不同的主题。在 Plan 9 安装上的或在 Andrew 文件系统(AFS)风格的分布式文件系统上的文件系统语义隐藏了文件的组织方式和文件系统到硬件和网络的映射方式。NFS 并不需要隐藏文件和目录在远程文件系统上的存储方法,但是它也没有公开存储文件系统、目录和文件的实际硬件。NFS:UNIX 问题的一个解决方案 分布式文件系统访问需要使用多个命令来使用户可以将网络上一台计算机中的目录挂载到自己的系统上来。Sun Microsystems 在很多年之前就面临了这种挑战,当时它正开始着手推广称为 远程过程调用(RPC)的技术和 NFS。 Sun 公司需要解决的根本问题是如何将几台 UNIX 机器连接在一起,从而构成一个无缝的分布式工作环境,而不需要重新编写 UNIX 文件系统的语义,同时也不用添加太多分布式文件系统特有的数据结构。当然,要想让 UNIX 工作站的网络看起来像一个大系统是不可能的:在保留每个系统的完整性的同时,要让用户能够在其他计算机的目录上进行操作,而且不会体验到不可接受的延时或任何的工作流程限制。 当然,NFS 所做的远远不止于实现了对文本文件的访问,我们还可以通过 NFS 来分发 “可运行的” 应用程序。必须要有一些安全过程来支持网络以防对可执行程序的恶意接管。但是这一切究竟是如何实现的呢?NFS 是一个 RPC 标准 NFS 传统上是作为一个 RFC 应用程序来定义的,它要求 NFS 服务器使用 TCP 协议,NFS 客户机使用 TCP 或另外一种可以避免网络拥塞的协议。Internet 工程任务组(IETF)在 RFC 1832 发布了 PRC 的 Request for Comments (RFC)。另外一个对于 NFS 实现来说至关重要的标准则描述了 NFS 所使用的数据格式;它已经在 RFC 1831 中以 “External Data Representation”(XDR)文档的形式发布了。 其他一些 RFC 是关于在 NFS 会话过程中交换验证信息所需要的安全性和加密算法的。这里我们先来关注一下 NFS 的基本机制,相关的一个协议是 Mount 协议,它是在 RFC 1813 的附录 1 中描述的。
mount
命令。更多信息和选项,请查看 linux® 手册页。NFS 服务器 /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 修改成特定用户和组帐号。 user id=210
且 group id=100
的用户。最后一项针对一个公共目录,它只有只读权限并只能答应以匿名帐号的身份访问。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 注重: 有关 /etc/fstab 的更多信息,请参考 fstab 的手册页。对 NFS 的批评 批评促使进步新闻热点
疑难解答