Ostatnio pisałem o konfiguracji Dom0external link - dzisiaj napiszę o uruchamianiu DomU.

Do instalacji DomU wykorzystuję skrypty z pakietu xen-tools, można go zainstalować poleceniem:

apt-get install xen-tools

Oczywiście aby wszystko działało fajnie musimy ustawić kilka domyślnych opcji, robimy to edytując plik /etc/xen-tools/xen-tools.conf. Lecimy po kolei:

# Virtual machine disks are created as logical volumes in
# volume group 'universe' (hint: LVM storage is much faster
# than file)
lvm = universe

Osobiście korzystam z LVM’a który zgodnie z hint’em jest znacznie szybszy od plików obrazów. Daje do tego bardzo wygodne możliwość w zarządzaniu rozmiarami wolumenów przydzielonych DomU, możliwość tworzenia snapshotów (np. na potrzeby backupu). Postawienie LVM’a w skrócie wygląda tak:

apt-get install lvm2
pvcreate /dev/sdb1  # to tylko przyklad - samodzielnie ustal partycje :)
vgcreate universe /dev/sdb1
vgchange -a y universe

Pozostałe opcje i bardziej skomplikowane przypadki tworzenia LVM’a można znaleźć tutaj: http://tldp.org/HOWTO/LVM-HOWTO/commontask.html

Ustalamy domyślne parametry dla tworzonych DomU - oczywiście zawsze możemy je nadpisać poprzez podanie innej wartości w linii poleceń, np. -memory 4Gb:

size   = 8Gb      # Disk image size.
memory = 512Mb    # Memory size
swap   = 1Gb      # Swap size
xfs_options      = noatime,nodiratime

Domyślnie nie ma konfiguracji dla systemu plików ext4, wystarczy dodać w odpowiednich miejscach:

fs = ext4
ext4_options     = noatime,nodiratime,errors=remount-ro

Ustawienia sieci:

# Default gateway and netmask for new VMs
gateway    = 10.0.10.1
netmask    = 255.255.255.0
broadcast  = 192.168.3.255

Warto ustawić domyślne ustawienia sieci - choć ja osobiście wolę zawsze podawać te parametry ręcznie.

# When creating an image, interactively setup root password
passwd = 1

Dzięki tej opcji na koniec tworzenia DomU zostaniemy poproszeni o podanie hasła dla root’a.

#  This is most useful on 64 bit host machines, for other systems it
# doesn't need to be used.
#
arch = amd64

Domyślna architektura dla tworzonych DomU - można przedefiniować z linii poleceń.

#  Uncomment if you wish newly created images to boot once they've been
# created.
#
boot = 0

Ja nie lubię gdy DomU uruchamiają się automatycznie po przygotowaniu bo często ręcznie modyfikuję konfigurację i dopiero uruchamiam wirtualkę - stąd 0.

# Let xen-create-image use pygrub, so that the grub from the VM is used,
# which means you no longer need to store kernels outside the VMs.
# Keeps things very flexible.
pygrub=1
role = pygrub, myconfig

Ta opcja powoduje że DomU będzie posiadać własny kernel, który może być aktualizowany niezależnie od kernela hypervisora. Włączenie tej opcji wymaga dodatkowej roli (pygrub) która zainstaluje wymagane pakiety, etc. Niestety roli tej nie ma w standardowej instalacji więc zamieszczam poniżej plik znaleziony w sieci. Edytujemy plik /etc/xen-tools/role.d/pygrub:

#!/bin/sh
#
#  Configure the new image to be suitable for booting via pygrub
#
# Wejn
# --
# http://wejn.org/
#

prefix=$1

#
#  Source our common functions - this will let us install a Debian package.
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
    . /usr/lib/xen-tools/common.sh
else
    echo "Installation problem"
fi

#
#  Update APT lists.
#
chroot ${prefix} /usr/bin/apt-get update

#
#  Install the packages
#
set -e
installDebianPackage ${prefix} perl
installDebianPackage ${prefix} libklibc
installDebianPackage ${prefix} klibc-utils
installDebianPackage ${prefix} initramfs-tools
installDebianPackage ${prefix} linux-image-2.6-xen-amd64
#chroot ${prefix} /usr/bin/dpkg -l | grep linux-image-xen-amd64
#if [ $? -ne 0 ]; then
#       installDebianPackage ${prefix} linux-image-2.6-xen-686
#else
#       installDebianPackage ${prefix} linux-image-2.6-xen-amd64
#fi

# Force initrd if none exists
echo ${prefix}/boot/initrd* | grep -q 2\\.6
if [ $? -ne 0 ]; then
        chroot ${prefix} update-initramfs -c -k `ls -1 ${prefix}/lib/modules/ | head -n 1`
fi

# Generate grub menu.lst
LNZ=`basename \`ls -1 ${prefix}/boot/vmlinuz*|tail -n 1\``
RD=`basename \`ls -1 ${prefix}/boot/initrd*|tail -n 1\``
mkdir -p ${prefix}/boot/grub
cat - < ${prefix}/boot/grub/menu.lst
default         0
timeout         1

title           Debian
root            (hd0,0)
kernel          /boot/$LNZ root=/dev/xvda2 ro
initrd          /boot/$RD
EOF

Jeżeli na DomU mamy zamiar główny system plików sformatować jako XFS to pygrub nie będzie potrafił się z niego zbootować - dobrze za to działa z ext3 i ext4.

