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

时间:2013-05-23 21:52:55

标签: django virtualenv virtualbox django-staticfiles

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

是否有其他用户需要添加vboxsf组?我的用户是班卓琴,而apache是​​www-data

还是有另一种解决方案吗? 我真的很想把我的文件放在我的主机上。

这是我的设置

  • 主持人:Xubuntu 12.10
  • 访客:Xubuntu 13.04
  • Django:1.5.1

以下是我的设置步骤中的相关部分。此外,我已启用django管理员。需要收集这些静态文件。

# 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/,但这并没有改变所有权。

1 个答案:

答案 0 :(得分:2)

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

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

我在serverfault here找到了答案。有关详细信息,请参阅this virtualbox ticket

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

在您的主机上运行以下命令:

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_”前缀)。

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

执行此操作后我必须重新启动,然后在共享文件夹上进行符号链接工作!