CentOS6では問題なかったのですが、CentOS7のvirt-cloneコマンドで重複したMACアドレスが使用できなくなりました。
重複したMACアドレスを仮想マシンに与える使い方をしていた為、若干困ったのでメモを残します。
Table of Contents
1 重複したMACアドレスを使用
私は仮想環境を以下の通りに使用してます。
- 予めベースとなる仮想マシンを用意しておく(例:Fedora20ベース) - DHCPサーバにベースとなる仮想マシンのMACアドレスに対する静的な IPアドレスを登録しておく - 仮想マシンを使用するクライアントマシンの/etc/hostsにホスト名と IPアドレスを登録しておく - 用途に合わせてベースとなる仮想マシンをクローンして使用する (例:Android構築用) - クローンしたマシンはベースとMACアドレスが同一である為、 クライアントマシンからssh [ホスト名]で接続できる
重複したMACアドレスが使用できない場合、DHCPサーバから静的なIPアドレスが分配されず、ssh [ホスト名]で接続できなくなり困りました。
2 virt-cloneコマンドのパッケージが変更
本現象が発生したのはCentOS6とCentOS7で/usr/bin/virt-cloneのパッケージが別のものになっている為です。
2.1 CentOS6のvirt-clone
/usr/bin/virt-cloneにクローン処理のpythonソースコードが記載されています。
python-virtinst.noarch : Python modules and utilities for installing virtual : machines
2.2 CentOS7のvirt-clone
/usr/bin/virt-cloneは/usr/share/virt-manager/virt-cloneを呼び出し、/usr/share/virt-manager/配下のpythonソースコードを使用します。
virt-install.noarch : Utilities for installing virtual machines
3 virt-cloneコマンドが呼び出すcloner.pyを変更
pythonソースコードとバイトコードのバックアップを取っておきます。
# cp /usr/share/virt-manager/virtinst/cloner.py{,.org}
以下の通り、ランタイムエラーを呼び出す箇所を警告出力に変更します。virt-cloneコマンドで-dオプションを指定すればpythonのスタックトレースが出力されるので該当箇所を見つけることができます。
# diff -uprN /usr/share/virt-manager/virtinst/cloner.py{.org,} --- /usr/share/virt-manager/virtinst/cloner.py.org 2015-05-03 01:45:11.703676348 +0900 +++ /usr/share/virt-manager/virtinst/cloner.py 2015-05-03 01:45:43.653392218 +0900 @@ -166,7 +166,7 @@ class Cloner(object): for m in maclist: msg = VirtualNetworkInterface.is_conflict_net(self.conn, m)[1] if msg: - raise RuntimeError(msg) + logging.warning(msg) self._clone_macs = maclist def get_clone_macs(self):
pythonソースコードをコンパイルします。
# python -O -m compileall /usr/share/virt-manager/virtinst/cloner.py # python -m compileall /usr/share/virt-manager/virtinst/cloner.py
以上でvirt-cloneで重複したMACアドレスを使うことができます。
4 webvirtmgr
webvirtmgrではvirt-cloneコマンドを使わず、libvirtのインターフェースを直接呼び出しているようで、重複したMACアドレスを使うことができます。
5 まとめ
そもそも仮想環境運用時にMACアドレスが重複することによるエラー検出は手間が掛かる為、virt-cloneコマンドで重複したMACアドレスを使えないようにしているので、上記修正は好ましいものではないです。
virt-cloneコマンドに重複したMACアドレスを許可するオプションを追加するのがより良い方法です。
DHCPサーバで動的にIPアドレスを分配しつつ、クローンしたマシンをDNSサーバに登録していく方式が最適です。