介绍
网络文件系统无疑是使用最广泛的网络服务之一。网络文件系统(NFS)基于远程过程调用它允许客户端自动挂载远程文件系统,因此透明地提供对它的访问,就好像文件系统是本地的一样。
情境
在这种情况下,我们将从IP地址10.1.1.50(NFS服务器)主机上导出文件系统,并将其安装在IP地址10.1.1.55(NFS Client)上的主机上。 NFS服务器和NFS客户端都将运行Ubuntu Linux。
先决条件
此时,我们假定您的系统上已经安装了NFS服务守护程序,包括NFS安装程序所依赖的portmap守护程序。
如果尚未这样做,则只需使用apt-get工具在NFS客户端和NFS服务器上安装nfs-common软件包。
# apt-get install nfs-common
上面的命令将获取并安装NFS客户端和NFS服务器通用的所有支持文件,包括端口映射。
另外,我们需要在NFS服务器端安装额外的软件包。
apt-get install nfs-kernel-server
该软件包是在UDP和TCP 2049端口上侦听的实际NFS守护程序。
执行rpcinfo -p来检查您的NFS安装是否正确,并实际确认NFS服务器确实正在运行并接受端口2049上的调用:
# rpcinfo -p | grep nfs
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
此外,在我们开始导出和挂载NFS目录之前,您的系统需要实际支持网络文件系统。要检查您的系统是否支持NFS grep /proc /filesystems并搜索nfs。
# cat /proc/filesystems | grep nfs
nodev nfs
nodev nfs4
如果看不到任何输出,则表示不支持NFS或尚未将NFS模块加载到内核中。要加载NFS模块,请执行:
# modprobe nfs
正确安装后,NFS守护程序现在应该正在UDP和TCP 2049端口上侦听,并且portmap应该正在端口111上等待指令。
此时,您应该在NFS服务器和NFS客户端上都监听端口映射:
rpcinfo -p | grep portmap
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
(adsbygoogle = window.adsbygoogle || [])。push({});
服务器导出文件
我们要使用NFS在网络上共享的所有目录都需要在此通信的服务器端进行定义,更具体地说,需要使用/etc /exports文件进行定义。在下一部分中,您将看到最常见的NFS导出:
最常见的出口选择
以下是最常见的NFS导出技术和选项:
/home /nfs /10.1.1.55(rw,sync) | 导出/home /nfs目录,用于IP地址为10.1.1.55且具有读取,写入权限和同步模式的主机 |
/home /nfs /10.1.1.0/24(ro,sync) | 导出网络10.1.1.0的/home /nfs目录,网络掩码为255.255.255.0,具有只读权限和同步模式 |
/home /nfs /10.1.1.55(rw,sync)10.1.1.10(ro,sync) | 导出/home /nfs目录用于IP 10.1.1.55的主机,具有读取,写入权限,同步模式,还可以导出/home /nfs目录用于IP地址为10.1.1.10的另一台主机,具有只读权限和同步模式 |
/home /nfs /10.1.1.55(rw,sync,no_root_squash) | IP地址为10.1.1.55且具有读取,写入权限,同步模式和远程root用户的主机的export /home /nfs目录将被视为root用户,并且能够更改任何文件和目录。 |
/home /nfs /*(ro,sync) | 导出/home /nfs目录以获取具有只读权限和同步模式的任何主机 |
/home /nfs /* .linuxconfig.org(ro,sync) | 导出linuxconfig.org域中具有只读权限和同步模式的任何主机的/home /nfs目录 |
/home /nfs /foobar(rw,sync) | 导出/home /nfs目录以获取具有读取,写入权限和同步模式的主机名foobar |
(adsbygoogle = window.adsbygoogle || [])。push({});
编辑导出文件
现在我们已经熟悉了一些NFS的导出选项,我们可以定义我们的第一个NFS导出。打开您喜欢的文本编辑器,例如vim并通过添加/home /nfs /*(ro,sync)行来编辑/etc /exports文件,该行将为具有只读权限的任何主机导出/home /nfs目录。不用文本编辑器,您只需使用echo命令将NFS导出行插入/etc /exports文件即可:
# echo '/home/nfs/ *(ro,sync)' > /etc/exports
# tail -1 /etc/exports
/home/nfs/ *(ro,sync)
确保要通过NFS导出的目录存在。您还可以在/home /nfs目录中创建一个文件,该文件将帮助您在远程挂载/home /nfs /后进行故障排除。
# touch /home/nfs/nfs-test-file
注意:NFS内核守护程序的默认行为是在导出行”no_subtree_check”中包含其他选项。当您尝试进一步配置NFS导出时,请注意这一事实。
重新启动NFS守护程序
编辑/etc /exports文件后,需要重新启动NFS守护程序以应用所有更改。根据您的Linux发行版,NFS的重新启动过程可能有所不同。 Ubuntu和Debian用户:
# /etc/init.d/nfs-kernel-server restart
Redhat和Fedora用户
# /etc/init.d/nfs restart
如果以后决定将更多NFS导出添加到/etc /exports文件,则需要重新启动NFS守护程序或运行命令exportfs:
# exportfs -ra
在客户端上挂载远程文件系统
首先,我们需要创建一个挂载点:
# mkdir /home/nfs_local
如果确定已准备好NFS客户端和挂载点,则可以运行mount命令来挂载导出的NFS远程文件系统:
# mount 10.1.1.50:/home/nfs /home/nfs_local
如果您需要指定文件系统类型,可以通过以下方式进行操作:
# mount -t nfs 10.1.1.50:/home/nfs /home/nfs_local
您可能还会收到和错误消息:
mount: mount to NFS server failed: timed out (retrying).
这可能意味着您的服务器支持更高的NFS版本,因此您需要向nfs client mount命令传递一个额外的参数。在此示例中,我们使用nfs版本3:
# mount -t nfs -o nfsvers=3 10.1.1.50:/home/nfs /home/nfs_local
无论如何,现在您应该可以在NFS客户端上本地访问远程/home /nfs目录。
# ls /home/nfs_local/
nfs-test-file
# cd /home/nfs_local/
# ls
nfs-test-file
# touch test
touch: cannot touch `test': Read-only file system
上面的输出证明已安装了远程NFS导出,并且我们可以通过导航到本地/home /nfs_local /目录来访问它。请注意,touch命令报告文件系统已以只读方式挂载,这正是我们的意图。
(adsbygoogle = window.adsbygoogle || [])。push({});
配置自动挂载
为了使此操作对最终用户完全透明,您可以在用户每次引导Linux系统时自动挂载NFS文件系统,或者也可以使用PAM模块在用户使用正确的用户名和密码登录后进行挂载。在这种情况下,只需编辑/etc /fstab即可在系统引导期间自动挂载系统。您可以使用自己喜欢的编辑器并在/etc /fstab中创建如下新行:
10.1.1.50:/home/nfs /home/nfs_local/ nfs defaults 0 0
和以前一样,您也可以使用echo命令执行此操作:
# echo "10.1.1.50:/home/nfs /home/nfs_local/ nfs defaults 0 0" >> /etc/fstab
# tail -1 /etc/fstab
10.1.1.50:/home/nfs /home/nfs_local/ nfs defaults 0 0
结论
网络文件系统带有大量导出选项。此处显示的内容仅勉强刮过NFS的表面。请拜访Linux NFS-HOWTO由Linux文档项目托管或NFS主页更多细节。
附录A
本NFS教程的以下部分将专门介绍RedHat和Fedora Linux系统,它们默认情况下通过使用iptables规则启用防火墙来阻止所有传入NFS服务器的流量。因此,当防火墙在NFS服务器上运行时,挂载NFS文件系统时可能会出现此错误:
mount.nfs:挂载到NFS服务器’10.1.1.13’失败:系统错误:没有到主机的路由。
此错误消息与您的NFS配置无关,所有需要做的就是关闭防火墙或添加iptables规则,以允许端口映射端口111,nfs端口2049和其他nfs服务的随机端口上的通信。
有两个解决方案:简单的解决方案是完全关闭防火墙,正确的解决方案是添加适当的iptables规则。
在类似Redhat的系统上关闭防火墙:
最简单的解决方案是仅关闭防火墙。这将自动向任何人授予对nfs守护程序的访问权限。我建议此解决方案仅用于测试NFS配置。输入以下内容linux命令停止防火墙并清理所有iptables规则:
# service iptables stop
现在,当您的NFS设置正确时,您应该可以从客户端计算机挂载nfs文件系统了。
添加iptables规则以允许NFS通信
对于上述问题,这是一种更为复杂但正确的解决方案。首先,我们需要通过编辑/etc /sysconfig /nfs文件来设置nfs服务(例如rquotad,mountd,statd和lockd)的静态端口。在/etc /sysconfig /nfs文件中添加或取消注释以下行:
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
STATD_PORT=662
使用以下命令重新启动NFSD守护程序linux命令s:
# /etc/init.d/nfs restart
# /etc/init.d/nfslock restart
使用rpcinfo命令确认新端口设置的有效性:
(adsbygoogle = window.adsbygoogle || [])。push({});
# rpcinfo -p localhost
The output should be similar to the one below:
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 999 rquotad
100011 2 udp 999 rquotad
100011 1 tcp 1002 rquotad
100011 2 tcp 1002 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 32769 nlockmgr
100021 3 udp 32769 nlockmgr
100021 4 udp 32769 nlockmgr
100021 1 tcp 32803 nlockmgr
100021 3 tcp 32803 nlockmgr
100021 4 tcp 32803 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100005 1 udp 892 mountd
100005 1 tcp 892 mountd
100005 2 udp 892 mountd
100005 2 tcp 892 mountd
100005 3 udp 892 mountd
100005 3 tcp 892 mountd
100024 1 udp 662 status
100024 1 tcp 662 status
将您当前的iptables规则保存到iptables-rules-orig.txt中:
# iptables-save > iptables-rules-orig.txt
创建具有以下内容的名为iptables-nfs-rules.txt的文件:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2:200]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 32769 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 32769 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 32803 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 32803 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 662 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 662 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 892 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 892 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
应用带有iptables-restore的新规则,其中单个参数将是iptables-nfs-rules.txt文件:
注意:这将创建一组新的iptables规则。如果以前已经定义了一些iptables规则,则可能需要编辑iptables-rules-orig.txt并将其与iptables-restore命令一起使用。
# iptables-restore iptables-nfs-rules.txt
保存这些新规则,因此下次重启服务器时不必为nfs守护程序应用新规则:
# service iptables save
现在您的服务器已准备就绪,可以接受客户端nfs请求。 (可选)您可以使用以下命令重新启动iptables规则/防火墙linux命令:
# service iptables restart