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