NFS?!

发布于 2021-05-09  628 次阅读


2.1。什么是NFS?

网络文件系统(NFS)的开发是为了允许计算机将磁盘分区挂载到远程计算机上,就好像它是本地磁盘一样。它允许在网络上快速无缝地共享文件。

如果您对它的设置不正确,它也可能使不需要的人通过网络访问您的硬盘驱动器(从而可能阅读您的电子邮件并删除所有文件以及闯入您的系统)。因此,如果要实施NFS设置,请仔细阅读本文档的第6节“安全性和NFS”。

还有其他系统提供与NFS类似的功能。Samba (http://www.samba.org) 为Windows客户端提供文件服务。最初由IBM (http://www.openafs.org)开发 并现已开源的Andrew File System 提供了具有一些附加安全性和性能特征的文件共享机制。Coda文件系统 (http://www.coda.cs.cmu.edu/)结合了文件共享功能,特别着重于断开连接的客户端。计划将Andrew和Coda文件系统的许多功能包括在NFS的下一版本(版本4) (http://www.nfsv4.org)中。如今,NFS的优点是它成熟,标准,易于理解并在各种平台上得到了强大的支持。

2.2。本文件的目的

本HOWTO旨在作为正确,有效地设置NFS的完整分步指南。设置NFS涉及两个步骤,即配置服务器,然后配置客户端。这些步骤中的每一个都按顺序处理。然后,该文档为有特殊需要和硬件设置的人员提供了一些技巧,以及安全性和故障排除建议。

本HOWTO并不是对NFS的胆量以及底层实现和体系结构的描述。涵盖此类主题的推荐材料可在NFS常见问题解答 (http://nfs.sourceforge.net/) 和HOWTO附录中找到。

本文档也无意作为完整的参考手册,也不包含Linux NFS功能的详尽列表。为此,您可以查看 nfs(5),exports(5), mount(8),fstab(5), nfsd(8),lockd(8), statd(8),rquotad(8)的手册页和mountd(8)。

它还不会涵盖被认为已过时的PC-NFS(鼓励用户使用Samba与Windows计算机共享文件)或仍在开发中的NFS版本4。

2.3。知识先决条件

在阅读本HOWTO之前,您应该了解有关TCP / IP网络的一些基本知识。如果您有疑问,请阅读 Networking-Overview-HOWTO。

2.4。必备软件:内核版本和nfs-utils

第2版​​NFS​​,第3版NFS和第4版NFS之间的差异将在后面解释;目前,如果要安装专用的,大容量或生产文件服务器,则可能只是建议您将需要NFS版本3。NFS版本2或4应该适合临时使用。

NFS版本2已经存在了一段时间(至少从1.2内核系列开始),但是,如果您要执行以下任一操作,则需要的内核版本至少为2.2.18:

将Linux NFS与其他操作系统的NFS混合

通过NFS可靠地使用文件锁定
使用NFS版本3
对于高于2.2.14的内核版本,还有一些补丁可提供上述功能。其中一些可以从Linux NFS主页下载。如果您的内核版本为2.2.14-2.2.17,并且手边有源代码,则可以确定是否已添加这些补丁程序,因为NFS版本3服务器支持将是配置选项。但是,除非有特殊原因要使用较旧的内核,否则应进行升级,因为在此过程中已修复了许多错误。内核2.2.19包含了对2.2.18的一些其他锁定改进。

版本3的功能还需要至少版本为0.1.6的nfs-utils软件包,并安装版本2.10m或更高版本。但是,由于nfs-utils和mount完全向后兼容,并且由于较新的版本具有很多安全性和错误修复,因此,如果您要开始进行NFS安装,则没有充分的理由不安装最新的nfs-utils和mount软件包。

所有2.4及更高版本的内核均具有完整的NFS版本3功能。所有2.6和更高版本的内核都具有不同级别的NFS版本4功能。稍后将对此进行更详细的讨论。

在所有情况下,如果要构建自己的内核,则需要选择NFS,并且要部署的NFS版本支持。如今,几乎所有标准Linux发行版都提供了支持NFS版本3的内核。

处理大于2 GB的文件将需要2.4x或更高版本的内核以及2.2.x版本或更高版本的glibc。

2.2.18之后的所有内核在客户端都支持基于TCP的NFS。在2.2.18之后的系列中,作为实验性选项,基于TCP的服务器端NFS仅以越野车形式存在。从2.4.17和2.5.6开始引入了针对2.4和2.5内核的补丁。现在,NFS中TCP的使用已成为主流,并得到了广泛的使用。

由于在内核版本2.2.18中引入了许多上述功能,因此编写本文档时应与该版本(包括2.6.x)之上的内核保持一致。如果您使用的是较旧的内核,则本文档可能无法正确描述您的NFS系统。

在撰写本文时,正在2.6.x内核中积极开发NFS版本4支持。它的实现仍然非常灵活且不断变化,不建议在生产中使用。NFS版本4的配置和相关的集成技术将在本文档的后面部分讨论。

2.5。从哪里获得帮助和更多信息

从2000年11月开始,Linux NFS主页位于 http://nfs.sourceforge.net。 请检查那里的NFS相关邮件列表以及最新版本的nfs-utils,NFS内核补丁以及其他与NFS相关的软件包。

当您遇到问题或本手册,常见问题解答或手册页中未涉及的问题时,应向nfs邮件列表(列表中的nfs点sourceforge点网)发送消息。为了最好地帮助开发人员和其他用户帮助您评估问题,您应该包括:

您正在使用的nfs-utils的版本
内核的版本以及所有非常规应用的内核。
您正在使用的Linux发行版
涉及的其他操作系统的版本
了解连接主机的网络配置也很有用。

如果您的问题涉及无法装载或导出共享,请还包括:

您的/ etc / exports文件的副本
rpcinfo -p localhost的输出在服务器上运行
rpcinfo -p 服务器名的输出在客户端上运行
阅读所有文档后,发送带有特定问题的所有这些信息是确保从列表中获得有帮助的答复的最佳方法。

您可能还希望查看 nfs(5),exports(5), mount(8),fstab(5), nfsd(8),lockd(8), statd(8),rquotad(8)的手册页和mountd(8)。

3.设置NFS服务器

3.1。服务器设置简介

假定您将同时设置服务器和客户端。如果您只是要设置一个客户端来处理其他人的服务器(例如您所在部门),则可以跳到 第4节“设置NFS客户端”。但是,每个已设置的客户端都需要在服务器上进行修改以授权该客户端(除非以非常不安全的方式完成服务器设置),因此,即使您没有设置服务器,也可能希望阅读本节以获取相关信息。一个想法,要寻找什么样的授权问题。

设置服务器将分两个步骤完成:设置NFS的配置文件,然后启动NFS服务。

3.2。设置配置文件

有三个你将需要编辑设置NFS服务器主要配置文件:/etc/exports, /etc/hosts.allow,和/etc/hosts.deny 。严格来说,您只需要进行编辑 /etc/exports即可使NFS正常工作,但是您将面临极其不安全的设置。您可能还需要编辑启动脚本。有关更多信息,请参见第3节“设置NFS服务器”。

3.2.1。/ etc / exports

该文件包含条目列表。每个条目指示共享的卷及其共享方式。检查手册页 (手册导出)以获取文件所有设置选项的完整说明,尽管此处的说明可能会满足大多数人的需求。

中的条目/etc/exports通常如下所示:

目录machine1(option11,option12)
机器2(选项21,选项22)
在哪里

目录
您要共享的目录。它可以是一个完整的卷,尽管不必如此。如果共享目录,则同一文件系统中该目录下的所有目录也将被共享。

机器1和机器2
可以访问目录的客户端计算机。这些机器可以按其DNS地址或IP地址(例如,machine.company.com或192.168.0.8 )列出。使用IP地址更可靠,更安全。如果您需要使用DNS地址,并且它们似乎无法解析到正确的机器,请参见第7章,“故障排除”。

选项xx
每台计算机的选项列表将描述该计算机将具有哪种访问权限。重要选项是:

ro:目录为只读共享;客户端计算机将无法编写它。这是默认值。
rw:客户端计算机将具有对该目录的读写访问权限。
no_root_squash:默认情况下,由root用户在客户端计算机上发出的任何文件请求都将被视为服务器上没有用户的请求。(请求映射到的确切UID取决于服务器“ nobody”而不是客户端上的用户“ UID”。)如果 选择了no_root_squash,则客户端计算机上的root将具有对服务器上文件的相同级别的访问权限。系统作为服务器上的root用户。这可能会带来严重的安全隐患,尽管如果要在涉及导出目录的客户端计算机上执行任何管理工作,则可能有必要。没有充分的理由,您不应指定此选项。
no_subtree_check:如果仅导出卷的一部分,则称为子树检查的例程将验证从客户端请求的文件是否在卷的适当部分中。如果整个卷都已导出,则禁用此检查将加快传输速度。
sync:默认情况下,除最新版本(1.11版)外, exportfs 命令的所有版本都将使用异步行为,告诉客户端计算机文件写入已完成-即已写入稳定存储-NFS完成处理后写入文件系统。如果服务器重新启动,此行为可能会导致数据损坏,并且sync 选项可以防止这种情况的发生。有关同步和 异步行为的完整讨论,请参见第5节“优化NFS性能”。
假设我们有两个客户端计算机slave1 和slave2,其IP地址 分别为192.168.0.1和192.168.0.2。我们希望与这些机器共享我们的软件二进制文件和主目录。的典型设置 /etc/exports可能如下所示:

/ usr / local 192.168.0.1(只读)192.168.0.2(只读)
/家庭192.168.0.1(rw)192.168.0.2(rw)
在这里,我们将/ usr / local只读状态共享给slave1和slave2,因为它可能包含我们的软件,允许slave1和 slave2向其写入超过安全性的问题可能没有任何好处。另一方面,如果用户要保存主目录,则必须以读写方式导出主目录。

如果安装规模较大,则可能会发现一堆计算机都位于同一本地网络上,这些计算机都需要访问服务器。有几种方法可以简化对大量计算机的引用。首先,您可以通过指定网络和网络掩码来一次访问一系列计算机。例如,如果要允许访问IP地址在192.168.0.0和 192.168.0.255之间的所有计算机, 则可以输入以下内容:

/ usr / local 192.168.0.0/255.255.255.0(ro)
/家庭192.168.0.0/255.255.255.0(rw)
有关 网络掩码的更多信息,请参见《网络概述》 HOWTO。您可能还希望查看init和的手册页 hosts.allow。

其次,您可以在条目中使用NIS网络组。要在导出文件中指定网络组,只需在网络组的名称前加上“ @”即可。有关 网络组如何工作的详细信息,请参见NIS HOWTO。

第三,您可以使用通配符,例如* .foo.com或 192.168。而不是主机名。2.2内核系列中的通配符实现存在问题,已在内核2.2.19中修复。

但是,请记住,如果网络组或本地网络中存在您不完全信任的计算机,则任何这些简化操作都可能导致安全风险。

为了避免(或不应该)导出哪些内容,请注意一些注意事项。首先,如果导出目录,则如果它们的父目录和子目录位于同一文件系统中,则它们的父目录和子目录将无法导出。但是,不必同时导出两个目录,因为在/etc/exports文件中列出父目录将导致该文件系统中的所有基础目录都被导出。

其次,用NFS导出FAT或VFAT(即MS-DOS或Windows 95/98)文件系统是一个糟糕的主意。FAT并非设计用于多用户计算机上,因此,依赖于权限的操作将无法正常工作。此外,据报道某些基础文件系统设计无法满足NFS的期望。

第三,设备或其他特殊文件可能无法正确导出到非Linux客户端。有关特定操作系统的详细信息,请参见第8节“将Linux NFS与其他操作系统一起使用”。

3.2.2。/etc/hosts.allow和/etc/hosts.deny
这两个文件指定网络上的哪些计算机可以使用计算机上的服务。文件的每一行都包含一个列出一项服务和一组计算机的条目。当服务器从计算机收到请求时,它将执行以下操作:

它首先检查hosts.allow计算机是否符合此处列出的规则。如果是这样,则允许该计算机访问。
如果机器hosts.allow与服务器中的条目不匹配, 则检查 hosts.deny客户端是否与那里列出的规则匹配。如果是,则拒绝访问该计算机。
如果客户端在任何一个文件中都没有匹配列表,则允许其访问。
除了控制对由inetd处理的服务 (例如telnet和FTP)的访问之外,该文件还可以通过限制与提供NFS服务的守护程序的连接来控制对NFS的访问。限制是基于每个服务的。

限制访问的第一个守护程序是portmapper。该守护程序实际上只是告诉请求客户端如何找到系统上的所有NFS服务。限制对portmapper的访问是防止有人通过NFS入侵系统的最佳防御,因为完全未经授权的客户端将不知道在哪里可以找到NFS守护程序。但是,有两点需要注意。首先,如果入侵者由于某种原因已经知道如何找到这些守护程序,那么仅限制portmapper是不够的。其次,如果您正在运行NIS,则限制portmapper还将限制对NIS的请求。这通常应该是无害的,因为您通常希望以类似的方式限制NFS和NIS,但要小心。(如果您正在运行NFS,运行NIS通常是一个好主意,因为客户端计算机需要一种方法来知道谁拥有导出的卷上的哪些文件。当然,还有其他方法可以做到这一点,例如同步密码文件。见 有关如何设置NIS的信息,请访问NIS HOWTO。

通常,使用NFS(与大多数Internet服务一样)是一个好主意,即明确拒绝对您不需要允许访问的IP地址的访问。

这样做的第一步是将以下条目添加到 /etc/hosts.deny中:

端口图:全部
从nfs-utils 0.2.0开始,您可以通过控制对单个守护程序的访问来更加谨慎。这是一个很好的预防措施,因为入侵者通常能够在portmapper周围疲倦。如果您有较新版本的nfs-utils,请为每个NFS守护程序添加条目(请参阅下一节以了解这些守护程序是什么;现在将它们的条目放在中 hosts.deny):

锁定:全部
挂载:全部
rquotad:ALL
状态:全部
即使您使用的是较旧版本的nfs-utils,添加这些条目在最坏的情况下也是无害的(因为它们只会被忽略),并且最多在升级时可以为您节省一些麻烦。一些系统管理员选择将条目ALL:ALL放入文件中 /etc/hosts.deny,这将导致查看这些文件的所有服务拒绝对所有主机的访问,除非明确允许。尽管这是更安全的行为,但在安装新服务时也可能会惹上麻烦,您忘了把它放在那儿,并且一生都无法弄清楚它们为什么不起作用。

接下来,我们需要添加一个条目hosts.allow 以为所有主机提供我们要访问的访问权限。(如果仅保留上述各行,hosts.deny则没有人可以访问NFS。) hosts.allow按照以下格式输入:

服务:主机[或网络/网络掩码],主机[或网络/网络掩码]
在这里,主机是潜在客户端的IP地址;在某些版本中,可能可以使用主机的DNS名称,但是强烈建议不要使用该主机。

假设我们具有上述设置,并且只想允许访问 slave1.foo.com和 slave2.foo.com,并假设这些机器的IP地址分别为192.168.0.1 和192.168.0.2。我们可以将以下条目添加到/etc/hosts.allow中:

端口图:192.168.0.1,192.168.0.2
对于最新的nfs-utils版本,我们还将添加以下内容(同样,即使不支持这些条目也无害):

锁定:192.168.0.1,192.168.0.2
quota:192.168.0.1,192.168.0.2
挂载:192.168.0.1,192.168.0.2
状态:192.168.0.1,192.168.0.2
如果打算在本地网络中的大量计算机上运行NFS,则/etc/hosts.allow还可以使用与/etc/exports上述相同的方式来输入网络/网络掩码样式 。

3.3。开始服务

3.3.1。先决条件

现在应该配置了NFS服务器,我们可以开始运行它。首先,您将需要安装适当的软件包。它主要包含一个足够新的内核和一个足够新的nfs-utils软件包版本。如有疑问,请参见第2节“简介”。

接下来,在启动NFS之前,您将需要使计算机上的TCP / IP网络正常运行。如果您可以使用telnet,FTP等,那么您的TCP网络很有可能。

就是说,使用最新的Linux发行版,您可能只需重启计算机就可以启动并运行NFS,并且启动脚本应该会检测到您已设置 /etc/exports文件并可以正确启动NFS。如果尝试这样做,请参见第4节,“设置NFS客户端”,以验证NFS是否正在运行。如果这不起作用,或者您无法重新引导计算机,则以下部分将告诉您需要启动哪些守护程序才能运行NFS服务。如果在上面编辑配置文件时由于某些原因nfsd已经在运行,则必须刷新配置;否则,请转入 有关详细信息,请参见第4节“设置NFS客户端”。

3.3.2。启动Portmapper

NFS依赖于portmapper守护程序,称为 portmap或rpc.portmap。它需要首先启动。它应该位于中, /sbin但有时位于中 /usr/sbin。最新的Linux发行版在引导脚本中启动该守护程序,但是在开始使用NFS之前,值得确保它正在运行(只需键入ps aux | grep portmap即可)。

3.3.3。守护进程

NFS服务由五个守护进程负责: rpc.nfsd,它完成大部分工作; rpc.lockd和rpc.statd,它们处理文件锁定;rpc.mountd和rpc.rquotad处理初始的安装请求,而rpc.rquotad处理导出的卷上的用户文件配额。从2.2.18开始, nfsd会根据需要调用lockd,因此您不必担心自己启动它。 statd将需要单独启动。最新的Linux发行版将具有这些守护程序的启动脚本。

守护程序都是nfs-utils程序包的一部分,并且可以在/sbin目录中,也可以在/usr/sbin 目录中。

如果您的发行版未在启动脚本中包含它们,则应添加它们,并配置为按以下顺序启动:

rpc.portmap
rpc.mountd,rpc.nfsd
rpc.statd,rpc.lockd(如有必要)和
rpc.rquotad
nfs-utils软件包具有RedHat和Debian的示例启动脚本。如果您使用的是其他发行版,通常可以只复制RedHat脚本,但是您可能必须删除以下内容:

。../init.d/functions
以避免收到错误消息。

3.3.4。验证NFS是否正在运行

为此,请使用rpcinfo quota命令查询portmapper,以了解其提供的服务。您应该得到这样的内容:

程序与原型端口
100000 2 tcp 111端口映射器
100000 2 udp 111端口映射器
100011 1 udp 749 rquotad
100011 2 udp 749 rquotad
100005 1 udp 759安装
100005 1 tcp 761已安装
100005 2 udp 764安装
100005 2 tcp 766安装
100005 3 UDP 769安装
100005 3 tcp 771安装
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
300019 1 tcp 830 amd
300019 1 udp 831 amd
100024 1 udp 944状态
100024 1 tcp 946状态
100021 1 udp 1042 nlockmgr
100021 3 udp 1042 nlockmgr
100021 4 udp 1042 nlockmgr
100021 1 tcp 1629 nlockmgr
100021 3 tcp 1629 nlockmgr
100021 4 tcp 1629 nlockmgr

这表示我们有NFS版本2和3,rpc.statd版本1,网络锁管理器(rpc.lockd的服务名称)版本1、3和4。还有其他服务列表,具体取决于NFS是否遍历TCP或UDP。除非明确请求TCP,否则Linux系统默认使用UDP。但是其他操作系统(例如Solaris)默认为TCP。

如果没有至少可以看到这样一行 端口映射,这样一行NFS,并且这样一行 mountd的,那么你将需要原路返回,并再次尝试启动守护程序(见第7章,“故障排除”,如果这仍然不起作用)。

如果确实列出了这些服务,则应该准备好设置NFS客户端以访问服务器中的文件。

3.3.5。稍后对/ etc / exports进行更改

如果返回并更改/etc/exports 文件,所做的更改可能不会立即生效。您应该运行命令exportfs -ra强制 nfsd重新读取该 /etc/exports文件。如果找不到 exportfs命令,则可以使用-HUP标志杀死 nfsd(有关杀死的详细信息,请参见手册页)。

如果那仍然不起作用,请不要忘记检查 hosts.allow以确保您没有忘记在那里列出任何新的客户端计算机。还要检查您可能设置的任何防火墙上的主机列表(有关防火墙和NFS的更多详细信息,请参见第7节,“故障排除”和第6节,“安全性和NFS”)。

4.设置NFS客户端

4.1。挂载远程目录

开始之前,您应该仔细检查以确保您的装载程序足够新(如果要使用版本3 NFS,则为2.10m版本),并且该客户端计算机支持NFS装载,尽管大多数标准发行版都支持。如果将2.2或更高版本的内核与/proc文件系统一起使用,则 可以通过读取文件/proc/filesystems并确保其中包含nfs的行来检查后者。否则,如果将NFS编译为模块,则键入insmod nfs可能会使其神奇地出现。否则,您将需要构建(或下载)内置了NFS支持的内核。通常,当运行下面的mount命令时,未编译NFS的内核会给出非常具体的错误 。

要开始将计算机用作NFS客户端,您将需要在该计算机上运行portmapper,并且要使用NFS文件锁定,还需要 在客户端和服务器上都运行rpc.statd和rpc.lockd。默认情况下,最新发行版会在引导时启动这些服务。如果不是,请参阅第4节“设置NFS客户端”以获取有关如何启动它们的信息。

随着portmap,lockd和statd的运行,您现在应该能够使用mount命令从服务器上挂载远程目录,就像挂载本地硬盘一样。继续上一节中的示例,假设上面的服务器名为 master.foo.com,并且我们希望将/home目录挂载 在 slave1.foo.com上。然后,在slave1.foo.com上的根提示符下,我们要做的就是键入:

#挂载master.foo.com:/home / mnt / home

并且master/home上 的目录将显示为slave1上 的目录。(请注意,这是假设我们事先已将目录创建为空安装点。) /mnt/home/mnt/home

如果这不起作用,请参见第7章,“故障排除”。

您可以通过键入以下内容来卸载文件系统:

#卸载/ mnt / home

就像您要使用本地文件系统一样。

4.2。在引导时获取要挂载的NFS文件系统

可以/etc/fstab 像本地文件系统一样将NFS文件系统添加到您的文件中,以便在系统启动时挂载它们。唯一的区别是文件系统类型将设置为nfs,转储和fsck顺序(最后两个条目)将必须设置为零。因此,对于上面的示例,/ etc / fstab中的条目如下所示:

#设备安装点fs类型选项转储fsckorder
master.foo.com:/home / mnt nfs rw 0 0

如果您不熟悉此文件的语法, 请参见fstab的手册页。如果您使用的是amd或autofs之类的自动安装程序 ,则挂载清单的相应字段中的选项应该看起来非常相似(如果不相同)。

此时,您应该已经可以使用NFS,尽管可能需要进行一些调整才能使其正常工作。您还应该阅读第6节“安全性和NFS”,以确保您的设置是相当安全的。

4.3。挂载选项

4.3.1。软安装与硬安装

您应该考虑立即添加一些选项。它们控制NFS客户端处理服务器崩溃或网络中断的方式。关于NFS的很酷的事情之一是它可以优雅地处理此问题。如果您设置正确的客户。有两种不同的故障模式:

柔软的
如果文件请求失败,则NFS客户端将向请求请求文件访问权限的客户端计算机上的进程报告错误。有些程序可以冷静地处理此问题,而大多数程序则不能。我们不建议使用此设置。这是损坏文件和丢失数据的秘诀。特别是,不要将其用于邮件磁盘-如果您重视邮件,那就是。

难的
当服务器崩溃时,访问NFS挂载的文件系统上的文件的程序将挂起。除非您还指定intr,否则不能中断或终止该进程(除非通过“确定终止”)。当NFS服务器重新联机时,程序将继续保持原样。我们建议在所有NFS挂载的文件系统上使用hard,intr。

从前面的示例中选取,fstab 现在看起来像:

#设备安装点fs类型选项转储fsckord

master.foo.com:/home / mnt / home nfs rw,hard,intr 0 0

在rsize和wsize安装选项指定的数据块的大小,客户端和服务器来回传递给对方。

默认值可能太大或太小;没有适合所有或大多数设置的尺寸。一方面,Linux内核和网卡的某些组合(主要在较旧的机器上)无法处理那么大的块。另一方面,如果它们可以处理较大的块,则较大的尺寸可能会更快。

正确设置块大小是性能的重要因素,如果您打算在生产环境中使用NFS服务器,则必须这样做。有关详细信息,请参见第5节“优化NFS性能”。

实践

file


擦肩而过的概率