[kvm] pxe installation over console
Tue 19 August 2014Questo 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).
i prerequisiti, non trattati in questa sede:
- un hypervisor kvm basato su libvirt
- un guest all'interno dello stesso network virtuale nel quale verranno creati i nuovi guests:
- esso funge da pxe/tftpd server;
- repository (facoltativo) per l'installazione dei pacchetti.
i principali componenti, trattati in questo articolo sono:
- modifica del network virtuale di riferimento per gestire il pxe booting;
- installazione e configurazione del pxe booting sul guest di riferimento;
- installazione e configurazione di un webserver per la gestione dei file kickstart/preseed;
- configurazione del webserver come repository di pacchetti (opzionale).
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
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
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: