NFS(Network File System)是一种能使服务器上的信息被其他计算机挂载而达到资源共享的网络文件系统。一个客户机可以把远程文件系统挂载到本地文件系统的某个目录下,作为本地系统的一部分来使用。NFS 有属于自己的协议和端口号,但在传送资料或其他相关信息时,NFS 服务器需要使用 RPC 协议来协助运行。
因为 NFS 支持的功能很多,每当启动一个功能就要启用一些端口来传输数据,因此 NFS 的功能所对应的端口是不固定的,通常是随机取用一些未被使用的小于 1024 的端口作为传输之用,而客户端必须知道服务器相关端口才能连接,此时需要 RPC 服务。
RPC(远程过程调用协议)的功能是制定每个 NFS 功能对应的端口号,并且回送给客户端,让客户端连接到正确的端口上。NFS 服务器启动时会随机启用数个端口号,并主动向 RPC 注册,RPC 固定使用 111 号端口监听客户机的请求并回应正确的端口号。因此,启动 NFS 之前,要先启动 RPC。
Ubuntu 系统所使用的软件包为 nfs-kernel-server,当然还需要其他包支持,比如 rpcbind 作端口映射工作,这些支持包在安装 NFS 时会自动安装。
sudo apt install nfs-kernel-server
NFS 的服务是 nfs-server.service,可以使用服务管理的办法进行管理
sudo systemctl enable/disable nfs-server.service # 启用/禁用
systemctl status nfs-server.service # 检查状态
systemctl start/stop/restart/reload nfs-server.service # 启动/停止/重启/重载
NFS 配置文件为 /etc/exports,每一行描述一个共享目录,并且说明该目录如何被共享,每一有效行的格式为:共享目录 访问者(选项) 访问者(选项)
访问者为主机或 IP 地址,括号内的选项只对括号前的访问者有效,访问者格式可以为:
常用选项及说明如表所示
选项 | 说明 |
---|---|
ro/rw | 只读/读写 |
sync/async | 同步/异步写入 |
secure | 只允许 NFS 通过 1024 以前端口连接(默认) |
insecure | 允许 NFS 通过 1024 及以上的端口连接,此选项关闭 secure |
secure_locks | 使用安全的文件锁 |
insecure_looks/no_auth_nlm | 允许使用不安全的文件锁,此选项关闭 secure_locks |
wdelay | 延迟写,如果多个用户要写入 NFS 目录,则归组写入(默认) |
no_wdelay | 同步写入。当使用 async 时,无须此设置 |
hide | 不共享子目录或隐藏子目录 |
no_hide | 共享 NFS 目录的子目录 |
subtree_check | 共享目录树,如果共享目录是一个子目录,将强制检查父目录权限(默认) |
no_subtree_check | 与 subtree_check 相对应,不检查父目录权限 |
root_squash | 客户机用 root 用户访问共享文件夹时,将 root 映射为匿名用户 |
no_root_squash | 客户机用 root 用户访问共享文件夹时,不做映射 |
all_squash | 客户机所有用户映射为匿名用户 |
anonuid=xxx,anongid=xxx | 使用 all_squash 选项时,指定 NFS 服务器 /etc/passwd 文件中用户的 UID 和 GID |
no_all_squash | 保留共享文件的 UID 和 GID(默认) |
在客户端使用 NFS,需要安装支持包
sudo apt-get install nfs-common
使用 mount 命令来将服务器上的共享目录安装到本地
mount -t nfs [options] server:dir mount_point
其意义是将 server 服务器上的 dir 目录安装在本地的 mount_point 安装点上,文件系统类型为 nfs
首先建立一个共享目录,然后向其中添加一些用于共享的文件
sudo mkdir -p /var/nfs_share
sudo /etc/init.d /var/nfs_share
编辑 /etc/exports 文件,加入如下行
/var/nfs_share *(rw,no_root_squash,insecure)
重载 NFS 服务
sudo systemctl reload nfs-server.service
在任意一台可以 ping 通服务器的主机上安装共享目录,这里以 Ubuntu 客户端为例
sudo mkdir -p /mnt/nfs
sudo mount -t nfs 192.168.1.105:/var/nfs_share /mnt/nfs
将 192.168.1.105 上的 /var/nfs_share 目录挂载到本机的 /mnt/nfs 目录下。到此,在客户端可以通过命令查看其中内容了
ls -l /mnt/nfs
NFS 文件系统的拆卸与普通文件的拆卸方法相同
sudo umount /mnt/nfs