Hyper-V + vagrant + centos/7 の場合の注意
VirtualBoxだと /vagrantが勝手にできて、読み書きともに出来るけど今回の環境では「もともと Vagrantfileの存在するディレクトリに存在したファイル、ディレクトリ」しか共有されない。ファイルの新規作成もダメ。
なので共有ディレクトリをsmbでマウントするようにした。
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.provider "hyperv"
# enable network
config.vm.provision "shell", run: "always", inline: "systemctl restart network.service"
config.vm.network "private_network", ip: "172.29.202.34"
config.vm.synced_folder ".", "/vagrant"
config.vm.synced_folder "./workspace", "/vagrant/workspace", create: true, type: "smb", mount_options: ["vers=3.0"]
config.vm.provider "hyperv" do |h|
end
end
smbでのマウントがうまくできない
上の設定でOKかと思ったが、何度やっても以下のようになる。
vagrant up
...
Stderr:
Error:
Stdout:
つまり、何もない。辿れない。
困ったのでデバッグオプション付きで実行してみた(vagrant up --debug
)が、smb_prepareが失敗している、程度のことしかわからない。
別のPCで同じVagrantfileを使って vagrant up してみたら上手く行く。ユーザー名とパスワードを入力するのは面倒だが、上手く行く。
何が何だかわからない。
原因
しばらくgoogleでいろいろ探してみたところ、 環境変数 %TMP% %TEMP% の内容がおかしいらしい、とわかった。
システム環境変数で確認すると %TMP% は %USERPROFILE%\AppData\Local\Temp となっていて、%USERPROFILE% は c:\Users\自分のWindowsログイン名 となっている。
つまり user = okadabasso でWindowsにログインしている場合 %TMP% は c:\Users\okadabasso\AppData\Local\Temp になるはずなのだが、どういう訳か c:\Users\okadab~2\AppData\Local\Temp になっていた。
多分、以前空白付きのユーザー名を使っていたのを修正したときにおかしくなったのだと思う。
fsutil 8dot3name
を使って短いファイル名を無効にしてもダメだった。
仕方がないので %TMP%と%TEMP%を無理やり正しい内容にセットしてやるとうまく vagrant up
できて、ちゃんと対象のディレクトリが共有出来ていた。
PowerShellの初期化コード
エクスプローラーからPowerShellを開くのが便利なのでPowerShellの場合。
初期化コードのスクリプトファイルを開くのはこう。(ファイルがない場合は別)
[PS]>notepad $profile
内容はこんな感じ
$env:TEMP=$env:USERPROFILE + "\AppData\Local\Temp"
$env:TMP=$env:USERPROFILE + "\AppData\Local\Temp"
で、PowerShellウインドウを開いてから vagrant up すると、対象のディレクトリが共有できる。
その他
この作業で結局二日費やしてしまった。前にvagrantとdockerでいろいろやろうとしてた時も同じような場所ではまっていた。
現段階では Hyper-V + vagrant + Docker for Windows で頑張るより VirutalBox + vagrantで適当なlinuxホストを実行し、その中でdocker使うほうがましなんじゃないか、って気がしている。