CentOS7のvirt-cloneで重複したMACアドレスを使用する

CentOS6では問題なかったのですが、CentOS7のvirt-cloneコマンドで重複したMACアドレスが使用できなくなりました。

重複したMACアドレスを仮想マシンに与える使い方をしていた為、若干困ったのでメモを残します。

 

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サーバに登録していく方式が最適です。