这个问题一定要分享,困扰了三天,终于解决。
我在什么样的情景下遇到这个问题?
在学Laravel,想要在windows编辑代码,然后通过virtualbox上centos共享文件夹的方式,在Linux上运行代码。
Linux上的环境是使用Laradock搭建的,这是一个基于docker的集成环境。
目录
一、操作环境
二、先说结论
三、这有什么影响?
四、原因
五、手动挂载怎么操作?
六、一些资料
virtualbox6+,windows10,centos7.6,docker19.03 , laradock
virtualbox设置共享文件夹的时候,尽量不要使用virtualbox【自动挂载】功能,就是设置共享文件夹时候不要勾选【自动挂载】的选择框。因为自动挂载和手动挂载,共享文件夹的执行权限是不同的!!
-rwxrwx--- root vboxsf index.html #自动挂载模式下,文件的权限是770
-rwxrwxrwx root root index.html #手动挂载模式下,文件的权限是777
发现了吗?使用virtualbox【自动挂载】模式下,共享文件除了root用户和vboxsf组外,其他用户和组根本没有权限!!
一般LNMP环境Nginx和php使用的用户都不是root,所以他们能读吗?肯定返回404啊。
不要天真的以为chmod就好了,因为那根本就不管用!!!
ok,那我把Nginx和php使用的用户(这里假设www-data)加入到vboxsf组就好了吧?
sudo usermod -aG vboxsf www-data
对于一些情况,这样确实是可以的。但是如果用的是Docker呢,PHP和Nginx用的都是docker镜像?Dockfile里面新建了一个www-data的用户,docker的宿主机并没有这一用户,而且docker容器里面也没有vboxsf这一个组啊!!无论怎么折腾docker里的Nginx,都没有操作共享文件夹的权限啊··············
首先,virtualbox共享文件夹有两种方式,一种是手动挂载(Manual Mounting)即进入到centos执行命令行,并且添加到开机任务。另一种是自动挂载(Automatic Mounting)。自动挂载就是在设置【共享文件夹】时勾选【自动挂载】选项,这样无需再执行命令行和添加开机任务,每次开机都会自己挂载。
其次,在勾选自动挂载的情况下,virtualbox会自动在/media文件夹下,新建带有前缀“sf_”的文件夹,例如sf_laravel。这个文件夹的权限就是770。严格限制root用户和vboxsf组才有权限。这是virtualbox设定并且限制的。看Virtualbox官方文档:
Access to an automatically mounted shared folder is granted to everyone in a Windows guest, including the guest user. For Linux and Oracle Solaris guests, access is restricted to members of the group
vboxsf
and theroot
user.
1、virtualbox客户端【设置】-【共享文件夹】。注意这里【共享文件夹名称】稍后command有用到
2、启动虚拟机,进入centos。把名为laravel的共享挂载到/var/www下
mount -t vboxsf laravel /var/www
编辑/etc/fstab。添加如下用于开机启动
laravel /var/www vboxsf defaults 0 0
virtualbox官方文档:
https://www.virtualbox.org/manual/UserManual.html#sf_mount_manual
通过VirtualBox实现虚拟机中共享本地目录,权限不足:
https://www.linuxidc.com/Linux/2017-11/148333.htm
CentOS7 在 VirtualBox 上的安装配置(2) -- VirtualBox 增强包安装篇:
https://segmentfault.com/a/1190000006233585#articleHeader2