Een nieuwe Linux-distributie installeren is in een handomdraai gebeurd: live-cd starten, installer doorlopen en rebooten. Best handig voor één of twee pc’s, maar wat als je twintig nieuwe computers op kantoor moet installeren? In dit artikel bekijken we twee oplossingen om die taak te automatiseren: Kickstart en Preseed.

De meeste Linux-installers zijn erg gebruiksvriendelijk voor beginnelingen. Bovendien bieden ze nog geavanceerde mogelijkheden voor de power users. Toch hebben ze veelal één nadeel: de installatie kan niet volledig unattended (zonder toezicht) verlopen. Er is immers heel wat manuele interactie vereist: de live-cd booten, de juiste optie kiezen om de installer te starten, toetsenbordlayout kiezen, partitie-layout bevestigen, enzovoorts. Dat is erg lastig als je een groot aantal computers wilt installeren. Je moet dan voortdurend van de ene naar de andere pc hollen en steeds weer door dezelfde dialoogvensters klikken. Een mogelijke oplossing is het gebruik van imaging software. Je installeert de distributie dan op één systeem en past die installatie helemaal naar wens aan. Daarna maak je een disk image van dat systeem om -volledig automatisch- te installeren op alle andere pc’s. Op die manier win je heel wat tijd, al zijn er ook nadelen verbonden aan die aanpak. Zo kan imaging software niet altijd goed overweg met grote hardware-verschillen tussen de verschillende pc’s. Bovendien is het up-to-date brengen van het disk image behoorlijk tijdrovend. Disk imaging is dan ook vooral een goede oplossing in omgevingen met honderden compleet identieke computers.

Unattended install

Een andere – en veel flexibelere – oplossing is de installer in unattended mode starten. De mooie grafische installers van tegenwoordig zijn namelijk niet meer dan een frontend voor een commandline installer. Verschillende commandline installers kun je ook starten met een configuratiebestand dat alle benodigde informatie bevat. Zo heeft de installer tijdens het installatieproces geen enkele input meer nodig van de gebruiker. De installatie kan dus volledig automatisch verlopen, vanaf het partitioneren tot de reboot. Bovendien volstaat één configuratiebestand voor de meest uiteenlopende hardware. De installer detecteert immers welke drivers geïnstalleerd moeten worden. En het spreekt voor zich dat een configuratiebestand veel eenvoudiger aan te passen is dan een disk image. Het bekendste voorbeeld daarvan is ongetwijfeld Red Hat’s Kickstart-formaat, gebruikt door de Anaconda-installer. Met Anaconda en Kickstart kan je onder andere Red Hat Enterprise Linux, CentOS en Fedora installeren. Voor Debian, Ubuntu en afgeleiden daarvan is er Preseed. We bekijken verderop hoe je Kickstart en Preseed in de praktijk gebruikt. Eerst gaan we iets dieper in op de installatieprocedure in zijn geheel.

Kickstart

Met een kickstart- of preseed-bestand alleen kan je nog geen computer installeren. Je moet namelijk op de één of andere manier de installer van je distributie starten én het gepaste configuratiebestand inladen. De eenvoudigste methode is een minimaal live image te starten – vanaf cd-rom of usb-stick – en in het boot-menu een extra parameter toe te voegen met de locatie van je kickstart-bestand. Dat kickstart-bestand kan je bijvoorbeeld op een webserver in je LAN plaatsen. De installer gaat dan volledig automatisch aan de slag met de instructies van het kickstart-bestand en haalt de benodigde packages van het internet. Dat is de methode die wij in onze voorbeelden verderop in dit artikel, gebruiken. Maar ook die twee stappen kun je verder automatiseren. Boot je de te installeren computers via het netwerk (PXE boot), dan heb je geen cd-rom of usb-stick meer nodig. Je moet dan enkel een TFTP-server opzetten die het boot image beschikbaar stelt en je DHCP-server zo configureren dat de DHCP-clients weten welk boot image ze moeten gebruiken. Het kickstart-bestand en de benodigde packages kun je dan via NFS of HTTP beschikbaar stellen op een fileserver. Klinkt omslachtig? Tools zoals Cobbler maken het opzetten van een PXE-infrastructuur een stuk eenvoudiger. Maar dat is dan weer voer voor een ander artikel…

