Virtualizzare una macchina Linux fisica sotto Xen potrebbe non essere semplice e immediato. Vediamo come fare in pochi semplici passi:
- creare (ovviamente) la macchina virtuale Xen e avviarla in rescue mode come spiegato in precedenza;
- partizionare i dischi (fdisk /dev/xvda) usando eventualmente LVM (se si usano i CD di Red Hat in rescue mode occorre anteporre "lvm" ad ogni comando: lvm pvcreate, lvm vgcreate, lvm lvcreate);
- creare i filesystem su tutti i device che lo necessitano (mkfs.ext3 /dev/xvda1, mkswap /dev/rootvg/swapvol);
- creare una apposita directory e montarci il filesystem di root (mount /dev/rootvg/rootvol /mnt/sysimage);
- creare sotto il filesystem di root le directory necessarie agli altri mountpoint (boot, home, initrd, opt, proc, selinux, sys, tmp, usr, var);
- montare tutti gli altri filesystem;
- sincronizzare la macchina fisica con la macchina virtuale usando netcat:
eseguire sulla macchina virtuale
nc -l -p 8888 | tar -xvC /mnt/sysimage
eseguire sulla macchina fisica:
tar -cf - / --exclude=/dev --exclude=/initrd --exclude=lost+found --exclude=/proc | nc ipvm 8888
- montare /proc (mount /proc /mnt/sysimage/proc -o bind) ed entrare nella nuova macchina (chroot /mnt/sysimage)
- configurare i driver scsi:
# /etc/modprobe.conf
alias eth0 xennet
alias scsi_hostadapter xenblk
- creiamo i device necessari al boot (da Red Hat 4 è sufficiente solo il riferimento al filesystem di root):
mkdir -p /dev/mapper /dev/rootvg
chmod 755 /dev/mapper
chmod 700 /dev/rootvg/
mknod -m 700 /dev/mapper/control c 10 63
mknod -m 660 /dev/mapper/rootvg-rootvol b 253 0
ln -s /dev/mapper/rootvg-rootvol /dev/rootvg/rootvol
- Installiamo kernel per Xen e rimuoviamo i kernel non necessari:
yum -y install kernel-xenU
rpm -e kernel-2.6.9-55.EL
- Controlliamo che pyGrub sia stato aggiornato correttamente:
[...]
title Red Hat Enterprise Linux AS (2.6.9-89.0.9.ELxenU)
root (hd0,0)
kernel /vmlinuz-2.6.9-89.0.9.ELxenU ro root=/dev/rootvg/rootvol console=ttyS0
initrd /initrd-2.6.9-89.0.9.ELxenU.img
In particolare controlliamo che il device di root sia corretto.
- configuriamo /etc/inittab in modo da avere una console seriale disponibile:
# Run gettys in standard runlevels
co:2345:respawn:/sbin/agetty xvc0 9600 vt100-nav
- possiamo riavviare il sistema virtuale ed eseguire un'ultima sincronizzazione da quella fisica (fermando eventualmente i servizi che hanno file aperti):
rsync -avz -e ssh --exclude /dev --exclude /var --exclude /otherfs --stats physical::/ /
Il comando è solo un esempio e va ovviamente adattato allo specifico caso.
Ci possono essere diversi problemi nella fase del primo boot della macchina virtuale; la maggior parte dei problemi dipende dal fatto che il sistema non riesce a montare il filesystem di root e quind eseguire chroot su di esso. Il problema principale è che spesso l'errore a video non riesce a dare una chiara indicazione di cosa non va:
Kernel panic - not syncyng: VFS: Unable to mount root fs on unknown-block(0,0)
Oppure per esempio:
Mounting root filesystem
mount: error 6 mounting ext3
mount: error 2 mounting none
Switching to new root
switchroot: mount failed: 22
umount /initrd/dev failed: 2
Kernel panic - not syncing: Attempted to kill init!
Brevemente il processo di boot si articola nelle seguenti fasi:
- viene caricato il kernel (specificato o dalla configurazione della virtual machine o dalla configurazione di pyGrub);
- viene montato il filesystem initrd (specificato sempre o dalla configurazione della virtual machine o dalla configurazione di pyGrub)
- se initrd viene montato correttamente (generalmente questo accade sempre a meno che non sia corrotto), viene cercato il device di root (specificato ancora o dalla configurazione della virtual machine o dalla configurazione di pyGrub);
- il device di root (presente in /dev) viene usato per montare il filesystem di root (è importante che il modulo per il filesystem sia compilato nel kernel o installato nell'initrd (solitamente viene fatto in automatico);
- vengono scambiati i filesystem di root (appena montato) e quello di initrd, quindi viene effettuato un chroot sul filesystem di root;
- viene avviata la normale procedura di init.
In caso di problemi controllare che:
- /etc/modprobe.conf contenga i driver corretti, e in particolare xenblk e xennet;
- /boot/grub/menu.lst abbia configurato il corretto device di root (nel mio caso solitamente è root=/dev/rootvg/rootvol);
- /dev abbia i device di necessari al boot (nel mio caso sono: /dev/mapper/control, /dev/mapper/rootvg/rootvol, /dev/rootvg/rootvol);
Se è tutto corretto probabilmente l'installazione del kernel non è stata completata correttamente, e quindi initrd è probabilmente corrotto o non correttamente configurato:
- cancellare e rigenerare initrd:
/sbin/mkinitrd /boot/initrd-2.6.9-89.0.9.ELxenU.img 2.6.9-89.0.9.ELxenU
- al limite cancellare e reinstallare il kernel:
rpm --justdb --nodeps -e kernel-xenU-2.6.9-89.0.9.ELl
yum install kernel-xenU kernel-xenU-devel
0 commenti:
Posta un commento