之前一直使用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
2
3
4
5
6
7
8
authorize:#手动生成的openSSH公钥
keys:#手动生成的openSSH私钥
folders:#对应本地需要映射到虚拟机中的文件夹
map:#指定本地路径,Win下目录各级间使用"/"分割,包括盘符(如C:/SomeFolders/TargetFolders)
to:#指定映射到vagrant内的目录路径,保持默认即可.如果设置正常,在虚拟机运行时,可在虚拟机配置中找到挂载的共享文件夹.
sites:#站点配置
map:#站点的域名,设置后记得在本地hosts中绑定指向Homestead虚拟机ip或127.0.0.1
to:#站点在vagrant中的默认目录

启动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环境部署