16

我在 Ubuntu 12.04 上安装了 Virtualenv,并使用它在统一桌面下的示例项目上工作。我正在使用 VirtualBox,并且在统一桌面上遇到了一些问题,因此更改为 KDE 桌面。

我现在正在尝试创建一个新项目,但 virtualenv 不允许我在我的项目文件夹中创建一个新环境。在终端中,我导航到项目文件夹,键入 virtualenv venv 并收到以下错误消息:

Traceback (most recent call last):
  File "/usr/bin/virtualenv", line 3, in <module>
    virtualenv.main()
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 938, in main
    never_download=options.never_download)
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 1039, in create_environment
    site_packages=site_packages, clear=clear))
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 1215, in install_python
    copyfile(stdinc_dir, inc_dir)
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 430, in copyfile
    copyfileordir(src, dest)
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 405, in copyfileordir
    shutil.copytree(src, dest, True)
  File "/usr/lib/python2.7/shutil.py", line 206, in copytree
    raise Error, errors
shutil.Error: [('/usr/include/python2.7/numpy', 'venv/include/python2.7/numpy', '[Errno 30] Read-only file system')]

谁能帮我解决这个问题?我试过重新安装 virtualenv 但没有乐趣。谢谢

4

5 回答 5

16

Virtualenv 正在使用符号链接(shutil.copytree使用它们,请参阅回溯)。禁用在 VirtualBox 共享文件夹中创建符号链接。终端中的简单测试(在来宾机器内):

$ ln -s testfile

要么你会得到一个failed to create symbolic link './testfile': Read-only file systemProtocol error

您可以通过在主机上的终端中执行来启用共享文件夹中的符号链接(来自 schisamo 的解决方案):

$ vboxmanage setextradata VM_NAME "VBoxInternal2/SharedFoldersEnableSymlinksCreate/NAME_OF_YOUR_SHARED_FOLDER" 1

将 VM_NAME 替换为虚拟机的名称,如 VirtualBox Manager 中所示:

VM_NAME 示例

和 NAME_OF_YOUR_SHARED_FOLDER 以及您可以在虚拟机设置中看到的共享文件夹的名称:

共享文件夹设置

设置完成后,重启VirtualBox。

您可以检查设置(在主机上

$ vboxmanage getextradata VM_NAME enumerate

修复 Windows(Ahti Kitsik)(感谢Bryan 的回答)。


VirtualBox从 4.0 版(适用于 Linux 和 Solaris)开始为共享文件夹实现符号链接,但出于安全原因,从 4.1.8 版开始禁用。这可能就是为什么它首先对您有用而后来却没有的原因。

文档

VirtualBox 共享文件夹还支持符号链接,也称为符号链接,在以下情况下:

  • 主机操作系统必须支持符号链接。例如,需要 Mac OS X、Linux 或 Oracle Solaris 主机。
  • 目前只有 Linux 和 Oracle Solaris Guest Additions 支持符号链接。
  • 出于安全原因,默认情况下不允许来宾操作系统创建符号链接。如果您相信来宾操作系统不会滥用该功能,您可以为共享文件夹启用符号链接的创建,如下所示 [见上文]
于 2014-06-22T16:53:24.087 回答
11

好的,经过更深入的谷歌搜索发现这是一个 VirtualBox 问题,而不是 Ubuntu 问题。共享文件夹受此活动保护。我不知道它第一次是如何/为什么起作用的,但它是一个已知的错误。我在共享文件夹之外创建了一个项目,没有任何问题。感谢您输入 Dougal。

于 2012-06-29T16:35:52.557 回答
9

Ahti Kitsik 在他的博客上发布了一个解决方法: https ://ahtik.com/fixing-your-virtualbox-shared-folder-symlink-error/

VBoxManage setextradata YOURVMNAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/YOURSHAREFOLDERNAME 1

YOURSHAREFOLDERNAME是根据 VirtualBox 的共享文件夹的名称。

如果你碰巧在使用 Vagrant,这里是你的 Vagrantfile 的修复:

config.vm.provider :virtualbox do |vb|
  vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate//vagrant","1"]
end
于 2014-01-30T07:43:40.183 回答
3

我在使用 Ubuntu 来宾的 virtualenv 和 VirtualBox(通过 Vagrant 管理)时遇到了同样的错误。

想起之前的一个文件权限给我带来问题的事件,我尝试在我的 Vagrantfile 中打开 nfs 共享:

config.vm.share_folder("v-root", "/home/vagrant/apps", "/home/gareth/Projects/project-name/", :nfs => true)

这为我解决了这个问题。不过,在 VirtualBox 上获取 nfs 共享的过程有点复杂:

https://www.virtualbox.org/wiki/Sharing_files_on_OSE

于 2013-03-08T12:14:01.100 回答
2

我在github.com上看到了这个解决方案:

将 virtualenv 升级到最新版本(1.11.6),并将其用作

virtualenv --always-copy testenv

选项不会使用硬链接,而是复制文件

于 2019-03-12T11:11:16.000 回答