среда, 3 апреля 2013 г.

клонирование виртуальных машин Proxmox

Добрый день.

 Появилось у меня тут задача, нужно много виртуальных машин в количестве нескольких тысяч.
  Всё это дело я решил реализовать в Proxmox. Установка и конфигурация много где есть и в официальной wiki всё очень добротно описано, по этому пропустим этот шаг.

Как можно создать виртуальные машины. Через кнопку web. Но каждый раз настраивать и устанавливать однотипные машине не целесообразно.


По этому готовые образы дисков и конфигурационных файлов хранятся в директориях (тут это Debian в других могут отличатся), которые можно скопировать и немного подправить и будет однотипная машина.

 Конфигурационный файлы /etc/pve/nodes/v-4-kp20-d1864-85/qemu-server/
Образы   /var/lib/vz/images/







Виртуальным машинам присваиваются уникальные идентификаторы и  директории для образов(вида 100, 102, 103 и т.д.)

Копируем сам образ в новую папку с именем идентификатора. Немного правим конфиг, изменяем путь до образа вида (ide0: local:299/vm-299-disk-1.qcow2,size=3G) .
  Тут папка с образом 299 и образ vm-299-disk-1.qcow2.
Меняем МАК адрес. Всё машина готова.

Но есть одно но, если таких машин нужно сотня или две, или даже больше. То это будет очень утомительное занятие. По этому написал не большой скрипт, который автоматически клонирует и и правит конфиги. Мак адреса он автоматом инкрементирует на еденицу(но не может делать больше 65535 машин, меняет последнии два числа).

 #!/bin/bash
 

conf_pve_vm=/etc/pve/nodes/v-4-kp20-d1864-85/qemu-server/
image_vm=/var/lib/vz/images/


# find mac for copy VM
mac_vm=$(grep -oE "[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}" $conf_pve_vm$1.conf)
start_mac=$mac_vm

start_vm=$(($1 + 1))
while [ $start_vm -le $2 ]; do
#create dir image
mkdir $image_vm$start_vm
#copy image disk
cp $image_vm$1/vm-$1-disk-1.qcow2 $image_vm$start_vm/vm-$start_vm-disk-1.qcow2
sleep 4

#copy conf
cp $conf_pve_vm$1.conf $conf_pve_vm$start_vm.conf
sleep 2

#reconf conf file
# rename path image (весь sed в одну строку)
sed "s/local:$1\/vm-$1-disk-1.qcow2/local:$start_vm\/vm-$start_vm-disk-1.qcow2/g"  \ $conf_pve_vm$start_vm.conf > $conf_pve_vm$start_vm.conf_temp && mv  \ $conf_pve_vm$start_vm.conf_temp $conf_pve_vm$start_vm.conf
sleep 2

#reconf mac adress
mac_number1=$(echo $mac_vm | cut -f1 -d:)
mac_number2=$(echo $mac_vm | cut -f2 -d:)
mac_number3=$(echo $mac_vm | cut -f3 -d:)
mac_number4=$(echo $mac_vm | cut -f4 -d:)
mac_number5=$(echo $mac_vm | cut -f5 -d:)
mac_number6=$(echo $mac_vm | cut -f6 -d:)

new_mac6=$(($(printf "%d\n" 0x$mac_number6) + 1))  # converting numbers  16 > 10
new_mac5=$mac_number5
max_mac=255
echo $new_mac6
if [ "$new_mac6" -gt "$max_mac" ]
then
new_mac5=$(($(printf "%d\n" 0x$mac_number5) + 1))
plus_one_mac=0
new_mac6="00"
fi


new_mac6=$(printf "%x\n" $new_mac6)
b=2
nub_char_mac=${#new_mac6}
if [ "$nub_char_mac" -ne "$b" ] ; then
new_mac6="0$new_mac6"
fi

temp_mac="$mac_number1:$mac_number2:$mac_number3:$mac_number4:$new_mac5:$new_mac6"
sed  "s/$start_mac/$temp_mac/g" $conf_pve_vm$start_vm.conf >  \ $conf_pve_vm$start_vm.conf_tmp && mv  $conf_pve_vm$start_vm.conf_tmp \ $conf_pve_vm$start_vm.conf
sleep 2
mac_vm=$temp_mac
start_vm=$(($start_vm + 1))
done




   Запуск скрипта script.sh 102 450 . 102 это идентификатор той машины которую копируем и 450 это конечная машина.
   Этим скриптом создано было более 1000 машин.