|
@@ -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
|
|