Clonare una macchina vera in 30 minuti con VirtualBox

Essendo uno sviluppatore mi son reso conto che la virtualizzazione di una macchina è molto comoda perché permette di proseguire con lo sviluppo dell’applicazione principale in contemporanea con (o con, addirittura, l’assenza de) l’hardware sul quale dovrà girare! Ma essendo anche l’amministratore della piccole rete del mio ufficio mi sto rendendo conto di cosa la virtualizzazione può fare anche in altri ambiti.

E’ appunto di questi giorni la «funerea» notizia che il mio server WEB, cioè la macchina che si collega ad internet via ADSL ed incorpora il WEB server del mio ufficio, dove ho su la mia pagina personale, i progetti che seguo ecc., mi sta lasciando… sta cioè letteralmente perdendo i pezzi! Ieri sera un connettore di uno dei dischi RAID di sistema si è staccato dalla motherboard… il server sta continuando ad andare con il disco RAID rimasto, ma fino a quando?

A questo punto mi son trovato davanti a due altrernative:

  1. spendere soldi e comprare una nuova macchina, o
  2. utilizzare il mio file server (che è un dual core con 2GB di RAM e 1TB di hard disk in RAID) per clonare il WEB server e farlo quindi girare su di esso.

Ovviamente ho scelto la seconda soluzione; e di seguito riporto il come ho fatto.

Prima di tutto ho aperto il WEB server ed ho estratto la scheda di rete a 10Mb che utilizzo per collegarlo al modem ADSL e l’ho inserita nel file server. Questo perché, per collegarsi al modem ADSL, ho bisogno di una ethernet dedicata e non posso usare quella che uso normalmente per collegare il file server alla reset dell’ufficio.

Il WEB server nominava eth1 quella scheda di rete, mentre usava eth0 per collegarsi alla reset dell’ufficio. Una volta finito il tutto dovrò riottenere lo stesso risultato.

Poi ho preso l’hard disk del WEB server che si era staccato e l’ho collegato, tramite un adattatore SATA/USB al file server. Questo è quello che vedo (ho isolato solo i dati che ci interessano):

# lshw -c disk
*-disk
description: SCSI Disk
physical id: 0.0.0
bus info: scsi@7:0.0.0
logical name: /dev/sdc
size: 152GiB (163GB)
capabilities: partitioned partitioned:dos
configuration: signature=00041a82

Quindi il mio disco si vede come device /dev/sdc.

A questo punto mi serve Virtualbox. Per installarlo è abbastanza semplice, basta andare sulla homepage del progetto e scaricarsi il file da installare sul prorpio sistema; ma, nel mio caso, avendo un file server basato su debian ho semplicemente aggiunto al file /etc/apt/sources.list le linee:

# Virtualbox
deb http://download.virtualbox.org/virtualbox/debian lenny non-free

e poi ho dato i comandi:

# aptitude update
# aptitude install virtualbox-3.1

Si noti che non ho installato il pacchetto Debian di default virtualbox-ose perché questo è limitato rispetto a quello completo che si trova sui server del progetto.

Una volta installato il tutto dovrebbe essere disponibile il comando VBoxManage:

# VBoxManage
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.

Usage:

VBoxManage [-v|–version]    print version number and exit
VBoxManage [-q|–nologo] … suppress the logo

VBoxManage list [–long|-l] vms|runningvms|ostypes|hostdvds|hostfloppies|
bridgedifs|hostonlyifs|dhcpservers|hostinfo|
hostcpuids|hddbackends|hdds|dvds|floppies|
usbhost|usbfilters|systemproperties

(L’output è stato tagliato perché molto lungo)

In particolare a noi serve il comando per clonare un hard disk reale in un hard disk virtuale leggibile da Virtualbox; a noi serve il comando:

# VBoxManage convertfromraw
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.

Usage:

VBoxManage convertfromraw   <filename> <outputfile>
[–format VDI|VMDK|VHD]
[–variant Standard,Fixed,Split2G,Stream,ESX]
VBoxManage convertfromraw   stdin <outputfile> <bytes>
[–format VDI|VMDK|VHD]
[–variant Standard,Fixed,Split2G,Stream,ESX]

Questo comando legge da un file o dallo standard input ma non da un block device, quindi se si usa la prima versione del comando  dobbiamo prima ricopiare il contenuto dell’hard disk da clonare in un file locale, mentre se si usa la seconda versione occorre prima stabilire la dimensione in byte del disco da clonare.

L’operazione più veloce (e meno ingombrante) è sicuramente la seconda dove, per determinare la dimensione in byte del disco, si può usare il comando fdisk come segue:

# fdisk -l /dev/sdc | head -2

Disk /dev/sdc: 163.9 GB, 163928604672 bytes

Quindi, la clonazione del disco si fa con il comando:

# cat /dev/sdc | VBoxManage convertfromraw stdin goldrake.vdi 163928604672 –format VDI

