Учимся пользоваться QEMU


Начал потихоньку виртуалки с VmWare переносить на новое железо с FreeBSD под QEMU.

Возникли следующие задачи:


 

Управление виртальными машинами QEMU по сети

Этот пункт решается очень просто, управление происходит по протоколу VNC.
В запуск qemu добавляем ключик

-vnc 192.168.0.1:5
где
192.168.0.1 - ip-адрес на котором будет висеть VNC, 
5 - порт на котором будет висеть VNC
соответственно подключаемся мы как-то так
vncviewer.exe 192.168.7.4:5905

Если хочется чтобы было защищено паролем, то добавляем ключик

 -vnc 192.168.0.1:5,password

После чего нужно сделать, чтобы мы могли добраться до монитора. Как с ним работается долго искал, но в итоге вроде разобрался.

Монитор переадресуем на сокет с помощью ключика
-monitor unix:/tmp/qemu.vm_name,server,nowait

После чего через монитор требуется установить пароль
echo change vnc password vnc_passwd | /usr/bin/nc -U /tmp/qemu.vm_name

После данных манипуляций, при попытки подключиться с помощью vnc-клиента, будет запрашиваться пароль на виртуальную машину.


 

Запуск и остановка всех виртуальных машин QEMU при старте системы

Были нарисованы два скриптика. Конечно очень кривые, но свою работу вполне выполняют. Если будут силы, потом перепишу.

# cat /usr/local/etc/rc.d/virtual_pc.sh

#!/bin/sh

. /etc/rc.subr

name="virtual_pc"
rcvar=${name}_enable

load_rc_config $name

: ${virtual_pc_enable="NO"}

start_cmd=virtual_pc_start
stop_cmd=virtual_pc_stop
vm_start="/usr/data/VirtualPC/vm.sh"
vm_passwd="passwd"

virtual_pc_start()
{
        # name hda mem vnc_if vm_number
        echo Starting Virtual PC
        ${vm_start} first_VM /usr/data/VirtualPC/first_VM.vmdk 256 ${virtual_pc_vnc_if} 1 ${vm_passwd}
        ${vm_start} second_VM /usr/data/VirtualPC/second_VM.vmdk 256 ${virtual_pc_vnc_if} 2 ${vm_passwd}
}

virtual_pc_stop()
{
        echo Stoping Virtual PC
        ${vm_start} first_VM stop
        ${vm_start} second_VM stop
}

# cat /usr/data/VirtualPC/vm.sh

#!/bin/sh

. /etc/rc.subr

# name hda mem vnc_if vm_number
vm_name=$1
hda=$2
vm_mem=$3
vnc_if=$4
vm_number=$5
vnc_passwd=$6

case "$2" in

stop)
        echo Shutdown VirtualPC ${vm_name}
        echo system_powerdown | nc -U /tmp/qemu.${vm_name} > /dev/null
        wait_for_pids `cat /var/run/${vm_name}.pid`
        ;;
*)

        echo Starting VirtualPC ${vm_name}
        kldstat | /usr/bin/grep kqemu > /dev/null || kldload kqemu

        /usr/local/bin/qemu -hda ${hda} -m ${vm_mem}  \
-vnc ${vnc_if}:${vm_number},password \
-net nic,model=pcnet,macaddr=52:54:00:12:34:0${vm_number} \
-net tap,ifname=tap${vm_number},script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown \
-pidfile /var/run/${vm_name}.pid \
-daemonize \
-kernel-kqemu \
-name ${vm_name} \
-monitor unix:/tmp/qemu.${vm_name},server,nowait \
-localtime

        /bin/echo change vnc password ${vnc_passwd} | /usr/bin/nc -U /tmp/qemu.${vm_name} > /dev/null

        ;;

esac

 

Доступ виртуальных машин в сеть

Не помню где, но где-то нашел следующие скриптики:

# cat /etc/qemu-ifup

#!/bin/sh
if ! ifconfig bridge0 >/dev/null 2>&1 ; then
ifconfig bridge0 create
ifconfig bridge0 addm em0
fi
ifconfig bridge0 addm ${1}
ifconfig bridge0 up
ifconfig ${1} up

# cat /etc/qemu-ifdown

#!/bin/sh
ifconfig bridge0 deletem ${1}
ifconfig ${1} destroy
if ! ifconfig|grep tap >/dev/null 2>&1 ; then
ifconfig bridge0 deletem em0
ifconfig bridge0 destroy
fi

где em0 соответственно имя реального интерфейса.

 

Для того чтобы разобраться с этим всем использовались следующие ресурсы:


Комментарии

Какая версия

Какая версия qemu?
system_powerdown сразу работало?