Benieuwd hoe zo’n kickstart-bestand er nu uitziet? Neem dan maar eens een kijkje in het bestand /root/anaconda-ks.cfg. Dat bestand werd tijdens de installatie van jouw systeem door Anaconda gebruikt. De meeste opties uit anaconda-ks.cfg zijn verplicht voor elk kickstart-bestand: partitielayout, bootloader, tijdzone, taal, toetsenbord en root-wachtwoord. Zaken zoals SELinux- en firewall-configuratie zijn niet verplicht: Anaconda kiest immers standaardinstellingen voor opties die je niet vermeldt. Zulke opties kan je ook expliciet opnemen: dan zie je tenminste duidelijk welke instelling gebruikt is. Maar je kan ze net zo goed weglaten. Zo wordt het kickstart-bestand niet nodeloos lang door alle standaardinstellingen te herhalen.

Kickstart Configurator

De gemakkelijkste manier om je eigen kickstart-bestand aan te maken, is met behulp van Kickstart Configurator (zie afbeelding 1). Dat is een grafische tool die je toelaat om nieuwe kickstart-bestanden aan te maken of bestaande kickstart-bestanden te wijzigen. De beschikbare opties worden overzichtelijk weergegeven in verschillende categorieën, al moeten we opmerken dat Kickstart Configurator niet alle opties toont. Om Kickstart Configurator te gebruiken moet je eerst het pakket “system-config-kickstart” installeren via yum. Kickstart Configurator is iets te uitgebreid om hier volledig te behandelen. We raden je vooral aan om zelf te experimenteren met de verschillende instellingen. Bekijk ook af en toe eens via Bestand > Voorbeeld of Control-P hoe jouw instellingen eruitzien in de kickstart-syntax.

## afb1.png: Afbeelding 1 – Kickstart Configurator is een gebruiksvriendelijke editor voor kickstart-bestanden

———-BEGIN LISTING 1———-

#platform=x86, AMD64, of Intel EM64T

#version=DEVEL

# Firewall configuration

firewall –enabled –service=ssh

# Install OS instead of upgrade

install

# Use network installation

url –url=”http://be.mirror.eurid.eu/centos/6.4/os/i386″

# Root password

rootpw –iscrypted $6$cPW5hbo3zC2lmd0k$JR4x.YMHNtMyJkpH1kQiy2PnunhxwdDV4gzPXy6mS4bIz.cgHfy3i9VgWuEj2QIcpV6nKLtRtI.faYxNJTqZw.

# System authorization information

auth –useshadow –passalgo=sha512

# Use graphical install

graphical

firstboot –disable

# System keyboard

keyboard be-latin1

# System language

lang nl_BE

# SELinux configuration

selinux –enforcing

# Installation logging level

logging –level=info

# Reboot after installation

reboot

# System timezone

timezone –isUtc Europe/Brussels

# Network information

network –bootproto=dhcp –device=eth0 –onboot=on

# System bootloader configuration

bootloader –location=mbr

# Clear the Master Boot Record

zerombr

# Partition clearing information

clearpart –all –initlabel

# Disk partitioning information

part /boot –fstype=”ext4″ –size=256

part / –fstype=”ext4″ –grow –size=1

part swap –fstype=”swap” –recommended

 

%packages

@base

@basic-desktop

@desktop-platform

@general-desktop

@graphical-admin-tools

@graphics

@internet-applications

@internet-browser

@office-suite

@print-client

@x11

thunderbird

xchat

-ekiga

-evolution

-evolution-help

-evolution-mapi

pdfedit

%end

———-EINDE LISTING 1———-

 

Desktop installeren

