Vi possono essere diversi motivi che portano alla perdita della tabella delle partizioni o alla sua corruzione. Nel caso di datastore VMFS le possibili cause sono: resignature da un altro sistema (ad esempio il backup server, nel caso funzioni in SAN mode), un errore umano (basta eseguire, su dischi condivisi, da vSphere Client un Datastore / Delete da un ESXi non ancora collegato al vCenter Server), o anche a causa di qualche problema lato storage (mi è capitato proprio questo caso di recente su uno storage entry level).
Al verificarsi di queste situazioni, di solito, la partizione VMFS è in realtà ancora presente e soprattutto lo sono i relativi dati, manca “solo” l’informazioni di dove inizia e finisce la partizione. Ma questo può essere semplicissimo da ricostruire a patto che applichiate sempre la recommended practice relativa ai datastore VMFS: uno e uno solodatastore per ogni disco, ossia un’unica partizione del massimo della capacità. In questo modo l’ultimo cilindro sarà l’ultimo disponibile sul disco e il primo quello che viene usato per l’allineamento, dato che le partizioni VMFS sono di norma allineate, a parte alcuni casi particolari su sistemi con il vecchio ESX (di fatto il disco creato durante l’installazione di ESX non era mai allineato).
Il problema è che per ricostruire la tabella delle partizioni vi serviranno tool diversi (anche se in teoria si potrebbe fare tutto con il secondo) in base al tipo di tabella delle partizioni:
- Per i dischi in formato MBR bisogna (o comunque è più semplice) usare il comando fdisk (tra l’altro relativamente facile per chi ha già esperienza con Linux).
- Per i dischi nel nuovo formato GPT bisogna usare partedUtil (dato che fdisk non è supportato su questi dischi) che è diverso e leggermente più complicato.
Ricordiamo che a partire da ESXi 5.0 il nuovo formato di default è prioprio il GPT. Ma se è certo che su ogni datastore VMFS3 il formato è sicuramente quello MBR, non è deterministico che un VMFS5 sia sempre in formato GPT: è vero per quelli nuovi creati da zero, ma non è sempre vero per quelli convertiti da VMFS3 (per maggiori informazioni vedere questo post). In generale i datastore VMFS3 aggiornati a VMFS5 rimangono in formato MBR, fino a quando non vengono poi estesi oltre i 2 TB, in quel caso vengono convertiti in GPT (con una nota sull’allineamento che vedremo dopo).
Quindi per ESX/ESXi fino alla versione 4.1 inclusa si è sicuri di avere VMFS3 e quindi dischi MBR. A partire da ESXi 5.0 bisogna controllare il tipo di dischi per conoscerne il formato (si può facilmente scoprire con il comando fdisk -l).
Come recuperare una partizione VMFS su un disco MBR
La KB 1002281 (Recovering a lost partition table on a VMFS volume) descrive esaustivamente i passi richiesti:
- Accedere ad ESX/ESXi usando la console. Per ESXi, vedere Tech Support Mode for Emergency Support (1003677)
- Eseguire il comando:
fdisk -l - Individuare il disco “compromesso” (sarà quello senza alcuna partizione) e segnarsi il relativo nome (qualcosa del tipo /dev/disks/…)
- Eseguire il comando fdisk per ripartizionare il disco corrotto usando la sintassi:
fdisk -u /dev/disks/… - Creare la partizione mancante usando i seguenti comandi di fdisk:
- Premere n (e Invio) per creare una nuova partizione.
- Premere p (e Invio) per crearla di tipo primaria.
- Premere 1 (e Invio) per specificare che sarà la prima partizione.
- Scrivere 128 (e Invio) per allineare la partizione al settore 128.
- Premere Invio per usare il valore di default (ultimo settore dispobile).
- Cambiare il tipo di partizione nel formato fb (VMFS):
- Premere t (e Invio). Notare che la partizione 1 sarà automaticamente selezionata (essendo l’unica).
- Scrivere fb (e dare Invio) .
- Premere w (e Invio) per salvare la tabella delle partizioni.
- Eseguire vmkfstools -V per il rescan dei datastore VMFS.
Come recuperare una partizione VMFS su un disco GPT
A differenza di fdisk, il comando partedUtil non è per nulla interattivo e richiede un po’ di attenzione e una maggior conoscenza sulla sintassi. Per maggiori informazioni potete consultare la KB 1036609(Using the partedUtil command line utility on ESXi/ESX).
Il passi sono comunque concettualmente simili al caso precedente. Prima di tutto bisogna raccogliere le informazioni sui dischi con il comando fdisk -l
Come si può notare il secondo disco è senza alcuna partizione. Da questa schermata otteniamo già tutte le inforazioni che ci serviranno per procedere, in particolare il nome del disco e i settori utilizzabili dello stesso. Questa seconda parte è pure ottenibile con il comando specifico partedUtil getUsableSectors
:
Questi numeri sono estremamente importanti perchè l’ultimo settore disponibile è quello derivato dalla differenza (nell’esempio 20971520 – 34 = 20971486).
A questo punto è possibile usare il comando partedUtil setptbl
per creare la partizione mancante. La sintassi è:
partedUtil setptbl diskName label "partNum startSector endSector type/guid attr"
Il diskName è stato ottenuto in precedenza con fdisk -l output, mentre label è semplicemente il valore gpt. Più complessa la seconda parte che è composta da diversi valori:
- Il valore
startSector
è di norma 2048 (l’allineamento usato per VMFS-5 nativi).
Nota: in realtà volumi VMFS-3 aggiornati a VMFS-5 continuano ad avere l’inizo al settore 128, anziché 2048. - Il valore
endSector
è stato calcolato con la differenza spiegata in precedenza dei valori ottenuti dapartedUtil getUsableSectors
.
Nota: il realtà il numero più piccolo pare essere sempre 34. - Il valore
type
è il tipo di partizione e per VMFS è AA31E02A400F11DB9590000C2911D1B8. - Il valore
attribute
è un numero che vale128
, per la partizione bootable e semplicemente0
per tutte le altre.
Quindi nell’esempio precedente il comando sarebbe (nota: è solo un esempio rapportato ai valori della schermata precedente, non eseguitelo sul vostro sistema!):
partedUtil setptbl /dev/disks/mpx.vmhba1:C0:T1:L0 gpt "1 2048 20971486 AA31E02A400F11DB9590000C2911D1B8 0"
Attenzione: non c’è alcun undo (su fdisk basta fare q al posto di w e si annulla qualunque modifica). Quindi prestate molta attenzione a questo tipo di comando.