【问题标题】:ln: failed to create symbolic link: Protocol error (in Vagrant)ln:创建符号链接失败:协议错误(在 Vagrant 中)
【发布时间】:2020-06-29 02:22:43
【问题描述】:

我正在使用Laravel Homestead(Vagrant,Ubuntu)。我的主机是运行 VirtualBox 的 Windows 10。

作为管理员(因为我已经看到很多回答说缺乏权限通常是人们在使用符号链接时遇到问题的原因),我打开 Git Bash 并运行以下命令:

vagrant@vboxHomestead:~/Code/myproject$ ls -lah /home/vagrant/foo/blah
total 0
drwxrwxrwx 1 vagrant vagrant 0 Mar 17 23:09 .
drwxrwxrwx 1 vagrant vagrant 0 Mar 17 22:36 ..
-rwxrwxrwx 1 vagrant vagrant 0 Mar 17 23:09 asdf.txt
vagrant@vboxHomestead:~/Code/myproject$ sudo ln -s /home/vagrant/foo/blah /home/vagrant/Code/myproject/storage/app/public/blah
ln: failed to create symbolic link '/home/vagrant/Code/myproject/storage/app/public/blah': Protocol error

有什么问题?和folder mappings of Homestead 有关系吗? 我怎样才能实现我的目标?

(我的 /home/vagrant/Code//home/vagrant/foo/ 映射到我的 Windows 机器上的单独驱动器。)

附:在尝试上述步骤之前,我什至删除了Homestead standard public symlink,以避免其他可能的并发症。

附言我还尝试在我的 Homestead Vagrantfile 的底部附近添加this(在最终的end 上方),然后再旋转盒子:

config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end

【问题讨论】:

    标签: laravel virtualbox symlink homestead vagrant-provision


    【解决方案1】:

    我注意到php artisan storage:link 现在也导致了“协议错误”。

    为了缩小问题范围,我创建了一个全新的 Homestead 项目和盒子,并尝试在其中创建符号链接(包括 php artisan storage:link),但也出现了“协议错误”。

    而且我非常小心地以管理员身份使用 Git Bash(我的终端/命令行客户端),所以我已经遵循 StackExchange 上大多数答案的建议。

    我还决定将我的一个 Windows 文件夹(我让 Homestead 映射到 /home/vagrant/foo/ 的那个)移动到 Homestead 映射到 /home/vagrant/Code/ 的 Windows 文件夹中。*

    我决定完全重启 Windows 10。现在,在启动新的 vagrant 框后,php artisan storage:link 并创建了我的其他符号链接。

    *我不确定是否有必要移动 Windows 文件夹。也许我可以将这些文件夹留在单独的 Windows 驱动器上。但当时,我想尽量减少可能出现的并发症。

    【讨论】:

      【解决方案2】:

      使用 Homestead 时,在 Windows 的公共目录中创建符号链接也会在 vagrant 上创建符号链接。反过来,可能 (!) 会产生此错误,并会在您的 Windows 目录中留下无效的符号链接。

      【讨论】:

      • 是的,但是链接在 vagrant ssh 中不起作用
      【解决方案3】:

      在您关闭 VM 并重新启动后,该错误有时会返回或仍然存在。基本上你需要再次告诉 VirtualBox 启用符号链接。这是完整的解决方案

      显然在你的 vagrant 文件中有这个,如上所述

      config.vm.provider "virtualbox" do |v|
          v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/Folder_Name", "1"]
      end
      

      我建议注释掉任何同步文件夹,并让默认的 ./(at host) 在 /vagrant(at guest) 同步。这将确保您的 shared folder(Folder_Name) 名称始终为 vagrant,如 https://www.vagrantup.com/docs/synced-folders/ 所述。此外,您不会遇到 ssh 的问题

      如果重启后符号链接协议错误返回或仍然持续运行

      VBoxManage setextradata "VM_Name" VBoxInternal2/SharedFoldersEnableSymlinksCreate/Folder_Name 1
      
      vagrant halt
      vagrant up
      
      vagrant ssh
      

      通常,VBoxManagee 位于 C:\Program Files\Oracle\VirtualBox\

      通过转到 /vagrant 并运行来验证符号链接的工作

      touch test.txt && ln -s test.txt test1.txt
      

      PS:我已经在 Windows Home 上尝试过,它对安全设置的访问受限

      【讨论】:

      • 不幸的是,这些都不起作用(Windows Home)。
      猜你喜欢
      • 2013-07-27
      • 2021-04-12
      • 2014-12-06
      • 2016-01-16
      • 2016-10-14
      • 2019-11-05
      • 2018-03-06
      • 1970-01-01
      相关资源
      最近更新 更多