China FreeBSD

使用NFS网络文件系统

  • 贡献者:HHJ
  • 阅读:1877
  • 类别:系统服务
  • 更新时间:2017-10-10 08:37:22

1. NFS 网络文件系统的介绍

NFS(Network File System)即网络文件系统,是 FreeBSD 支持的文件系统中的一种,它允许网络中的计算机之间通过 TCP/IP 网络共享资源。在 NFS 的应用中,本地 NFS 的客户端应用可以透明地读写位于远端 NFS 服务器上的文件,就像访问本地文件一样。 以下是 NFS 最显而易见的好处:

  1. 节省本地存储空间,将常用的数据存放在一台 NFS 服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。
  2. 用户不需要在网络中的每个机器上都建有 Home 目录,Home 目录可以放在 NFS 服务器上且可以在网络上被访问使用。
  3. 一些存储设备如软驱、CDROM 和 Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。

提示:

以上关于 NFS 网络文件系统的介绍引用于百度百科

1.2. NFS 网络文件系统服务端的组成介绍

FreeBSD 系统的 NFS 文件系统已经集成于内核之中,现版本的 FreeBSD 已经默认支持 NFS 服务端以及客户端。我们说文件系统是由内核实现的,但是服务是在用户层实现的。一个完整的 NFS 服务体系就像 mail 一样是一个复杂的服务集合体,其中包括:

  1. nfsd 提供基于 NFS 第三版本 和第四版本协议的服务支持,但是服务开放一组随机服务端口。
  2. rpcbind 开放 111 端口监听客户端请求,协调 NFS 服务端和客户端的端口绑定。
  3. nfsuserd 完成本地用户和远程用户 uid guid 的访问权限映射(对接)
  4. mountd 协助完成本地 NFS 文件系统挂载给客户端。

1.3. FreeBSD 下 NFS 服务端配置

虽然在 FreeBSD 上一个完整的文件系统的服务端要求至少 4 个服务启动才能协调工作。但是在配置上是不需要这么啰嗦的。 为了能够正常的运行支持 NFSv3 的 NFS 服务器,你需要修改/etc/rc.conf添加如下配置:

nfs_server_enable="YES"
nfsuserd_enable="YES"

为了能够正常的运行支持 NFSv4 的 NFS 服务器,你需要修改/etc/rc.conf添加如下配置:

nfs_server_enable="YES"
nfsv4_server_enable="YES"
nfsuserd_enable="YES"

重要:

NFSv3 与 NFSv4 的区别是:NFSv4支持专有的访问控制列表,允许客户端在本地操作文件

其中 nfs_server_enable 与 nfsv4_server_enable 是 nfsd 服务中的启动开关,这两个开关均由 nfsd 服务所支持。而不需要用户强制启动 rpcbind 与 mountd 的理由是:这两个服务均由 nfsd 服务后台自主维护,且进行后台强制启动!详细见如下代码分析

#!/bin/sh

....

nfsd_precmd()
{
        rc_flags="${nfs_server_flags}"

        # Load the modules now, so that the vfs.nfsd sysctl
        # oids are available.
        load_kld nfsd

        if checkyesno nfs_reserved_port_only; then
                echo 'NFS on reserved port only=YES'
                sysctl vfs.nfsd.nfs_privport=1 > /dev/null
        else
                sysctl vfs.nfsd.nfs_privport=0 > /dev/null
        fi

        if checkyesno nfsv4_server_enable || \
            checkyesno nfs_server_managegids; then
                force_depend nfsuserd || err 1 "Cannot run nfsuserd"
        fi

        if checkyesno nfsv4_server_enable; then
                sysctl vfs.nfsd.server_max_nfsvers=4 > /dev/null
        else
                echo 'NFSv4 is disabled'
                sysctl vfs.nfsd.server_max_nfsvers=3 > /dev/null
        fi

        force_depend rpcbind || return 1
        force_depend mountd || return 1
}

这段代段表示在 nfsd 服务启动之前要处理的运行环境,而代码段的最后两行表示在 nfsd 服务启动之前要强制启动 rpcbind 以及 mountd。关于 rc 系统的 start_precmd 请参考本站的 rc脚本的书写 小节。