Questo comando conviene darlo nella directory dove Virtualbox, di default, salva tutti i disk delle macchine vartuali del sistema, nel mio caso, poiché non avevo ancora tale directory, ho fatto:

# cd .VirtualBox
# mkdir HardDisks
# cd HardDisks
# cat /dev/sdc | VBoxManage convertfromraw stdin goldrake.vdi 163928604672 –format VDI
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.

Converting from raw image file=”stdin” to file=”goldrake.vdi”…
Creating dynamic image with size 163928604672 bytes (156335MB)…

Bene, ora il disco è clonato! Ci manca solo una macchina virtuale che lo usi come disco di root.

Per fare questo occorre creare una macchina virtuale che sia la più simile possibile all’hardware da rimpiazzare. Nel mio caso avevo un normale PC pentium con 512MB di RAM, quindi lo posso creare con:

# VBoxManage createvm –name goldrake –ostype Debian –register
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.

Virtual machine ‘goldrake’ is created and registered.
UUID: 0fa789c4-137b-4731-8c3d-ec3c6025ed7f
Settings file: ‘/root/.VirtualBox/Machines/goldrake/goldrake.xml’

Che mi crea la macchina di default:

# VBoxManage showvminfo goldrake
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.

Name:            goldrake
Guest OS:        Debian

A questo punto però devo intervenire con alcuni aggiustamenti. In primis la RAM, abbiamo detto 512MB, quindi:

# VBoxManage modifyvm goldrake –memory 512

La scheda di rete principale deve essere di tipo Bridged collegata ad eth0, e non NAT  come viene impostato di default, così è possibile accedere dalla rete locale al server. Quindi:

# VBoxManage modifyvm goldrake –nic1 bridged –bridgeadapter1 eth0

Per quanto riguarda la scheda di rete secondaria, quella che va al modem ADSL, devo fare in modo che questa sia direttamente collegata alla scheda 10Mb che ho tolto dal WEB server in modo tale che i pacchetti PPPoE passino come prima. Per fare questo faccio esattamente come prima: collego la seconda scheda di rete virtuale in modalità Bridged ad eth1 (la scheda di rete 10Mb proviente dal WEB server):

# VBoxManage modifyvm goldrake –nic2 bridged –bridgeadapter2 eth1

A questo punto occorre verificare che il file server veda questa scheda come eth1 usando il comando ifconfig -a; eseguito il comando mi son accorto che non è mappata come eth1 ma come eth2, colpa di udev, quindi nel file /etc/udev/rules.d/70-persistent-net.rules ho aggiustato la linea della scheda di rete secondaria come segue:

# PCI device 0x1050:0x0940 (ne2k-pci)
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”00:40:95:01:ae:77″, ATTR{dev_id}==”0x0″, ATTR{type}==”1″, KERNEL==”eth*”, NAME=”eth1″

Poi devo fare un modo che la scheda eth1 sia anche accesa al boot (basta che sia «up» senza necessariamente assegnarli un indirizzo IP) altrimenti la macchina virtuale non riuscirà ad utilizzarla. Per far ciò basta mettere nel file /etc/network/interfaces le linee:

 # This card is used by virtual machine goldrake to get connected with the
# Internet throught ADSL (PPPoE)
auto eth1
iface eth1 inet manual
        up ifconfig eth1 0.0.0.0 up

Ora, prima di far partire il nostro nuovo (fiammante e virtuale) WEB server dobbiamo fare in modo che il disco che abbiamo clonato prima sia aggiunto come disco principale (non mi preoccupo qui di ricreare nessun RAID poiché il sistema è virtualizzato e il file server ha già un suo RAID). Prima di tutto creo un SATA controller per la mia macchina virtuale (proprio come il controller del WEB server):

# VBoxManage storagectl goldrake –name ‘HD 163GB sata’ –add sata –controller IntelAhci

Poi collego il disco clonato:

VBoxManage storageattach goldrake –storagectl ‘HD 163GB sata’ –port 0 –device 0 –type hdd –medium goldrake.vdi

Ora siamo pronti per partire! Ridiamo un’occhiata alla configurazione della macchina virtuale, tanto per essere sicuri:

# VBoxManage showvminfo goldrake
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.