In listing 1 zie je een voorbeeld van een kickstart-bestand dat we met Kickstart Configurator aangemaakt hebben. We hebben een boot-partitie aangemaakt van 256MB, een swap-partitie van de door Red Hat aangeraden grootte (2GB swap voor 1GB RAM) en een partitie voor het rootbestandsysteem met de overige ruimte. Het root-wachtwoord is trouwens reeds gehashed in het kickstart-bestand. Vaak zijn kickstart-bestanden gewoon voor iedereen toegankelijk in het netwerk. Het zou dus niet erg veilig zijn om het root-wachtwoord gewoon in plaintext weer te geven. Vroeger werd steevast het MD5-algoritme gebruikt om wachtwoorden te hashen, maar in nieuwere distributies is dat meestal SHA-512. In listing 2 zie je twee mogelijkheden om een SHA-512 hash van een wachtwoord naar keuze te berekenen. De output van mkpasswd of grub-crypt zet je dan in het kickstart-bestand achter de optie rootpw –iscrypted. Je kan via de –authconfig-optie ook een ander hashing-algoritme kiezen voor wachtwoorden, maar dat raden we je niet aan. Van alle ondersteunde algoritmes is SHA-512 de meest veilige optie.

———-BEGIN LISTING 2———-

$ mkpasswd -m sha512

Password:

$6$uj1q0s2OsNaz$.x9gu75xs17UzB/yRqU2mko5429PabIbymRLsTtLKgpAvDA8DA9.PmiQgGMAM/HBS2/A1nmfb1w8RZATbBCs8/

$ grub-crypt –sha-512

Password:

Retype password:

$6$cPW5hbo3zC2lmd0k$JR4x.YMHNtMyJkpH1kQiy2PnunhxwdDV4gzPXy6mS4bIz.cgHfy3i9VgWuEj2QIcpV6nKLtRtI.faYxNJTqZw.

———-EINDE LISTING 2———-

Verder in het kickstart-bestand vind je nog de netwerkconfiguratie (via DHCP, maar we hadden ook een vast IP-adres kunnen ingeven) en hebben we de firstboot-optie uitgeschakeld. Die optie start normaalgesproken de Setup Agent bij de eerste boot, waarin je onder andere je gebruikersaccount moet aanmaken (tijdens de kickstart wordt enkel een root-account aangemaakt). Maar na een volledig automatische installatie willen we de Setup Agent niet meer starten. Extra gebruikers aanmaken kan gelukkig al tijdens de kickstart, al is die optie niet aanwezig in Kickstart Configurator. Open daarom het kickstart-bestand in een teksteditor en voeg de code uit listing 3 toe net boven de %packages-regel. In listing 3 zie je trouwens ook hoe je ervoor zorgt dat services automatisch gestart worden bij het booten. Zo ben je zeker dat na de kickstart alle vereiste services meteen draaien.

———-BEGIN LISTING 3———-

user –name=filip –password $6$R/DZLjR5xSW1$DPA0TdQiLbn2y4sOT61fzTldz1Q7u0NAUSqmQTnLxMHmREbsCdEXbVR7eFgRAjPpWQorAHfNWaA10/RQvlRZN0 –iscrypted

services –enabled=sshd

———-EINDE LISTING 3———-

Packages en scripts

Let ook op het %packages-onderdeel aan het einde van het bestand. Daarin geef je aan welke pakketten allemaal moeten worden geïnstalleerd. Je kan zowel pakketgroepen (bijvoorbeeld @office-suite) als individuele pakketten (bijvoorbeeld xchat) selecteren. De beschikbare pakketgroepen kan je het snelst controleren op een geïnstalleerd systeem met “yum grouplist -v”. Gebruik dan de naam tussen haakjes in het kickstart-bestand, voorafgegaan door een @-teken. Voor de groep “Desktop Platform (desktop-platform)” is dat bijvoorbeeld “@desktop-platform”. De groep @base wordt trouwens altijd geselecteerd door Anaconda, ongeacht of je die opgeeft of niet. Installeer je bepaalde pakketten uit een geselecteerde groep liever niet? Dat kan met de syntax “-<pakketnaam>”. Het is ook mogelijk om tijdens kickstart pakketten te installeren van third-party repositories. Je mag dan wel niet vergeten om die repository eerst te configureren. In listing 4 zie je een voorbeeld voor de EPEL-repository (plaats dit net boven %packages in het kickstart-bestand). Het laatste pakket uit onze lijst (pdfedit) is bijvoorbeeld afkomstig van EPEL.

 