1.4. 配置 exports 系统

NFS 文件系统需要一个可维护的本地挂载点,用于共享给远程客户端,而在通用文件系统上这个本地挂载点的维护则由 exports 系统来提供(ZFS 文件系统可自主维护 NFS 共享目录),其配置文件为/etc/exports,简单语法示例如下小节。

1.4.1 针对于 NFSv3 协议 exports 简单示例

/usr /usr/local -maproot=0:10 friends
/usr -maproot=daemon grumpy.cis.uoguelph.ca 131.104.48.16
/usr -ro -mapall=nobody
/u -maproot=bin: -network 131.104.48 -mask 255.255.255.0
/a -network 192.168.0/24
/u2 -maproot=root friends
/u2 -alldirs -network cis-net -mask cis-mask
/cdrom -alldirs,quiet,ro -network 192.168.33.0 -mask 255.255.255.0

#/usr 以及 /usr/local表示共享目录, -maproot=0:10 表示远程用户被映射为本地 uid 为 0 gid 为
#10 的用户,friends 是远程主机名,在 /etc/hosts 中应该为其定义映射 IP 地址。也就是说如果远
#程 friends 主机如果挂载以上两个目录,则远程主机的用户会被映射为本地的uid:gid = 0:10 的用户
#
#-maproot=daemon 表示远程用户被映射为本地用户 daemon。grumpy.cis.uoguelph.ca 131.104.48.16
#分别表示远程主机名以及远程 IP 地址,也就是说 /usr 挂载点如果被这两台主机进行挂载,则远程
#用户就会被影射为本地的 daemon 用户。
#
#/usr -ro -mapall=nobody 表示初以上情况外,所有其他主机的挂载权限为 ro(只读权限),且用户被
#映射为本地的 nobody 用户。
#
#/u -maproot=bin: -network 131.104.48 -mask 255.255.255.0 以及 /a -network 192.168.0/24 分
#别表示本地目录可以共享给 131.104.48/24 以及 192.168.0/24 这两个网段的客户端使用,只是用了
#不同的表示方法。
#
#/u2 -alldirs 表示所有 /u2 下的目录都可以被客户端当作独立挂载点进行挂载
#
#/cdrom -alldirs,quiet  中 quiet 表示如果出错,则以静默方法记录日志

1.4.2 针对于 NFSv4 协议 exports 简单示例

V4: /   -sec=krb5:krb5i:krb5p -network 131.104.48 -mask 255.255.255.0
V4: /   -sec=sys:krb5:krb5i:krb5p grumpy.cis.uoguelph.ca

#第一行代码表示使用 NFSv4 协议共享目录,可以使用此共享目录的客户端必须在 131.104.48/24 网段内
#第二行代码表示可以使用此共享目录的客户端主机名为 grumpy.cis.uoguelph.ca
#
#以上两行表示使用不同版本的 krb5 进行安全认证,并且被 chroot 在 "/" 本地挂载点。

小心:

exports 文件中 NFSv4 挂载点必须以 "V4: " 为前缀修饰词,且 "V4" 必须使用英文大写字母。

2. FreeBSD 下 NFS 文件系统客户端的使用

如果想把服务端共享目录以简单的方法挂载到本地,只需要使用 mount 命令进行挂载即可 针对于 NFSv3 协议只需

# mount -t nfs server-ip:/usr/ports  /mnt

针对于 NFSv4 协议只需

# mount -t nfs -o nfsv4 server-ip:/usr/ports  /mnt

如果想在开机启动时自动挂载 NFS 远程目录则需要按照如下几个步骤示例操作即可 需要在/etc/rc.conf文件中添加

nfsuserd_enable="YES"
nfscbd_enable="YES"

注意:

nfscbd 的作用是允许服务端向客户端委托事物

对于 NFSv3 协议调节/etc/fstab

server-ip:/usr/ports   /usr/ports   nfs  rw  0   0

对于 NFSv4 协议调节/etc/fstab

server-ip:/usr/ports   /usr/ports   nfs  rw,nfsv4  0   0