[kvm] pxe installation over console

Questo articolo vuole essere una prima bozza che raccogliesse i passaggi compiuti per arrivare all'automazione di installazioni Centos (a breve debian e qualche opzione supplementare di installazione). 

kvm

i prerequisiti, non trattati in questa sede:

i principali componenti, trattati in questo articolo sono:

Ovviamente sono passato da varie fasi di affinamento ed è per questo che spero di evirare qualche grattacapo a voi.

Per prima cosa, è indispensabile modificare il network utilizzato; io ho utilizzato quello di default perché virt-manager lo utilizza per le nuove installazioni, ma questo non è così importante quindi scegliete voi il network che preferite.

<network>
 <name>default</name>
  <uuid>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</uuid>
  <forward mode='nat'>
   <nat>
    <port start='1024' end='65535'/>
   </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:d1:f9:75'/>
  <dns>
   <forwarder addr='8.8.8.8'/>
   <host ip='192.168.122.1'>
    <hostname>meh</hostname>
   </host>
  </dns>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
   <dhcp>
   <range start='192.168.122.2' end='192.168.122.20'/>
   <host mac='52:54:00:92:c7:98' name='mysql01.cluster.io' ip='192.168.122.51'/>
   <host mac='52:54:00:3e:31:f3' name='mysql02.cluster.io' ip='192.168.122.52'/>
   <host mac='52:54:00:d8:40:7d' name='mysql03.cluster.io' ip='192.168.122.53'/>
   <host mac='52:54:00:74:d8:b4' name='diablo.cluster.io' ip='192.168.122.90'/>
   <host mac='52:54:00:45:72:3c' name='booter.cluster.io' ip='192.168.122.91'/>
   <bootp file='pxelinux.0' server='192.168.122.91'/>
  </dhcp>
 </ip>
</network>

le parti in rosso sono quelle necessarie per creare un pxe boot server:

In particolare, l'opzione ha come parametro file il nome del bootloader di rete, posizionato sul server 192.168.122.91.

Se non si volesse utilizzare un server tftpd esterno, è possibile (e più rapido) specificare l'host come tftpd server, eliminando l'opzione server= ed aggiungendo   come figlio del tag , allo stesso livello del tag , per intenderci.

dopo aver apportato questa modifica, è necessario riavviare il network; per fare cioò ricordatevi di spegnere tutte le macchine al suo interno perché, al meno con la mia versione, restartando il network con VM accese dentro, quelle stesse macchine non saranno più raggiungibili via network.

Dopo aver fatto ciò, basta stoppare il network e startarlo di nuovo:

virsh net-destroy default
virsh start default

ora possiamo spostarci sulla VM che ospiterà tutto l'essenziale per l'installazione headless.

La mia macchina di riferimento è una Centos 6, con 1G Ram e 1Vcpu; sul repository ufficiale è già presente tutto l'occorrente per il pxe booting.

yum install tftp-server

nella directory /tftpboot sarà ora presente il bootloader pxelinux con i relativi files.

per configurare il nostro booloader in bodo che ci permetta di scegliere che tipo di installazione fare, è necessario creare una directory all'interno del folder:

mkdir -p /tftpboot/pxelinux.cfg/{centos6,debian7}

all'interno della cartella pxelinux.cfg è necessario anche creare il file di configurazione che pxelinux cercherà come default, con il nome, appunto, default:

default grml32
implicit 0
prompt 1
timeout 100
ontimeout localboot
console 0
serial 0 115200 0
display boot.msg
F1 boot.msg

LABEL centos6
MENU LABEL CENTOS6 64 bit (Minimal Installation)
kernel centos6/vmlinuz
append initrd=centos6/initrd.img ks=http://192.168.122.91/ks_centos6.cfg console=ttyS0,115200 earlyprint=serial,ttyS0,115200

LABEL debian
MENU LABEL DEBIAN AMD64 (Debian Testing)
kernel debian7/linux
append url=http://192.168.122.91/server-base.cfg priority=critical DEBIAN_FRONTEND=noninteractive install debconf/priority=medium debian-installer/allow_unauthenticated=true vga=true initrd=debian7/initrd.gz -- console=ttyS0,115200 earlyprint=serial,ttyS0,115200

LABEL localboot
MENU LABEL LOCALBOOT
localboot 0

La configurazione prevede un file boot.msg in /tftpboot; un semplice file di test che faccia un print a video delle opzioni da poter utilizzare:

!!!!!!PXE BOOT MENU!!!!!!! centos6 - minimal CentOS 64bit debian - Debian GNU/Linux Preseed

in questo modo, sarà sempre possibile sapere cosa cercare all'avvio.

è anche impostato un fallback per l'avvio da HD allo scadere del timout o, semplicemente, digitando localboot.

