| 
				
			 | 
			
			
				@@ -2,26 +2,21 @@ 
			 | 
		
	
		
			
			| 
				
					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.10 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					5
				
			 | 
			
			
				+# version: 5.0.1 
			 | 
		
	
		
			
			| 
				
					6
				
			 | 
			
				
					6
				
			 | 
			
			
				 ## 
			 | 
		
	
		
			
			| 
				
					7
				
			 | 
			
				
					7
				
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
					8
				
			 | 
			
				
					8
				
			 | 
			
			
				 #<manual_parameters> 
			 | 
		
	
		
			
			| 
				
					9
				
			 | 
			
				
			 | 
			
			
				-path_kvm=( "/kvm/ms1" "/kvm/ms2" );				# path kvm machines 
			 | 
		
	
		
			
			| 
				
					10
				
			 | 
			
				
			 | 
			
			
				-path_bak=( "/backup/kvm/ms1" "/backup/kvm/ms2"  );		# path backup kvm machines 
			 | 
		
	
		
			
			| 
				
					11
				
			 | 
			
				
			 | 
			
			
				-img_dev=( "sda.img" "sda.img" );				# storage kvm 
			 | 
		
	
		
			
			| 
				
					12
				
			 | 
			
				
			 | 
			
			
				-img_part=( '"sda1" "sda2" "sda3" "sda4"' 
			 | 
		
	
		
			
			| 
				
					13
				
			 | 
			
				
			 | 
			
			
				-           '"sda1" "sda2" "sda3" "sda4"' );			# sections in media kvm 
			 | 
		
	
		
			
			| 
				
					14
				
			 | 
			
				
			 | 
			
			
				-img_type=( '"dd" "dd" "dd" "ntfsclone"' 
			 | 
		
	
		
			
			| 
				
					15
				
			 | 
			
				
			 | 
			
			
				-           '"dd" "dd" "dd" "ntfsclone"' );			# type backup partition:dd[fat,EFI System,Windows recovery environment,Microsoft reserved],ntfsclone[ntfs,Microsoft basic data] 
			 | 
		
	
		
			
			| 
				
					16
				
			 | 
			
				
			 | 
			
			
				-img_size=( '"300" "99" "128" ""' 
			 | 
		
	
		
			
			| 
				
					17
				
			 | 
			
				
			 | 
			
			
				-           '"300" "99" "128" ""' );				# size partition for dd (Mb) 
			 | 
		
	
		
			
			| 
				
					18
				
			 | 
			
				
			 | 
			
			
				-img_offset=( '"1048576" "315621376" "419430400" "553648128"' 
			 | 
		
	
		
			
			| 
				
					19
				
			 | 
			
				
			 | 
			
			
				-             '"1048576" "315621376" "419430400" "553648128"' );	# offset for switch section media kvm 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					9
				
			 | 
			
			
				+path_kvm=(	"/kvm/w2kbuh" 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					10
				
			 | 
			
			
				+	        "/kvm/w2ktbo" );			# path kvm machines 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					11
				
			 | 
			
			
				+path_bak=(	"/arhive/backup/kvm/w2kbuh"  
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					12
				
			 | 
			
			
				+		"/arhive/backup/kvm/w2ktbo"  );		# path backup kvm machines 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					13
				
			 | 
			
			
				+img_dev=(	"sda.img" 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					14
				
			 | 
			
			
				+		"sda.img" );				# storage kvm 
			 | 
		
	
		
			
			| 
				
					20
				
			 | 
			
				
					15
				
			 | 
			
			
				 #</manual_parameters> 
			 | 
		
	
		
			
			| 
				
					21
				
			 | 
			
				
					16
				
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
					22
				
			 | 
			
				
					17
				
			 | 
			
			
				 #<script_value> 
			 | 
		
	
		
			
			| 
				
					23
				
			 | 
			
				
					18
				
			 | 
			
			
				 version="4.0.10"; 
			 | 
		
	
		
			
			| 
				
					24
				
			 | 
			
				
			 | 
			
			
				-owner="(c) script by Koshuba V.O. 2018"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					19
				
			 | 
			
			
				+owner="(c) script by Koshuba V.O. 2021"; 
			 | 
		
	
		
			
			| 
				
					25
				
			 | 
			
				
					20
				
			 | 
			
			
				 msg_dat=( '"Script to save or restore the image KVM" "Скрипт сохранения или восстановления образа KVM"' 
			 | 
		
	
		
			
			| 
				
					26
				
			 | 
			
				
					21
				
			 | 
			
			
				           '"MAIN MENU" "ГЛАВНОЕ МЕНЮ"' 
			 | 
		
	
		
			
			| 
				
					27
				
			 | 
			
				
					22
				
			 | 
			
			
				           '"RESTORE KVM MACHINE" "ВОССТАНОВЛЕНИЕ ГОСТЕВОЙ МАШИНЫ KVM"' 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -40,7 +35,7 @@ msg_dat=( '"Script to save or restore the image KVM" "Скрипт сохран 
			 | 
		
	
		
			
			| 
				
					40
				
			 | 
			
				
					35
				
			 | 
			
			
				           '"Starting kvm-snapshot script." "Запуск скрипта kvm-snapshot."' 
			 | 
		
	
		
			
			| 
				
					41
				
			 | 
			
				
					36
				
			 | 
			
			
				           '"Ending work kvm-snapshot script." "Окончание работы скрипта kvm-snapshot."' 
			 | 
		
	
		
			
			| 
				
					42
				
			 | 
			
				
					37
				
			 | 
			
			
				           '"Not found save images!" "Не найдены сохраненные образы!"' 
			 | 
		
	
		
			
			| 
				
					43
				
			 | 
			
				
			 | 
			
			
				-          '"The installed type was not found from the parameters for image processing - dd,ntfsclone,mrsrv!" "Не найден установленный тип из параметров для обработки образа - dd,ntfsclone,mrsrv!"' ); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					38
				
			 | 
			
			
				+	 ); 
			 | 
		
	
		
			
			| 
				
					44
				
			 | 
			
				
					39
				
			 | 
			
			
				 	  # msg[17] 
			 | 
		
	
		
			
			| 
				
					45
				
			 | 
			
				
					40
				
			 | 
			
			
				 msg=();											# set current messages 
			 | 
		
	
		
			
			| 
				
					46
				
			 | 
			
				
					41
				
			 | 
			
			
				 esc_title="";										# title escape menu 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -76,7 +71,7 @@ operation_exit=( "clear" "endproc" "exit" ); 
			 | 
		
	
		
			
			| 
				
					76
				
			 | 
			
				
					71
				
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
					77
				
			 | 
			
				
					72
				
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
					78
				
			 | 
			
				
					73
				
			 | 
			
			
				 #<tools_script> 
			 | 
		
	
		
			
			| 
				
					79
				
			 | 
			
				
			 | 
			
			
				-get_tools=( "ntfsclone" "pigz" "locale" "du" "ntfsfix" "gunzip" );           # tools for script 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					74
				
			 | 
			
			
				+get_tools=( "pigz" "locale" "du" "gunzip" "dd" );           # tools for script 
			 | 
		
	
		
			
			| 
				
					80
				
			 | 
			
				
					75
				
			 | 
			
			
				 #</tools_script> 
			 | 
		
	
		
			
			| 
				
					81
				
			 | 
			
				
					76
				
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
					82
				
			 | 
			
				
					77
				
			 | 
			
			
				  
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -364,10 +359,6 @@ function saveKvm() { 
			 | 
		
	
		
			
			| 
				
					364
				
			 | 
			
				
					359
				
			 | 
			
			
				 local save_kvm="${path_kvm[$set_kvm]}"; 
			 | 
		
	
		
			
			| 
				
					365
				
			 | 
			
				
					360
				
			 | 
			
			
				 local save_bak="${path_bak[$set_kvm]}/$rdate"; 
			 | 
		
	
		
			
			| 
				
					366
				
			 | 
			
				
					361
				
			 | 
			
			
				 local save_img="${img_dev[$set_kvm]}"; 
			 | 
		
	
		
			
			| 
				
					367
				
			 | 
			
				
			 | 
			
			
				-eval local save_type="(" $(echo -e ${img_type[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
					368
				
			 | 
			
				
			 | 
			
			
				-eval local save_size="(" $(echo -e ${img_size[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
					369
				
			 | 
			
				
			 | 
			
			
				-eval local save_dev="(" $(echo -e ${img_part[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
					370
				
			 | 
			
				
			 | 
			
			
				-eval local save_offset="(" "$(echo -e ${img_offset[$set_kvm]})" ")"; 
			 | 
		
	
		
			
			| 
				
					371
				
			 | 
			
				
					362
				
			 | 
			
			
				 local set_loop_main="$(losetup -f|grep -v loop-control|sed 's/\/\dev\///g')"; 
			 | 
		
	
		
			
			| 
				
					372
				
			 | 
			
				
					363
				
			 | 
			
			
				 losetup /dev/$set_loop_main $save_kvm/$save_img; 
			 | 
		
	
		
			
			| 
				
					373
				
			 | 
			
				
					364
				
			 | 
			
			
				  
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -378,34 +369,7 @@ fi 
			 | 
		
	
		
			
			| 
				
					378
				
			 | 
			
				
					369
				
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
					379
				
			 | 
			
				
					370
				
			 | 
			
			
				 sfdisk -d /dev/$set_loop_main >$save_bak/info_sfdisk.txt; 
			 | 
		
	
		
			
			| 
				
					380
				
			 | 
			
				
					371
				
			 | 
			
			
				 sfdisk -l /dev/$set_loop_main >$save_bak/info_disk.txt; 
			 | 
		
	
		
			
			| 
				
					381
				
			 | 
			
				
			 | 
			
			
				-dd if=/dev/$set_loop_main of=$save_bak/winboot.img bs=512 count=1; 
			 | 
		
	
		
			
			| 
				
					382
				
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				
					383
				
			 | 
			
				
			 | 
			
			
				-for ((iskvm=0; iskvm != ${#save_dev[@]}; iskvm++)) 
			 | 
		
	
		
			
			| 
				
					384
				
			 | 
			
				
			 | 
			
			
				- do 
			 | 
		
	
		
			
			| 
				
					385
				
			 | 
			
				
			 | 
			
			
				-    local set_loop_dev="$(losetup -f|grep -v loop-control|sed 's/\/\dev\///g')"; 
			 | 
		
	
		
			
			| 
				
					386
				
			 | 
			
				
			 | 
			
			
				-    losetup -o ${save_offset[$iskvm]} /dev/$set_loop_dev /dev/$set_loop_main; 
			 | 
		
	
		
			
			| 
				
					387
				
			 | 
			
				
			 | 
			
			
				-    if [ "${save_type[$iskvm]}" == "ntfsclone" ]; 
			 | 
		
	
		
			
			| 
				
					388
				
			 | 
			
				
			 | 
			
			
				-	    then 
			 | 
		
	
		
			
			| 
				
					389
				
			 | 
			
				
			 | 
			
			
				-	    ntfsclone --save-image -o - /dev/$set_loop_dev| pigz -p2 -c9>$save_bak/${save_dev[$iskvm]}_ntfs.img.gz; 
			 | 
		
	
		
			
			| 
				
					390
				
			 | 
			
				
			 | 
			
			
				-	fi 
			 | 
		
	
		
			
			| 
				
					391
				
			 | 
			
				
			 | 
			
			
				-	if [ "${save_type[$iskvm]}" == "dd" ]; 
			 | 
		
	
		
			
			| 
				
					392
				
			 | 
			
				
			 | 
			
			
				-	    then 
			 | 
		
	
		
			
			| 
				
					393
				
			 | 
			
				
			 | 
			
			
				-		if [ "${save_size[$iskvm]}" != "" ]; 
			 | 
		
	
		
			
			| 
				
					394
				
			 | 
			
				
			 | 
			
			
				-		    then 
			 | 
		
	
		
			
			| 
				
					395
				
			 | 
			
				
			 | 
			
			
				-		    dd if=/dev/$set_loop_dev status=progress bs=${save_size[$iskvm]}M count=1|pigz -p4 -M -c9>$save_bak/${save_dev[$iskvm]}_dd.img.gz; 
			 | 
		
	
		
			
			| 
				
					396
				
			 | 
			
				
			 | 
			
			
				-		    else 
			 | 
		
	
		
			
			| 
				
					397
				
			 | 
			
				
			 | 
			
			
				-		    dd if=/dev/$set_loop_dev status=progress|pigz -p4 -M -c9>$save_bak/${save_dev[$iskvm]}_dd.img.gz; 
			 | 
		
	
		
			
			| 
				
					398
				
			 | 
			
				
			 | 
			
			
				-		fi 
			 | 
		
	
		
			
			| 
				
					399
				
			 | 
			
				
			 | 
			
			
				-	     
			 | 
		
	
		
			
			| 
				
					400
				
			 | 
			
				
			 | 
			
			
				-	fi 
			 | 
		
	
		
			
			| 
				
					401
				
			 | 
			
				
			 | 
			
			
				-	if [ "${save_type[$iskvm]}" != "ntfsclone" ] && [ "${save_type[$iskvm]}" != "dd" ] && [ "${save_type[$iskvm]}" != "mrsrv" ]; 
			 | 
		
	
		
			
			| 
				
					402
				
			 | 
			
				
			 | 
			
			
				-	    then 
			 | 
		
	
		
			
			| 
				
					403
				
			 | 
			
				
			 | 
			
			
				-		echo "[$save_bak/${save_dev[$irkvm]}_dd.img.gz]\n ${msg[18]} - >> /var/log/syslog"; 
			 | 
		
	
		
			
			| 
				
					404
				
			 | 
			
				
			 | 
			
			
				-		echo "$(date) - kvm-snapshot: [$save_bak/${save_dev[$irkvm]}_dd.img.gz] \n ${msg[18]}" >> /var/log/syslog; 
			 | 
		
	
		
			
			| 
				
					405
				
			 | 
			
				
			 | 
			
			
				-	fi 
			 | 
		
	
		
			
			| 
				
					406
				
			 | 
			
				
			 | 
			
			
				-     
			 | 
		
	
		
			
			| 
				
					407
				
			 | 
			
				
			 | 
			
			
				-    losetup -d /dev/$set_loop_dev; 
			 | 
		
	
		
			
			| 
				
					408
				
			 | 
			
				
			 | 
			
			
				-done 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					372
				
			 | 
			
			
				+dd if=/dev/$set_loop_main status=progress |pigz -p4 -M -c9>$save_bak/$save_img-dd.img.gz; 
			 | 
		
	
		
			
			| 
				
					409
				
			 | 
			
				
					373
				
			 | 
			
			
				 losetup -d /dev/$set_loop_main; 
			 | 
		
	
		
			
			| 
				
					410
				
			 | 
			
				
					374
				
			 | 
			
			
				 } 
			 | 
		
	
		
			
			| 
				
					411
				
			 | 
			
				
					375
				
			 | 
			
			
				  
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -413,38 +377,9 @@ function restoreKvm() { 
			 | 
		
	
		
			
			| 
				
					413
				
			 | 
			
				
					377
				
			 | 
			
			
				 local rest_kvm="${path_kvm[$set_kvm]}"; 
			 | 
		
	
		
			
			| 
				
					414
				
			 | 
			
				
					378
				
			 | 
			
			
				 local rest_bak="${path_bak[$set_kvm]}/$set_img"; 
			 | 
		
	
		
			
			| 
				
					415
				
			 | 
			
				
					379
				
			 | 
			
			
				 local rest_img="${img_dev[$set_kvm]}"; 
			 | 
		
	
		
			
			| 
				
					416
				
			 | 
			
				
			 | 
			
			
				-eval local rest_type="(" $(echo -e ${img_type[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
					417
				
			 | 
			
				
			 | 
			
			
				-eval local rest_size="(" $(echo -e ${img_size[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
					418
				
			 | 
			
				
			 | 
			
			
				-eval local rest_dev="(" $(echo -e ${img_part[$set_kvm]}) ")"; 
			 | 
		
	
		
			
			| 
				
					419
				
			 | 
			
				
			 | 
			
			
				-eval local rest_offset="(" "$(echo -e ${img_offset[$set_kvm]})" ")"; 
			 | 
		
	
		
			
			| 
				
					420
				
			 | 
			
				
					380
				
			 | 
			
			
				 local set_loop_rmain="$(losetup -f|grep -v loop-control|sed 's/\/\dev\///g')"; 
			 | 
		
	
		
			
			| 
				
					421
				
			 | 
			
				
					381
				
			 | 
			
			
				 losetup /dev/$set_loop_rmain $rest_kvm/$rest_img; 
			 | 
		
	
		
			
			| 
				
					422
				
			 | 
			
				
			 | 
			
			
				-dd if=$rest_bak/winboot.img of=/dev/$set_loop_rmain bs=512 count=1; 
			 | 
		
	
		
			
			| 
				
					423
				
			 | 
			
				
			 | 
			
			
				-sleep 1 
			 | 
		
	
		
			
			| 
				
					424
				
			 | 
			
				
			 | 
			
			
				-for ((irkvm=0; irkvm != ${#rest_dev[@]}; irkvm++)) 
			 | 
		
	
		
			
			| 
				
					425
				
			 | 
			
				
			 | 
			
			
				- do 
			 | 
		
	
		
			
			| 
				
					426
				
			 | 
			
				
			 | 
			
			
				-    local set_loop_rdev="$(losetup -f|grep -v loop-control|sed 's/\/\dev\///g')"; 
			 | 
		
	
		
			
			| 
				
					427
				
			 | 
			
				
			 | 
			
			
				-    losetup -o ${rest_offset[$irkvm]} /dev/$set_loop_rdev /dev/$set_loop_rmain; 
			 | 
		
	
		
			
			| 
				
					428
				
			 | 
			
				
			 | 
			
			
				-	if [ ${rest_type[$irkvm]} == "ntfsclone" ]; 
			 | 
		
	
		
			
			| 
				
					429
				
			 | 
			
				
			 | 
			
			
				-	    then 
			 | 
		
	
		
			
			| 
				
					430
				
			 | 
			
				
			 | 
			
			
				-	    gunzip -c $rest_bak/${rest_dev[$irkvm]}_ntfs.img.gz|ntfsclone --restore-image -O /dev/$set_loop_rdev -; 
			 | 
		
	
		
			
			| 
				
					431
				
			 | 
			
				
			 | 
			
			
				-	fi 
			 | 
		
	
		
			
			| 
				
					432
				
			 | 
			
				
			 | 
			
			
				-	if [ "${rest_type[$irkvm]}" == "dd" ]; 
			 | 
		
	
		
			
			| 
				
					433
				
			 | 
			
				
			 | 
			
			
				-	    then 
			 | 
		
	
		
			
			| 
				
					434
				
			 | 
			
				
			 | 
			
			
				-		if [ "${rest_size[$irkvm]}" != "" ]; 
			 | 
		
	
		
			
			| 
				
					435
				
			 | 
			
				
			 | 
			
			
				-		    then 
			 | 
		
	
		
			
			| 
				
					436
				
			 | 
			
				
			 | 
			
			
				-		    pigz -p4 -c -d -M $rest_bak/${rest_dev[$irkvm]}_dd.img.gz|dd of=/dev/$set_loop_rdev status=progress bs=${rest_size[$irkvm]}M count=1; 
			 | 
		
	
		
			
			| 
				
					437
				
			 | 
			
				
			 | 
			
			
				-		    else 
			 | 
		
	
		
			
			| 
				
					438
				
			 | 
			
				
			 | 
			
			
				-		    pigz -p4 -c -d -M $rest_bak/${rest_dev[$irkvm]}_dd.img.gz|dd of=/dev/$set_loop_rdev status=progress; 
			 | 
		
	
		
			
			| 
				
					439
				
			 | 
			
				
			 | 
			
			
				-		fi 
			 | 
		
	
		
			
			| 
				
					440
				
			 | 
			
				
			 | 
			
			
				-	fi 
			 | 
		
	
		
			
			| 
				
					441
				
			 | 
			
				
			 | 
			
			
				-	if [ "${rest_type[$irkvm]}" != "ntfsclone" ] && [ "${rest_type[$irkvm]}" != "dd" ]; 
			 | 
		
	
		
			
			| 
				
					442
				
			 | 
			
				
			 | 
			
			
				-	    then 
			 | 
		
	
		
			
			| 
				
					443
				
			 | 
			
				
			 | 
			
			
				-		echo "[$rest_bak/${rest_dev[$irkvm]}_dd.img.gz]\n ${msg[18]} - >> /var/log/syslog"; 
			 | 
		
	
		
			
			| 
				
					444
				
			 | 
			
				
			 | 
			
			
				-		echo "$(date) - kvm-snapshot: [$rest_bak/${rest_dev[$irkvm]}_dd.img.gz] \n ${msg[18]}" >> /var/log/syslog; 
			 | 
		
	
		
			
			| 
				
					445
				
			 | 
			
				
			 | 
			
			
				-	fi 
			 | 
		
	
		
			
			| 
				
					446
				
			 | 
			
				
			 | 
			
			
				-    losetup -d /dev/$set_loop_rdev; 
			 | 
		
	
		
			
			| 
				
					447
				
			 | 
			
				
			 | 
			
			
				-done 
			 | 
		
	
		
			
			| 
				
			 | 
			
				
					382
				
			 | 
			
			
				+pigz -p4 -c -d -M $rest_bak/${rest_dev[$irkvm]}_dd.img.gz|dd of=/dev/$set_loop_rdev status=progress; 
			 | 
		
	
		
			
			| 
				
					448
				
			 | 
			
				
					383
				
			 | 
			
			
				 losetup -d /dev/$set_loop_rmain; 
			 | 
		
	
		
			
			| 
				
					449
				
			 | 
			
				
					384
				
			 | 
			
			
				 } 
			 | 
		
	
		
			
			| 
				
					450
				
			 | 
			
				
					385
				
			 | 
			
			
				  
			 |