vagrant upでエラー 「command failed! setup」

#突然のエラー
ある日、突然前回まで普通に動いていたvagrantがvagrant upでエラーが出るようになってしまった。

#環境
環境は以下。
ホストOS: Windows7 Professional 64bit
仮想化ソフト: VirtualBox 6.0.4
BOX: bento/centos-7.5

#エラーの内容
エラー内容は以下のような感じ

```windows:cmd.exe
C:\vagrant>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'bento/centos-7.5' version '201808.24.0' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
[default] GuestAdditions seems to be installed (6.0.4) correctly, but not running.
==> default: Checking for guest additions in VM...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

 setup

Stdout from the command:



Stderr from the command:


C:\vagrant>

```
Linux自体は起動しているが、ローカルディレクトリのマウントが出来ていない。
そのため仮想サーバを立ててWindows上でWebの開発というのが出来なくなってしまった。

#やったこと
上記のエラーをWebで調べると、

##VirtualBoxをバージョンアップしたことにより、GuestAdditionsのバージョンとの不整合が起こっている
　メッセージを見る限りでは不整合は起こっていないので違う。
　というか、最初は起こっていたのでGuestAdditionsのバージョンをVirtualBoxと合わせる作業は手動で行った。
　この項目を調べていると、vagrant-vbguestプラグインをインストールすると自動でやってくれるよ、とかがたくさん出てくるが、今回の私のケースではプラグインをインストールしてもエラーのためアップデートが行われなかったので手動で行った。

```vagrant:ssh
[root@localhost ~]# wget http://download.virtualbox.org/virtualbox/6.0.4/VBoxGuestAdditions_6.0.4.iso
[root@localhost ~] mkdir vbguest
[root@localhost ~] mount -rt iso9660 ./VBoxGuestAdditions_6.0.4.iso ./vbguest
[root@localhost ~] sh ./vbguest/VBoxLinuxAdditions.run
　　　　　　　　　　・・・ インストールメッセージ ・・・
[root@localhost ~] umount ./vbguest
[root@localhost ~] rm ./VBoxGuestAdditions_6.0.4.iso
[root@localhost ~] rmdir ./vbguest
```

　これで、バージョンは合うようになったものの、上の方で書いたvagrant up時のメッセージは消えなかった。

