Table of Contents

Processo di avvio (soluzioni)

Soluzione Esercitazione 1

La macchina si blocca sul prompt di GRUB2:

           Minimal BASH like line editing is supported. For the first word,
           TAB lists possible command completions. anywhere else TAB lists
           possible device or file completions.                           

grub>

Digitare il comando ls per visualizzare la lista dei dischi e delle relative partizioni

grub> ls
(hd0) (hd0,msdos5) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1)

La macchina ha un solo disco (hd0) e quattro partizioni MBR (hd0,msdosn).

Eseguite un ls di ogni partizione e individuate la partizione di root e di boot del sistema. L'etichetta (Label) indicata puo' aiutarvi.

Una volta individuata il root filesystem segnatevi l'etichetta indicata ed utilizzatela per come valore del parametro root del kernel. Sempre attraverso il comando ls cercate il percorso del kernel e dell'initramfs.

Avviate il sistema utilizzando i comandi kernel16 e initrd16 di Grub2. Aiutatevi con il tasto TAB per completare i percorsi.

grub> linux16 (hd0,msdos1)/vmlinuz-3.10.0-693.21.1.el7.x86_64 root=LABEL=root01
grub> initrd16 (hd0,msdos1)/initramfs-3.10.0-693.21.1.el7.x86_64.img
grub> boot

Se tutto e' stato eseguito alla lettera la macchina partira' normalmente… o quasi: nessun prompt di console viene visualizzato. Qualcosa ancora non va.

Far ripartire la VM (Machine → Reset dal menu della finestra VirtualBox) ed avviare il sistema in modalita' rescue

grub> linux16 (hd0,msdos1)/vmlinuz-3.10.0-693.21.1.el7.x86_64 root=LABEL=root01 systemd.unit=rescue.target
grub> initrd16 (hd0,msdos1)/initramfs-3.10.0-693.21.1.el7.x86_64.img
grub> boot

La macchina partira' e si blocchera su questo output:

Give root password form maintenance:

Purtroppo non conosciamo la password di root: dobbiamo sovrascriverla:

Bootstrap in modalita' rd.break

Tornare nuovamente alla prompt di grub riavviando la macchina. Far partire il kernel con il parametro rd.break

grub> linux16 (hd0,msdos1)/vmlinuz-3.10.0-693.21.1.el7.x86_64 root=LABEL=root01 rd.break
grub> initrd16 (hd0,msdos1)/initramfs-3.10.0-693.21.1.el7.x86_64.img
grub> boot

L'avvio si blocca durante l'esecuzione dell'initramfs, prima dello switch sul filesystem di root (pivot).

switch_root:/#

Ora e' necessario che rimontiate il root filesystem (/sysroot) in scrittura ed eseguiate un chroot sulla directory

switch_root:/# mount -o remount,rw /sysroot
switch_root:/# chroot /sysroot
sh-4.2#

A questo punto potete eseguire un semplice passwd per modificare la pasword di root

Bene, ora riavviate in rescue.mode ed inserite la password di root, siete ad un passo dal successo. Rimane da capire perche' la console non mostrasse il prompt di login. Controllate ad esempio lo stato del servizio di virtual terminal (getty):

