Hlavní navigace

Automatická instalace Debianu bez zásahu uživatele

Jakub Vokoun

Přednastavení (preseeding) nám dává možnost odpovědět dopředu na všechny otázky, na které se ptá instalační program. Můžeme tak nakonfigurovat celý proces instalace, který pak probíhá bez našeho zásahu.

Doba čtení: 5 minut

Sdílet

Automatizujeme instalaci

Přednastavení lze využít u všech běžných způsobů instalace, které se liší v možnosti, kde může být soubor s konfigurací umístěn.

Způsob instalace initrd soubor síť
CD/DVD ano ano ano
zavedení ze sítě ano ne ano
z pevného disku (USB) ano ano ano

Použití initrd je univerzální, ale pracnější na přípravu. Má však tu výhodu, že konfigurace je dostupná na začátku instalačního procesu. Oproti tomu soubor umístěný v síti je k dispozici až po jejím nastavení, které musíme udělat ručně.

Používáme-li variantu s initrd, stačí pouze, aby se soubor s konfigurací jmenoval preseed.cfg a nacházel se v kořenovém adresáři initrd. U zbylých způsobů je třeba instalátoru říci, kde má soubor hledat. Použijeme k tomu parametry jádra, které buď umístíme příslušného konfiguračního souboru (např. syslinux.cfg) nebo je předáme jádru ručně při zavádění. Kromě cesty ke konfiguračnímu souboru můžeme také uvést jeho kontrolní součet.

# HTTP
preseed/url=http://pocitac/cesta/k/preseed.cfg
preseed/url/checksum=5da499872becccfeda2c4872f9171c3d

# TFTP
preseed/url=tftp://pocitac/cesta/k/preseed.cfg
preseed/url/checksum=5da499872becccfeda2c4872f9171c3d

# CD
preseed/file=/cdrom/preseed.cfg
preseed/file/checksum=5da499872becccfeda2c4872f9171c3d

# USB
preseed/file=/hd-media/preseed.cfg
preseed/file/checksum=5da499872becccfeda2c4872f9171c3d 

Vytvoření souboru s přednastavením

Konfigurační soubor využívá stejný formát jako debconf-set-selections(1), formát je následující:

<vlastník> <jméno otázky> <typ otázky> <hodnota> 

Při vytváření vlastní konfigurace můžeme vyjít z ukázkového souboru, který si upravíme dle vlastních potřeb. Další možnost je si soubor vytvořit na čerstvě naistalovaném systému, k čemuž je třeba mít nainstalovaný balík  debconf-utils:

$ debconf-get-selections --installer > preseed.cnf
$ debconf-get-selections >> preseed.cnf 

Než soubor použijeme, můžeme je pomocí debconf-set-selections zkontrolovat:

$ head -4 preseed.cfg
#### Contents of the preconfiguration file (for buster)
### Localization
# Preseeding only locale sets language, country and locale.
d-i debian-installer/locale strin en_US

$ debconf-set-selections -c preseed.cfg
warning: Unknown type strin, skipping line 4 

Takto můžeme například odhalit chybu v typu, ale neexistující otázku již ne.

Ukázky přednastavení

Obecné

# Lokalizace
d-i debian-installer/locale string cs_CZ

# Rozložení klávesnice
d-i keyboard-configuration/xkb-keymap select cz

# Nastavení časového pásma
d-i time/zone string Europe/Prague 

Síť

# Síť nemusíme nastavovat vůbec
d-i netcfg/enable boolean false

# Statické nastavení IPv4
d-i netcfg/get_ipaddress string 192.168.1.42
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 192.168.1.1
d-i netcfg/get_nameservers string 192.168.1.1
d-i netcfg/confirm_static boolean true 

Zrcadlo

d-i mirror/country string manual
d-i mirror/http/hostname string http.cz.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string 

Uživatelé

V konfiguračním souboru lze také přednastavit hesla jak pro uživatele root, tak pro běžného uživatele. Můžeme jej uložit v nešifrované podobně (což je samozřejmě bezpečnostní riziko) nebo jako crypt(3) hash.

# Heslo pro uživatele root v nešifrované podobě
d-i passwd/root-password password h3sl0
d-i passwd/root-password-again password h3sl0

# Heslo pro uživatele root jako crypt(3) hash
d-i passwd/root-password-crypted password $6$EdHzCIa7oPqJYLsl$2RGfIdaKkxRXDWi5Y2Q2ENjhNe7LfBXBItf16hTvsYE4PDYWdimt3iLtzXjLPv89RhCbY//4rZGCRbTBffyXq0 

Hash získáme pomocí:

$ mkpasswd -m sha-512 
# Vytvoření běžného uživatele
d-i passwd/user-fullname string Frantisek Prochazka
d-i passwd/username string franta

