Hi!
Here i’m using a snapshot LVM method and compress over SSH on remote backup server.
With this method i’ve have disk image compress with gunzip, the disk image is ready for restauration
with simple dd pipe with gzip -d cmd.
I’ve develop a script for process automation here it’s:
#!/usr/bin/php
<?php
#Backup LV over SSH
#creation:24/11/2017
#update:24/05/2018
$conf_targets=array(
'crx-fw01-disk',
'crx-web01-disk',
'crx-mail01-disk',
'crx-vmtemplate01-disk',
'crx-dxspiderham-disk',
'crx-dxspider11m-disk',
'crx-sche02-disk',
'crx-web02-disk',
'crx-sup01-disk'
);
$conf_vgname='vg__data_store';
$conf_ssh_uri='ssh crx-bck01.ext.crx.cloud -p9822';
$conf_pathremote='/data_crxbck01/backup_lvm_vg__data_store_from_crx-hyp01-5';
function lvmGetAllLv(){
$lvminf=array();
$out=`/sbin/lvdisplay`;
$out=explode("\n",$out);
$s=0;
foreach($out as $k=>$v){
if (preg_match("/Logical(.*)volume(.*)/",$v,$m)) {
$s=1;
}
if($s){
if(preg_match("/LV(.*)Name(.*)/",$v,$o)){
$lvkey=trim($o[2]);
}
if (preg_match("/LV(.*)Size(.*)/",$v,$m)) {
#var_dump($m);
$size=$m[2];
if(preg_match("/MiB/",$size,$n)){
$size=(int)$size;
$size=$size/1000;
$size=ceil($size);
}else{ //GiB value:
$size=str_replace(',','.',$size);
$size=(float)$size;
$size=ceil($size);
}
$lvminf[$lvkey]['size']=$size;
}
if (preg_match("/VG(.*)Name(.*)/",$v,$m)) {
$lvminf[$lvkey]['vg_name']=trim($m[2]);
}
}
}
return $lvminf;
}
$curr_date=date('d-m-Y');
$all_lv=lvmGetAllLv();
foreach($all_lv as $lvname=>$lvinfo){
if(in_array($lvname,$conf_targets)){
$opt_size=$lvinfo['size'].'g';
$opt_snap='snap';
$backup_file_name=$curr_date.'_'.$lvname.'_'.$opt_size.'.gz';
echo "\nBackup LV:$lvname";
echo "\nStart:".date('d-m-Y H:i:s')."\n";
$create_snapshot_cmd="/sbin/lvcreate --size $opt_size --snapshot --name $opt_snap /dev/$conf_vgname/$lvname";
echo $create_snapshot_cmd."\n";
$exec=`$create_snapshot_cmd`;
$copy_snap_to_rmt="/bin/dd if=/dev/$conf_vgname/snap bs=1k | /bin/gzip | $conf_ssh_uri /bin/dd of=$conf_pathremote/$backup_file_name bs=1k";
echo $copy_snap_to_rmt."\n";
$exec=`$copy_snap_to_rmt`;
$remove_snapshot_cmd="/sbin/lvremove -f /dev/$conf_vgname/snap";
echo $remove_snapshot_cmd."\n";
$exec=`$remove_snapshot_cmd`;
echo "\nEnd:".date('d-m-Y H:i:s')."\n\n";
}
}
?>
backup_lv_to_ssh.php
So i run it into a screen, and i’m using this on the remote to control in real time :
watch "du -sh *"
control files
To restore img simply, re create a LV with the correct size, and import IMG into it :
lvcreate -L 40G -n myserver-disk vg_target
dd if=/path/to/file/backup/myserver-disk.gz | gzip -d | dd of=/dev/vg_target/myserver-disk
restore img into lv process
Hope it’ll help you to do your backup and export vm disk.
A+
Article: 26042018