Homestead离线安装踩坑记录
之前一直使用vagrant跑Minimal版的CentOS,搭建和项目一致的环境费了不少时间.最近折腾Laravel的时候看了下Homestead,感觉确实会省事很多,便试着安装了下,结果还是踩坑了.现记录下来以供个人总结和参考.
进行Homestead离线安装前,先确认了一下本地环境.操作系统为Windows10,现有的vagrant版本为1.7.4,距最新Releases差了两个小版本号倒也足够用.但是由于国内某些众所周知的原因,直接vagrant box add laravel/homestead下载的话会慢成Doge,于是只能选择离线安装的方式.
下载Homestead box
首先在hashicorp中找到合适的版本,再在链接后加上”版本号/providers/虚拟机类型.box”即可获得下载链接.
如我们要下载版本号为0.4.1的virtualbox版的box文件,链接即为: https://atlas.hashicorp.com/laravel/boxes/homestead/versions/0.4.1/providers/virtualbox.box
离线导入box文件
在box所在目录下执行add指令导入即可,注意替换box文件名:
1 | vagrant box add laravel/homestead homestead-v0.4.1.box |
安装HomeStead
Git clone拉取HomeStead源码,双击init.bat脚本安装(或者运行bash init.sh)完成安装.其实看下源码就发现安装只是拷贝3个文件到用户目录下的.homestead文件夹中.其中有个Homestead.yaml便是我们要修改的HomeStead配置文件.
配置Homestead.yaml
大部分保持默认即可,一般情况下需要手动配置的不多:
1 | authorize:#手动生成的openSSH公钥 |
启动Homestead虚拟机
进入之前Git clone拉取下来的homestead目录,运行vagrant up,正常情况下就可启动homestead虚拟机…..
—-当然,那是指正常情况,homestead就可以跑起来了,那也就不必往下看了.然而可能由于homestead的最新版本对离线安装的box判定问题,或是已有vagrant的其他环境冲突,所以这里踩了几个坑.
坑1:box XXX could not be found
首次执行vagrant up就告诉我不存在,然后它开始自顾自的跑去下载了- -||
而vagrant box list指令返回的box中确实已经有了该box了啊?谷歌一圈没有找到满意的答案,这坑看来还是要自己填~ ~ ~
先从自身找原因,一开始我使用vagrant box add 指令创建的是一个别名,难道它只能识别name为laravel/homestead的box?删掉box重新添 加,错误依旧.确实不大可能和别名有关,真是想多了.
然后从vagrant开始排查,由于之前装过vagrnat,且使用了《将Vagrant移出系统盘的方法》将.vagrant.d转移到其他目录了.便推测homestead是否无视了vagrant的环境变量VAGRANT_HOME,而去寻找默认目录了.
由于不想影响现有的其他box,便使用mklink做了个junction硬链接过去,但是并没有效果,于是尝试硬链接到homestead源码的虚拟机目录下,结果悲剧了,没想homestead初始化虚拟机目录时会删除目录下的所有文件….不作死就不会死啊,尝试的时候真是不要太过无脑和随意.(庆幸的是被删的box我做过package了)
冷静下来,看了一下源码,再使用debug模式调用vagrant up,大致理解调用的判断还是依据vagrant的,而其他box没问题的话,确实和.vagrant.d目录的迁移无关.
于是考虑是不是因为box没展开的原因,因为每个add的box首次vagrnat up是会进行初始化的,因为墙的原因我也并没法知道在线下载是不是比离线add多了一步展开.
先将HomeStead源码目录的Vagrantfile重命名为Vagrantfile.bak,然后在当前目录执行1
vagrant init laravel/homestead #vagrant box add时的名称
这时又生成了一个Vagrantfile文件,再在当前目录执行vagrant up
这相当于使用vagrant默认的方法进行box的展开安装了.完成后删掉刚才生成的Vagrantfile文件,把Homestead的Vagrantfile.bak改回Vagrantfile.
这时再使用vagrant up,果然找到了box了,并可自动根据配置文件进行一系列homestead的配置操作了.
坑2:Warning: Authentication failure. Retrying…
这个错误发生在我将该homestead项目进行开发后,用package指令打包后放到另一台电脑,并按照上面的步骤进行启动(区别在于使用的box自己为打包的box)时出现.
仔细想想就发现,使用自己打包的box已经存在有自动生成的密钥对了,再手动生成openSSH必然无法通过授权.
于是先进入.vagrant.d\boxes\laravel-VAGRANTSLASH-homestead\0\virtualbox\目录下,找到vagrant_private_key私钥文件.
这里我先是将Homestead.yaml替换成这个解包出来的私钥和对应的公钥了,但是仍然无法通过授权= =||
然后查看了一下使用的key的路径1
vagrant ssh-config
发现其中的IdentityFile指向了.vagrant.d目录的private_key文件,这个就比较费解了,为嘛homestead无视了配置文件里的公钥和私钥指定,却调用了这个随机生成的私钥?将该目录的private_key文件内容替换为解包出来的那个私钥,授权通过.
参考链接:
如何下载Vagrant的Box
离线安装&配置Laravel开发环境Homestead
PHPhub 开发环境部署
Windows下Homestead环境部署