Rola myconfig do wstępnej konfiguracji systemu DomU

Rola myconfig to mój własny zestaw skryptów, który konfiguruje DomU w taki sposób jak lubię - bym nie musiał każdorazowo tracić czasu na ustawienie nowego systemu pod siebie. Zawartość poniżej:

#!/bin/sh
#
#  Configure DomU to my needs
#
# Tomasz Gagor
# --
# https://gagor.pl/
#

prefix=$1

#
#  Source our common functions - this will let us install a Debian package.
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
    . /usr/lib/xen-tools/common.sh
else
    echo "Installation problem"
fi

#
# Moje ulubione zrodla w sources.list
#
echo "deb http://ftp.pl.debian.org/debian/ squeeze main non-free contrib" > ${prefix}/etc/apt/sources.list
echo "deb-src http://ftp.pl.debian.org/debian/ squeeze main non-free contrib" > ${prefix}/etc/apt/sources.list
echo "deb http://security.debian.org/ squeeze/updates main contrib non-free" > ${prefix}/etc/apt/sources.list
echo "deb-src http://security.debian.org/ squeeze/updates main contrib non-free" > ${prefix}/etc/apt/sources.list
echo "deb http://ftp.pl.debian.org/debian/ squeeze-updates main non-free contrib" > ${prefix}/etc/apt/sources.list
echo "deb-src http://ftp.pl.debian.org/debian/ squeeze-updates main non-free contrib" > ${prefix}/etc/apt/sources.list
echo "deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free" > ${prefix}/etc/apt/sources.list
echo "deb http://packages.dotdeb.org stable all" > ${prefix}/etc/apt/sources.list
echo "deb-src http://packages.dotdeb.org stable all" > ${prefix}/etc/apt/sources.list

#  Update APT lists.
chroot ${prefix} /usr/bin/apt-get update

#
#  Zainstaluj ulubione paczki
#
set -e
installDebianPackage ${prefix} ssh
installDebianPackage ${prefix} vim
installDebianPackage ${prefix} mc
installDebianPackage ${prefix} bash-completion
installDebianPackage ${prefix} ethtool
installDebianPackage ${prefix} less
installDebianPackage ${prefix} screen
installDebianPackage ${prefix} postfix
installDebianPackage ${prefix} apticron

#
#  Usun paczki ktorych nie potrzebuje lub nie lubie
#

# PPP
removeDebianPackage ${prefix} pppconfig
removeDebianPackage ${prefix} pppoeconf
removeDebianPackage ${prefix} pppoe
removeDebianPackage ${prefix} ppp
removeDebianPackage ${prefix} libpcap0.7

# edytory
removeDebianPackage ${prefix} nano
removeDebianPackage ${prefix} ed
removeDebianPackage ${prefix} nvi

# inne
#removeDebianPackage ${prefix} tasksel tasksel-data
#removeDebianPackage ${prefix} pciutils
#removeDebianPackage ${prefix} fdutils
#removeDebianPackage ${prefix} cpio

# skypt automatyczne czyszczacy cache apta
# zmniejsza rozmiar backupow
echo '#!/bin/bash' > ${prefix}/etc/cron.daily/apt-get-clean.sh
echo 'apt-get clean' >> ${prefix}/etc/cron.daily/apt-get-clean.sh
chmod +x ${prefix}/etc/cron.daily/apt-get-clean.sh

# ethtool - zwieksza wydajnosc wirtualizowanych urzadzen sieciowych
echo "post-up  ethtool -K eth0 tx off" >> ${prefix}/etc/network/interfaces

# konfiguracja vima tak jak lubie
chroot ${prefix} /usr/sbin/update-alternatives --set editor /usr/bin/vim.basic
cat < ${prefix}/etc/vim/vimrc.local
syntax on
set background=dark

if has("autocmd")
        filetype plugin indent on
endif

set showmatch
VIMRC

# konfiguracja bash-autocompletion
cat <> ${prefix}/etc/bash.bashrc
# enable bash completion in interactive shells
if [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
fi
BASHCOMP
echo 'source /etc/bash.bashrc' >> ${prefix}/etc/profile

# instalacja i konfiguracja postfixa
# poniżej wpisz własny alias dla hostmastera
echo "root: hostmaster@mojadomena.pl" >> ${prefix}/etc/aliases
chroot ${prefix} /usr/bin/newaliases
chroot ${prefix} /usr/sbin/postconf -e "myhostname = `cat ${prefix}/etc/hostname`"
chroot ${prefix} /usr/sbin/postconf -e "mydestination = `cat ${prefix}/etc/hostname`, `cat ${prefix}/etc/hostname`.in.veracomp.pl, localhost.localdomain, localhost"
chroot ${prefix} /usr/sbin/postconf -e 'relayhost = mail.example.pl'
chroot ${prefix} /usr/sbin/postconf -e 'myorigin = /etc/mailname'
# dostosuj domenę pod siebie
echo "`cat ${prefix}/etc/hostname`.internal.example.pl" > ${prefix}/etc/mailname

# konfiguracja locales
chroot ${prefix} /usr/sbin/locale-gen

# konfiguracja timezone
echo 'Europe/Warsaw' > ${prefix}/etc/timezone
chroot ${prefix} dpkg-reconfigure -f noninteractive tzdata

# konfiguracja mc i authorized_keys ssh takie jak na dom0
cp -r /root/.mc/ ${prefix}/root/
cp -r /root/.ssh/ ${prefix}/root/