网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件 一样访问远端系统上的文件。
以下是NFS最显而易见的好处:
本地工作站使用更少的磁盘空间,因为通常的数据可以存放在一 台机器上而且可以通过网络访问到。
用户不必在每个网络上机器里头都有一个home目录。Home目录 可以被放在NFS服务器上并且在网络上处处可用。
诸如软驱,CDROM,和 Zip® 之类的存储设备可以在网络上面被别的机器使用。 这可以减少整个网络上的可移动介质设备的数量。
NFS至少有两个主要部分:一台服务器和一 台(或者更多)客户机。客户机远程访问存放在服务器上的数据。为了 正常工作,一些进程需要被配置并运行。
Note: 在 FreeBSD 5.X上面,portmap 被rpcbind替换了。而且,在FreeBSD 5.X上面, the user is required to replace every instance of portmap with rpcbind in the forthcoming examples。
服务器必须运行以下服务:
服务 | 描述 |
---|---|
nfsd | NFS,为来自NFS客户端的 请求服务。 |
mountd | NFS挂载服务,处理nfsd(8)递交过来的请求。 |
portmap | portmap服务允许 NFS客户端查看NFS服务在用的端口。 |
客户端同样运行一些进程,比如 nfsiod。 nfsiod处理来自NFS的请求。 这是可选的,而且可以提高性能,对于普通和正确的操作来说并不是必须的。 参考nfsiod(8)手册获得更多信息。
NFS的配置过程相对简单。这个过程只需要 对/etc/rc.conf文件作一些简单修改。
在NFS服务器这端,确认/etc/rc.conf 文件里头以下开关都配上了:
portmap_enable="YES" nfs_server_enable="YES" mountd_flags="-r"
只要NFS服务被置为enable,mountd 就能自动运行。
在客户端一侧,确认下面这个开关出现在 /etc/rc.conf里头:
nfs_client_enable="YES"
/etc/exports文件指定了哪个文件系统 NFS应该输出(有时被称为“共享”)。 /etc/exports里面每行指定一个输出的文件系统和 哪些机器可以访问该文件系统。在指定机器访问权限的同时,访问选项 开关也可以被指定。有很多开关可以被用在这个文件里头,不过不会在这 里详细谈。您可以通过阅读exports(5) 手册来发现这些开关。
以下是一些/etc/exports的例子:
紧接着的这个例子说明了如何输出一个文件系统,尽管具体设定和您 的环境以及网络配置有关。作为实例,为了输出/cdrom 到三个的例子机器,它们有同样域名(因此他们的域名不大对)或者在您的 /etc/hosts文件里头有记录。-ro 标志将被输出的文件系统置为只读。由于这个标志,远程系统将无法在被输出 的文件系统上写入任何变动。
/cdrom -ro host1 host2 host3
下面的例子可以输出/home给三个以IP地址方式表示的主机。 对于在没有配置DNS服务器的私有网络里头,这很有用。 此外,the /etc/hosts 文件也可以用以配置主机名;参看 hosts(5) 。 -alldirs 标记允许子目录被作为挂载点。 也就是说,客户端可以根据需要挂载需要的目录。
/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4
下面几行输出 /a ,以便两个来自不同域的客户端可以访问文件系统。 -maproot=root 标记授权远端系统上的 root 用户在被输出的文件系统上以root身份进行读写。 如果没有特别指定 -maproot=root 标记, 则即使用户在远端系统上是 root 身份, 也不能修改被输出文件系统上的文件。
/a -maproot=root host.example.com box.example.org
为了能够访问到被输出的文件系统,客户端必须被授权。 请确认客户端在您的 /etc/exports 被列出。
在 /etc/exports 里头,每一行里面,输出信息和文件系统一一对应。 一个远程主机每次只能对应一个文件系统。而且只能有一个默认入口。比如,假设 /usr 是独立的文件系统。这个 /etc/exports 就是无效的:
/usr/src client /usr/ports client
一个文件系统,/usr, 有两行指定输出到同一主机, client. 解决这一问题的正确的格式是:
/usr/src /usr/ports client
The properties of one filesystem exported to a given host must all occur on one line. Lines without a client specified are treated as a single host. This limits how you can export filesystems, but for most people this is not an issue.
下面是一个有效输出列表的例子, /usr and /exports 是本地文件系统:
# Export src and ports to client01 and client02, but only # client01 has root privileges on it /usr/src /usr/ports -maproot=root client01 /usr/src /usr/ports client02 # The client machines have root and can mount anywhere # on /exports. Anyone in the world can mount /exports/obj read-only /exports -alldirs -maproot=root client01 client02 /exports/obj -ro
一旦修改 /etc/exports 了之后, 为了让变动生效,您必须重启 mountd。 可以通过对mountd 进程发送HUP信号重启:
# kill -HUP `cat /var/run/mountd.pid`
另外,系统重启动可以让FreeBSD把一切都弄好。尽管如此,重启不是必须的。 以 root 身份执行下面的命令可以搞定一切。
在 NFS 服务器端:
# portmap # nfsd -u -t -n 4 # mountd -r
在 NFS 客户端:
# nfsiod -n 4
现在每件事情都应该就绪,以备挂载一个远端文件系统。 在这些例子里头, 服务器名字将是:server ,而客户端的名字将是: client。 如果您只打算临时挂载一个远端文件系统或者只是打算作测试配置正确与否, 只要在客户端以 root 身份执行下面的命令:
# mount server:/home /mnt
这条命令会把服务端的 /home 目录挂载到客户端的 /mnt 上。 如果配置正确,您应该可以进入客户端的 /mnt 目录并且看到所有服务端的文件。
如果您打算让系统每次在重启动的时候都自动挂载远端的文件系统,把那个文件系统加到 /etc/fstab 文件里头去。下面是例子:
server:/home /mnt nfs rw 0 0
fstab(5) 手册里有所有可用的开关。
NFS 有很多实际应用。下面是比较常见的一些:
多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。
在大型网络中,配置一台中心 NFS 服务器用来放置所有用户的home目录可能会带来便利。 这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。
几台机器可以有通用的/usr/ports/distfiles 目录。 这样的话,当您需要在几台机器上安装port时,您可以无需在每台设备上下载而快速访问源码。