ESXi kickstart2

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску

ESXi - автоматическая установка с флешки с виртуаьными машинами

Идея такая:
Recovery procedure should allow customer to completely reset device to factory settings including erasing of any secure keys/setting/etc.
To perform factory reset user should power off the appliance and insert any FAT16/FAT32 USB Flash drive with “factory.rst” file on it. This file acts as trigger to the system restore service and may not contain any data. After that customer should power-on the appliance and wait for shutdown. When shutdown was happened customer should remove USB flash drive. At that point appliance should be at the factory state and should be available to configure after powering it on.
Другими словами - если есть файлик на второй флешке - то ставить вместе со всем барахлом. Если нет - грузиться с винта. Забавно.

Маленькое отсупление - я бы убил этих инженегров из VMware inc. - судя по их документации так сделать нельзя. Но если нельзя а очень хочется ...
Итак, задача состоит из нескольких частей:

  • Настроить загрузчик так что бы он определял наличие файла, и на основе этого принимал решние
  • Собрать образ ESXi с виртуальными машинами в нем самом
  • Написать скрипт установки

На словах все довольно просто, но - грузиться надо с образа ISO а не с "настоящего" диска и это порождает кучу проблем.

  • подмонтировать этот образ нельзя - эти уроды товарищи не включили никаких нормальных утилит, а то что есть - не позволяет работать с образами (модуль loop отсутвует)
  • нет комманды mount - все что можно монтирует автомаунт.

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

  • скрипт кикстата лежит обычно внутри образа и недоступен (монтировать USB НЕЛЬЗЯ, а даже если и можно было бы - то нельзя смонтировать образ ISO.) А стандартная ссылка cdrom:/ks.cfg указывает на ФИЗИЧЕСКИЙ привод, где никакого файла конечно же нет.
  • образы виртуалок можно положить куда угодно на флешку, но монтировать USB Drive нельзя. Т.е. вроде вот они, близко - но не доставть.

Но, есть такое слово - надо.

Загрузка

Я уже описывал chain load http://wiki.sirmax.noname.com.ua/index.php/Grub_Chain_load - достаточно подробно. В этом случае я делаю все то же самое, за исключением того что флешку разбиваю на те же 2 раздела но все файлы размещаю на 1-м (vfat)

# fdisk -l /dev/sdb

Disk /dev/sdb: 8032 MB, 8032091136 bytes
248 heads, 62 sectors/track, 1020 cylinders, total 15687678 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00035e84

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     6293503     3145728    b  W95 FAT32
/dev/sdb2         6293504    15687677     4697087   83  Linux
# ls -1
boot
esxi.iso
ks.cfg

В boot на первом разделе помещаю grub и grub4dos. Обратить внимание , что меню для grub4dos лежит в папке /boot/grub хотя сам он - в /boot/grub4dos. это связано с тем что пути поиска menu.lst захардкожены.
Итого, имеем:

grub.cfg

cat boot/grub/grub.cfg 
insmod loopback.mod
set timeout=3


function check_usb {
if [ -f (hd1,1)/factory.rst ]; then
    echo "Please remove USB drive with factory.rst file. "
    sleep -v 5
    check_usb
fi

}


menuentry "Boot " {
# check for flag
    echo "Check for recovery mode"
    if [ -f (hd0,1)/recovery ]; then
        echo "Recovery file found, Ububtu will be loaded in 5 seconds"
        sleep -v 5
        set isofile="/ubuntu-11.10-desktop-i386.iso"
        loopback loop (hd0,1)$isofile
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile nomodeset
        initrd (loop)/casper/initrd.lz
    else
        if [ -f (hd1,1)/factory.rst ]; then
            echo "factory.rst file was found ... appliance will be reseted to factory defaults in 5 secons"
            sleep -v 5
    	    check_usb
     # Re-install
            echo "Re-install mode"
            set root=(hd0,1)
            linux16 /boot/grub4dos/grub.exe
        else
# Normal boot
            echo "Will boot from hard drive in 5 seconds"
            sleep -v 5
            set root=(hd2)
            chainloader +1
            boot
        fi
    fi
}

В качестве рековери диска можно применять любой - хоть gentoo хоть убунту хоть что угодно. Для тестов использовал что под рукой было.
Если на втором диске (hd1,1) находим нужный файлик - переходим в режим инсталляции и просим вытащить флешку с этим файликом. Как только флешка пропала - продолжаем загрузку grub4dos --> iso.

menu.lst

Думаю, тут все предельно ясно - безусловная передача управления образу. Обратить внимание что образ должен быть НЕ фрагментирован!

color blue/green yellow/red white/magenta white/magenta
timeout 3
default /default

title ESXi kickstart install
map (hd0,0)/esxi.iso (0xff)
map --hook
chainloader (0xff)
boot

Загрузка образа ESXi

При установке с флешки разложено некоторое число граблей, остановлюсь на них чуть подробнее.
В интеренте полно примеров как кастомизировать образ, в 2-х словах

  • смотнировать оригинальны куда-то в /mnt/esxi (moount your-esxi-iso /mnt/esxi -o loop)
  • скопировать содержимое /mnt/esxi в рабочуюю директорию.
  • править содержимое
  • собрать назад в диск примерно так
ionice -n 7 mkisofs  -allow-limited-size -relaxed-filenames -J -R -o ./esxi.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table ./NEW_ISO_WITH_ADDONS

Для того что бы ESXi из образа на диске корректно нашла файлик кикстарта в boot.cfg исправляем

bootstate=0
title=Loading ESXi installer
kernel=/tboot.b00
kernelopt=runweasel
modules=/b.b00  ks=usb --- /useropts.gz --- /k.b00  <skipped list>
build=
updated=0

т.е. добавляем

ks=usb

МЕЖДУ /b.b00 и --- /useropts.gz Я не уверен что это единственный верный путь, но все другие вроде ks=usb:/path/... у меня не заработали.

После проделаных действий ESXi загрузиться, найдет скрипт и начнет установку.

Установка образов виртуальных машин

У меня не получилось заставить ESXi смонтировать флешку. Хотя в документации написано что это возможно фактически у меня это не заработало.
После длительных эксперементов я пришел выводу что на самом деле проблема именно в монтировании. Блочное устройство для флешки присутвует и доступ к нему есть. Соответвенно, с ним можно работать. Я пошел следующим путем:

  • Cоздал tar-файл куда положил все что мне нужно.
  • скопировал файл напрямую в раздел - без создания ФС: dd if=VMs.tar of=/dev/sdb2 bs=1024 (/dev/sdb - флешка)
  • на ESXi распаковка выглядит примерно так (в ks.cfg)
cd  /vmfs/volumes/datastore1/
mkdir VMs
cd VMs
USB_DRIVE=`esxcfg-mpath -l | grep 'usb.vmhba[0-9][0-9]-usb'`
export USB_DRIVE
REAL_USB_DRIVE=`echo ${USB_DRIVE} | awk -F"-" '{print }'`
export REAL_USB_DRIVE
tar -xvf /vmfs/devices/disks/${REAL_USB_DRIVE}:2

После того как образ достали и распаковали можно пробовать устанавливать машины, настраивать сеть и т.п. Об этом написано довольно много - потому только короткий скрипт без комментарием

VM_NAME=MgmtVM
VM_STORE_ORIGIN=/vmfs/volumes/datastore1/VMs/$VM_NAME
VM_STORE=/vmfs/volumes/datastore1/$VM_NAME

if [ -d $VM_STORE_ORIGIN ]
then
    logger "*** Importing $VM_NAME"
    rm -rf $VM_STORE
    mkdir $VM_STORE

    logger " -- Converting VMDK $VM_STORE_ORIGIN/$VM_NAME-disk1.vmdk --> $VM_STORE/$VM_NAME.vmdk"
    vmkfstools -i $VM_STORE_ORIGIN/$VM_NAME-disk1.vmdk -d thin $VM_STORE/$VM_NAME.vmdk
    [ $? = 0 ] && logger "SUCCESS" || logger "FAILED"

    cp $VM_STORE_ORIGIN/$VM_NAME.vmx $VM_STORE

    logger " -- Removing temporary folder"
    #rm -rf $VM_STORE.tmp

    logger " -- Registering VM"
    VMID=$(vim-cmd solo/registervm $VM_STORE/$VM_NAME.vmx)
    if [ $? = 0 ]
    then
                logger "VM id $VMID registered successfully"
                vim-cmd hostsvc/autostartmanager/update_autostartentry $VMID PowerOn 90 1 stop 90 yes
                logger " -- Powering on $VM_NAME (VMID = $VMID)"
                vim-cmd vmsvc/power.on $VMID
    else
                logger "!!! VM registration failed!"
    fi
else
        logger "!!! Path not found $VM_STORE_ORIGIN"
fi


Замечу, что:

  • устройства на ESXi расположены по другому пути
 ls -lsa   /dev/disks/mpx.vmhba40:C0:T0:L0*
7843839 -rw-------    1 root     root         8032091136 Jul  4 14:45 /dev/disks/mpx.vmhba40:C0:T0:L0
7842815 -rw-------    1 root     root         8031042560 Jul  4 14:45 /dev/disks/mpx.vmhba40:C0:T0:L0:1
  • esxcfg-mpath -l - показать список блочных устройств

ks.cfg

приведу части из скрипта кикстарта:

install --firstdisk=ahci,local --overwritevmfs
# Тут скорее всего достаточно install --firstdisk --overwritevmfs 
#  но не уверен.
#
network --device=vmnic0 --addvmportgroup=false --bootproto=static --ip=172.16.252.253 --netmask=255.255.255.0 --gateway=172.16.252.254 --nameserver=172.16.1.2 --hostname=applience.com
rootpw PasswordHere
reboot
vmaccepteula

%post --interpreter=busybox
sleep 10
#
cd  /vmfs/volumes/datastore1/
mkdir VMs
cd VMs
USB_DRIVE=`esxcfg-mpath -l | grep 'usb.vmhba[0-9][0-9]-usb'`
export USB_DRIVE
REAL_USB_DRIVE=`echo ${USB_DRIVE} | awk -F"-" '{print }'`
export REAL_USB_DRIVE
tar -xvf /vmfs/devices/disks/${REAL_USB_DRIVE}:2
#
#
# Reboot here!
#
%firstboot --interpreter=busybox
vim-cmd hostsvc/enable_ssh
vim-cmd hostsvc/start_ssh
vim-cmd hostsvc/enable_esx_shell
vim-cmd hostsvc/start_esx_shell
#
#
# Deploy VMs
/vmfs/volumes/datastore1/VMs/Router/first_boot.sh
/vmfs/volumes/datastore1/VMs/MgmtVM/first_boot.sh
#
# Хорошо бы выключить после установки
poweroff