在vbox共享文件夹上执行collectstatic会产生只读错误



我正在尝试使用virtualbox在django项目上工作。项目目录是一个符号链接,指向驻留在主机上的共享文件夹。django项目是在没有权限问题的情况下创建的,并且我成功地在客户机上使用Apache托管了站点。然而,当我运行collectstatic时,我得到OSError: [Errno 30] Read-only file system

是否有其他用户需要添加vboxsf组?我的用户是banjo, apache的用户是www-data

还是有其他解决方案?我真的很想把我的文件放在我的主机上。

这是我的设置

  • 主机:Xubuntu 12.10
  • Guest: Xubuntu 13.04
  • Django: 1.5.1

以下是我的设置步骤中的相关部分。另外,我已经启用了django admin。需要收集的就是这些静态文件。

# add banjo user and apache user to shared folder owernship group
sudo gpasswd -a banjo vboxsf
sudo gpasswd -a www-data vboxsf
ln -s /media/sf_foobar foobar.com
mkdir -p foobar.com/dev
cd foobar.com/dev
mkvirtualenv foobar --no-site-packages
workon foobar
pip install django
django-admin.py startproject foobar
# settings.py
STATIC_ROOT = '/home/banjo/foobar.com/dev/foobar/static/'
python manage.py collectstatic -l

我得到以下错误

(foobar)virtual-machine|foobar: python manage.py collectstatic -l
You have requested to collect static files at the destination
location as specified in your settings.
This will overwrite existing files!
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel: yes
Linking '/home/banjo/.virtualenvs/foobar/local/lib/python2.7/site-packages/django/contrib/admin/static/admin/css/rtl.css'
OSError: [Errno 30] Read-only file system

这是一个显示所有者和组

的文件系统树。
virtual-machine|foobar.com: tree -L 3 -ug
.
└── [root   vboxsf]  prod
    ├── [root   vboxsf]  foobar
    │   ├── [root   vboxsf]  foobar
    │   ├── [root   vboxsf]  manage.py
    │   └── [root   vboxsf]  static
    ├── [root   vboxsf]  logs
    └── [root   vboxsf]  requirements.txt

我运行sudo chown -R banjo prod/,但这并没有改变所有权。

问题不在于collectstatic本身。我使用的是-l标志,它创建静态文件的符号链接。

实际问题是virtualbox 4.1.18不允许在主机上创建符号链接。

我在这里找到了serverfault的答案。有关更多信息,请参阅此virtualbox票证

我在这里重新发布解决方案,供快速参考。

在主机上运行以下命令:

VBoxManage setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1

或者在Windows上

VBoxManage.exe setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1

其中VM_NAME是虚拟机的名称(例如Ubuntu), SHARE_NAME是共享目录的名称(不带"sf_"前缀)。

这将重新启用之前的符号链接友好行为。

我必须在这样做之后重新启动,然后在共享文件夹上进行符号链接工作!

最新更新