———-BEGIN LISTING 4———-

repo –name=EPEL6 –baseurl=”http://download.fedoraproject.org/pub/epel/6/i386″

———-EINDE LISTING 4———-

Tot slot kun je nog eigen scripts uitvoeren tijdens de installatie. Daarvoor gebruikt men meestal shell scripts, al kun je ook andere interpreters kiezen (zoals Perl of Python). Scripts die je wilt uitvoeren nà de installatie, plaats je in de %post-sectie. Alle commando’s tussen %post en %end worden uitgevoerd in een chroot naar het geïnstalleerde systeem. Meestal is dat precies wat je wilt, maar je kunt ook scripts uitvoeren in de live image van de installer door de optie –nochroot aan het %post-commando toe te voegen. Dat is bijvoorbeeld nuttig om nog extra bestanden te kopiëren van de installatie-image naar het geïnstalleerde systeem.

Voor de volledigheid vermelden we ook nog de %pre-sectie, bedoeld om scripts uit te voeren vóór de eigenlijke installatie. De %pre-sectie heb je enkel nodig voor erg geavanceerde installatiemethodes. Zo zou je bijvoorbeeld de partitielayout dynamisch kunnen genereren in de %pre-sectie, afhankelijk van het aantal schijven in de computer. We verwijzen je graag naar Red Hat’s website voor een voorbeeld (zie referenties). Daar vind je trouwens ook de volledige documentatie van het kickstart-formaat. Is je eigen kickstart-bestand af? Controleer dit dan voor alle zekerheid nog even met “ksvalidator <kickstart-bestand>”. Zo ben je zeker dat het bestand geen syntaxfouten bevat!

Kickstarten maar!

