无法更改 vagrant 主文件夹中文件夹的权限

Posted

技术标签:

【中文标题】无法更改 vagrant 主文件夹中文件夹的权限【英文标题】:Cannot change permissions of folders within vagrant home folder 【发布时间】:2012-10-21 13:44:53 【问题描述】:

当我 ssh 进入我的 vagrant 虚拟机时,我可以更改 vagrant 用户文件夹上方和外部的文件和文件夹的权限,以及 vagrant 用户文件夹内的文件的权限。但无法更改 vagrant 用户文件夹下文件夹的权限。我是否以 vagrant 用户和 root 身份登录都有同样的问题。

对于更改 vagrant 用户文件夹中的权限是否有某种限制? vagrant 用户文件夹不与主机操作系统共享,但 capistrano 部署文件夹和 docRoot 是。

Guest 是 CentOS 6,Host 是 OS X 10.7。流浪者是 1.0.5。 Virtualbox 是 4.2.1。

【问题讨论】:

【参考方案1】:

共享文件夹的格式会在不同版本的 Vagrant 中发生变化。见法比奥的回答https://serverfault.com/questions/398414/vagrant-set-default-share-permissions

Vagrant 1.3.1 及更早版本

config.vm.share_folder "v-data", "/export", "/export", :owner => 'vagrant', :group => 'httpd', :extra => 'dmode=775,fmode=775'

流浪者版本 1.3.1、1.3.2

在 Vagrant 1.3.1 及更高版本中,extra 选项已替换为需要数组的 mount_options

config.vm.share_folder "v-data", "/export", "/export", :owner => 'vagrant', :group => 'httpd', :mount_options => ['dmode=775', 'fmode=775']

流浪版本>=1.3.3

在 vagrant 1.3.3 中,config.vm.share_folder 似乎已替换为 config.vm.synced_folder

config.vm.synced_folder "v-data", "/export", "/export", :owner => 'vagrant', :group => 'httpd', :mount_options => ['dmode=775', 'fmode=775']

【讨论】:

如果您有更多关于 Vagrant 版本以及 share_folder 和 synced_folder 命令的信息,请发表评论。我没有在每个 Vagrant 版本中测试每个语句,也找不到明确的文档。我确实发现了这个相关的 Vagrant pull 问题:github.com/mitchellh/vagrant/pull/1029 伙计,这需要更多的支持。 :mount_options 上几乎没有关于较新版本的文档;我必须通过反复试验来弄清楚。 不确定 vagrant 的过去版本,但当前版本 (1.4.3) 需要 @DavidSpreekmeester 在他的回答中显示的语法,他说在 1.2.7 中有效。 这可行,但主要用于已创建的文件和文件夹。我在主机上创建新文件/文件夹时遇到了问题,但在来宾中有时我会遇到奇怪的行为 - 我可以通过列出文件/文件夹来查看它们,但根本无法访问它们。列出时,我根本看不到任何权限,只是像?????????? ? ? ? ? ? AppendStream.php 这样的问号。这个问题在我重新启动来宾后消失了,我可以在config.vm.share_folder 权限下再次访问那些? 文件。注意我也试过777 这种行为出现在 linux 主机 (mint) 以及 windows (7 64b) 主机上【参考方案2】:

我的问题可能与你的有关。

我有一个centos vm vagrant 作为guest,win7 作为host。

我实际上无法更改与主机共享的任何文件夹在 VM 中的权限。

如果我发现任何有用的信息,我会报告。 在此处讨论 google 组:

https://groups.google.com/forum/?fromgroups=#!topic/vagrant-up/2JvcoZTuWRI

更新 1:我还了解到您不能在共享文件夹中创建符号链接。

更新 2: 创建虚拟框后,我似乎无法更改它的权限。 但是在 VagrantFile 中,您可以将共享文件夹的权限设置为适合的内容:I.E.

config.vm.share_folder "v-data", "/export", "/export", :owner=> 'vagrant', :group=>'httpd', :extra => 'dmode=775,fmode=775'

我在这里设置了所有者、组和适合我们的权限。

我希望这会有所帮助。

【讨论】:

虚拟框创建后好像无法更改权限。但是在 VagrantFile 中,您可以将共享文件夹的权限设置为适合的内容:I.E. config.vm.share_folder "v-data", "/export", "/export", :owner=> 'vagrant', :group=>'httpd', :extra => 'dmode=775,fmode=775' 您可以vagrant reload 将这些更改应用到 Vagrantfiles。 我更喜欢 'dmode=775,fmode=664' 我也是,除了使用 Ansible 运行 Django 数据库迁移之外,我需要 Django 的 manage.py 才能执行。由于无法仅更改该文件的权限,因此我不得不使用['dmode=775', 'fmode=777']【参考方案3】:

