背景
業務だけでなく個人開発でも、vagrantを使うことが増えたことなど、ここらで備忘録的に遭遇したエラーなどをまとめておこうと思う。
皆様ご存知のように、PC環境やらvirtualboxのバージョンやらで都度新しいエラーに遭遇します。
同じような憎しみ悩みを抱えてる人の助けになればと思います。
基本
一応、基本の使い方も書いておく
詳しい構築はいつか書く…と思う(多分)
# boxファイル取得
vagrant box add [box名]
# vagrant初期化
vagrant init [box名]
# vagrant起動
vagrant up
余談ですがvagrant box add
は必ずしも必要ではないです。
初回vagrant up
時、事前にboxを取得していればそれを元にVMを構築し、
取得していなければ取得してくるという動作をします。
(しかも自動でaddされる)
なのでぶっちゃけしなくてもOK
vagrant init
することで初期化されますが、ここでVMを構築しているわけではありません。
vagrant init
はあくまでVagrantfileを作っているだけです。
実際に構築されるのは初回vagrant up
時です。
config.vm.box = "[box名]"
その証拠にVagrantfile内のこの部分を別のbox名に書き換えてから
初回vagrant upすると書き換えたboxで起動するかと思います。
error: VT-x is disabled in the BIOS for all CPU modes
初めてVagrant触る人に出がちなエラー
Stderr: VBoxManage.exe: error: Not in a hypervisor partition (HVP=0) (VERR_NEM_NOT_AVAILABLE).
VBoxManage.exe: error: VT-x is disabled in the BIOS for all CPU modes (VERR_VMX_MSR_ALL_VMX_DISABLED)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
対処方法
BIOS/UEFI設定からVirtulization Technologyを有効にする
(Windows画面)
スタートメニュー > 設定(歯車アイコン) > 更新とセキュリティ
左側メニューから [回復] を選択 > 右側 PCの起動をカスタマイズする の [今すぐ再起動する]
(オプションの選択画面)
トラブルシューティング > UEFIファームウェアの設定 > 再起動
(start up menu画面)
[BIOS Setup] を選択
(BIOS/UEFI画面)
System Configuration > Virtulization Technology
Enterキーで切り替え[Enabled]にする
Exit > Exit Saving Changes
Exit Saving Changes?
と聞かれるので [yes]を選択
再起動したら完了です
error: Context: "enum RTEXITCODE __cdecl handleImportAppliance(struct HandlerArg *)"
これも初めてVagrant触る人に出がちなエラー。
Vagrantが設定ファイルやらを読み込もうとした際に
そこまでのパスに日本語が含まれていてうまく読み込めず起きるエラー。
あるあるだが、Windowsユーザー名が日本語の場合起こる。
業務PCだとこういうトラップあるよね_(:3 」∠)_
対処方法
.vagrant.d
フォルダの移動と環境変数の設定
■boxファイルの削除
*多分やらなくても行ける気はしますが念のため
# boxの確認
vagrant box list
# boxの削除
vagrant box remove [box名]
■.vagrant.dフォルダの移動
vagrantインストール時、インストール場所を特に変えていなければ
C:\Users\[ユーザー名]\.vagrant.d
というパスになっているはずなので
.vagrant.d
フォルダをまるっと、日本語の含まれないパスに移動します。
迷ったらC直下で。C:\.vagrant.d
■環境変数の設定
スタートメニュー > 設定(歯車アイコン) > システム
左側メニューから [詳細情報] を選択 > 右側(右端) 関連設定 の [システムの詳細設定]
システムのプロパティが表示されるので
[詳細設定]タブの[環境変数]を選択
上側(ユーザーの環境変数)の[新規]
変数名にVAGRANT_HOME
変数値にC:\.vagrant.d
(先程移動したパスを設定して下さい)を設定
それぞれの画面で[OK]を押してすべて閉じたら完了です。
*環境変数の変更はコマンドプロンプトを新しく立ち上げ直さないと反映されないので注意。
ちなみにこの.vagrant.d
のフォルダの中身を見てみるとわかりますが
とってきたboxファイルだったり、defaultの秘密鍵insecure_private_keyなんかがあります。
(insecure_private_keyはvagrant upする時、
結局新しい秘密鍵へと置き換えられるようなので、ぶっちゃけ昔の名残でいるような感じだと思います)
なのでVagrant init
するフォルダに日本語が含まれていなければ良いというわけではなく
VMを構築するのに必要な.vagrant.d
までのパスにも日本語が含まれないようにする必要があるわけです。
default: Warning: Authentication failure. Retrying...と
vagrant sshできない問題 と 常にパスワード聞かれる問題...
もう見たくない
そう思うほど無限沸きするAuthエラー。
そしていきなりずっとパスワードを問われる問題。
ひどい場合はvagrant sshできなくなるケース。
原因
①host側(windows)秘密鍵とguest側(vagrant)公開鍵の不一致
②それぞれの鍵へアクセスする権限がない
①については少しググると出てくるので試した人も多いかと思います。
問題は②ですね
vagrant側のパーミッション設定ミスなら楽なのですが
windows側のパーミッションだとめんどくさいです。。
対処方法
Case①
まず①からです。
鍵認証についてですが、ここでは細かい仕組みは省略します(エラー解決が本題なので)
よーわからんて人は、ひとまず秘密鍵
と公開鍵
ってのを使って認証してるんだーと思っといてください。
それぞれの鍵がどこにあるのかというと
[Vagrantfileがある場所]\.vagrant\machines\default\virtualbox\private_key
/home/vagrant/.ssh/authorized_keys
です
この二つのファイルがかみ合わなくなってしまったことで表題のエラーが起こったり
あるいはvagrant ssh
できなくなってしまうわけです。
直す方法はいろいろありますがここでは手っ取り早く作り直す方法で行きます。
と、その前に
windows - vagrant間でファイル共有設定をしてない人は下記手順で設定しましょう。
■プラグインvbguestの追加
>vagrant plugin list
vagrant-vbguest (0.30.0, global)
もしまだ入っていなければ
vagrant plugin install vagrant-vbguest
■Vagrantfile書き換え
- # config.vm.synced_folder "../data", "/vagrant_data"
+ config.vm.synced_folder "./share", "/home/vagrant/share"
こうすることでwindows側でVagrantfileのあるフォルダにshare
というフォルダを作成すれば
share
フォルダとvagrant側の/home/vagrant/share
が共有されます。
ようするに、windows - vagrant間でファイルの受け渡しが可能になります。
設定したらvagrant reload
か
vagrant halt
> vagrant up
で読み込みなおしましょう。
後者の方が確実です。
share
フォルダを作るのを忘れてると起動しないので注意。。
■秘密鍵/公開鍵の作成~設定
vagrant ssh
もし上記ができない時はVirtual box、もしくはTeraTermなどから接続
cd ~/.ssh
ssh-keygen
ssh-keygen
をすると対話モードになり、本来はパスフレーズを決めたりするのですが
今回は面倒なのですっ飛ばします
プロンプト(元の状態)に戻ってくるまでEnterを押します(多分3回)
ls
authorized_keys id_rsa id_rsa.pub
多分、こんな感じになっているはず
id_rsa
が秘密鍵、id_rsa.pub
が公開鍵です
これをそれぞれ置き換えていきます
mv id_rsa.pub authorized_keys
これでvagrant側の公開鍵はできました。
次はwindows側に秘密鍵を渡してあげましょう。
共有フォルダの設定は先程やったので、そこに名前を変えて移動してあげるだけです。
mv id_rsa ~/share/private_key
ls ~/share/
private_key
こんな感じになってればOKです
一度、vagrantを抜けます
exit
今度はwindows側です。秘密鍵を移動しましょう。
[Vagrantfileのあるフォルダ]\share\private_key
を
[Vagrantfileのあるフォルダ]\.vagrant\machines\default\virtualbox\private_key
と差し替えます
差し替えができたら完了です
■動作確認
vagrantを再起動してvagrant sshしてみます
vagrant reload
vagrant ssh
無事につながった方、お疲れさまでした
つながってない方は次の②も試してみましょう
Case②
Vagrantの.ssh
ディレクトリのパーミッションを見直していきましょう
defaultの設定に合わせます
cd ~
# 所有者/グループ変更
sudo chown vagrant:root .ssh/
# .sshパーミッション変更
sudo chmod 700 .ssh/
# 秘密鍵所有者/グループ変更
sudo chown vagrant:vagrant .ssh/authorized_keys
# 秘密鍵パーミッション変更
sudo chmod 600 .ssh/authorized_keys
設定出来たら①の時と同様vagrant reload
してvagrant ssh
してみてください
それでもダメなレアケースはwindows側も怪しいかもしれません
Case②'
windows側の所有者情報を設定します
本来、初回のvagrant up
をすると
windowsのユーザーが所有者兼、実行ユーザーとして割り当てられるのですが
vagrant ssh
もとい鍵認証に失敗すると、自分だけでなく他のwindowsユーザーが割り当てられることがあるようです
秘密鍵は本来、複数ユーザーが扱えるようにしてはいけないというものの為
こいつが原因でコケているケースに遭遇しました。。
(Azure ADとかGroupPolicyとかやってる稀有な例かもしれませんががが)
先程の
[Vagrantfileのあるフォルダ]\.vagrant\machines\default\virtualbox\private_key
を右クリックします
プロパティ > [セキュリティ]タブ > 詳細設定
アクセス許可エントリに複数ユーザー(SYSTEMやAuthenticated Users含む)がいたらビンゴです
継承の無効化 > 現在継承されているアクセス許可で実行する処理のポップアップが表示されるので
[継承されたアクセス許可をこのオブジェクトの明示的なアクセス許可に変換します。]を選択
自分のユーザー以外を全て削除
ここまで出来たらコマンドプロンプトを立ち上げ直して
再度vagrant ssh
してみます
これでもダメなら作り直した方が早いです(白目)
2022/5/12追記
もし自windowsユーザーが表示されない時は、Vagrantfileのあるフォルダを
[右クリック]→[アクセスを許可する]→[特定のユーザー]
でユーザー一覧が出てくるので追加しましょう
これでprivate_keyでも出てくるはず。
/sbin/mount.vboxsf: mounting failed with the error: No such device
割かしよくあるエラー
ちょっと前のバージョンのOS(box)を使おうとするとでてくる
原因
yum update
した際にkernelが上がることで
virtual boxで管理しているkernelの設定と差異がでることで起きるエラー
対処方法
プラグインvbguestのインストール
上記別のエラーでも入れましたが、またもこいつの出番。
vagrant plugin install vagrant-vbguest
vbguestを入れた後はvagrant up
or vagrant reload
で
基本自動で解決してくれる。
自動でやってくれない時はやむなし
vagrant vbguest
Vagrant box addできない&vagrant upできない...つまり
外部ダウンロードできない
原因
このケースは大体においてセキュリティソフトが原因のことがほとんどです
自分の使ってるセキュリティソフト + vagrantとかで検索かけると出てくるはず…はず…
NUROで無料でついてくる諸悪の根源Kasperskyさんの設定を備忘録がてら書いておきます
設定 > ネットワーク設定
監視対象のポートの [選択したネットワークポートを監視する] にチェックを入れ
[選択]をクリック
443と80ポートを無効にして保存。
暗号化された接続のスキャンの [暗号化された接続をスキャンしない]を選択
(そもそも暗号化された通信をなぜお前が見るんだKasperskyさんよ…)
上記の設定で行けると思います。保存を忘れずに。。
あとがき
殴り書きに近い感じで忘れないように書いているので
変なところあるかもしれません。。
暇な時を見つけて修正とか、違った記事書くかもしれません。
気ままに書くので期待はせずにで…