配置跟Virtual配置几乎一模一样。我只对不一样的配置进行说明,以及描述我遇到的所有问题。
一、配置
1、homestead.yaml文件中的provider:
provider:virtual
修改为
provider:hyperv
2、挂载文件配置:
folders:
- map: E:\workfile\yii
to: /home/vagrant/code
type:"smb"
smb_host:"10.1.172.70"
smb_username: windows用户名(带域)
smb_password: windows用户密码
mount_options: ["vers=3.02","mfsymlinks",'username=windows用户名(不带域)','password=windows用户密码']
3、Homestead版本:
目前使用:v12.6.0
二、遇到的问题
1、挂载文件失败:
mount -t cifs -o vers=3.02,username=windows用户名(不带域),password=*****,credentials=/etc/smb_creds_vgt-b97e60a728d3bb8bf8bdd5da3997e165-66f0bd5cbca4d218f5f0b8a5f1712727,uid=1000,gid=1000,mfsymlinks,_netdev,nofail //10.1.172.70/vgt-b97e60a728d3bb8bf8bdd5da3997e165-66f0bd5cbca4d218f5f0b8a5f1712727 /home/vagrant/code
The error output from the last command was:
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)
mount -t cifs -o vers=2.0,credentials=/etc/smb_creds_vgt-b97e60a728d3bb8bf8bdd5da3997e165-6ad5fdbcbf2eaa93bd62f92333a2e6e5,uid=1000,gid=1000,mfsymlinks,_netdev,nofail //10.1.172.70/vgt-b97e60a728d3bb8bf8bdd5da3997e165-6ad5fdbcbf2eaa93bd62f92333a2e6e5 /vagrant
The error output from the last command was:
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)
分析了下这个两个挂载的报错:
我在我的项目目录中下载了homestead目录,并且把homestead.yaml写在了homestead目录中。
--项目目录
--homestead
--homestead.yaml
--项目代码1
--项目代码1
yaml配置的共享目录如下:
folders:
- map: E:\workfile\yii
to: /home/vagrant/code
vagrant up开始后, smb会共享我要挂载的windows目录,目录如下
目录1:E:\workfile\yii
目录2:E:\workfile\yii\homestead
在配置里填写了
mount_options: ["vers=3.02","mfsymlinks",'username=windows用户名(不带域)','password=windows用户密码']
有了这个配置后,第一次挂载通过了。 但是出现了 vers=2.0的第二次挂载,而且这次挂载没有使用我配置的用户名和密码。 这次挂载是把homestead目录挂载到虚拟机/vagrant 目录下。似乎是一步默认行为。接着我在vagrant2.2.18程序目录里修改了ruby代码。
代码路径:D:\Program Files\HashiCorp\Vagrant\embedded\gems\2.2.18\gems\vagrant-2.2.18\plugins\hosts\windows\cap\smb.rb
def self.smb_mount_options(env)
["vers=2.0"]
end
修改如下:
def self.smb_mount_options(env)
["vers=2.0", 'username=windows用户名(不带域)','password=windows用户密码']
end
修改完成后还是报错,排查发现挂载命令时会使用credentials这个参数,然后我在虚拟机命令行里去掉这个参数后就挂载成功了。所以我找到这段代码并且注释了这个参数的使用:
D:\Program Files\HashiCorp\Vagrant\embedded\gems\2.2.18\gems\vagrant-2.2.18\plugins\synced_folders\smb\cap\mount_options.rb
mnt_opts << "credentials=/etc/smb_creds_#{options[:smb_id]}"
至此,两次文件挂载顺利通过。
Vagrant requires administrator access to create SMB shares and
may request access to complete setup of configured shares.
==> homestead: Setting hostname...
==> homestead: Mounting SMB shared folders...
homestead: D:/workflow/vankeyi-admin => /home/vagrant/code
homestead: D:/workflow/vankeyi-admin/homestead => /vagrant
==> homestead: [vagrant-hostmanager:guests] Updating hosts file on active guest virtual machines...
==> homestead: [vagrant-hostmanager:host] Updating hosts file on your workstation (password may be required)...
==> homestead: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> homestead: flag to force provisioning. Provisioners marked to run always will still run.
2、host_manager在更新hosts文件的时候提示编码失败:
报错内容:
C:/Users/用户/.vagrant.d/gems/2.7.4/gems/vagrant-hostmanager-1.8.9/lib/vagrant-hostmanager/hosts_file/updater.rb:156:in `match': invalid byte sequence in GBK (ArgumentError)
C:/Users/用户/.vagrant.d/gems/2.7.4/gems/vagrant-hostmanager-1.8.9/lib/vagrant-hostmanager/hosts_file/updater.rb:83:in `read': "\\xBF" followed by "#" on GBK (Encoding::InvalidByteSequenceError)
分析这个报错应该都是在把我配置的nginx访问域名写入到windows的hosts中时,报的编码问题,都跟io有关联。所以要找到vagrant2.2.18中io.rb文件,把utf-8设置为默认编码。
代码目录:D:\Program Files\HashiCorp\Vagrant\embedded\gems\2.2.18\gems\vagrant-2.2.18\lib\vagrant\util\io.rb
# Read!
#注释原来这段代码
# data << io.readpartial(READ_CHUNK_SIZE).encode(
# "UTF-8", Encoding.default_external,
# invalid: :replace,
# undef: :replace
# )
#加入以下代码
data << io.readpartial(READ_CHUNK_SIZE).encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')
修改后再vagrant up --provision重启即成功启动。
以上问题的排查和修改都在多次尝试和重装vagrant的操作下完成的,踩过不少坑,也学习到了一些东西。所以把东西记录一下,也相当于把我修改的文件做一个说明。如果对配置hyperv虚拟的朋友有帮助就更好了。共勉。
--------------------------------这里是追加的内容-----------------------------------
3、在外网网络上挂载文件失败:
今天回到家再尝试了启动vagrant,发现在挂载文件的时候还是失败了,通过vagrant ssh登陆到虚拟机里,执行
# sudo mount -t cifs -o vers=2.0,username=用户名(不带域名),password=*****,uid=1000,gid=1000,mfsymlinks,_netdev,nofail //172.25.16.1/vgt-fea2074abad00eb061ec6d4394617ba7-6ad5fdbcbf2eaa93bd62f92333a2e6e5 /vagrant
参数什么的都与内网网络是一致的,所以通过dmesg命令查看kernel log messages的日志内容,发现报错:
[ 50.364937] Status code returned 0xc000006d STATUS_LOGON_FAILURE
[ 50.364943] CIFS VFS: \\172.25.16.1 Send error in SessSetup = -13
[ 50.365008] CIFS VFS: cifs_mount failed w/return code = -13
很诡异,相同的挂载命令在内网和外网下出现了不同的响应,所以我又通过man mount.cifs复习了一下参数,发现有一个domain参数我一直没有用, 但是我的电脑是有加域的,顿时明白了自己是缺少了域参数才导致我挂载出现一系列的登录问题。那么在上文提到的credentials这个参数,大概率就是因为我没有加域才导致登录失败的, 这个等后天回内网环境的时候再去测验这个问题。
而现在我需要把domain这个参数分别加入到我的homestead.yaml以及smb.rb(参数上文提到的加默认用户名和密码)的代码里去。
homestead.yaml文件
mount_options: ["vers=3.02","mfsymlinks",'username=用户名(不一定要域)','password=**','domain=域']
smb.rb文件
def self.smb_mount_options(env)
["vers=2.0", 'username=windows用户名(不带域)','password=windows用户密码', 'domain=域']
end
到此,外网的挂载就顺利完成了。
4、 The repository 'https://deb.nodesource.com/node_14.x focal Release' no longer has a Release file.
这个问题在laravel/homestead的github里issue可以找到解答。
https://github.com/laravel/homestead/issues/1707