Vagrantで遭遇した色々なエラーまとめてみた

# 背景
業務だけでなく個人開発でも、vagrantを使うことが増えたことなど、ここらで備忘録的に遭遇したエラーなどをまとめておこうと思う。
皆様ご存知のように、PC環境やらvirtualboxのバージョンやらで都度新しいエラーに遭遇します。
同じような~~憎しみ~~悩みを抱えてる人の助けになればと思います。

# 基本
一応、基本の使い方も書いておく
詳しい構築はいつか書く…と思う(多分)

```po:cmd
# boxファイル取得
vagrant box add [box名]

# vagrant初期化
vagrant init [box名]

# vagrant起動
vagrant up
```
<br>

余談ですが`vagrant box add`は**必ずしも必要ではない**です。

初回`vagrant up`時、事前にboxを取得していればそれを元にVMを構築し、
取得していなければ取得してくるという動作をします。
(しかも自動でaddされる)
なのでぶっちゃけしなくてもOK
<br>

`vagrant init`することで初期化されますが、ここでVMを構築しているわけではありません。
`vagrant init`はあくまでVagrantfileを作っているだけです。
実際に構築されるのは**初回**`vagrant up`**時です**。

<br>

```:Vagrantfile
config.vm.box = "[box名]"
```
その証拠にVagrantfile内のこの部分を別のbox名に書き換えてから
初回vagrant upすると書き換えたboxで起動するかと思います。


# error: VT-x is disabled in the BIOS for all CPU modes

初めてVagrant触る人に出がちなエラー

```:cmd
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ファイルの削除
*多分やらなくても行ける気はしますが念のため

```:cmd
# boxの確認
vagrant box list

# boxの削除
vagrant box remove [box名]
```
<br>


■.vagrant.dフォルダの移動
vagrantインストール時、インストール場所を特に変えていなければ
`C:\Users\[ユーザー名]\.vagrant.d`
というパスになっているはずなので


`.vagrant.d`フォルダをまるっと、**日本語の含まれないパス**に移動します。
迷ったらC直下で。`C:\.vagrant.d`
<br>

■環境変数の設定
**スタートメニュー** > **設定(歯車アイコン)** > **システム**
左側メニューから **[詳細情報]** を選択 > 右側(右端)　関連設定 の [**システムの詳細設定**]

システムのプロパティが表示されるので
[**詳細設定**]タブの[**環境変数**]を選択

上側(ユーザーの環境変数)の[**新規**]
**変数名**に`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...と<br>vagrant sshできない問題 と 常にパスワード聞かれる問題...

もう見たくない
そう思うほど無限沸きするAuthエラー。
そしていきなりずっとパスワードを問われる問題。
ひどい場合はvagrant sshできなくなるケース。

### 原因
①host側(windows)秘密鍵とguest側(vagrant)公開鍵の不一致
②それぞれの鍵へアクセスする権限がない

①については少しググると出てくるので試した人も多いかと思います。
問題は②ですね
vagrant側のパーミッション設定ミスなら楽なのですが
windows側のパーミッションだとめんどくさいです。。

### 対処方法

#### Case①
まず①からです。
鍵認証についてですが、ここでは細かい仕組みは省略します(エラー解決が本題なので)
よーわからんて人は、ひとまず`秘密鍵`と`公開鍵`ってのを使って認証してるんだーと思っといてください。

それぞれの鍵がどこにあるのかというと
```:秘密鍵(windows)
[Vagrantfileがある場所]\.vagrant\machines\default\virtualbox\private_key
```
```:公開鍵(vagrant)
/home/vagrant/.ssh/authorized_keys
```
です

この二つのファイルがかみ合わなくなってしまったことで表題のエラーが起こったり
あるいは`vagrant ssh`できなくなってしまうわけです。

直す方法はいろいろありますがここでは手っ取り早く作り直す方法で行きます。

と、その前に
windows - vagrant間でファイル共有設定をしてない人は下記手順で設定しましょう。

■プラグインvbguestの追加

```:プラグインの確認(cmd)
>vagrant plugin list
vagrant-vbguest (0.30.0, global)
```
もしまだ入っていなければ
```:vbguestのインストール(cmd)
vagrant plugin install vagrant-vbguest
```
<br>

■Vagrantfile書き換え
```diff: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``フォルダを作るのを忘れてると起動しないので注意。。

■秘密鍵/公開鍵の作成～設定
```:cmd
vagrant ssh
```
もし上記ができない時はVirtual box、もしくはTeraTermなどから接続
<br>


```:vagrant
cd ~/.ssh
ssh-keygen
```

`ssh-keygen`をすると対話モードになり、本来はパスフレーズを決めたりするのですが
今回は面倒なのですっ飛ばします
プロンプト(元の状態)に戻ってくるまでEnterを押します(多分3回)

```:vagrant
ls

authorized_keys  id_rsa  id_rsa.pub
```

多分、こんな感じになっているはず
``id_rsa``が秘密鍵、`id_rsa.pub`が公開鍵です
これをそれぞれ置き換えていきます

```:vagrant
mv id_rsa.pub authorized_keys
```
これでvagrant側の公開鍵はできました。
次はwindows側に秘密鍵を渡してあげましょう。
共有フォルダの設定は先程やったので、そこに名前を変えて移動してあげるだけです。

```:vagrant
mv id_rsa ~/share/private_key
ls ~/share/

private_key
```
こんな感じになってればOKです
一度、vagrantを抜けます
```:vagrant
exit
```

今度はwindows側です。秘密鍵を移動しましょう。
```:windows
[Vagrantfileのあるフォルダ]\share\private_key
```
を
```
[Vagrantfileのあるフォルダ]\.vagrant\machines\default\virtualbox\private_key
```
と差し替えます

差し替えができたら完了です

■動作確認
vagrantを再起動してvagrant sshしてみます
```:cmd
vagrant reload
vagrant ssh
```

無事につながった方、お疲れさまでした
つながってない方は次の②も試してみましょう

#### Case②

Vagrantの`.ssh`ディレクトリのパーミッションを見直していきましょう
defaultの設定に合わせます

```:vagrant
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のインストール

上記別のエラーでも入れましたが、またもこいつの出番。

```:cmd
vagrant plugin install vagrant-vbguest
```

vbguestを入れた後は`vagrant up` or `vagrant reload`で
基本自動で解決してくれる。
自動でやってくれない時はやむなし
```:cmd
vagrant vbguest
```

# Vagrant box addできない&vagrant upできない...つまり<br>外部ダウンロードできない

### 原因
このケースは大体においてセキュリティソフトが原因のことがほとんどです
自分の使ってるセキュリティソフト + vagrantとかで検索かけると出てくるはず…はず…

NUROで無料でついてくる~~諸悪の根源~~Kasperskyさんの設定を備忘録がてら書いておきます

**設定** > **ネットワーク設定**
監視対象のポートの [**選択したネットワークポートを監視する**] にチェックを入れ
[**選択**]をクリック

**443**と**80**ポートを無効にして**保存**。

暗号化された接続のスキャンの [**暗号化された接続をスキャンしない**]を選択
(~~そもそも暗号化された通信をなぜお前が見るんだKasperskyさんよ…~~)

上記の設定で行けると思います。保存を忘れずに。。


# あとがき
殴り書きに近い感じで忘れないように書いているので
変なところあるかもしれません。。

暇な時を見つけて修正とか、違った記事書くかもしれません。
気ままに書くので期待はせずにで…