在 Vagrant 1.2.7 中,使用了版本 2 Vagrantfiles,因此语法与之前的答案略有不同。 下面是 CentOS 6.2 的诀窍。我发现使用相对路径作为源在我的情况下效果最好。它指向共享文件夹。

config.vm.synced_folder "./", "/vagrant", owner: 'vagrant', group: 'apache', extra: 'dmode=775,fmode=775'

正如 Jamie 所说,您仍然需要在创建之前配置它,所以在编辑完覆盖的 Vagrantfile 之后使用vagrant reload

【讨论】:

【参考方案4】:

VirtualBox 不允许更改同步文件夹的所有者/权限。

您可以在 Vagrant 文件中更改它(由其他人回答)。 考虑更改所有者而不是组。 还要考虑一下——如果这样做是为了让你的服​​务器可以写入文件——你的服务器很可能被称为 www-data 而不是 httpd。使用ps aux | grep nginx[或apache/lighthttpd]来检查。

还有一些其他的选择:

更改正在访问共享文件而不是同步文件夹的程序的所有者。 例如,如果 PHP 需要写入文件,请将服务器和 PHP 更改为以 vagrant 运行。 [在 Apache 中,这是在 httpd.conf 中完成的。 NGINX 的用户在 nginx.conf 中设置,php-fpm 的用户在php-fpm.conf 或其包含的文件之一。 您需要更改 Apache 锁定文件 (/var/lock/apache2) 或 PHP websocket 文件 (/var/run/php5-fpm.sock)] 和 webserver 的权限。 使用不同的 VM(HyperV、VMware)而不是 VirtualBox。其他虚拟机似乎没有这个限制。 使用 RSyn 同步文件,而不是使用默认同步。config.vm.synced_folder "/var/www/", type: "rsync" 将所有权限设置为 777。通常这将是灾难性的,甚至没有建议。这仍然是一个坏主意,但在 VM 上可能是可行的。不过,在授予共享访问权限之前请三思。config.vm.synced_folder "/var/www/", mount_options: ["dmode=777", "fmode=666"]

Ryan Sechreset 和 Jeremy Kendall 更好地描述了这些答案。

【讨论】:

【参考方案5】:

从主机而不是来宾更改权限。 VirtualBox 不允许从来宾操作系统更改共享文件的权限。

TLDR;问题不在于您的来宾用户无权访问您的主机文件。问题是您主机上的 virtaul box 进程的执行用户没有权限在主机中写入文件。有两组权限。访客权限必须像任何其他操作系统一样设置。您还必须确保您的来宾操作系统正在运行的虚拟盒进程具有该文件夹的权限。如果该进程只有读取权限,那么任何来宾用户所能做的就是读取。

【讨论】:

我遇到了同样的问题,这无济于事,因为主机上不存在 Vagrant 框上的用户 这实际上帮助了我。如果 synced_folders 设置正确会有所帮助。 @JackalopeZero 问题不在于您的访客上的用户没有访问您的主机文件的权限。问题是您主机上的 virtaul box 进程的执行用户没有写入文件的权限。有两组权限。访客权限必须像任何其他操作系统一样设置。您还必须确保您的来宾操作系统正在运行的虚拟盒进程具有该文件夹的权限。如果该进程只有读取权限,那么任何来宾用户所能做的就是读取。包括管理员用户【参考方案6】:

目前无法发表评论,但可以扩展 MDeSilva 对 Vagrant 1.7.2 的回答:

对某些人来说可能很明显,但组和所有者应该用引号引起来。

group: "sync_group", owner: "sync_owner", mount_options: ['dmode=755, fmode=644']

【讨论】:

虽然 vagrant 通常是一个开发环境,但仍然没有理由获得这些权限。 通常 dmode=755fmode=644 与 Web 服务器(在这种情况下为 apache)组是 group 设置将很多。【参考方案7】:

对于流浪者 1.7.2 像这样编辑 Vagrant 文件,

group: sync_group, owner: sync_owner, mount_options: ['dmode=777', 'fmode=776']

【讨论】:

以上是关于无法更改 vagrant 主文件夹中文件夹的权限的主要内容,如果未能解决你的问题,请参考以下文章

Vagrant Homestead'存储'文件夹权限被拒绝[已结束]

更改自己的VM上的组后如何重新获得对主文件夹的访问权限? [关闭]

应用程序无法使用 Vagrant 创建可写文件夹

Vagrant 1.9.5:设置默认同步文件夹的权限

ubuntu 中怎么解决root用户下除主分区外其他文件系统的权限问题?

使用vagrant搭建k8s节点三-----部署主节点