====== Clonazione di una macchina Linux ======
Per creare un clone di un sistema Linux (test su Debian Lenny) si può effettuare un dump di tutte le partizioni originali, quindi sul sistema destinazione si creano le partizioni e si effettua il restore. Il caso si complica un po' se il sistema è interamente su RAID1 software e il kernel non è monolitico.
Un kernel monolitico non ha bisogno di caricare moduli per completare il bootstrap, quindi ha compilato staticamente il supporto per il RAID, il filesystem ext3, il controller del disco... e tutto quanto il necessario. Un kernel modulare invece ha bisogno di un file **initrd** che contiene almeno i moduli necessari al boot.
Una procedura di clonazione potrebbe essere questa:
- Fare il dump di tutte le partizioni, eventualmente con salvataggio remoto:
dump -0 -a -b 128 -f - /dev/md0 \
| ssh niccolo@pigbox.rigacci.org 'cat > md0.dump'
- Avviare ad esempio con CD Knoppix la macchina destinazione.
- Preparare le partizioni destinazione e il RAID1:
fdisk /dev/hda
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/hda1 missing
- Fare il restore del dump:
mke2fs -j /dev/md0
mount /dev/md0 /mnt
cd /mnt
restore -f /tmp/md0.dump
Si possono presentare alcuni problemi qui di seguito elencati.
===== Spazio per il boot loader =====
Se la partizione RAID deve contenere la directory /boot (di solito cioè la partizione con il root filesystem) potrebbe essere necessario creare il volume RAID con un parametro **''%%--metadata%%''**, come in questo esempio:
mdadm --create /dev/md0 --metadata=0.90 -l1 -n2 /dev/sda1 /dev/sdb1
===== Boot loader e kernel =====
Si deve essere sicuri di **installare il boot loader**, ad esempio **GRUB**. Se il kernel è monolitico (contiene tutti i driver per completare il bootstrap) la cosa è molto semplice:
chroot /mnt
grub --no-floppy --device-map=/dev/null
grub> device (hd0) /dev/hda
grub> root (hd0,0)
grub> setup (hd0)
grub> quit
Se invece **il kernel è modulare** (ad esempio il supporto RAID o ext3 sono compilati come moduli, come nel caso dei kernel Debian) l'installazione del GRUB va fatta con **''grub-install''** (perché? Ditemelo!) e bisogna anche ricreare l'immagine **initrd**. Attenzione a quando si esegue **''mkinitrd''**, si deve specificare esattamente la versione del kernel da usare che in generale non è quella in esecuzione in quel momento:
chroot /mnt
grub-install
mkinitrd -o /boot/initrd.img-2.6.18-4-486 2.6.18-4-486
In Debian Lenny esistono due pacchetti con tool per la creazione dell'immagine initrd: **yaird** e **initramfs-tools**, il vecchio pacchetto **initrd-tools** che conteneva **''mkinitrd''** è stato mandato in pensione (vedere il [[http://kernel-handbook.alioth.debian.org/ch-initrd.html|Manuale Debian Linux Kernel]]). Il tool più moderno e flessibile - ma che genera immagini più ingombranti - è **initramfs-tools** che contiene il comando **update-initramfs**. Si può usare con un comando del tipo:
update-initramfs -u -k all
===== RAID =====
==== Kernel monolitico ====
Nel caso di **kernel monolitico** la cosa più sicura è indicare tramite GRUB quali volumi RAID assemblare, ed evitare l'autodetect. Si aggiunge una riga in ''/boot/grub/menu.lst'', del tipo:
kernel /boot/vmlinuz-2.6.18-4-486 raid=noautodetect md=0,/dev/hda1,/dev/hdc1
Nel caso di un kernel modulare si deve verificare le seguenti cose:
- Eseguire **''dpkg-reconfigure mdadm''**, specificare che si ha il root filesystem su RAID e che si vuole l'avvio automatico di tutti i volumi RAID.
- Creare un opportuno file di configurazione **''/etc/mdadm/mdadm.conf''** in modo che tutti i volumi siano conosciuti e avviati in automatico:
DEVICE partitions
ARRAY /dev/md0 devices=/dev/hda1,/dev/hdc1
ARRAY /dev/md1 devices=/dev/hda5,/dev/hdc5
MAILADDR root
Le operazioni di cui sopra dovrebbero garantire anche che **''mdadm''** crei gli opportuni **''/dev/mdN''** interagendo con **''udev''**.
==== Kernel modulare ====
Nel caso di **kernel modulare** bisogna stare attenti all'immagine **''%%/boot/initrd.img-%%''** perché contiene una copia di **''/etc/mdadm/mdadm.conf''**. Al bootstrap il kernel assembla i volumi raid secondo il contenuto di quel file, ignorando gli eventuali parametri **md=0,...** e ignorando il modo in cui sono stati assemblati la volta precedente.
Se il file ''/etc/mdadm/mdadm.conf'' non esiste allora viene fatto l'autodetect sfruttando l'informazione contenuta nei volumi raid sul modo in cui è stato fatto l'ultimo ''%%--assemble%%''. Per modificare questa informazioni si deve **assemblare il volume nel modo desiderato ed utilizzarlo** (ad esempio facendo un ''mount'' per un volume normale o uno ''swapon'' per un volume swap).
L'immagine **initramfs** è un archivio //cpio// //gzipped//, per estrarne il contenuto in una directory:
mkdir tmp; cd tmp
zcat /boot/initrd.img-2.6.18-4-686 | cpio --extract --make-directories
Per ottenere un file ''mdadm.conf'' corretto nell'immagine ram-disk bisogna prima editare il file in uso (''/etc/mdadm/mdadm.conf'') e poi eseguire:
update-initramfs -u -k all
Nella immagine risultante controllare il contenuto dei file:
* **''/etc/mdadm/mdadm.conf''**
* **''/conf/md.conf''** oppure **''/conf/conf.d/md''**
Verificare poi il contenuto di questi file prima di fare reboot:
* **''/etc/mdadm/mdadm.conf''**
* **''/etc/fstab''**
* **''/boot/grub/menu.lst''**
* **''/var/lib/mdadm/mdadm.conf-generated''** (a che serve?)
Se si volesse **alterare manualmente il contenuto** di una immagine **initramfs** è sufficiente scompattarla in una directory, apportare le modifiche necessarie e poi creare nuovamente l'archivio compresso con:
find | cpio -H newc -o | gzip -9 > ../my_initramfs.img
===== Schede Ethernet =====
In un sistema Debian Lenny il nome alle schede Ethernet (eth0, eth1, ...) viene assegnato staticamente. Questo vuol dire che in caso di sostituzione di una scheda o spostamento delle stesse negli slot PCI i nomi non vengono mescolati ma restano fissati al MAC address. Nel caso si cloni un sistema con due schede Ethernet (eth0 ed eth1) ci troveremmo quindi con due schede Ethernet nominate **eth2** e **eth3**.
Questo è causato dallo script **''/etc/udev/rules.d/z45_persistent-net-generator.rules''** il cui risultato viene salvato nel file
**''/etc/udev/rules.d/z25_persistent-net.rules''**
Per cancellare l'associazione nome scheda con il MAC address è sufficiente editare quest'ultimo file.
Per inibire questo automatismo ed assegnare ex-novo ad ogni boot i nomi alle schede di rete, basta commentare l'esecuzione di **write_net_rules** nello script di cui sopra. Si tratta di file di configurazione, quindi viene mantenuto in caso di upgrade.
===== kexec per fare boot senza reboot =====
kexec --load kernel-image --append=command-line-options --initrd=initrd-image