Table of Contents

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:

  1. 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'
  2. Avviare ad esempio con CD Knoppix la macchina destinazione.
  3. Preparare le partizioni destinazione e il RAID1:
    fdisk /dev/hda
    mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/hda1 missing
  4. 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 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:

  1. 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.
  2. 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-<version> 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:

Verificare poi il contenuto di questi file prima di fare reboot:

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