So I've been working on a setup for virtualization, where currently I'm using one large iSCSI target from an OpenSolaris machine. It occurred to me that there is a downside to this. I cannot use zfs snapshots for individual machines and backups/restores will be more difficult. I also did not want to be hassled with having to connect the iscsi targets using iscsiadm
every time I spin up a new VM.
Luckily libvirt provides iSCSI storage pool methods which will connect the targets and manage them for you. This makes life much easier for me, however, virt-install
does not have the functionality to install on these. Me being more proficient in Perl, I decided to take up the task of creating a simple wrapper. To use it, first you need this template XML file called "disk.xml."
$NAME <host name="$PORTAL"/>
<device path="$TARGET"/>
/dev/disk/by-path
Here's my script that I call virt-iscsi-install
, and it's pretty easy to use. Not the greatest solution as it does not do much for error checking, but for now this is what I'll be using. I may consider venturing into some Python and patch virt-install to include similar functionality as the libvirt library is well documented and not hard to understand.
#!/usr/bin/perl use Sys::Virt; use Getopt::Long; usage() if ( ! GetOptions( 'name|n=s' => \$name, 'ram|r=s' => \$ram, 'target|t=s' => \$target, 'portal|p=s' => \$portal, 'mirror|m=s' => \$mirror )) ; #print "name: $name\nram: $ram\ntarget: $target\nportal: $portal\n"; sub usage { print "usage: $0 --name--ram --target ". " --portal --mirror \n"; exit; } my $path = createPool($target,$portal,$name); print "Volume: $path\n"; print "Launching virt-install..\n"; system ("virt-install -n $name -r $ram --location $mirror --file $path --vnc --bridge=br0"); sub createPool { my ($target, $portal, $name) = @_; my $vmm = Sys::Virt->new(address => 'qemu:///system'); open my $fh, ') { s/\$NAME/$name/; s/\$TARGET/$target/; s/\$PORTAL/$portal/; $xml = "$xml $_"; } close $fh; #print $xml; my $pool = $vmm->define_storage_pool($xml); $pool->create(); if (!$pool->get_autostart) { print "setting pool to auto-start\n"; $pool->set_autostart(1); } my @volNames = $pool->list_volumes; foreach my $vol (@volNames) { return $vol->get_path; } }