Здесь размещено описание одного из функциональных блоков инструкции с примером управления виртуальными машинами "Qemu-KVM" через простейшие BASH-скрипты. Отдельно неприменимо.
Фрагмент кода с функциями формирования строки инициализации и запуска виртуальной машины как таковой:
# vi /etc/kvm/fnc.d/7.run.fnc
#!/bin/bash
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell)
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell)
# Функция непосредственного запуска виртуальной машины
function start-run() {
# Если скрипт исполняет суперпользователь, то задаём перевод запускаемой машины во владение пользователя, специально созданного для работы с виртуальными машинами
if [ "`id --user`" == "0" ]; then
RUNUS="-runas ${USER}"
else
RUNUS=""
fi
# Запускаем виртуальную машину
echo "${DATE}: Starting virtual machine ${NAME} ..." | tee -a "${LOGT}"
/usr/bin/kvm -name ${NAME} -daemonize -enable-kvm ${RUNUS} \
${PSTRING} \
${DSTRING} \
${NSTRING} \
${MSTRING}
# Если скрипт исполняет суперпользователь, то задаём перевод ресурсов запускаемой машины во владение пользователя и группы, специально созданных для работы с виртуальными машинами. В противном случае, если скрипт исполняется от рядового пользователя группы KVM, просто расширяем права доступа в рамках группы KVM
if [ "`id --user`" == "0" ]; then
chown -R ${USER}:${GROUP} /tmp/kvm
chmod -R ug+rw /tmp/kvm
chmod -R o-rwx /tmp/kvm
else
# Права доступа к PID-файлам на уровне взаимодействия приложения и системы автоматически ограничиваются до "go-rwx". Применение "umask" эффекта не даёт. Компенсируем точечно, постфактум добавляя групповые разрешения
chmod -R ug+rw ${MPID}
fi
# Проверяем успешность запуска виртуальной машины (ждём десять секунд)
for I in {1..10}
do
STATE=`ps wax | grep --invert-match grep | grep --ignore-case --count --extended-regexp "kvm[ ]+\-name[ ]+${NAME}[ ]+"`
if [ ${STATE} -ne 0 ]; then
# Увеличиваем на единицу счётчик успешно запущенных виртуальных машин
let "RUNNING = RUNNING + 1"
echo "${DATE}: The virtual machine is running successfully." | tee -a "${LOGT}"
return 0
fi
# Ждём некоторое время
echo " Wait ${I} seconds for running VM..."
sleep 1
done
# Учитывая то, что в течении заданного времени успешного запуска виртуальной машины не зафиксировано - объявляем о неудаче
echo "${DATE}: Виртуальная машина не была успешно запущена." | tee -a "${LOGT}"
return 1
return 0
}
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell)
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell)
# Функция непосредственного запуска виртуальной машины
function start-run() {
# Если скрипт исполняет суперпользователь, то задаём перевод запускаемой машины во владение пользователя, специально созданного для работы с виртуальными машинами
if [ "`id --user`" == "0" ]; then
RUNUS="-runas ${USER}"
else
RUNUS=""
fi
# Запускаем виртуальную машину
echo "${DATE}: Starting virtual machine ${NAME} ..." | tee -a "${LOGT}"
/usr/bin/kvm -name ${NAME} -daemonize -enable-kvm ${RUNUS} \
${PSTRING} \
${DSTRING} \
${NSTRING} \
${MSTRING}
# Если скрипт исполняет суперпользователь, то задаём перевод ресурсов запускаемой машины во владение пользователя и группы, специально созданных для работы с виртуальными машинами. В противном случае, если скрипт исполняется от рядового пользователя группы KVM, просто расширяем права доступа в рамках группы KVM
if [ "`id --user`" == "0" ]; then
chown -R ${USER}:${GROUP} /tmp/kvm
chmod -R ug+rw /tmp/kvm
chmod -R o-rwx /tmp/kvm
else
# Права доступа к PID-файлам на уровне взаимодействия приложения и системы автоматически ограничиваются до "go-rwx". Применение "umask" эффекта не даёт. Компенсируем точечно, постфактум добавляя групповые разрешения
chmod -R ug+rw ${MPID}
fi
# Проверяем успешность запуска виртуальной машины (ждём десять секунд)
for I in {1..10}
do
STATE=`ps wax | grep --invert-match grep | grep --ignore-case --count --extended-regexp "kvm[ ]+\-name[ ]+${NAME}[ ]+"`
if [ ${STATE} -ne 0 ]; then
# Увеличиваем на единицу счётчик успешно запущенных виртуальных машин
let "RUNNING = RUNNING + 1"
echo "${DATE}: The virtual machine is running successfully." | tee -a "${LOGT}"
return 0
fi
# Ждём некоторое время
echo " Wait ${I} seconds for running VM..."
sleep 1
done
# Учитывая то, что в течении заданного времени успешного запуска виртуальной машины не зафиксировано - объявляем о неудаче
echo "${DATE}: Виртуальная машина не была успешно запущена." | tee -a "${LOGT}"
return 1
return 0
}