本項目と同じような記事リンク
　・[VagrantのboxのGuest Additionsのアップデート方法](https://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85)
　・[vagrant up するとGuestAdditions エラーが発生](https://qiita.com/satokourov/items/e632df854be6048adf7b)

####※2019/06/11追記
　再度同じようなエラーが起こったので調べて見たところ、今回はGuest Additionsのバージョン不整合のようだった。以下のコマンドでバージョンを上げるとエラーはなくなった。

```windows:cmd.exe
C:\vagrant> vagrant vbguest --do install
C:\vagrant> vagrant up
・・・中略・・・
GuestAdditionsVersion="6.0.8 r130520"
GuestAdditionsFacility_VirtualBox Base Driver=50,1560211532027
GuestAdditionsFacility_VirtualBox System Service=800,1560211540581
GuestAdditionsFacility_Seamless Mode=0,1560211532027
GuestAdditionsFacility_Graphics Mode=0,1560211532027

C:\vagrant>
```

##カーネルのバージョンアップ
　カーネルのバージョンアップをすることでエラーが起こらなくなる、というのを見てそのようにやってみた。
　これは、ここの記事を全面的に参考にさせてもらった。

　・[CentOS 7 最新安定版カーネルインストール、及び切り替え](https://server.etutsplus.com/centos-7-how-to-update-kernel-to-the-latest-mainline-stable/)

　結果、無駄に(?)カーネルが最新バージョンになった。
　この時に気づいたが、色々動かしてみるとvagrant haltとかreloadもまともに動いていない様子・・・。まじで困った・・・。

##ログを見て調べる
　かなり手詰まってしまったので仕方なくログレベルをdebugにしてログを見ることに。
　Windowsの環境変数（コンピュータアイコン右クリック→プロパティ→システムの詳細設定→環境変数、で、システムの詳細設定を表示し、システムの環境変数にVAGRANT_LOGを追加し、値をdebugに。
コマンドプロンプトを開き直して再びvagurant upを実行すると大量のログが出力される。
ログが出力された後、チマチマとログを見ていくと以下のような出力があった。

```windows:cmd.exe
C:\vagrant> vagrant up
　　　　　・・・　中略　・・・
DEBUG ssh: Exit status: 127
DEBUG ssh: Re-using SSH connection.
 INFO ssh: Execute:  setup (sudo=true)
DEBUG ssh: stderr: bash: sudo: command not found
　　　　　・・・　中略　・・・
```

sudo: command not found？。sudoないの？
sshの方で調べてみる。

```vagrant:ssh
[root@localhost ~]# find / -name sudo -print
/etc/selinux/targeted/active/modules/100/sudo
/usr/libexec/sudo
```
一応見つかったことは見つかったものの、selinux関係ないし/usr/libexec/sudoの中身は空っぽだった。なんでsudoが無くなってしまったかはものすごく不明。首をかしげながらsudoをインストール。

（実は最初にGuestAdditionsをインストールするときにrootで作業しているが、最初sudoでやろうと思ったらnot foundが出たのでエラー時にパスかマウントが不足して見えてなくなったと思い、めんどくさかったのでsuして作業していた・・・。ちゃんと調べてたらsudoがない事はもっと早く分かっていたかもしれない）

```vagrant:ssh
[root@localhost ~]# yum -y install sudo                                                                                               
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * elrepo: ftp.ne.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * remi: ftp.riken.jp
 * remi-php72: ftp.riken.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package sudo.x86_64 0:1.8.23-3.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

======================================================================================================================================
 Package                      Arch                           Version                               Repository                    Size
======================================================================================================================================
Installing:
 sudo                         x86_64                         1.8.23-3.el7                          base                         841 k

Transaction Summary
======================================================================================================================================
Install  1 Package

Total download size: 841 k
Installed size: 3.0 M
Downloading packages:
sudo-1.8.23-3.el7.x86_64.rpm                                                                                   | 841 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : sudo-1.8.23-3.el7.x86_64                                                                                           1/1 
  Verifying  : sudo-1.8.23-3.el7.x86_64                                                                                           1/1 

Installed:
  sudo.x86_64 0:1.8.23-3.el7                                                                                                          

Complete!
[root@localhost ~]# 

```

そして一旦シャットダウン

``` vagrant:ssh
[root@localhost ~]# shutdown -h now
```

大量のログが出るとわかりにくいので、Windowsの環境変数VAGRANT_LOGは一旦外しておき、
vagrant upをしなおす。

```windows:cmd.exe
C:\vagrant>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'bento/centos-7.5' version '201808.24.0' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
[default] GuestAdditions 6.0.4 running --- OK.
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => C:/vagrant
    default: /var/www/html => C:/src/html
    default: /home/vagrant/data => C:/vagrant/data
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.

C:\vagrant>
```
今度はローカルディレクトリのマウントも出来ているよう。
とりあえずsudoがなくなったのは気持ち悪いけど直って良かった・。

####※2019/02/19追記
　どうやら原因が判明。
この件の前にvimを7から8に上げたのだけど、その時にyum removeしてyum installした、気がする。
これがダメでsudoが消えたっぽい・・・。「sudo 消えた」とかで検索するとチョロチョロ引っ掛かる・・・お恥ずかしいorz

　参考記事
　・[CentOS7にvim8をインストールして簡単連番作成(後半の追記部分)](https://qiita.com/forestkinoko/items/9da2bcb9a7fbcf91c690)

####※2019/06/11追記
 Vagrantをバージョンアップしたりしたときに不意に次のようなエラーでVagrantが起動しなくなる場合がある。

```Windows:cmd.exe
C:\HashiCorp\Vagrant\embedded\gems\[バージョン]\gems\vagrant-[バージョン]\lib\vagrant\util\io.rb:32:in `encode': incomplete "\x83" on Windows-31J (Encoding::InvalidByteSequenceError)
```

スナップショット名が日本語になっていたり、VirtualBoxのバージョンが新しすぎたりする場合、
エラーになるというようなことが書かれているサイトが多いが、

以下のいずれかの方法で解決できるかもしれない。（本件のエラー表示は原因が色々あるっぽいので結局何が悪いのか一概に特定できない）

#####Vagrantfileに追加

```:Vagrantfile
Encoding.default_external = 'UTF-8'
```
[参考サイト]
http://dqn.sakusakutto.jp/2014/02/vagrant_up_gsub_invalid_byte_se.html

#####io.rbを書き換える
[変更前]

```C:\HashiCorp\Vagrant\embedded\gems\2.2.4\gems\vagrant-2.2.4\lib\vagrant\io.rb(32行目付近)
data << io.readpartial(READ_CHUNK_SIZE).encode("UTF-8", Encoding.default_external)
```
[変更後]

```C:\HashiCorp\Vagrant\embedded\gems\2.2.4\gems\vagrant-2.2.4\lib\vagrant\io.rb(32行目付近)
data << io.readpartial(READ_CHUNK_SIZE).encode("Windows-31J", Encoding.default_external)
```
ちなみにこちらは先程のVagrantfileに記載するのと反対の動作をさせるものなので、排他使用です。
両方記述するとエラーになるので注意。

##### /etc/modules-load.d/vboxsf.confを作成し、vboxsfを記述
vagrant sshでゲストのコマンドラインから以下を打ち込む。
(Permission Deniedエラーになったらsuしてからsudoなしで実行)

```
sudo echo vboxsf > /etc/modules-load.d/vboxsf.conf
```
その後、vagrant reloadする。

参考: https://github.com/dotless-de/vagrant-vbguest/issues/278