Vagrant
NFS
在某些情况下,默认共享文件夹实现(例如 VirtualBox 共享文件夹)具有较高的性能损失。如果您在使用同步文件夹时遇到性能不佳的问题,NFS 提供了一种解决方案。Vagrant 内置了支持,可为您编排主机和客户端上的 NFS 服务器配置。
Windows 用户:NFS 文件夹在 Windows 主机上不起作用。Vagrant 将忽略您在 Windows 上请求的 NFS 同步文件夹。
先决条件
在使用基于 NFS 的同步文件夹之前,主机机器必须安装 nfsd,即 NFS 服务器守护程序。这预装在 Mac OS X 上,并且通常是 Linux 上的一个简单的软件包安装。
此外,客户端机器必须安装 NFS 支持。这通常也是一个简单的软件包安装。
如果您使用的是 VirtualBox 提供程序,还需要确保您已设置 私有网络。这是由于 VirtualBox 内置网络存在限制。对于 VMware,您不需要这样做。
启用 NFS 同步文件夹
要启用 NFS,只需在同步文件夹中添加 type: "nfs" 标志
Vagrant.configure("2") do |config|
config.vm.synced_folder ".", "/vagrant", type: "nfs"
end
如果您将此添加到已运行客户端机器的现有的 Vagrantfile 中,请务必 vagrant reload 以查看您的更改。
NFS 同步文件夹选项
NFS 同步文件夹有一组可以指定的选项,这些选项是 NFS 独有的。这些选项如下。可以在 config.vm.synced_folder 定义的最后一部分中指定这些选项,以及 type 选项。
nfs_export(布尔值) - 如果此值为 false,Vagrant 将不会自动修改您的/etc/exports,并假定您已经自行完成了此操作。nfs_udp(布尔值) - 是否使用 UDP 作为传输协议。UDP 更快,但有一些限制(有关更多详细信息,请参阅 NFS 文档)。默认值为 true。nfs_version(字符串 | 整数) - 在 guest 上挂载文件夹时使用的 NFS 协议版本。默认值为 3。
NFS 全局选项
您还可以使用 Vagrantfile 中的 config.nfs 设置更多全局 NFS 选项。这些选项在下文中有所说明。
functional(布尔值) - 默认为 true。如果为 false,则 NFS 将不会用作同步文件夹类型。如果同步文件夹明确请求 NFS,则会报错。map_uid和map_gid(整数) - 分别映射所有读/写请求的 UID/GID。这不会影响 guest 机器内的所有者/组,但所有写入操作的行为都将如同由主机上的此 UID/GID 写入一样。默认值为运行 Vagrant 的当前用户。verify_installed(布尔值) - 默认为 true。如果此值为 false,则 Vagrant 将跳过检查是否已安装 NFS。
指定 NFS 参数
除了上述选项之外,Vagrant 还可以使用 Vagrantfile 中的 mount_options 键指定替代 NFS 参数,以挂载 NFS 共享。例如,要使用 actimeo=2 客户端挂载选项
config.vm.synced_folder ".", "/vagrant",
type: "nfs",
mount_options: ['actimeo=2']
这将导致在 guest 上执行以下 mount 命令
mount -o 'actimeo=2' 172.28.128.1:'/path/to/vagrantfile' /vagrant
您还可以通过使用 OS 特定的 linux__nfs_options 或 bsd__nfs_options 键来调整在 /etc/exports 模板中指定的参数。请注意,这些选项会完全覆盖 Vagrant 自动添加的默认参数。例如,要使 NFS 共享异步
config.vm.synced_folder ".", "/vagrant",
type: "nfs",
linux__nfs_options: ['rw','no_subtree_check','all_squash','async']
这将导致主机上 /etc/exports 中的以下内容(请注意添加的 async 标志)
# VAGRANT-BEGIN: 21171 5b8f0135-9e73-4166-9bfd-ac43d5f14261
"/path/to/vagrantfile" 172.28.128.5(rw,no_subtree_check,all_squash,async,anonuid=21171,anongid=660,fsid=3382034405)
# VAGRANT-END: 21171 5b8f0135-9e73-4166-9bfd-ac43d5f14261
Root 权限要求
要配置 NFS,Vagrant 必须修改主机上的系统文件。因此,在 vagrant up 序列的某个时刻,您可能会被提示提供管理员权限(通过典型的 sudo 程序)。这些权限用于修改 /etc/exports 以及启动和停止 NFS 服务器守护程序。
如果您不想在每次 vagrant up 时输入密码,Vagrant 使用精心设计的命令来实现细粒度的 sudoers 修改,以避免输入密码。
下面是一些示例 sudoers 条目。请注意,您可能需要在某些主机上稍微修改它们,因为 Vagrant 修改 /etc/exports 的方式因操作系统而异。如果以下命令位于非标准路径中,请相应地进行修改。
另请注意,在 sudoer 文件格式中,条目按顺序应用。如果您已添加适当的条目,但仍然需要输入密码,请确保条目未过早插入。从 sudoers man 页面: “当有多个条目匹配某个用户时,它们会按顺序应用。在有多个匹配项的情况下,最后一个匹配项将被使用(这不一定是最高效的匹配项)。”
对于*nix 用户,请使用 visudo 编辑您的 /etc/sudoers 文件。它可防止您出现语法错误,而这些错误可能会导致您无法获得提升的权限。
所有以下片段都需要 Vagrant 1.7.3 或更高版本。
使用适合您用户的组 根据您的机器配置,您可能需要使用与以下示例中列出的不同的组。
对于 macOS,sudoers 应该包含以下条目
Cmnd_Alias VAGRANT_EXPORTS_ADD = /usr/bin/tee -a /etc/exports
Cmnd_Alias VAGRANT_NFSD = /sbin/nfsd ^(restart|status|update)$
Cmnd_Alias VAGRANT_EXPORTS_REMOVE = /usr/bin/sed -E -e /*/ d -ibak /etc/exports
%admin ALL=(root) NOPASSWD: VAGRANT_EXPORTS_ADD, VAGRANT_NFSD, VAGRANT_EXPORTS_REMOVE
对于 Linux,sudoers 应该如下所示
Cmnd_Alias VAGRANT_EXPORTS_CHOWN = /bin/chown 0\:0 /tmp/vagrant-exports
Cmnd_Alias VAGRANT_EXPORTS_MV = /bin/mv -f /tmp/vagrant-exports /etc/exports
Cmnd_Alias VAGRANT_NFSD_CHECK = /etc/init.d/nfs-kernel-server status
Cmnd_Alias VAGRANT_NFSD_START = /etc/init.d/nfs-kernel-server start
Cmnd_Alias VAGRANT_NFSD_APPLY = /usr/sbin/exportfs -ar
%sudo ALL=(root) NOPASSWD: VAGRANT_EXPORTS_CHOWN, VAGRANT_EXPORTS_MV, VAGRANT_NFSD_CHECK, VAGRANT_NFSD_START, VAGRANT_NFSD_APPLY
对于 Fedora Linux,sudoers 可能会如下所示(假设您的用户属于 vagrant 组)
Cmnd_Alias VAGRANT_EXPORTS_CHOWN = /bin/chown 0\:0 /tmp/vagrant-exports
Cmnd_Alias VAGRANT_EXPORTS_MV = /bin/mv -f /tmp/vagrant-exports /etc/exports
Cmnd_Alias VAGRANT_NFSD_CHECK = /usr/bin/systemctl status --no-pager nfs-server.service
Cmnd_Alias VAGRANT_NFSD_START = /usr/bin/systemctl start nfs-server.service
Cmnd_Alias VAGRANT_NFSD_APPLY = /usr/sbin/exportfs -ar
%vagrant ALL=(root) NOPASSWD: VAGRANT_EXPORTS_CHOWN, VAGRANT_EXPORTS_MV, VAGRANT_NFSD_CHECK, VAGRANT_NFSD_START, VAGRANT_NFSD_APPLY
对于 SUSE Linux,sudoers 可能会如下所示(假设您的用户属于 vagrant 组)
Cmnd_Alias VAGRANT_CHOWN = /usr/bin/chown 0\:0 /tmp/vagrant-exports
Cmnd_Alias VAGRANT_MV = /usr/bin/mv -f /tmp/vagrant-exports /etc/exports
Cmnd_Alias VAGRANT_START = /usr/bin/systemctl start --no-pager nfs-server
Cmnd_Alias VAGRANT_STATUS = /usr/bin/systemctl status --no-pager nfs-server
Cmnd_Alias VAGRANT_APPLY = /usr/sbin/exportfs -ar
%vagrant ALL=(root) NOPASSWD: VAGRANT_CHOWN, VAGRANT_MV, VAGRANT_START, VAGRANT_STATUS, VAGRANT_APPLY
如果您不想直接编辑 /etc/sudoers,您可以创建 /etc/sudoers.d/vagrant-syncedfolders 并包含适当的条目,假设 /etc/sudoers.d 已启用。
其他说明
加密文件夹: 如果您有加密的磁盘,那么 NFS 通常会拒绝导出文件系统。NFS 提供的错误信息通常不明确。一个常见的错误信息是 <path> 不支持 NFS。 除了共享未加密的目录外,对此没有解决方法。
版本 4: UDP 通常不是 NFSv4 的有效传输协议。NFS 4.0 的早期实现仍然允许 UDP,这允许在少数情况下使用 UDP 传输协议。RFC5661 明确指出不应单独使用 UDP 作为 NFS 4.1 中的传输协议。 由于 NFS 特定版本的传输协议不受支持而导致的错误并不总是很明确。 当尝试使用 UDP 与 NFSv4 时,一个常见的错误消息
mount.nfs: an incorrect mount option was specified
在使用 NFSv4 时,请确保 nfs_udp 选项设置为 false。 例如
config.vm.synced_folder ".", "/vagrant",
type: "nfs",
nfs_version: 4,
nfs_udp: false
有关传输协议和 NFS 版本 4 的更多信息,请参阅
排查 NFS 问题
NFS 问题可能由多种原因引起。 以下列表描述了如何识别问题根源。
确保主机上正在运行 nfs 服务器。 使用命令
ps aux | grep nfsd检查它是否正在运行。 如果 nfs 服务未运行,则可能需要手动重新启动。检查 nfs-kernel-server 的状态
systemctl status nfs-kernel-server,查看是否存在类似exportfs: Failed to stat /path : No such file or directory的错误。 然后创建缺失的目录或从/etc/exports中删除该行并重新启动 nfs-kernel-serversysctemctl start nfs-kernel-server如果使用 Mac,请确保
/sbin/nfsd已获得“完全磁盘访问”权限。确保同步文件夹存在于主机的
/etc/exports文件中。 如果目标文件夹未列在/etc/exports中,请确保 synced_folder 选项nfs_export设置为true,或手动添加该条目。确保
/etc/exports的内容有效。 例如,如果正在运行 nfsd,可以通过运行nfsd checkexports来完成此操作。确保客户机安装了 nfs 客户端。 客户端可能因操作系统而异。 如果客户机上未安装 nfs 客户端,则可能需要安装。
确保客户机可以访问挂载点。 可以使用类似
rpcinfo或showmount命令来完成此操作。 例如rpcinfo -u <ip> nfs或showmount -e <ip>。确保防火墙未阻止 NFS。
尝试手动挂载文件夹,启用详细输出
$ vagrant ssh $ mount -v -t nfs -o <mount options> <ip address>:<path to folder on host> <mountpoint>如果使用 UDP 连接:请确保 nfs 服务器启用了 UDP。 此设置可能可以在配置文件
/etc/nfs.conf中更改。 或者,在 Vagrant 中,将同步文件夹的nfs_udp选项设置为false。