Tra le impostazioni è anche necessario settare una console per la redirezione dell'output, segnate in grassetto. è importante mettere il richiamo al file boot.msg dopo la console, in modo da vederne l'output; alra cosa importante, è quella di settare la stessa velocità di baud tra pxelinux e l'installer kickstart/preseed (non è importante la velocità, dato che stiamo parlando di seriali virtuali :P ).

come avrete notato, all'interno delle definizioni dei due tipi di installazione sono specificati i file locali dovre trovare kernel ed ramdisk (non dimenticate di copiare i binari nelle cartelle suddette, prendendoli direttamente dai siti delle distro), mentre il file di installazione automatico è reperibile via http. altra considerazione è l'aggiunta ai parametri di boot della console virtuale. Per abilitare il tftpd server, è ora necessario modficare le linee del file /etc/xinetd.d/tftp:

service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}

le modifiche sono solo 2, come sottolineato.

Ora un bel:

kill -HUP $(pidof xinetd)

oppure

service xinetd start

chkconfig xinetd on

ed il nostro tftp server dovrebbe essere in ascolto sulla porta 69 udp:

netstat -nlp | grep xinetd

Per la parte di webserver, ho utilizzato lighttpd, dato che la richiesta di risorse è infima, anche se ho perso qualche minuto per alcune configurazioni di default.

Ovviamente, potete usare qualsiasi webserver, in grado di servire i files kickstart/preseed e, se l'avete configurato, il repository con i pacchetti da installare.

Per prima cosa è necessario scaricare il binario dal repo epel, dato che centos non lo mette a disposizione:

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/lighttpd-1.4.35-1.el6.x86_64.rpm
rpm -i lighttpd-1.4.35-1.el6.x86_64.rpm

ora, è necessario modificare un paconsole=ttyS0,115200 earlyprint=serial,ttyS0,115200io di parametri, per bindare correttamente il server e per la gestione del directory listing.

sed  -i /server.bind/s/^/#/ /etc/lighttpd/lighttpd.conf
sed  -i /dir-listing.activate/s/disable/enable/ /etc/lighttpd/conf.d/dirlisting.conf
mkdir -p /var/www/lighttpd/{centos6,debian7}
service lighttpd start
chkconfig lighttpd on

ora, non resta che creare i files kickstart/preseed (al momento ho solo un kickstart funzionante):

ks_centos6.cfg:

#version=DEVEL
install
#SYSTEM
url --url=http://192.168.122.91/cconsole=ttyS0,115200 earlyprint=serial,ttyS0,115200entos6
lang it_IT.UTF-8
keyboard it
network --onboot yes --device eth0 --bootproto dhcp --ipv6 auto
rootpw --iscrypted xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --enforcing
timezone --utc Europe/Rome
bootloader --location=mbr --driveorder=vda --append="crashkernel=auto console=ttyS0,115200 earlyprint=serial,ttyS0,115200"
skipx
text
reboot
services --disabled ip6tables
services --enabled ntpd
zerombr
clearpart --initlabel --all
autopart

#PKGS
repo --name="CentOS" --baseurl=http://192.168.122.91/centos6/ --cost=100
%packages --nobase
@core
%end

Le parti sottolineate sono ovviamente le più importanti affinché si possa generare un'installazione completamente automatica secondo i nostri criteri; in particolare, utilizzo un repository locale prodotto da una minimal iso di centos scaricabile dal sito della distro copiando il conttenuto in /var/www/lighttpd/centos6/ (e kernel e initrd in /tftpboot/centos6 ).

Per generare l'hash della passwd di root:

openssl passwd -1 "mypasswd"

anche qui, ho specificato la console con lo stesso baud rate degli altri componenti, in modo che grub passi al kernel la console da utilizzare dopo l'installazione. In questo modo, con una sola linea di codice sarà possibile installare una VM e trovarsi al suo prompt, in meno di 5 minuti!!!!

compiuti questi passaggi siamo pronti per installare la nostra prima vm; torniamo sull'host e installiamo una VM con il seguente comando:

virt-install --name test2 --virt-type kvm \
--vcpus=1 --ram 1072 --network network=default,model=virtio \ 
--disk path=/home/j0lly/images/test02,size=8 \
--pxe  --nographics --os-variant=rhel6 --os-type=linux --autostart --debug

la parte magica qui è vestita dallo switch --pxe, che abilita il pxe booting durante l'installazione; da notare anche il network di riferimento, cioè quello utilizzato durante tutta la procedura del post.

Questa Guida è un draft, scritto di fretta per non dimenticare le cose fatte.

Spero di poter amliare, impaginare meglio ed aggiornare qualche conf, per ottimizzare la cosa.

Stay TuNeD

Fonti:

stephenwagner

andreasmarschke

lighttpd

redhat

cyberciti

soekris