giovedì 10 gennaio 2008

Macchina virtuale per VMware "da zero" (parte II)

Provo ora a costruire un hard disk virtuale. La prima buona notizia è che, a differenza del file di configurazione vmx, il file vmdk, che definisce i dischi, ha una documentazione ufficiale scaricabile dal sito di VMware. Mi sembra abbastanza chiara. Prima di tutto viene definito cosa è un disco virtuale. In generale un disco può essere composto da una catena di link dove il primo elemento è il disco base e tutti i successivi (collegati in catena) sono i delta link che vengono creati ogni volta che viene generato uno snapshot (cioè una foto istantanea) del disco. Questa architettura permette di avere quindi delle istantanee in momenti precisi e poter eventualmente ripristinare il disco a questi punti. A me per ora interessa creare solamente un "disco base", quindi cercherò di evitarmi complicazioni in questo senso. Ogni link è composto da uno o più extent, un extent è uno spazio "fisico" nel quale sono memorizzati i dati e generalmente è un file del sistema "reale" (ma potrebbe essere anche un hard disk reale o una partizione di un hard disk reale)
  • il link può utilizzare un singolo extent oppure l'insieme di più piccoli extent
  • lo spazio utilizzato può essere allocato tutto in fase di creazione del disco, oppure può crescere dinamicamente nel momento in cui c'è l'esigenza di archiviare i dati.
La struttura di link di un disco virtuale è definita in un file di configurazione ("descriptor file", cioè un file di testo con estensione .vmdk) Dopo questa premessa (essenziale per capire) inizio a creare il file di configurazione (xubuntu.vmdk) secondo le specifiche. Prima di tutto la versione che è 1:
version = 1
Successivamente devono essere inseriti due parametri che definiscono un identificativo univoco del link (CID) e l'identificativo del link padre (parentCID). Gli identificativi sono valori casuali a 32bit e nel file di configurazione sono espressi in forma esadecimale. Nel mio caso il disco base non ha un link padre, quindi parentCID deve essere impostato ad un valore predefinito che da specifiche è (~0x0) (cioè la negazione di uno zero che nella rappresentazione esadecimale diventa ffffffff). In pratica i parametri da impostare sono:
CID=fffffffe
parentCID=ffffffff
Il parametro successivo consente di definire il tipo di disco. Tra le varie opzioni possibili scelgo "twoGbMaxExtentSparse" che genera, per ogni link, diversi extent (con una dimensione massima di 2Gb ciascuno) e alloca lo spazio dinamicamente (così non ho bisogno di occupare effettivamente tutto lo spazio del disco virtuale. Scrivo quindi: createType="twoGbMaxExtentSparse" Ora devono essere definiti i singoli extent. Vorrei un disco da 10Gb, quindi lo costruisco con 5 extent di 2Gb l'uno. La sintassi per definire un extent è la seguente:
modalità dimensione tipo nome
modalità
indica se è in scrittura o in sola lettura, imposto RW (lettura e scrittura)
dimensione
è la dimensione dell'extent espressa in settori, 1 settore = 512 byte. Se voglio un extent da 2 Gb scrivo 2 * 1024 * 1024 * 1024 / 512 = 4194304
tipo
uso SPARSE che indica che lo spazio viene allocato solo quando serve
nome
è il nome del file che contiene i dati. Utilizzando la sintassi consigliata lo chiamo xubuntu-s0001.vmdk la "s" indica che è di tipo SPARSE mentre 0001 è un numero progressivo. Riassumendo scrivo:
RW 4194304 SPARSE "xubuntu-s0001.vmdk"
RW 4194304 SPARSE "xubuntu-s0002.vmdk"
RW 4194304 SPARSE "xubuntu-s0003.vmdk"
RW 4194304 SPARSE "xubuntu-s0004.vmdk"
RW 4194304 SPARSE "xubuntu-s0005.vmdk"
L'ultima parte del file di descrizione del disco definisce come sarà visto l'hardware dalla macchina virtuale. È necessario definire il tipo di interfaccia (adapterType) che imposto a "ide" e la geometria del disco; uest'ultima mi risulta un po' più complessa da capire, e deve essere coerente con la dimensione effettiva del disco. Un'altra volta proverò ad approfondire il significato dei parametri, per ora mi limito ad utilizzare questa tabella. Quindi, copiando, scrivo:
ddb.adapterType = "ide"
ddb.geometry.sectors = "63"
ddb.geometry.heads = "16"
ddb.geometry.cylinders = "16383"
Ora il file di configurazione dovrebbe essere completo. Mi resta solo un dubbio. I file del disco (xubuntu-s0001.vmdk) vengono generati direttamente da VMPlayer all'avvio o devono già esistere? Proviamo a partire senza. Niente: non parte! Proviamo a partire generando dei file vuoti... non parte! Probabilmente è necessario generare i file degli extent già nel formato corretto. La cosa è diventata un po' più complessa del previsto. Ma penso che questa sarà un'altra puntata!

Nessun commento: