停止中のvm(kvm)のネットワーク設定を書き換える習作
もう一年以上更新してなかったのか…
virt-cloneした後にネットワーク設定を修正するのが面倒くさいので、スクリプト一発でなんとかしたくて書いてみた。
#!/usr/bin/perl use strict; use warnings; use Sys::Guestfs; use Sys::Virt; use Data::Section::Simple qw(get_data_section); die "Usage: $0 domain ip_addr\n" if @ARGV != 2; my ($domain, $ip) = @ARGV; my $vmm_addr = 'qemu:///system'; my $vmm = Sys::Virt->new(address => $vmm_addr); grep { $_->get_name eq $domain } $vmm->list_domains and die "$domain is now actvie.\n"; my ($dom_obj) = grep { $_->get_name eq $domain } $vmm->list_defined_domains or die "No sush domain: $domain\n"; my ($image, $mac) = $dom_obj->get_xml_description =~ qr| <source[ ]file='(.*?)'/> .* <mac[ ]address='(.*?)'/> |sxm; my $content = sprintf get_data_section('ifcfg-eth0'), $mac, $ip; print <<EOT; New network configuration --------------------------- $content --------------------------- EOT my $guestfs = Sys::Guestfs->new; $guestfs->add_drive($image); $guestfs->launch; $guestfs->mount( '/dev/mapper/VolGroup00-LogVol00', '/' ); $guestfs->write_file( '/etc/sysconfig/network-scripts/ifcfg-eth0', $content, 0 ); $guestfs->sync; print "Finish\n"; __DATA__ @@ ifcfg-eth0 DEVICE=eth0 BOOTPROTO=static HWADDR=%s IPADDR=%s NETMASK=255.255.255.0 ONBOOT=yes
CentOS5.5で動きます。他は知らない。
やってることは、
- domain(vm)が停止してるか確認
- domainのxml定義からイメージファイルのパスとMACアドレスと抜き出す。
- libguestfsを使って、停止中のvmの設定ファイルを引数で指定したIPと先程のMACで上書き。
vmのrootデバイスがハードコードなのがいけてないけど、guestfishのinspectみたいなのがSys::Guestfsに見当たらなかった。いい方法ないかな。
これだとNIC一個のvmしか対応してないし、本当にやりたいことはもうちょっと込み入ってるのであくまで習作。けどこれだけでも役に立つかもと思って一応晒しときます。