StupidDog's blog

IT関連の手近な所で、疑問に思った事を調べた記録

「Windows7でVagrantを更新インストールした環境で、"bsdtarが見つからない"となる件について」

はじめに

Windows7上で、インストーラによりVagrantを更新インストールした環境で発生した問題について原因と対応をまとめました。
(2014.10.13時点)

環境

Windows7 Professional (64bit)
Vagrant 1.5.2 (更新前)
Vagrant 1.6.5 (更新後)

問題

問題を発生させる手順
  1. Vagrnat 1.5.2 がインストールされている状態で、1.6.5 用のインストーラからインストールする。
  2. Boxファイルの追加(vagrant box add)を行う。
発生した問題

下記のエラーメッセージが表示されBoxファイルの追加に失敗する。

F:\vm\z001>type vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu1404"
  config.vm.box_url = "f:\\boxs\\ubuntu-14-04-x64-virtualbox.box"
end

F:\vm\z001>vagrant box add ubuntu1404 "f:\\boxs\\ubuntu-14-04-x64-virtualbox.box"
==> box: Adding box 'ubuntu1404' (v0) for provider:
    box: Downloading: file://f:/boxs/ubuntu-14-04-x64-virtualbox.box
    box: Progress: 100% (Rate: 163M/s, Estimated time remaining: --:--:--)
The executable 'bsdtar' Vagrant is trying to run was not
found in the %PATH% variable. This is an error. Please verify
this software is installed and on the path.

エラーメッセージは「実行ファイルの"bsdtar"がサーチパス上から見つからない。インストールしてパスを通してください」みたいな感じです。

対応

Vagrant 1.5.2 をアンインストールしてから、Vagrant 1.6.5 を新規インストールする。
ネット上を調べると、「bsdtar.exeを別途インストールする」や「PATH環境変数へ、別の場所にあるbsdtar.exeのパスを追加する」などが見つかりましたが、新規インストールが現状での最良だと思います。(理由は後ほど)

調査と原因

まず、vagrant 1.6.5を新規インストールした場合と、更新インストールした場合で何が異なるのか?
bsdtar.exeに注目して調べると「C:\HashiCorp\Vagrant\embedded\gnuwin32\bin」の内容が異なります。

更新インストールした場合
C:\HashiCorp\Vagrant\embedded\gnuwin32\bin>dir
 ドライブ C のボリューム ラベルは SYSTEM(SSD) です
 ボリューム シリアル番号は 8A9F-F559 です

 C:\HashiCorp\Vagrant\embedded\gnuwin32\bin のディレクトリ

2014/10/13  18:53    <DIR>          .
2014/10/13  18:53    <DIR>          ..
2014/04/29  22:48         1,209,161 libarchive.dll
               1 個のファイル           1,209,161 バイト
               2 個のディレクトリ  176,688,869,376 バイトの空き領域
新規インストールした場合
C:\HashiCorp\Vagrant\embedded\gnuwin32\bin>dir
 ドライブ C のボリューム ラベルは SYSTEM(SSD) です
 ボリューム シリアル番号は 8A9F-F559 です

 C:\HashiCorp\Vagrant\embedded\gnuwin32\bin のディレクトリ

2014/10/13  19:28    <DIR>          .
2014/10/13  19:28    <DIR>          ..
2014/04/29  22:50         1,252,396 bsdcpio.exe
2014/04/29  22:50         1,281,328 bsdtar.exe
2014/04/29  22:48         1,209,161 libarchive.dll
               3 個のファイル           3,742,885 バイト
               2 個のディレクトリ  176,117,678,080 バイトの空き領域

「bsdtar.exe」が無くなっています。
これはインストーラにより削除されたことになるのですが、更新インストール時のログに原因となりそうなメッセージが出力されています。

更新インストール時のログ(抜粋)
...
MSI (c) (AC:30) [18:49:28:836]: Disallowing installation of component: {BCBBCB44-984B-4F12-9EAE-9F32C977168F} since the same component with higher versioned keyfile exists
MSI (c) (AC:30) [18:49:28:836]: Disallowing installation of component: {46C1C17F-C76E-4445-ACC8-D4FEE653035F} since the same component with higher versioned keyfile exists
...
MSI (s) (88:64) [18:50:35:698]: Executing op: ComponentRegister(ComponentId={BCBBCB44-984B-4F12-9EAE-9F32C977168F},KeyPath=C:\HashiCorp\Vagrant\embedded\gnuwin32\bin\bsdtar.exe,State=3,,Disk=1,SharedDllRefCount=2,BinaryType=0)
1: {3D24EE12-E0CF-41EC-8182-361ECF575656} 2: {BCBBCB44-984B-4F12-9EAE-9F32C977168F} 3: C:\HashiCorp\Vagrant\embedded\gnuwin32\bin\bsdtar.exe 
...

「Disallowing installation of component: {GUID} since the same component with higher versioned keyfile exists」が、「既に更新が必要のないバージョンが存在しているのでインストールしません」な感じです。
長い英数字文字列{GUID}が対象ファイルを表しています。ログの後半で{GUID}に対応するファイルが「gunwin32\bin\bsdtar.exe」であることが確認できます。

Windows Installer の 更新時のルール(
File Versioning Rules (Windows))で判定した結果、インストール対象から外されているようです。(Vagrant 1.5.2 と 1.6.5 でインストールされる「bsdtar.exe」は同じなので更新する必要がないのですが)

その後、何故かインストール処理中に「gunwin32\bin」以下のファイルが削除されます。
「bsdtar.exe」も一緒に削除された後、インストール対象から外れていためインストールされず「bsdtar.exe」が消えてしまう結果となるようです。

まとめ

msi形式のインストーラの作成時の設定か、Windows Installer特有の問題なのかは別として、vagrant 1.6.5のインストーラ単体では内容物に不足はありません。
「bsdtar.exe」を別途ダウンロードしてきて「gunwin32\bin」以下へ配置しても、他のいくつかのファイルが消えているので不安定な環境が残るだけです。

また、更新インストールで問題が発生する状態でも「C:\HashiCorp\Vagrant\embedded\mingw\bin」に「bsdtar.exe」があります(ファイルサイズ異なり名前は同じだが別もの)。
今回のようにインストール方法を変えて差分を確認していない人が、残っている同名のファイルへパスを通す対応をしているようです。

Vagrant 1.6.5のインストーラに「bsdtar.exe」がないわけでもなく、1.6.5で新規にパスの設定が必要になったわけでもありません。
プロダクトとして想定されているインストール結果は、1.6.5のインストーラで新規インストールした状態であり、問題が発生する更新インストールの状態ではありません。

不安定な状態に場当たり的な対応はしないで、想定されている状態にした方が良いとの判断で、現状では新規インストールが最良であると考えます。

場当たり対応をした環境で「おれの環境では発生するんだが」な問題を報告されても対応できないからねっ≧ω≦)b!!