# Heslo běžného uživatele v čitelném tvaru
d-i passwd/user-password password heslo1
d-i passwd/user-password-again password heslo2

# Heslo bezneho uživatele jako crypt(3) hash
d-i passwd/user-password-crypted password $6$dK0F/EFSR/$ZYGXLMML8jGXrSZXkMtpRu.z7e2UzFTRgkuwXQSHojCDvo2C7Ln9/6WTwuQlpKVAVYt/bKA0CUV/YL2T4tLuF1 

Zadáme-li do proměnných passwd/root-password-crypted nebo passwd/user-password-crypted jako hodnotu vykřičník, bude účet zakázán.

Rozdělení disku

Dělení disku je limitováno možnostmi, které nabízí partman-auto. Při použití celého disku nebo stávajícího volného místa není konfigurace složitá.

# Automatické rozdělení volného místa
d-i partman-auto/init_automatically_partition select biggest_free

# Použití prvního SCSI/SATA disku:
d-i partman-auto/disk string /dev/sda 

Akutálně jsou pro rozdělení disku dostupné tři metody:

  • regular
  • LVM
  • crypto – LVM nad zašifrovanou oblastí
# Použití LVM
d-i partman-auto/method string lvm 

Dále jsou k dispozici tři schémata dělení:

  • atomic -všechny soubory v jedné oblasti
  • home – samostatná oblast /home
  • multi – samostatné oblasti /home, /var a /tmp
# Použití atomic schématu
d-i partman-auto/choose_recipe select atomic 
# Souhlas s rozdělením
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 

Zdrojový repozitář pro debian-installer obsahuje další ukázky konfigurace.

Instalace základního systému

# Neinstalovat doporučené balíky
d-i base-installer/install-recommends boolean false

# Pokud nechceme instalovat jádro
d-i base-installer/kernel/image string none 

Nastavní pro apt

# Povolení sekcí contrib a non-free
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true

# Nasteveni updates a security
d-i apt-setup/services-select multiselect security, updates
d-i apt-setup/security_host string security.debian.org 

Výběr balíků

# Nastavení meta balíků pro tasksel
tasksel tasksel/first multiselect standard, ssh-server

# Vlastní balíky
d-i pkgsel/include string tmux vim mc

# Můžeme povolit popularity contest
popularity-contest popularity-contest/participate boolean true 

Zavaděč

# Je-li Debian jediný OS, nainstaluje se Grub do MBR
d-i grub-installer/only_debian boolean true 

Úprava instalačního ISO obrazu

Takto připravený konfigurační soubor můžeme použít pro modifikování initrd již existujícího ISO obrazu. ISO obraz si samozřejmě můžeme sestavit sami, ale pokud chceme pouze aplikovat přednastavení, rychlejší je úprava již hotového. K manipulaci s initrd využijeme cpio(1).

Instalační ISO obraz rozbalíme a do initrd přidáme  preseed.cfg:

$ mkdir isofiles
$ bsdtar -C isofiles -xf firmware-10.3.0-amd64-netinst.iso
$ chmod +w -R isofiles/install.amd/
$ gunzip isofiles/install.amd/initrd.gz
$ echo preseed.cfg | cpio -H newc -o -A -F isofiles/install.amd/initrd
$ gzip isofiles/install.amd/initrd
$ chmod -w -R isofiles/install.amd/ 

Chceme-li, aby náš ISO obraz nabootoval přímo do instalátoru, je třeba nastavit timeout:

$ chmod +w -R isofiles/isolinux
$ sed -i 's/timeout 0/timeout 50/' isofiles/isolinux/isolinux.cfg
$ echo 'totaltimeout 100' >>  isofiles/isolinux/isolinux.cfg
$ chmod -w -R isofiles/isolinux 

Jelikož jsme měnili existující soubory, je na místě přepočítat jejich kontrolní součty:

Root obecný tip

$ cd isofiles
$ chmod +w md5sum.txt
$ rm md5sum.txt
$ iso_files="$(find -follow -type f | egrep '.*')"
$ for f in $iso_files; do md5sum "$f" >> md5sum.txt done
$ chmod -w md5sum.txt 

Nakonec vytvoříme nový ISO obraz:

$ xorriso -as mkisofs -o preseeded.iso \
    -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
    -c isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot \
    -boot-load-size 4 -boot-info-table isofiles 

Rozhodně testujte

Takto připravený ISO obraz můžeme snadno otestovat například pomocí qemu. Je třeba opatrnosti, pokud je na cílovém stroji více pevných disků nebo pokud nebude Debian jediným operačním systémem. Ukázkový konfigurační soubor z výše uvedeného odkazu nepokrývá automatizaci celého procesu, je proto na místě námi vytvořený obraz předem vyzkoušet.