Kopieer het kickstart-bestand nu naar een webserver en download het “netinstall” image van je lokale CentOS-mirror (bijvoorbeeld http://be.mirror.eurid.eu/centos/6.4/isos/i386 voor België). Boot je computer dan vanaf dat image en druk op Tab zodra je het boot-menu te zien krijgt. Nu moet je de url-van je kickstart-bestand als volgt toevoegen aan de commandline (zie afbeelding 2):

ks=http://www.jouw-webserver.be/ks.cfg

Druk daarna op Enter om verder te booten. Het netinstall image start nu Acaconda, leest jouw kickstart-file in, downloadt alle benodigde pakketten en installeert je systeem volledig automatisch. Na de installatie wordt je computer herstart en kan je meteen aan de slag met je nieuwe systeem. Als dat niet gemakkelijk is!

## afb2.png: Afbeelding 2 – Voeg de locatie van jouw kickstart-bestand toe aan de Grub-commandline om de automatische installatie te starten

Preseed

Kickstart is een prima methode om Red Hat-gebaseerde Linux-distributies te installeren, maar uniek is het zeker niet. Ook Debian bevat al jaren een gelijkaardige oplossing, preseed genaamd. Maar om preseed te begrijpen, moeten we eerst een ander Debian-specifieke tool uitleggen: debconf. Debconf is het systeem waarmee alle Debian-pakketten geconfigureerd worden. Je hebt er misschien nog nooit van gehoord, maar wellicht ken je het commando dpkg-reconfigure. Daarmee kun je een pakket volledig opnieuw configureren, alsof je het net geïnstalleerd hebt. Dat is vooral handig als je door handmatige wijzigingen een onwerkbare configuratie gemaakt hebt en niet meer weet hoe je het moet oplossen. dpkg-reconfigure maakt dan een nieuwe configuratie aan op basis van een aantal vragen. Voor het pakket ‘locales’ bijvoorbeeld zal dpkg-reconfigure je vragen welke talen je allemaal wilt gebruiken in Debian. Ook de Debian installer gebruikt eigenlijk debconf om je installatie te configureren. Een preseed-bestand is dus niet meer dan een lijst van debconf-parameters, zodat de installer zijn werk zonder verdere vragen kan doen. In listing 5 zie je een ingekorte en licht aangepaste versie van het standaard preseed-bestand voor Debian Wheezy. De volledig -én uitgebreid gedocumenteerde- versie vind je online (zie referenties).

———-BEGIN LISTING 5———-

d-i debian-installer/locale string nl_BE

d-i keyboard-configuration/xkb-keymap select be

keyboard-configuration keyboard-configuration/xkb-keymap select be

d-i netcfg/choose_interface select auto

d-i netcfg/get_hostname string preseed-test

d-i netcfg/get_domain string localdomain

d-i mirror/country string be

d-i mirror/http/hostname string ftp.be.debian.org

d-i mirror/http/directory string /debian

d-i mirror/suite string wheezy

d-i passwd/root-password password r00tme

d-i passwd/root-password-again password r00tme

d-i passwd/user-fullname string Filip Vervloesem

d-i passwd/username string filip

d-i passwd/user-password password hackme

d-i passwd/user-password-again password hackme

d-i clock-setup/utc boolean true

d-i time/zone string Europe/Brussels

d-i clock-setup/ntp boolean true

d-i partman-auto/method string lvm

d-i partman-lvm/device_remove_lvm boolean true

d-i partman-md/device_remove_md boolean true

d-i partman-lvm/confirm boolean true

d-i partman-lvm/confirm_nooverwrite boolean true

d-i partman-auto/choose_recipe select atomic

d-i partman-partitioning/confirm_write_new_label boolean true

d-i partman/choose_partition select finish

d-i partman/confirm boolean true

d-i partman/confirm_nooverwrite boolean true

d-i partman-md/confirm boolean true

d-i partman-partitioning/confirm_write_new_label boolean true

d-i partman/choose_partition select finish

d-i partman/confirm boolean true

d-i partman/confirm_nooverwrite boolean true

d-i finish-install/reboot_in_progress note

———-EINDE LISTING 5———-

 

Elke regel in het preseed-bestand heeft een vaste syntax, bestaande uit 4 velden:

1. de te configureren component, bijvoorbeeld “d-i” (afkorting voor “debian-installer”)

2. key (de optienaam), bijvoorbeeld “mirror/country”

3. type (wat voor type de optie is), bijvoorbeeld “string”

4. value (de eigenlijk waarde van de optie), bijvoorbeeld “be”

 

Een overzicht van beschikbare opties vind je in het eerder vermelde voorbeeldbestand en in Debian’s online documentatie (zie referenties). Helaas bestaat er geen grafische editor zoals Kickstart Configurator om gemakkelijk preseed-bestanden aan te maken. Je moet je dus behelpen met de voorbeelden, de documentatie en wat experimenteerwerk. Het enige gebruiksvriendelijke alternatief is de website van InstaLinux. Daar kan je op basis van een aantal eenvoudige vragen een eigen preseed-bestanden aanmaken, al toont InstaLinux je slechts een deel van de beschikbare opties. Met ons voorbeeld uit listing 5 installeren we trouwens een Wheezy image met de standaard pakketselectie en aangepaste toetsenbord, taal, tijdzone, hostname, root-wachtwoord en gewone gebruiker. 

Meer mogelijkheden

Maar daar stoppen de mogelijkheden niet. Je kunt ook extra pakketten installeren vanuit preseed. Je kent misschien al de verschillende ‘taken’ die de Debian installer voorstelt, zoals webserver of mailserver. Die selecteer je via tasksel. Maar je kunt natuurlijk ook individuele pakketten selecteren. Die mogen zelfs uit third-party repositories komen, al moet je dan niet vergeten om ook de url van de gpg-key toe te voegen. In listing 6 voegen we eerst de deb-multimedia-repository toe mét de bijbehorende gpg-key. Vervolgens installeren we met tasksel de default desktop environment (Gnome 3), laptop-specifieke pakketten en een ssh-server. Tot slot installeren we nog twee pakketten uit deb-multimedia. Voeg deze regels toe net boven de laatste regel van listing 5.

 

———-BEGIN LISTING 6———-

d-i apt-setup/local0/repository string \

       deb http://www.deb-multimedia.org wheezy main non-free

d-i apt-setup/local0/comment string deb-multimedia.org

d-i apt-setup/local0/key string http://www.jouw-webserver.be/deb-multimedia.gpg

tasksel tasksel/first multiselect desktop, laptop, ssh-server

d-i pkgsel/include string handbrake-gtk, libdvdcss2

———-EINDE LISTING 6———-

 

Verder kun je vanuit het preseed-bestand ook al pakketten configureren, net zoals met dpkg-reconfigure op een bestaand systeem. Je moet dan wel per pakket de precieze opties kennen die via debconf te configureren zijn. De gemakkelijkste manier om die te achterhalen is via het commando “debconf-get-selections | grep <pakketnaam>” op een systeem waar het pakket reeds geïnstalleerd is. Listing 7 bevat een (ingekort) voorbeeld met de opties voor de exim4-mailserver. De gewenste opties van debconf-get-selections kun je zo in het preseed-bestand plakken om toe te passen tijdens installatie. Tot slot kun je nog extra commando’s of scripts uitvoeren vanuit preseed. Voor meer informatie en enkele voorbeelden verwijzen we je naar de online documentatie.

 

———-BEGIN LISTING 7———-

$ debconf-get-selections | grep -i exim4

exim4-config exim4/dc_postmaster <jouw-email-adres>

exim4-config exim4/mailname <hostname>

———-EINDE LISTING 7———-

 

Een preseed-installatie start je door de url van het preseed-bestand mee te geven in het boot-menu van de installer. Voor Debian kan je booten vanaf het netinstall-image, maar dat is met zijn 275MB nog redelijk groot. Na wat speurwerk op Debian’s ftp-server kwamen we nog een “mini image” tegen van slechts 20MB. OM de preseed te starten bleek dit prima te volstaan. In het boot-menu ga je daarvoor naar “Advanced options” en selecteer je “Automated install”. Druk dan op op Tab en voeg de volgende optie toe aan de commandline:

url=”http://www.jouw-webserver.be/preseed.cfg”. Nu is het een kwestie van booten, de installer zijn werk laten doen en rebooten om je nieuwe systeem te gebruiken.

 

## afb3.png: Afbeelding 3 – Ook bij de Debian-installer geef je de locatie van het preseed-bestand gewoon in het boot-menu mee

Onmisbare tools

Met een kickstart- of preseed-bestand kan je Red Hat en Debian-gebaseerde distributies volledig automatisch installeren. Elk formaat heeft zijn eigen syntax, maar de mogelijkheden zijn grotendeels hetzelfde. Het kickstart-formaat is iets eenvoudiger, vooral omdat je vanuit de grafische Kickstart Configurator kunt vertrekken voor een basis kickstart-bestand. Anderzijds biedt preseed meer mogelijkheden om individuele pakketten al tijdens de installatie te configureren. In ieder geval zijn beide tools onmisbaar voor wie vaak nieuwe Linux-installaties uitvoert. Zodra je het gemak van kickstart en preseed gewend bent, zal je nooit meer een manuele installatie willen uitvoeren!

 

Referenties:

Voorbeeld %pre-script in kickstart: https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-preinstallconfig.html#s2-kickstart2-prescript-example

Red Hat kickstart options: https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-options.html

Debian Wheezy preseed.cfg: http://www.debian.org/releases/wheezy/example-preseed.txt

Debian preseeding documentatie: http://www.debian.org/releases/stable/i386/apb.html

InstaLinux: http://www.instalinux.com

Debian Wheezy mini image: http://ftp.debian.org/debian/dists/wheezy/main/installer-i386/current/images/netboot/