ブログ

VagrantのEncoding::InvalidByteSequenceErrorへの対処方法 2020.05.14

弊社の開発環境として使用しているWindowsのアップデートにより、VirtualBoxのアップデートが必要になりました。

それに伴い、エラーが発生してVagrantが起動できなくなったケースへの対処方法をご紹介します。

今回のエラーについては、従来より、度々発生しているようで、ネット上にもいくつか情報がございましたが、最近の記事があまり見つからなかったので、改めて情報共有のため本サイトとしても投稿します。

VirtualBox : 6.0.20
Vagrant    : 2.2.5

具体的には、次のようなエラーが発生してVagrantが起動できなくなりました。

C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/util/io.rb:32:in `encode': incomplete "\x8C" on Windows-31J (Encoding::InvalidByteSequenceError)
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/util/io.rb:32:in `read_until_block'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/util/subprocess.rb:194:in `block in execute'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/util/subprocess.rb:192:in `each'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/util/subprocess.rb:192:in `execute'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/util/subprocess.rb:22:in `execute'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/plugins/providers/virtualbox/driver/base.rb:451:in `block in raw'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/util/busy.rb:19:in `busy'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/plugins/providers/virtualbox/driver/base.rb:450:in `raw'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/plugins/providers/virtualbox/driver/base.rb:388:in `block in execute'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/util/retryable.rb:17:in `retryable'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/plugins/providers/virtualbox/driver/base.rb:383:in `execute'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/plugins/providers/virtualbox/driver/version_5_0.rb:581:in `read_state'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/plugins/providers/virtualbox/provider.rb:101:in `state'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/machine.rb:532:in `state'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/action/builtin/wait_for_communicator.rb:26:in `block in call'

当初、Vagrantのバージョンが少し古いことが問題かと考え、ver2.2.7にアップデートしましたが、エラーの内容は変わりませんでした。

改めて、エラーメッセージに向き合います(汗)。

最初のエラーメッセージに「Windows-31J」や「Encoding::InvalidByteSequenceError」とあります。

対処方法としては、いろいろあるかもしれませんが、エラーメッセージにあるエラーに直接対処するには、rubyモジュールの修正を行う必要があるようです。

修正対象のファイル :

C:/HashiCorp/Vagrant/embedded/gems/2.2.5/gems/vagrant-2.2.5/lib/vagrant/util/io.rb

このファイルは直接の修正ができないため、一旦、書き込みが可能なフォルダーにファイルをコピーして修正してから、そのファイルを管理者権限で元のフォルダー内に上書きして変更します。
なお、事前に修正前のファイルをどこかに控えておくと安心です。

HTMLの比較(赤文字が修正箇所)
修正前
data << io.readpartial(READ_CHUNK_SIZE).encode("UTF-8", Encoding.default_external)
修正後
data << io.readpartial(READ_CHUNK_SIZE).encode("Windows-31J", Encoding.default_external)

修正後、「vagrant up」や「vagrant reload」にて正常に起動ができることを確認できました。

以上、お役に立てれば幸いです。