| 
				
			 | 
			
			
				@@ -2,24 +2,22 @@ 
			 | 
		
	
		
			
			| 
				
					2
				
			 | 
			
				
					2
				
			 | 
			
			
				 # The script is designed to create or restore an image of a virtual machine kvm (c) 2018 
			 | 
		
	
		
			
			| 
				
					3
				
			 | 
			
				
					3
				
			 | 
			
			
				 # author Koshuba V.O. 
			 | 
		
	
		
			
			| 
				
					4
				
			 | 
			
				
					4
				
			 | 
			
			
				 # license: MIT 
			 | 
		
	
		
			
			| 
				
					5
				
			 | 
			
				
			 | 
			
			
				-# version: 4.0.0 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					5
				
			 | 
			
			
				+# version: 4.0.5 
			 | 
		
	
		
			
			| 
				
					6
				
			 | 
			
				
					6
				
			 | 
			
			
				 ## 
			 | 
		
	
		
			
			| 
				
					7
				
			 | 
			
				
					7
				
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
					8
				
			 | 
			
				
					8
				
			 | 
			
			
				 #<manual_parameters> 
			 | 
		
	
		
			
			| 
				
					9
				
			 | 
			
				
			 | 
			
			
				-path_kvm=( "/kvm/win7x64"  
			 | 
		
	
		
			
			| 
				
					10
				
			 | 
			
				
			 | 
			
			
				-           "/kvm/win2kx64" );					# path kvm machines 
			 | 
		
	
		
			
			| 
				
					11
				
			 | 
			
				
			 | 
			
			
				-path_bak=( "/arhive/backup/kvm/win7x64"  
			 | 
		
	
		
			
			| 
				
					12
				
			 | 
			
				
			 | 
			
			
				-           "/arhive/backup/kvm/win2kx64" );			# path backup kvm machines 
			 | 
		
	
		
			
			| 
				
					13
				
			 | 
			
				
			 | 
			
			
				-img_dev=( "disk_c.img"  
			 | 
		
	
		
			
			| 
				
					14
				
			 | 
			
				
			 | 
			
			
				-          "disk_c.img" );					# storage kvm 
			 | 
		
	
		
			
			| 
				
					15
				
			 | 
			
				
			 | 
			
			
				-img_part=( '"sda1" "sda2"'  
			 | 
		
	
		
			
			| 
				
					16
				
			 | 
			
				
			 | 
			
			
				-           '"sda1"' );						# sections in media kvm 
			 | 
		
	
		
			
			| 
				
					17
				
			 | 
			
				
			 | 
			
			
				-img_offset=( '"1048576" "105906176"'  
			 | 
		
	
		
			
			| 
				
					18
				
			 | 
			
				
			 | 
			
			
				-           '"32256"' );						# offset for switch section media kvm 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					9
				
			 | 
			
			
				+path_kvm=( "/kvm/win2012" "/kvm/win2008" );			# path kvm machines 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					10
				
			 | 
			
			
				+path_bak=( "/backup/kvm/win2012" "/backup/kvm/win2008" );	# path backup kvm machines 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					11
				
			 | 
			
			
				+img_dev=( "sda.img" "sda.img" );				# storage kvm 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					12
				
			 | 
			
			
				+img_part=( '"sda1" "sda2" "sda3" "sda4"' '"sda1"' );		# sections in media kvm 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					13
				
			 | 
			
			
				+img_type=( '"dd" "dd" "dd" "ntfsclone"' '"ntfsclone"' );	# type backup partition:dd[fat,EFI System,Windows recovery environment,Microsoft reserved],ntfsclone[ntfs,Microsoft basic data] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					14
				
			 | 
			
			
				+img_size=( '"300" "99" "128"' '""' );				# size partition for dd (Mb) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					15
				
			 | 
			
			
				+img_offset=( '"1048576" "315621376" "419430400" "553648128"' 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					16
				
			 | 
			
			
				+             '"1048576"' );					# offset for switch section media kvm 
			 | 
		
	
		
			
			| 
				
					19
				
			 | 
			
				
					17
				
			 | 
			
			
				 #</manual_parameters> 
			 | 
		
	
		
			
			| 
				
					20
				
			 | 
			
				
					18
				
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
					21
				
			 | 
			
				
					19
				
			 | 
			
			
				 #<script_value> 
			 | 
		
	
		
			
			| 
				
					22
				
			 | 
			
				
			 | 
			
			
				-version="4.0.0"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					20
				
			 | 
			
			
				+version="4.0.5"; 
			 | 
		
	
		
			
			| 
				
					23
				
			 | 
			
				
					21
				
			 | 
			
			
				 owner="(c) script by Koshuba V.O. 2018"; 
			 | 
		
	
		
			
			| 
				
					24
				
			 | 
			
				
					22
				
			 | 
			
			
				 msg_dat=( '"Script to save or restore the image KVM" "Скрипт сохранения или восстановления образа KVM"' 
			 | 
		
	
		
			
			| 
				
					25
				
			 | 
			
				
					23
				
			 | 
			
			
				           '"MAIN MENU" "ГЛАВНОЕ МЕНЮ"' 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -38,7 +36,8 @@ msg_dat=( '"Script to save or restore the image KVM" "Скрипт сохран 
			 | 
		
	
		
			
			| 
				
					38
				
			 | 
			
				
					36
				
			 | 
			
			
				           '"Found the file kvmsnapshot.lock - work is stopped!" "Найден файл kvmsnapshot.lok - работа остановлена!"' 
			 | 
		
	
		
			
			| 
				
					39
				
			 | 
			
				
					37
				
			 | 
			
			
				           '"Starting kvm-snapshot script." "Запуск скрипта kvm-snapshot."' 
			 | 
		
	
		
			
			| 
				
					40
				
			 | 
			
				
					38
				
			 | 
			
			
				           '"Ending work kvm-snapshot script." "Окончание работы скрипта kvm-snapshot."' 
			 | 
		
	
		
			
			| 
				
					41
				
			 | 
			
				
			 | 
			
			
				-          '"Not found save images!" "Не найдены сохраненные образы!"' ); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					39
				
			 | 
			
			
				+          '"Not found save images!" "Не найдены сохраненные образы!"' 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					40
				
			 | 
			
			
				+          '"The installed type was not found from the parameters for image processing - dd,ntfsclone,mrsrv!" "Не найден установленный тип из параметров для обработки образа - dd,ntfsclone,mrsrv!"' ); 
			 | 
		
	
		
			
			| 
				
					42
				
			 | 
			
				
					41
				
			 | 
			
			
				 	  # msg[17] 
			 | 
		
	
		
			
			| 
				
					43
				
			 | 
			
				
					42
				
			 | 
			
			
				 msg=();											# set current messages 
			 | 
		
	
		
			
			| 
				
					44
				
			 | 
			
				
					43
				
			 | 
			
			
				 esc_title="";										# title escape menu 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -220,7 +219,7 @@ esac 
			 | 
		
	
		
			
			| 
				
					220
				
			 | 
			
				
					219
				
			 | 
			
			
				 #<functions> 
			 | 
		
	
		
			
			| 
				
					221
				
			 | 
			
				
					220
				
			 | 
			
			
				 #<Fn test lock file> 
			 | 
		
	
		
			
			| 
				
					222
				
			 | 
			
				
					221
				
			 | 
			
			
				 testproc(){ 
			 | 
		
	
		
			
			| 
				
					223
				
			 | 
			
				
			 | 
			
			
				-if [ ! -f $scriptlog ]; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					222
				
			 | 
			
			
				+if [ -f $scriptlog ]; 
			 | 
		
	
		
			
			| 
				
					224
				
			 | 
			
				
					223
				
			 | 
			
			
				  then 
			 | 
		
	
		
			
			| 
				
					225
				
			 | 
			
				
					224
				
			 | 
			
			
				     echo > $scriptlog; 
			 | 
		
	
		
			
			| 
				
					226
				
			 | 
			
				
					225
				
			 | 
			
			
				 fi 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -362,6 +361,8 @@ function saveKvm() { 
			 | 
		
	
		
			
			| 
				
					362
				
			 | 
			
				
					361
				
			 | 
			
			
				 local save_kvm="${path_kvm[$set_kvm]}"; 
			 | 
		
	
		
			
			| 
				
					363
				
			 | 
			
				
					362
				
			 | 
			
			
				 local save_bak="${path_bak[$set_kvm]}/$rdate"; 
			 | 
		
	
		
			
			| 
				
					364
				
			 | 
			
				
					363
				
			 | 
			
			
				 local save_img="${img_dev[$set_kvm]}"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					364
				
			 | 
			
			
				+eval local save_type="(" $(echo -e ${img_type[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					365
				
			 | 
			
			
				+eval local save_size="(" $(echo -e ${img_size[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
					365
				
			 | 
			
				
					366
				
			 | 
			
			
				 eval local save_dev="(" $(echo -e ${img_part[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
					366
				
			 | 
			
				
					367
				
			 | 
			
			
				 eval local save_offset="(" "$(echo -e ${img_offset[$set_kvm]})" ")"; 
			 | 
		
	
		
			
			| 
				
					367
				
			 | 
			
				
					368
				
			 | 
			
			
				 local set_loop_main="$(losetup -f|grep -v loop-control|sed 's/\/\dev\///g')"; 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -372,14 +373,34 @@ if [[ ! -d $save_bak ]]; 
			 | 
		
	
		
			
			| 
				
					372
				
			 | 
			
				
					373
				
			 | 
			
			
				     mkdir -p $save_bak; 
			 | 
		
	
		
			
			| 
				
					373
				
			 | 
			
				
					374
				
			 | 
			
			
				 fi 
			 | 
		
	
		
			
			| 
				
					374
				
			 | 
			
				
					375
				
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
					375
				
			 | 
			
				
			 | 
			
			
				-sfdisk -d /dev/$set_loop_main >$save_bak/info.txt; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					376
				
			 | 
			
			
				+sfdisk -d /dev/$set_loop_main >$save_bak/info_sfdisk.txt; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					377
				
			 | 
			
			
				+sfdisk -l /dev/$set_loop_main >$save_bak/info_disk.txt; 
			 | 
		
	
		
			
			| 
				
					376
				
			 | 
			
				
					378
				
			 | 
			
			
				 dd if=/dev/$set_loop_main of=$save_bak/winboot.img bs=512 count=1; 
			 | 
		
	
		
			
			| 
				
					377
				
			 | 
			
				
					379
				
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
					378
				
			 | 
			
				
					380
				
			 | 
			
			
				 for ((iskvm=0; iskvm != ${#save_dev[@]}; iskvm++)) 
			 | 
		
	
		
			
			| 
				
					379
				
			 | 
			
				
					381
				
			 | 
			
			
				  do 
			 | 
		
	
		
			
			| 
				
					380
				
			 | 
			
				
					382
				
			 | 
			
			
				     local set_loop_dev="$(losetup -f|grep -v loop-control|sed 's/\/\dev\///g')"; 
			 | 
		
	
		
			
			| 
				
					381
				
			 | 
			
				
					383
				
			 | 
			
			
				     losetup -o ${save_offset[$iskvm]} /dev/$set_loop_dev /dev/$set_loop_main; 
			 | 
		
	
		
			
			| 
				
					382
				
			 | 
			
				
			 | 
			
			
				-    ntfsclone --save-image -o - /dev/$set_loop_dev| pigz -p2 -c9>$save_bak/${save_dev[$iskvm]}.img.gz; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					384
				
			 | 
			
			
				+    if [ "${save_type[$iskvm]}" == "ntfsclone" ]; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					385
				
			 | 
			
			
				+	    then 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					386
				
			 | 
			
			
				+	    ntfsclone --save-image -o - /dev/$set_loop_dev| pigz -p2 -c9>$save_bak/${save_dev[$iskvm]}.img.gz; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					387
				
			 | 
			
			
				+	fi 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					388
				
			 | 
			
			
				+	if [ "${save_type[$iskvm]}" == "dd" ]; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					389
				
			 | 
			
			
				+	    then 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					390
				
			 | 
			
			
				+		if [ "${save_size[$iskvm]}" != "" ]; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					391
				
			 | 
			
			
				+		    then 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					392
				
			 | 
			
			
				+		    dd if=/dev/$set_loop_dev of=$save_bak/${save_dev[$iskvm]}_dd.img.gz status=progress bs=${save_size[$iskvm]}M count=1; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					393
				
			 | 
			
			
				+		    else 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					394
				
			 | 
			
			
				+		    echo "Warning! not found size partition ${save_dev[$iskvm]} for dd!"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					395
				
			 | 
			
			
				+		fi 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					396
				
			 | 
			
			
				+	     
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					397
				
			 | 
			
			
				+	fi 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					398
				
			 | 
			
			
				+	if [ "${save_type[$iskvm]}" != "ntfsclone" ] && [ "${save_type[$iskvm]}" != "dd" ] && [ "${save_type[$iskvm]}" != "mrsrv" ]; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					399
				
			 | 
			
			
				+	    then 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					400
				
			 | 
			
			
				+		echo "[$save_bak/${save_dev[$irkvm]}_dd.img.gz]\n ${msg[18]} - >> /var/log/syslog"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					401
				
			 | 
			
			
				+		echo "$(date) - kvm-snapshot: [$save_bak/${save_dev[$irkvm]}_dd.img.gz] \n ${msg[18]}" >> /var/log/syslog; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					402
				
			 | 
			
			
				+	fi 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					403
				
			 | 
			
			
				+     
			 | 
		
	
		
			
			| 
				
					383
				
			 | 
			
				
					404
				
			 | 
			
			
				     losetup -d /dev/$set_loop_dev; 
			 | 
		
	
		
			
			| 
				
					384
				
			 | 
			
				
					405
				
			 | 
			
			
				 done 
			 | 
		
	
		
			
			| 
				
					385
				
			 | 
			
				
					406
				
			 | 
			
			
				 losetup -d /dev/$set_loop_main; 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -389,6 +410,8 @@ function restoreKvm() { 
			 | 
		
	
		
			
			| 
				
					389
				
			 | 
			
				
					410
				
			 | 
			
			
				 local rest_kvm="${path_kvm[$set_kvm]}"; 
			 | 
		
	
		
			
			| 
				
					390
				
			 | 
			
				
					411
				
			 | 
			
			
				 local rest_bak="${path_bak[$set_kvm]}/$set_img"; 
			 | 
		
	
		
			
			| 
				
					391
				
			 | 
			
				
					412
				
			 | 
			
			
				 local rest_img="${img_dev[$set_kvm]}"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					413
				
			 | 
			
			
				+eval local rest_type="(" $(echo -e ${img_type[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					414
				
			 | 
			
			
				+eval local rest_size="(" $(echo -e ${img_size[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
					392
				
			 | 
			
				
					415
				
			 | 
			
			
				 eval local rest_dev="(" $(echo -e ${img_part[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
					393
				
			 | 
			
				
					416
				
			 | 
			
			
				 eval local rest_offset="(" "$(echo -e ${img_offset[$set_kvm]})" ")"; 
			 | 
		
	
		
			
			| 
				
					394
				
			 | 
			
				
					417
				
			 | 
			
			
				 local set_loop_rmain="$(losetup -f|grep -v loop-control|sed 's/\/\dev\///g')"; 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -399,7 +422,24 @@ for ((irkvm=0; irkvm != ${#rest_dev[@]}; irkvm++)) 
			 | 
		
	
		
			
			| 
				
					399
				
			 | 
			
				
					422
				
			 | 
			
			
				  do 
			 | 
		
	
		
			
			| 
				
					400
				
			 | 
			
				
					423
				
			 | 
			
			
				     local set_loop_rdev="$(losetup -f|grep -v loop-control|sed 's/\/\dev\///g')"; 
			 | 
		
	
		
			
			| 
				
					401
				
			 | 
			
				
					424
				
			 | 
			
			
				     losetup -o ${rest_offset[$irkvm]} /dev/$set_loop_rdev /dev/$set_loop_rmain; 
			 | 
		
	
		
			
			| 
				
					402
				
			 | 
			
				
			 | 
			
			
				-    gunzip -c $rest_bak/${rest_dev[$irkvm]}.img.gz|ntfsclone --restore-image -O /dev/$set_loop_rdev -; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					425
				
			 | 
			
			
				+	if [ ${rest_type[$irkvm]} == "ntfsclone" ]; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					426
				
			 | 
			
			
				+	    then 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					427
				
			 | 
			
			
				+	    gunzip -c $rest_bak/${rest_dev[$irkvm]}_ntfs.img.gz|ntfsclone --restore-image -O /dev/$set_loop_rdev -; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					428
				
			 | 
			
			
				+	fi 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					429
				
			 | 
			
			
				+	if [ "${rest_type[$irkvm]}" == "dd" ]; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					430
				
			 | 
			
			
				+	    then 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					431
				
			 | 
			
			
				+		if [ "${rest_size[$irkvm]}" != "" ]; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					432
				
			 | 
			
			
				+		    then 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					433
				
			 | 
			
			
				+		    dd if=$rest_bak/${rest_dev[$irkvm]}_dd.img.gz of=/dev/$set_loop_rdev status=progress bs=${rest_size[$irkvm]}M count=1; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					434
				
			 | 
			
			
				+		    else 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					435
				
			 | 
			
			
				+		    echo "Warning! not found size partition ${rest_dev[$irkvm]} for dd!"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					436
				
			 | 
			
			
				+		fi 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					437
				
			 | 
			
			
				+	fi 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					438
				
			 | 
			
			
				+	if [ "${rest_type[$irkvm]}" != "ntfsclone" ] && [ "${rest_type[$irkvm]}" != "dd" ]; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					439
				
			 | 
			
			
				+	    then 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					440
				
			 | 
			
			
				+		echo "[$rest_bak/${rest_dev[$irkvm]}_dd.img.gz]\n ${msg[18]} - >> /var/log/syslog"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					441
				
			 | 
			
			
				+		echo "$(date) - kvm-snapshot: [$rest_bak/${rest_dev[$irkvm]}_dd.img.gz] \n ${msg[18]}" >> /var/log/syslog; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					442
				
			 | 
			
			
				+	fi 
			 | 
		
	
		
			
			| 
				
					403
				
			 | 
			
				
					443
				
			 | 
			
			
				     losetup -d /dev/$set_loop_rdev; 
			 | 
		
	
		
			
			| 
				
					404
				
			 | 
			
				
					444
				
			 | 
			
			
				 done 
			 | 
		
	
		
			
			| 
				
					405
				
			 | 
			
				
					445
				
			 | 
			
			
				 losetup -d /dev/$set_loop_rmain; 
			 |