同步目录的用户权限

现在你通过修改 Vagrant 配置文件,设置了主机与虚拟机之间的同步目录(synced_folder),这个目录在虚拟机上的权限相当重要,它直接会影响你在这个目录下存储的网站应用是否有权限能把上传的文件存储在这个目录下面。

理解 Linux 系统的文件与目录的权限相当重要。一般来说,如果一个用户要写入内容到某个目录下面,比如在这个目录下创建新的文件,修改文件,删除文件,创建目录,这些都算写入操作。如果目录的拥有者就是这个要做写入操作的用户,一般这个用户是有权限可以做这个写入操作。了解更多可以参考宁皓的《 CentOS 》课程包里的《 Linux 文件与目录权限 》。

在默认情况下,设置的同步目录在虚拟机上,它的拥有者是 SSH 登录虚拟机用的用户,默认这个用户是 vagrant 。并且你在虚拟机内部使用命令是无法修改这个同步目录的拥有者或权限的,这应该是 Vagrant 的限制,你可以在配置文件里指定这个目录的拥有者与群组。

如果你的同步目录是这样配置的:

  1. config.vm.synced_folder "./app", "/mnt"

或者用的是 Windows 主机,使用的是 SMB 类型的同步目录:

  1. config.vm.synced_folder "./app", "/mnt", type: "smb"

启动并连接到虚拟机,进入到同步目录在虚拟机里的上一级目录,查看一下目录的内容:

  1. cd /
  2. ls -la

ls -la 可以列出目录的详细信息,包括目录与文件的权限,拥有者还有所属用户组的信息。在返回的信息里找到 mnt 这个同步目录的详细信息:

  1. drwxr-xr-x. 2 vagrant vagrant 0 May 13 12:33 mnt

出现的第一个 vagrant 指的是目录的拥有者,第二个 vagrant 是目录所属的用户群组。

拥有者与用户组

你有能力可以修改同步目录的拥有者与用户组,像这样:

  1. config.vm.synced_folder "./app", "/mnt",
  2. owner: "root", group: "root"

在配置同步目录的时候使用 owner 选项设置目录的拥有者,在上面把拥有者设置成了 root (超级管理员)这个用户,这里只是测试一下这个设置,真正用的时候,你可能希望把拥有者设置成其它的用户名,先记住这个设置的方法就行。然后用 group 设置目录所属用户组。这两个选项在 NFS 类型的同步目录下无效。

NFS

你是 macOS 用户,并且设置的共享目录的类型是 NFS,那在虚拟机上这个共享目录的拥有者还有用户组会是这个目录在主机上的用户名与用户组。在虚拟机上很可能不存在主机上的用户与群组,所以你看到的同步目录的用户与群组可能是数字 ID,或者目录的拥有者与群组名跟在主机上的名称不一致。因为目录记录的是拥有者与群组的 ID,所以主机上的 ID 是 1001 的用户叫 wanghao,在另一台主机(虚拟机)里,ID 号是 1001 的用户可能不叫 wanghao 。

macOS 上配置的 NFS 类型的共享目录:

  1. config.vm.synced_folder "./app", "/mnt", type: "nfs"

NFS 类型的同步目录在虚拟机上:

  1. drwxr-xr-x. 3 501 games 102 May 13 06:56 mnt