這個問題一定要分享,困擾了三天,終於解決。
我在什麼樣的情景下遇到這個問題?
在學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 增強包安裝篇: