环境:
基于VBox 的 vagrant (centos版本)开发环境。
问题:
Virtualbox 虚拟机(centOS)中,在进行go程序编译的时候,需要设置一个链接符,然后得到了如下的错误:
ln: failed to create symbolic link ‘/home/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes’: Protocol error
查证:
经过排查,发现这是因为这 VirtualBox 从安全角度出发,限制了共享文件夹软链接的创建,从而导致了该问题的发生。因此我们解决问题的入口就要确定在如何解决共享文件夹可创建软链接权限的问题。
解决:
- 关闭VBox
- 将VBox的安装目录添加到环境变量 PATH 中,通常VirtualBox在安装时,一般会在环境变量中自动创建名为VBOX_MSI_INSTALL_PATH的系统变量,将此变量添加到系统环境变量PATH中即可。
在这里,我直接往PATH目录中添加安装目录了:
- 使用管理员权限打开cmd程序:
右键选择管理员权限即可。
运行如下命令:VBoxManage setextradata YOURVMNAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/YOURSHAREFOLDERNAME 1
PS:YOURVMNAME修改为自己虚拟机中linux系统的名称,即VirtualBox管理器左边列表中显示的虚拟机名称。YOURSHAREFOLDERNAME 修改为自己设置的共享目录名称 master_default_1517988860839_41143,即下图中我的共享目录的名称 home_gopath_src_。
所以正式命令如下:
VBoxManage setextradata master_default_1517988860839_41143 VBoxInternal2/SharedFoldersEnableSymlinksCreate/home_gopath_src_ 1
执行验证就可以看到我们的设置的key/value 值信息:
C:Windowssystem32>VBoxManage getextradata master_default_1517988860839_41143 enumerate Key: GUI/LastCloseAction, Value: PowerOff Key: GUI/LastNormalWindowPosition, Value: 208,97,720,445 Key: GUI/RestrictedRuntimeDevicesMenuActions, Value: HardDrives Key: GUI/RestrictedRuntimeMachineMenuActions, Value: SaveState,PowerOff Key: GUI/StatusBar/IndicatorOrder, Value: HardDisks,OpticalDisks,FloppyDisks,Network,USB,SharedFolders,Display,VideoCapture,Features,Mouse,Keyboard Key: VBoxInternal2/SharedFoldersEnableSymlinksCreate/home_gopath_src_, Value: 1 Key: VBoxInternal2/SharedFoldersEnableSymlinksCreate/usr_share_nginx_html_, Value: 1 Key: VBoxInternal2/SharedFoldersEnableSymlinksCreate/vagrant, Value: 1
说明已经设置成功了。
- 使用 vagrant up 启动,继续编译
发现,编译过程依然报最初的错误,想到我们之前使用管理员权限执行的命令,因此,我们执行vagrant命令的时候也尝试使用管理员权限执行(使用管理员权限打开 cmd 即可,其余操作不变),OK,没有问题,编译成功。
PS.在这种情况下,要在 VBox 中查看虚拟机的运行情况,也需要使用使用管理员权限打开虚拟机,不然看到运行情况是停止状态。
以上