Name:            goldrake
Guest OS:        Debian
UUID:            0fa789c4-137b-4731-8c3d-ec3c6025ed7f
Config file:     /root/.VirtualBox/Machines/goldrake/goldrake.xml
Hardware UUID:   0fa789c4-137b-4731-8c3d-ec3c6025ed7f
Memory size:     512MB
VRAM size:       8MB
Number of CPUs:  1
Synthetic Cpu:   off
CPUID overrides: None
Boot menu mode:  message and menu
Boot Device (1): Floppy
Boot Device (2): DVD
Boot Device (3): HardDisk
Boot Device (4): Not Assigned
ACPI:            on
IOAPIC:          off
PAE:             on
Time offset:     0 ms
Hardw. virt.ext: on
Hardw. virt.ext exclusive: on
Nested Paging:   on
VT-x VPID:       on
State:           powered off (since 2010-03-28T09:45:57.000000000)
Monitor count:   1
3D Acceleration: off
2D Video Acceleration: off
Teleporter Enabled: off
Teleporter Port: 0
Teleporter Address:
Teleporter Password:
Storage Controller Name (0):            HD 163GB sata
Storage Controller Type (0):            IntelAhci
Storage Controller Instance Number (0): 0
Storage Controller Max Port Count (0):  30
Storage Controller Port Count (0):      30
HD 163GB sata (0, 0): /root/.VirtualBox/HardDisks/goldrake.vdi (UUID: 9b634097-7714-46ba-aea8-5b9e1749d192)
NIC 1:           MAC: 080027D3C8CB, Attachment: Bridged Interface ‘eth0’, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps
NIC 2:           MAC: 080027FF98E2, Attachment: Bridged Interface ‘eth1’, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps
NIC 3:           disabled
NIC 4:           disabled
NIC 5:           disabled
NIC 6:           disabled
NIC 7:           disabled
NIC 8:           disabled
UART 1:          disabled
UART 2:          disabled
Audio:           disabled
Clipboard Mode:  Bidirectional
VRDP:            disabled
USB:             disabled

USB Device Filters:

<none>

Shared folders:  <none>

Guest:

Statistics update:                   disabled

Ok, e tutto a posto, lanciamo la nostra macchina virtuale con:

# VBoxHeadless -startvm goldrake 
Sun VirtualBox Headless Interface 3.1.6
(C) 2008-2010 Sun Microsystems, Inc.
All rights reserved.

Listening on port 3389.

Bene, la macchina è partita e possiamo seguire la sequenza di boot utilizzando rdesktop da una qualunque macchina della rete locale. Io ho usato:

$ rdesktop -a 16 -N 192.168.32.254:3389

Bene! Il boot è partito e il sistema Debian/Linux che implementa il mio WEB server non si è assoultamente accorto che ora non sta più girando su una macchina vera ma bensì su una macchina virtuale! Fantastico!

Proviamo subito se riesco ad entrare prima in locale via SSH come facevo prima:

$ ssh root@goldrake
Password:
Linux goldrake 2.6.30-1-686 #1 SMP Sat Aug 15 19:11:58 UTC 2009 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Mar 28 16:13:18 2010

Sìììì! Funziona! Ma ora viene il bello, vediamo se riesco a collegarmi in rete via ADSL con questa macchina virtuale appena creata:

$ links2 -dump ‘http://www.consulenti-ict.it’ | head
Nome utente  ___________   Password  ___________   [  ]    Recupera Nome
utente/Password     Registrati

* Home          
* Staff       
* Contatti     
* News        
* Mail list   
* Eventi      

Direi che funziona alla grande no? ;)

Una nota prima di chiudere: in realtà non sono riuscito ad entrare subito via SSH… né a collegarmi ad internet, questo perché nel solito file /etc/network/interfaces del vecchio WEB server le interfaccie di rete erano mappate sulle vecchie schede di rete. Per risolvere al volo il problema mi son semplicemente loggato nel sistema dalla console ottenuta con rdesktop ed ho modificato il suddetto file come segue:

# SUBSYSTEM==”net”, DRIVERS==”?*”, ATTR{address}==”00:13:8f:41:ad:86″, NAME=”eth0″

# SUBSYSTEM==”net”, DRIVERS==”?*”, ATTR{address}==”00:40:95:01:ae:77″, NAME=”eth1″

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”08:00:27:d3:c8:cb”, ATTR{dev_id}==”0x0″, ATTR{type}==”1″, KERNEL==”eth*”, NAME=”eth0″

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”08:00:27:ff:98:e2″, ATTR{dev_id}==”0x0″, ATTR{type}==”1″, KERNEL==”eth*”, NAME=”eth1″

Poi ho fatto ripartire il sistema e tutto è andato come doveva.


P.S. I 30 minuti che ho indicato nel titolo, ovviamente, sono al netto del tempo che ci vuole per clonare un hard disk da 163GB…

Su Rodolfo Giometti

Ingegnere informatico libero professionista ed esperto GNU/Linux offre supporto per: - device drivers; - sistemi embedded; - sviluppo applicazioni industriali per controllo automatico e monitoraggio remoto; - corsi di formazione dedicati. Manutentore del progetto LinuxPPS (il sottosistema Pulse Per Second di Linux) contribuisce attivamente allo sviluppo del kernel Linux con diverse patch riguardanti varie applicazioni del kernel e dispositivi (switch, fisici di rete, RTC, USB, I2C, network, ecc.). Nei 15+ anni di esperienza su Linux ha lavorato con le piattaforme x86, ARM, MIPS & PowerPC.

Lascia un commento

Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi