-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlibvirt-bin.conf
More file actions
146 lines (127 loc) · 3.48 KB
/
libvirt-bin.conf
File metadata and controls
146 lines (127 loc) · 3.48 KB
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
description "libvirt daemon"
author "Dustin Kirkland <kirkland@canonical.com>"
start on (runlevel [2345] and stopped networking RESULT=ok)
stop on starting rc RUNLEVEL=[016]
expect daemon
respawn
pre-start script
mkdir -p /var/run/libvirt
# Clean up a pidfile that might be left around
rm -f /var/run/libvirtd.pid
end script
# by default wait up to 30 seconds for vms to shut down
env libvirtd_shutdown_timeout=30
# uris for which to shut down vms
env libvirt_uris='qemu:///system lxc:///'
# domains that should be saved and not shut down
env libvirt_save_domains='euklid'
# savedir for vm states
env libvirt_savepath='/user2/vmstate'
post-start script
check_state()
{
getstate=`$VIRSH domstate $1 2>/dev/null | head -n 1`
if [ "$getstate" = "running" ];
then
return 0
else
return 1
fi
}
log_msg()
{
logf="/var/log/libvirt/startuplog.log"
logger -p daemon.debug -s -t libvirt -- "$@" >> $logf 2>&1
}
start_domain()
{
log_msg "Starting domain $1..."
virsh start $1
}
restore_domain()
{
log_msg "Restoring domain $1..."
virsh restore $libvirt_savepath/$1
}
for domain in $libvirt_save_domains;
do
# Check that a save state file exists, otherwise just start the domain
if [ -f $libvirt_savepath/$domain ];
then
counter=0
# Try 3 times to resume the domain
while [ $counter -lt 3 ]
do
restore_domain $domain
check_state $domain
if [ $? -eq 0 ];
then
counter=3
fi
counter=$((counter+1))
sleep 5
done
rm -f $libvirt_savepath/$domain
fi
# Check if the domain is now running, if not start it from scratch
check_state $domain
if [ $? -eq 1 ];
then
echo "Could not restore domain $domain, starting instead..."
start_domain $domain
fi
done
end script
pre-stop script
log_msg()
{
logf="/var/log/libvirt/shutdownlog.log"
logger -p daemon.debug -s -t libvirt -- "$@" >> $logf 2>&1
}
run_virsh()
{
# We parse the output for things like domain state;
# make sure the output is in the language we expect.
LANG=C virsh "$@"
}
if [ -z "$RUNLEVEL" ]; then
exit 0
fi
if [ "$RUNLEVEL" -ne 0 ] && [ "$RUNLEVEL" -ne 1 ] && [ "$RUNLEVEL" -ne 6 ]; then
exit 0
fi
log_msg "libvirt-bin: entering pre-stop at $(date)"
for domain in $libvirt_save_domains; do
log_msg "libvirt-bin: Saving domain $domain..."
run_virsh save $domain $libvirt_savepath/$domain 2>/dev/null
done
for uri in $libvirt_uris; do
for domain in $(run_virsh -c "$uri" list | awk '$3 == "running" {print $2}'); do
log_msg "libvirt-bin: attempting clean shutdown of $domain at $(date)"
run_virsh -c "$uri" shutdown "$domain" >/dev/null
done
done
delay=$libvirtd_shutdown_timeout
while [ $delay -gt 0 ]; do
for uri in $libvirt_uris; do
if ! run_virsh -c "$uri" list | awk '$3 == "running" {exit 1}'; then
# VMs at this URI are still running. Wait, then
# start at the beginning looking for running VMs.
sleep 1
delay=$(($delay - 1))
continue 2
fi
done
break
done
for uri in $libvirt_uris; do
for domain in $(run_virsh -c "$uri" list | awk '$3 == "running" {print $2}'); do
log_msg "destroying $domain"
run_virsh -c "$uri" destroy "$domain" >/dev/null
done
done
log_msg "libvirt-bin: exiting pre-stop at $(date)"
end script
# If you used to set $libvirtd_opts in /etc/default/libvirt-bin,
# change the 'exec' line here instead.
exec /usr/sbin/libvirtd -d