[ovirt-users] Exporting a VM's disks

Maor Lipchuk mlipchuk at redhat.com
Sat Feb 21 10:10:16 EST 2015


Hi John,

Well done for writing the script.
I was wondering, what is it that you are trying to do? If you try to migrate disks from one setup to another you might want to consider using "Import Storage Domain" (see [1]),
though it is only supported from oVirt 3.5.


[1]
http://www.ovirt.org/Features/ImportStorageDomain#Work_flow_for_Import_File_Storage_Domain_-_UI_flow


Regards,
Maor


----- Original Message -----
> From: "John Gardeniers" <jgardeniers at objectmastery.com>
> To: "users" <users at ovirt.org>
> Sent: Friday, February 20, 2015 12:33:48 AM
> Subject: [ovirt-users] Exporting a VM's disks
> 
> Hi All,
> 
> Having recently had a need to manually export a VM from our RHEV
> environment I searched for a way to identify the VM's disks with the
> files on the storage system. The search led me to
> http://rhevdup.blogspot.com.au/2013/05/manual-export-of-vm-from-rhev.html but
> unfortunately, the script in that post only lists the first drive for a
> VM, making it less than useful for exporting VMs with multiple drives.
> 
> Inspired by that post I wrote my own version in Perl (I detest Python).
> The script works on our RHEV 3.4 with a Gluster storage back end. I
> would greatly appreciate it if some of you could test it on other
> RHEV/Ovirt versions and on different storage systems. Thanks for any
> feedback.
> 
> regards,
> John
> 
> 
> #! /usr/bin/env perl
> 
> # Run this script on the RHEV/Ovirt engine (management) machine
> #
> # Find the files on the storage which belong to a VM's disk(s)
> # Input parameter: A single VM name (case sensitive)
> 
> use DBI;
> 
> my $vm = shift or die "No VM specified\n";
> 
> my $conf = '/etc/ovirt-engine/engine.conf.d/10-setup-database.conf';
> my $host = 'localhost';
> my $db;
> my $user;
> my $pass;
> my $port = 5432;
> 
> open my $fi, '<', $conf or die "Can't read $conf\n";
> 
> while(<$fi>) {
>      my $line = $_;
>      $host = $1 if($line =~ /ENGINE_DB_HOST="(.*)"/);
>      $db = $1 if($line =~ /ENGINE_DB_DATABASE="(.*)"/);
>      $user = $1 if($line =~ /ENGINE_DB_USER="(.*)"/);
>      $pass = $1 if($line =~ /ENGINE_DB_PASSWORD="(.*)"/);
>      $port = $1 if($line =~ /ENGINE_DB_PORT="(.*)"/);
> }
> 
> die "Unable to get all database details\n" if(!$db || !$user || !$pass);
> my $dbh = DBI->connect("dbi:Pg:dbname=$db;host=$host;port=$port", $user,
> $pass, {AutoCommit=>1,RaiseError=>1,PrintError=>0});
> die "Error connecting to the database\n" if(!$dbh);
> 
> # Get the device ID
> my $sql = "select device_id from vms_for_disk_view where array_vm_names
> = '{$vm}'";
> my @row = $dbh->selectrow_array($sql);
> my $vm_id = $row[0];
> 
> if($vm_id) {
>      print "\nVM ID:      $vm_id\n";
> 
>      # Get the drive ID(s)
>      $sql = "select image_guid, to_char(size/1024/1024/1024.0,
> '999G999D99'), to_char(actual_size/1024/1024/1024.0, '999G999D99'),
> storage_name from images_storage_domain_view where vm_names = '$vm' and
> entity_type = 'VM'";
>      my $sth = $dbh->prepare($sql) || die "Error preparing the SQL
> string \"$sql\"\n$dbh::errstr";
>      print "\nError executing $sql\n$DBI::errstr\n\n" unless
> $sth->execute();
>      print "Disk ID(s): ";
>      my $cnt = 0;
> 
>      while (@row = $sth->fetchrow_array) {
>          print "            " if($cnt++);
>          print "$row[0], $row[1]GB allocated, $row[2]GB actual, on
> $row[3]\n";
>      }
> 
>      $sth->finish;
>      print "\n";
> } else {
>      print "\nVM \"$vm\" not found. Be aware that the name is case
> sensitive.\n\n";
> }
> 
> $dbh->disconnect;
> 
> _______________________________________________
> Users mailing list
> Users at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/users
> 


More information about the Users mailing list