[root@localhost ~]# systemctl status getty@tty1
● getty@tty1.service - Getty on tty1
   Loaded: loaded (/usr/lib/systemd/system/getty@.service; disable; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:agetty(8)
           man:systemd-getty-generator(8)
           http://0pointer.de/blog/projects/serial-console.html

Trovato! La console e' disabilitata! E' sufficiente abilitarla:

[root@localhost ~]# systemctl enable getty@tty1

Rimane da capire perche' la macchina non mostri il menu di GRUB2 all'avvio. Verificate il file di configurazione /boot/grub2/grub.cfg:

[root@localhost ~]# ls /boot/grub2/grub.cfg
ls: cannot access /boot/grub2/grub.cfg: No such file or directory

Perfetto, il file non e' presente. Per crearlo eseguite:

[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

Riavviate la macchina. Eseguite il login. L'umanita' e' salva.

.

.

.

.

.

.

.

.

.

Soluzione Esercitazione 2

I moduli di Dracut si trovano nella directory /usr/lib/dracut/modules.d/.

Create una directory in /usr/lib/dracut/modules.d/

[root@localhost ~]# mkdir /usr/lib/dracut/modules.d/99banner/

Create lo script di inizializzazione del modulo /usr/lib/dracut/modules.d/99banner/module-setup.sh:

#!/bin/bash

check() {
    require_binaries /usr/bin/figlet
}

depends() {
    return 0
}

install() {
#
# Include figlet banner creator and a font file 
#
    inst /bin/figlet
    inst /usr/share/figlet/big.flf
    inst_hook pre-pivot 99 "${moddir}/banner.sh"
}

Create lo script che effettivamente sara' eseguito /usr/lib/dracut/modules.d/99banner/banner.sh:

#!/bin/sh

# Parses the infnbanner commandline options
#
#Bootparameters:
#infnbanner=string    custom banner

type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh

infnbanner=$(getarg infnbanner)

[ -n "$infnbanner" ] && /usr/bin/figlet -f /usr/share/figlet/big.flf "$infnbanner" > /dev/console

sleep 2

A questo punto, se tutto e' stato eseguito correttamente, il modulo banner sara' incluso tra quelli disponibili:

[root@localhost ~]# dracut --list-modules|grep banner
banner

Create ora un initram fs che includa il modulo banner:

[root@localhost ~]# dracut --add banner -f /boot/initramfs-infnbanner.img

Verificate che nell'initramfs siano presenti i file necessari:

[root@localhost ~]# lsinitrd /boot/initramfs-infnbanner.img |grep -e usr/bin/figlet -e usr/share/figlet/big.flf -e 99-banner.sh
-rwxr-xr-x   1 root     root        45064 Apr 11 09:55 usr/bin/figlet
-rwxr-xr-x   1 root     root          412 Apr 11 08:12 usr/lib/dracut/hooks/pre-pivot/99-banner.sh
-rw-r--r--   1 root     root        26384 Dec 11  2015 usr/share/figlet/big.flf

Configurate il menu di GRUB2 aggiungendo il parametro del kernel infnbanner=QUELLOCHEVOLETE e rimuovendo rhgb e quiet

[root@localhost ~]# grubby --args=infnbanner=QUELLOCHEVOLETE --remove-args="rhgb quiet" --update-kernel=ALL

Ora testate la configurazione riavviando la macchina. ATTENZIONE: e' necessario modificare il menu di avvio "on the fly" in modo da caricare l'initramfs creato in precedenza.

Se tutto funziona e' giunto il momento di rendere persistene la modifica, creando una sezione menuentry che includa l'initramfs initramfs-infnbanner.img ed il parametro del kernel infnbanner

[root@localhost ~]# cat << EOF >> /etc/grub.d/40_custom
menuentry 'CentOS INFN Banner' --class rhel fedora --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'CentOS-INFN-Banner' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  d1af0011-5f50-4ff7-9b13-8924e42be36e
	else
	  search --no-floppy --fs-uuid --set=root d1af0011-5f50-4ff7-9b13-8924e42be36e
	fi
	linux16 /vmlinuz-3.10.0-693.21.1.el7.x86_64 root=UUID=f67e9992-dc45-4a53-899e-c09afb6a546d ro crashkernel=auto infnbanner=CentOS-INFN
	initrd16 /initramfs-infnbanner.img
}
EOF

Create ora il fiel di configurazione di GRUB2:

[root@localhost ~]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.save
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

Verificate che tutto sia andato a buon fine riavviando la VM e selezionando la voce di menu 'CentOS INFN Banner'