vagrant package で CentOS の Box を作成して再利用しようとしたらネットワーク設定ではまった

vagrant は自分で作った VM から vagrant package というコマンドで box ファイルを作成して、それを雛形にして新たに VM を作ることができます。これで必要なパッケージのインストール、ユーザの追加、設定ファイルの配置などをしてから box 化しておくことで同じ環境を使いまわすことができます。
いまどきは Chef などの構成管理ソフトを使って毎回自動的に環境構築、というのが流行りだと思いますけど、時間もかかるので手元で開発用に使いたいものだと box から VM 作成/起動してすぐ利用、というのが手軽でいいです(手軽さが欲しいなら Docker と言われそうだけど)。

vagrant の box 作成はこちらを参考にしました。

Vagrantのboxに少しだけ手を加えたものをboxとして取っておきたい - Qiita

今日もアプリのテスト用にいくつかサーバが欲しくなったので CentOS 6.4 の VM を作ってそこに環境構築して vagrant package で box 化してから、Vagrant の Multi-VM で一気にサーバを立てよう……としたら vagrant up がネットワーク設定のところでこけました。
/sbin/ifup eth1 がデバイスがみつからなくて失敗しているというようなメッセージが出ているものと、IP アドレスが既に使われていてネットワークインタフェースを有効にできない、という2種類のメッセージがありました。

CentOS(おそらく RedHat も)はネットワークインタフェース(eth0, eth1 など)と MAC アドレスの対応を憶えておくようになっているそうで、新しい VM を起動すると当然 MAC アドレスは新しいものが使われるのですが、古い設定が /etc/udev/rules.d/70-persistent-net.rules に残っていて、新しい MAC アドレスは eth2 として追加されるため eth1 が存在しない、という扱いになるそうです。

もうひとつはもっと単純で、/etc/sysconfig/network-scripting/ifcfg-eth1 の IP アドレスの設定を残したまま Box 化してしまっていたので、Vagrant に指定したアドレスではなく元になった VM で使っていた IP アドレスのまま利用しようとしてしまっていたようでした。

Box 化する前にこれらの設定ファイルを削除しておけば大丈夫でした。なお元になった VM も再起動すればこれらのファイルは自動的に再生成されました。

$ vagrant ssh
vm> sudo rm /etc/udev/rules.d/70-persistent-net.rules
vm> sudo rm /etc/sysconfig/network-scripting/ifcfg-eth1
vm> exit
$ vagrant halt
$ vagrant package

vagrant package の前に halt で停止してるのはなんとなくで、不要かもしれません。

問題解決にあたり以下のページを参考にさせて頂きました。
仮想マシンコピー時にeth0消滅 ( /etc/udev/rules.d/70-persistent-net.rules ) - とあるSIerの憂鬱
VMイメージ内でMACアドレスとインターフェース名(eth0とか)の関係が固定化されるのを防ぐ - Qiita