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