ESXi (4) : Accès direct à un disque (Raw Device Mapping)

27 décembre 2012

ESXi permet de donner aux VM des accès directs à certains périphériques. Si j'ai bien compris, cette fonctionnalité est normalement prévue pour fonctionner sur du matériel serveur et se gère depuis la console d'administration. Mais dans le cas des disques dur, il existe un moyen plus ou moins détourné d'en profiter sur la version gratuite installée sur un pc de bureau.

Avant de commencer, je tiens à dire que ce genre de manipulation n'est apparemment pas supporté officiellement, c'est donc à vos risques et périls comme on dit. D'autre part, j'ai trouvé ces informations sur un site, mais ce n'est pas vraiment un sujet que je maîtrise, donc il se peut que j'emplois des termes faux ou imprécis, je vous donne juste la démarche que j'ai suivi pour faire fonctionner l'ensemble sur mon serveur.

Le principal intérêt de cette utilisation, c'est de pouvoir transférer les disques vers / depuis un autre système ou machine, tout en conservant leur contenu. Dans mon cas par exemple, mon serveur possède 3 disques assignés de cette façon à la VM principale (sous Debian Squeeze), qui l'utilise en raid5 pour stocker toutes nos données. Je pourrai, en cas de besoin, brancher ces 3 disques dans un autre pc sous linux et accéder au données du raid sans rien n'avoir à faire.

Je n'ai jamais eu à le faire en conditions réelles, mais avant de mettre en service le serveur, j'avais fait un test qui s'était avéré concluant. D'autre part, suite à une petite mésaventure qui m'est arrivée il y a quelques temps, j'ai pu constater qu'après une réinstallation de l'hôte et de la VM, le raid a été accessible sans aucune manipulation de ma part (même pas de reconstruction).

Côté performances, contrairement à ce que l'on pourrait croire, il n'y a apparemment pas de gain significatif : voir par exemple un test pris au hasard sur le net.

Avant de commencer, assurez vous d'avoir activé l'accès SSH sur l'hôte, voir le billet ESXi (3) : Mise à jour, et ouvrez une session avec votre client ssh favoris.

Identification des disques

Normalement si vous êtes ici, c'est que vous avez au moins 2 disques dans votre hôte ESXi, un qui contient le système et compose le datastore principal, et un que vous souhaitez mapper afin de lui donner un accès direct depuis une VM. Il va donc falloir identifier le(s) disque(s) sélectionné(s). La commande fdisk -l va nous aider pour cela :

~ # fdisk -l

Disk /dev/disks/t10.ATA_____WDC_WD6400AAKS2D22A7B2________________________WD2DWCASY5910182: 640.1 GB, 640135028736 bytes
255 heads, 63 sectors/track, 77825 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks  Id System
/dev/disks/t10.ATA_____WDC_WD6400AAKS2D22A7B2________________________WD2DWCASY5910182p1               1       77825   625129281  fd Linux raid autodetect


Disk /dev/disks/t10.ATA_____MAXTOR_STM380215AS__________________________________5QZ2TS7C: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks  Id System
/dev/disks/t10.ATA_____MAXTOR_STM380215AS__________________________________5QZ2TS7Cp1   *           1          45      358400   7 HPFS/NTFS
Partition 1 does not end on cylinder boundary
/dev/disks/t10.ATA_____MAXTOR_STM380215AS__________________________________5QZ2TS7Cp2              45        9730    77790208   7 HPFS/NTFS

Le résultat n'est ici pas très lisible car le blog n'est pas large alors que le résultat de la commande est tout en largeur (je n'ai d'ailleurs pas tout affiché pour simplifier). Si vous en avez la possibilité, ajustez la taille de votre console en fonction.

Bref, on voit ici 2 disques (qui sont déjà mappés, ce qui explique les partitions) : un Maxtor de 80Go et un Western Digital de 640Go qui est celui pour lequel je veux créer le mapping et dont l'identifiant est :

__t10.ATA_____WDC_WD6400AAKS2D22A7B2________________________WD2DWCASY5910182

