VM Backup Shell Skript aendern
Hallo Leute,
das u.g. Skript funktioniert eigentlich wunderbar um eine VM von HOST1 auf HOST2 zu sichern, inkl. Log etc sowie Speicherplatzcheck....
...dabei hat mir ein CommunityMitglied geholfen. Nun mäöchte ich aber das Skript so ändern:
- Es soll nicht nur eine VM auf dem Quellhost gesichert werden sondern mehrere
- Es soll nicht mehr eine Platte gemountet werden sondern ein Share verwendet werden den der Rechner bereits in Zugriff hat /share/IT/backup
An welchen Stellen ändere ich das nun?
1. Anstatt USB="/mnt/cdrom" --> PLATTE="/share/IT/backup" und dann überall wo USB steht im Code PLATTE hinzufügen?
2. Wie kann ich denn mehrere VM´s sichern? bzw. alle VM´s die unter /data1/vm/ abgelegt sind? Dort gibt es vm01, vm02, vm03 usw.
--> VM1 heisst bei mir immer gleich: w7x64.vmx
--> VM_Ordner1 heisst dann vm01 oder vm02 oder vm03 etc.
das u.g. Skript funktioniert eigentlich wunderbar um eine VM von HOST1 auf HOST2 zu sichern, inkl. Log etc sowie Speicherplatzcheck....
...dabei hat mir ein CommunityMitglied geholfen. Nun mäöchte ich aber das Skript so ändern:
- Es soll nicht nur eine VM auf dem Quellhost gesichert werden sondern mehrere
- Es soll nicht mehr eine Platte gemountet werden sondern ein Share verwendet werden den der Rechner bereits in Zugriff hat /share/IT/backup
An welchen Stellen ändere ich das nun?
1. Anstatt USB="/mnt/cdrom" --> PLATTE="/share/IT/backup" und dann überall wo USB steht im Code PLATTE hinzufügen?
2. Wie kann ich denn mehrere VM´s sichern? bzw. alle VM´s die unter /data1/vm/ abgelegt sind? Dort gibt es vm01, vm02, vm03 usw.
--> VM1 heisst bei mir immer gleich: w7x64.vmx
--> VM_Ordner1 heisst dann vm01 oder vm02 oder vm03 etc.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#!/bin/bash
# Ab hier alle Einstellungen überprüfen und ggf. anpassen!!
# ---------------------------------------------------------
VM_ORDNER1="vm01" #In welchem Ordner liegt die VM
VM_BACKUP1="/data2/vm/vm01" #Der komplette Pfad zum VM Ordner
VM_1="w7x64.vmx" #Name der VM
BACKUPORDNER="backup" #Name des Backup-Ordners, wird angelegt falls nicht vorhanden.
LOGZIEL="/data1/vm_backup_logs" #Pfad zu den Logs, muss vorhanden sein.
USER="xxx" #Administrator für VMware Server 2
PW="xxx" #PW für Administrator VMware Server 2
IP="https://127.0.0.1/sdk" #Nur in AUSNAHMEFÄLLEN ändern. (Bei Standartinstallationen kann dies so bleiben)
USB="/mnt/cdrom" #Mountpoint
CLEAN=0 #Alte Backups im Ordner "BACKUPORDNER" bei Platzmangel löschen? 1=ja, 0=nein
# ---------------------------------------------------------
# AB HIER NICHTS MEHR ÄNDERN
# ---------------------------------------------------------
DATUM="$(date +%d-%m-%Y)"
LOG="${LOGZIEL}/${DATUM}.log"
LOG_ERR="${LOGZIEL}/${DATUM}_err.log"
ZIEL=""
MOUNTED=0
DEVICE=""
#mail_err ()
#{
# echo | mail -s "${DATUM}, $(date +%H:%M) Backup-Fehler" $MAIL < $LOG_ERR
#}
#
#mail_final ()
#{
# echo | mail -s "${DATUM}, $(date +%H:%M) Backup-Erfolg" $MAIL <$LOG
#}
#USB-Platten werden gemountet
for i in $(seq 1 $PLATTEN); do
if [ $MOUNTED = 0 ]; then
echo "Datum: "$DATUM >> $LOG
echo "Zeit: "$(date +%H:%M) >> $LOG
# echo | mount $USB$DEVICE -o force 1>> $LOG 2>> $LOG_ERR
echo | mount SERVERFORBACKUP:/data2/vm/ /mnt/cdrom/
if [ $? = 0 ]; then
ZIEL=$USB"/"$BACKUPORDNER
MOUNTED=1
echo "${USB}${DEVICE} gemountet." >>$LOG
else
DEVICE=$(( $DEVICE + 1 ))
fi
fi
done
#Wenn keine der Platten eingebunden werden kann: EXIT mit Error-Mail
if [ $MOUNTED = 0 ]; then
echo "Keine Speichermedien gefunden. Backup wurde abgebrochen!" >>$LOG_ERR
mail_err
exit
fi
#Wenn nicht vorhanden wird Backup-Ordner erstellt.
if ! [ -d $ZIEL ]; then
echo "Erstelle Ziel-Ordner (${ZIEL})." >>$LOG
echo | mkdir $ZIEL 1>> $LOG 2>> $LOG_ERR
if ! [ $? = 0 ]; then
echo "Ordner $ZIEL konnte nicht erstellt werden. Backup wird abgebrochen." >>$LOG
mail_err
exit
else
echo "Ordner ${ZIEL} wurde erstellt." >> $LOG
fi
else
echo "Ordner (${ZIEL}) bereits vorhanden." >> $LOG
fi
#Speicherplatzabfrage.
#Wenn CLEAN auf 1 gesetzt, wird bei zu geringem Speicherplatz der Backupordner gelöscht.
#Backup-Rotation in Planung....
S="/"
MB=0
MENGEQ=" GB"
MENGEZ=" GB"
MENGED=" GB"
LIMIT=1
LAUF=2
END=0
echo 1
for i in $(seq 1 $LAUF); do
if [ $END = 0 ]; then
QUELLE=$(du -s $S$VM_BACKUP1 | tr -s " " | cut -d "/" -f 1)
ZIEL1=$(df $S$ZIEL | tr -s " " | cut -d " " -f 4 | grep -v "Avai")
QUELLEERG=$(( $QUELLE / 1048576 ))
if [ $QUELLEERG -lt $LIMIT ]; then
QUELLEERG=$(( $QUELLE / 1024 ))
MB=1
MENGEQ=" MB"
fi
ZIELERG=$(( $ZIEL1 / 1048576 ))
if [ $MB = 1 ]; then
ZIELERG=$(( $ZIEL1 / 1024 ))
MENGEZ=" MB"
MENGED=" MB"
fi
DIFFERENZ=$(( $ZIELERG - $QUELLEERG ))
PROZENT=$(( $DIFFERENZ * 100 / $ZIELERG ))
NUTZ=$(( 100 - $PROZENT ))
if [ $ZIELERG -lt $QUELLEERG ]; then
if [ $CLEAN = 1 ]; then
echo "Größe VM........................: "$QUELLEERG$MENGEQ >> $LOG
echo "Verfügbarer Speicherplatz.......: "$ZIELERG$MENGEZ >> $LOG
echo "Freier Speicherplatz nach Backup: "$DIFFERENZ$MENGED >> $LOG
echo "Platzbedarf in %................: "$NUTZ" %" >> $LOG
echo " " >> $LOG
echo "Speicherplatz nicht ausreichend. Ordner ${ZIEL} wird geleert." >> $LOG
echo "...." >> $LOG
echo | touch $ZIEL/test.file 1>> $LOG 2>> $LOG_ERR
echo | rm -r $ZIEL/* 1>> $LOG 2>> $LOG_ERR
else
echo "Größe VM........................: "$QUELLEERG$MENGEQ >> $LOG_ERR
echo "Verfügbarer Speicherplatz.......: "$ZIELERG$MENGEZ >> $LOG_ERR
echo "Freier Speicherplatz nach Backup: "$DIFFERENZ$MENGED >> $LOG_ERR
echo "Platzbedarf in %................: "$NUTZ" %" >> $LOG_ERR
echo " " >> $LOG_ERR
echo "Speicherplatz nicht ausreichend. Backup-Vorgang wird abgebrochen." >> $LOG_ERR
mail_err
exit
fi
else
END=1
echo "Größe VM........................: "$QUELLEERG$MENGEQ >> $LOG
echo "Verfügbarer Speicherplatz.......: "$ZIELERG$MENGEZ >> $LOG
echo "Freier Speicherplatz nach Backup: "$DIFFERENZ$MENGED >> $LOG
echo "Platzbedarf in %................: "$NUTZ" %" >> $LOG
echo " " >> $LOG
echo "Speicherplatz ausreichend. Backup wird gestartet." >> $LOG
fi
fi
done
# VMs in den Suspend setzen und Erfolg abfragen
# 0 = i.O.
# 255 = Fehler
echo | vmrun -T server -h $IP -u $USER -p $PW suspend "[ha-datacenter/standard] $VM_ORDNER1/$VM_1" 1>>$LOG 2>>$LOG_ERR
if [ $? = 255 ]; then
echo "ACHTUNG: Die Virtuelle Maschine ($VM_ORDNER1/$VM_1) konnte nicht in den Suspend Modus versetzt werden." >>$LOG_ERR
echo "Backup wurde abgebrochen" >>$LOG_ERR
umount $USB$DEVICE >> $LOG_ERR
mail_err
exit
else
echo "$(date +%H:%M): Virtuelle Maschine ($VM_1) wurde erfolgreich in den Suspend-Mode versetzt" >>$LOG
fi
#Verzeichnis für neues Backup erstellen falls noch nicht vorhanden
if ! [ -d $ZIEL/$DATUM ]; then
echo | mkdir $ZIEL/$DATUM >> $LOG
fi
#Jetzt kann tar loslegen
cd /
echo | tar -czvf $ZIEL/$DATUM/$DATUM.tar.gz $VM_BACKUP1 1>>$LOG 2>>$LOG
#Auf Fehler während tar prüfen:
# 0 = fehlerfrei,
echo "Errorlevel TAR: "$? >> $LOG
if [ $? != 0 ] ; then
echo "ACHTUNG: Beim Backup (tar) von (${VM_BACKUP1}) wurden am ${DATUM} um $(date +%H:%M) Uhr Fehler/Meldungen ausgegeben!" >>$LOG
echo "Das erstellte Archiv befinden sich in ${ZIEL}/${DATUM}/${DATUM}.tar.gz" >>$LOG
umount $USB$DEVICE >> $LOG
echo | vmrun -T server -h $IP -u $USER -p $PW start "[standard] $VM_ORDNER1/$VM_1" 1>>$LOG 2>>$LOG_ERR
# Prüfen ob VM gestartet werden konnte
if [ $? = 255 ]; then
echo "ACHTUNG: Die Virtuelle Maschine ($VM_ORDNER1/$VM_1) konnte nicht gestartet werden." >>$LOG_ERR
mail_err
else
echo "$(date +%d-%m-%Y): Virtuelle Maschine ($VM_1) wurde erfolgreich gestartet" >>$LOG
fi
mail_final
exit
else
echo | vmrun -T server -h $IP -u $USER -p $PW start "[standard] $VM_ORDNER1/$VM_1" 1>>$LOG 2>>$LOG_ERR
#Prüfen ob VM gestartet werden konnte
if [ $? = 255 ]; then
echo "ACHTUNG: Die Virtuelle Maschine ($VM_ORDNER1/$VM_1) konnte nicht gestartet werden." >>$LOG_ERR
mail_err
else
echo "-------------------------------------------------------------------" >>$LOG
echo "$(date +%H:%M): Virtuelle Maschine ($VM_1) wurde erfolgreich gestartet" >>$LOG
fi
#Backup war erfolgreich also beenden wir die .log entsprechend und verschicken die Mail
echo "------------------------------------------------------------ " >> $LOG
echo "Das Backup von ${VM_1} wurde am ${DATUM} um $(date +%H:%M) Uhr erfolgreich beendet und in ${ZIEL}/${DATUM}/${DATUM}.tar.gz gespeichert." >> $LOG
umount $USB$DEVICE 1>>$LOG 2>>$LOG_ERR
mail_final
fi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 203795
Url: https://administrator.de/forum/vm-backup-shell-skript-aendern-203795.html
Ausgedruckt am: 10.04.2025 um 17:04 Uhr
10 Kommentare
Neuester Kommentar

Hallo,
Du kannst statt eine for-Schleife nehmen
und den Code dann innerhalb der Schleife ausführen.
Kannst Du nichtersetzen durchund dann den Codeblock wo die USB-Platten gemountet werden auskommentieren?
Markus
Du kannst statt
VM_ORDNER1="vm01" #In welchem Ordner liegt die VM
for i in 1 2 3; do VM_ORDNER=vm0$i;
Dein weiterer Code hier
done
Kannst Du nicht
USB=/mnt/cdrom
USB=/share/IT/backup
Markus

Zur Berechnung des Speicherplatzes:
Diese Zeile funktioniert nur dann, wenn $S$VM_BACKUP1 ein absoluter Pfad ist, also mit einem / anfängt. du verwendet als Trenner den Tab \t der aber auch von cut standardmäßig benutzt wird. Also funktioniert auch
Und hier könnte man tail verwenden Außerdem kann man mit der Option -m bei du und df die Ausgabe in MB erhalten und braucht dann nicht mehr umzurechnen.das funktioniert hier, soweit ich das testen kann.
Markus
Diese Zeile
QUELLE=$(du -s $S$VM_BACKUP1 | tr -s " " | cut -d "/" -f 1)
QUELLE=$(du -s $S$VM_BACKUP1 | cut -f 1)
ZIEL1=$(df $S$ZIEL | tr -s " " | cut -d " " -f 4 | grep -v "Avai")
ZIEL1=$(df $S$ZIEL | tr -s " " | cut -d " " -f 4 | tail -1)
QUELLE=$(du -sm $S$VM_BACKUP1 | cut -f 1)
ZIEL1=$(df -m $S$ZIEL | tr -s " " | cut -d " " -f 4 | tail -1)
Markus

In die Zeile mit der for-Schleife gehört entwede ein Semikolon for "do" oder ein Zeilenumbruch. Also oderMarkus
for i in 01 02 03 04 05 06 07 do VM_ORDNER1=w7vm$i;
for i in 01 02 03 04 05 06 07; do VM_ORDNER1=w7vm$i;
for i in 01 02 03 04 05 06 07
do VM_ORDNER1=w7vm$i;

Gib im Terminal ein. Was passiert?
Du musst die einzelnen Zeilen im Terminal ausprobieren um Fehler zu finden.
Markus
ZIEL1=2000000
ZIELERG=$(( $ZIEL1 / 1048576 ))
echo $ZIELERG
Du musst die einzelnen Zeilen im Terminal ausprobieren um Fehler zu finden.
Markus

So, ich hab das mal ausprobiert mit der Berechnung ob der Speicherplatz reicht. Zuverlässig geht es mit bc
Markus
ZIELERG=$(echo $ZIEL1 / 1048576 | bc -l )

Am einfachsten wäre es, wenn Du nur den Teil des Codes posten würdest, der nicht funktioniert. Du musst Dir die Variablen anzeigen lassen, die eigentlich verwendet werden sollen, also "echo" einbauen wo was nicht geht. Das ganze Skript ist so kaum nachvollziehbar.
Markus
Markus