Ce n'est pas cet identifiant qui est utilisé par ESXi pour désigner le disque, mais l'identifiant VML, il va donc falloir aussi le trouver. Pour cela, le dossier /vmfs/devices/disks contient une liste des disques ainsi que les identifiants VML sous forme de lien symbolique. Il suffit donc de lancer un ls /vmfs/devices/disks/ -l afin de trouver la correspondance (toujours pour ne pas trop charger l'affichage sur le blog, je n'ai pas ajouté l'option -l :

~ # ls /vmfs/devices/disks/
t10.ATA_____MAXTOR_STM380215AS__________________________________5QZ2TS7C
t10.ATA_____MAXTOR_STM380215AS__________________________________5QZ2TS7C:1
t10.ATA_____MAXTOR_STM380215AS__________________________________5QZ2TS7C:2
t10.ATA_____WDC_WD6400AAKS2D22A7B2________________________WD2DWCASY5910182
t10.ATA_____WDC_WD6400AAKS2D22A7B2________________________WD2DWCASY5910182:1
vml.010000000020202020202020202020202035515a32545337434d4158544f52
vml.010000000020202020202020202020202035515a32545337434d4158544f52:1
vml.010000000020202020202020202020202035515a32545337434d4158544f52:2
vml.0100000000202020202057442d574341535935393130313832574443205744
vml.0100000000202020202057442d574341535935393130313832574443205744:1

L'identifiant VML de mon disque Western Digital est donc vml.0100000000202020202057442d574341535935393130313832574443205744, et je le vérifie bien :

~ # ls -l /vmfs/devices/disks/vml.0100000000202020202057442d574341535935393130313832574443205744
lrwxrwxrwx    1 root     root            74 Dec 26 15:42    /vmfs/devices/disks/vml.0100000000202020202057442d574341535935393130313832574443205744 -> t10.ATA_____WDC_WD6400AAKS2D22A7B2________________________WD2DWCASY5910182

Nous allons donc pouvoir passer à la deuxième étape.

Création du mapping

Le mapping en question se matérialise par un fichier VMDK et sera vu par ESXi comme tous les disques virtuels. Concernant l'emplacement de ce fichier, qui doit se trouver sur un datastore, ce que je fais en général, c'est de créer dans un premier temps la VM qui l'accueillera sans lui ajouter de disque. Ainsi le dossier au nom de la VM sera créé sur le datastore, et je m'en servirai pour stocker le fichier de mapping. On lance la création avec la commande suivant :

vmkfstools -z /vmfs/devices/disks/vml.0100000000202020202057442d574341535935393130313832574443205744 /vmfs/volumes/datastore1/[NOM_VM]/[NOM_DISQUE].vmdk

Le plus dur est fait ! Il ne reste maintenant plus qu'à ajouter un disque dur à une VM existante, en sélectionnant le fichier que l'on vient d'obtenir. Pour cela, allez dans les propriétés d'une VM (clic droit sur la VM, puis Edit settings.... Dans l'onglet Hardware cliquez sur Add..., sélectionnez ''Hard Disk" :

rdm1

Sélectionnez Use an existing virtual disk :

rdm2

Puis sélectionnez le fichier que l'on vient de créer :

rdm3

Dans l'écran vous pouvez laisser les options par défaut, puis valider. Et voilà ! Vous pouvez désormais lancer la VM. Voici comment est vu un disque virtuel :

~$ sudo hdparm -I /dev/sda

/dev/sda:

ATA device, with non-removable media
Standards:
Likely used: 1

Et voici comment est vu un disque mappé via RDM :

~$ sudo hdparm -I /dev/sdb

/dev/sdb:

ATA device, with non-removable media
Model Number:       WDC WD6400AAKS-22A7B2
Serial Number:      WD-WCASY5909070
Firmware Revision:  01.03B01
Transport:          Serial, SATA 1.0a, SATA II Extensions, SATA Rev 2.5
Standards:
Supported: 8 7 6 5
Likely used: 8