Bonne pratique : utiliser des noms de périphérique persistants sur une VM Linux


Ce document explique comment utiliser un nommage de périphérique persistant sur votre VM Linux.

Pour les VM utilisant un système d'exploitation Linux, les noms des périphériques, par exemple /dev/sda, peuvent changer après avoir effectué des procédures telles que les suivantes :

  • Démarrer et arrêter une VM
  • Dissocier et réassocier des disques
  • Modifier les types de machines

Ce changement de nom de périphérique se produit car les noms des périphériques sont attribués à partir d'une plage disponible dès lors qu'une VM démarre ou qu'un périphérique est associé. Dissocier un périphérique ou arrêter la VM libère son nom. Lorsque le périphérique est réassocié ou que la VM a redémarré, un nouveau nom de périphérique est ensuite attribué à partir de la plage disponible. Le noyau Linux ne garantit pas l'ordre des périphériques lors des redémarrages.

Une modification du nom d'un périphérique peut entraîner le dysfonctionnement des applications ou des scripts qui dépendent du nom de périphérique d'origine, ou empêcher la VM de démarrer après un redémarrage.

Pour éviter ce problème, il est recommandé d'utiliser un nommage de périphérique persistant lorsque vous référencez des disques et des partitions sur vos VM Linux. Vous pouvez également utiliser des liens symboliques.

Avant de commencer

  • Vérifiez la gestion des périphériques pour votre système d'exploitation Linux :
  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification est le processus permettant de valider votre identité pour accéder aux services et aux API Google Cloud. Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine comme suit :

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.

Nommer les périphériques sur les VM Linux

Les noms de périphériques Linux des disques associés à votre VM dépendent de l'interface que vous avez choisie lors de la création des disques. Lorsque vous utilisez commande du système d'exploitation lsblk pour afficher vos disques, elle affiche le préfixe nvme pour les disques associés à l'interface NVMe et le préfixe sd pour les disques associés à l'interface SCSI.

L'ordre des numéros de disque ou des contrôleurs NVMe n'est pas prévisible ni cohérent entre les redémarrages de VM. Lors du premier démarrage, un disque persistant peut être nvme0n1 (ou sda pour SCSI). Lors du deuxième démarrage, le nom du périphérique pour le même disque persistant peut être nvme2n1 ou nvme0n3 (ou sdc pour SCSI).

Lorsque vous accédez à des disques associés, vous devez utiliser les liens symboliques créés dans /dev/disk/by-id/. Ces noms persistent après les redémarrages. Pour en savoir plus sur les liens symboliques, consultez la section Liens symboliques pour les disques associés à une VM.

Noms de périphériques SCSI

Le format d'un disque associé en SCSI est de sda pour le premier disque associé. Les partitions de disque apparaissent sous la forme sda1. Chaque disque supplémentaire utilise une lettre séquentielle, telle que sdb et sdc. Lorsque sdz est atteint, les disques suivants sont nommés tels que sdaa, sdab et sdac, jusqu'à sddx.

Noms de périphériques NVMe

Le format d'un périphérique de disque associé en NVMe dans les systèmes d'exploitation Linux est nvmenumbernnamespace. number représente le numéro de contrôleur de disque NVMe et namespace est un ID d'espace de noms NVMe attribué par le contrôleur de disque NVMe. Pour les partitions, pn est ajouté au nom du périphérique, où n est un nombre, à partir de 1, qui désigne la nth partition.

Le numéro de contrôleur commence à 0. Le nom de périphérique d'un seul disque NVMe associé à votre instance de calcul est nvme0n1. La plupart des types de machines utilisent un seul contrôleur de disque NVMe. Les noms des périphériques NVMe sont ensuite nvme0n1, nvme0n2, nvme0n3, etc.

Les disques SSD locaux associés à une série de machines de troisième génération ou à des instances ultérieures disposent d'un contrôleur NVMe distinct pour chaque disque. Sur ces VM, les noms de périphériques des disques SSD locaux associés en NVMe ressemblent à nvme0n1, nvme1n1 et nvme2n1. Le nombre de disques SSD locaux associés dépend du type de machine de votre VM.

Les instances de calcul basées sur des séries de machines de troisième génération ou ultérieures utilisent NVMe pour les disques Persistent Disk et Google Cloud Hyperdisk, ainsi que pour les disques SSD locaux. Chaque VM dispose d'un contrôleur NVMe pour les disques Persistent Disk et Hyperdisk, et d'un contrôleur NVMe pour chaque disque SSD local. Le contrôleur NVMe de Persistent Disk et de Hyperdisk possède un seul espace de noms NVMe pour tous les disques associés. Ainsi, une instance de série de machines de troisième génération avec un disque Persistent Disk et un Hyperdisk (chacun avec deux partitions) et deux disques SSD locaux non formatés utilise les noms de périphériques suivants:

  • nvme0n1 : Persistent Disk
  • nvme0n1p1
  • nvme0n1p2
  • nvme0n2 : Hyperdisk
  • nvme0n2p1
  • nvme0n2p2
  • nvme1n1 : premier disque SSD local
  • nvme2n1 : deuxième disque SSD local

Utiliser un nommage de périphérique persistant

Pour configurer un nom de périphérique persistant, vous devez attribuer un nom de point d'installation pour le disque dans le fichier fstab. Il existe trois façons de configurer un nom de périphérique persistant.

  • À l'aide d'un libellé. Cette option nécessite que le système de fichiers soit compatible avec les libellés et que vous ajoutiez un libellé aux partitions de disque.
  • À l'aide d'un UUID de partition ou de disque. Un UUID est généré lorsqu'un disque est créé avec une table de partition et l'UUID est unique par partition.
  • En utilisant un ID de disque persistant (/dev/disk/by-id) pour un disque Persistent Disk ou Google Cloud Hyperdisk, ou un symlink basé sur le nom de ressource du disque.

Nous vous recommandons d'utiliser l'UUID de partition ou le lien symbolique pour les VM Linux.

UUID de partition

Pour rechercher l'UUID d'un disque, procédez comme suit :

  1. Connectez-vous à votre VM.
  2. Si vous ne connaissez pas le nom de périphérique du disque, vous pouvez trouver le nom du disque en utilisant le lien symbolique.

    ls -l /dev/disk/by-id/google-*
    

    Le résultat ressemble à ce qui suit :

      lrwxrwxrwx 1 root root  9 Oct 23 15:58 /dev/disk/by-id/google-my-vm -> ../../sda
      lrwxrwxrwx 1 root root 10 Oct 23 15:58 /dev/disk/by-id/google-my-vm-part1 -> ../../sda1
      lrwxrwxrwx 1 root root 11 Oct 23 15:58 /dev/disk/by-id/google-my-vm-part15 -> ../../sda15
      lrwxrwxrwx 1 root root  9 Oct 23 15:58 /dev/disk/by-id/google-my-vm-app-data -> ../../nvme0n1
      

  3. Récupérez l'UUID de la partition du disque en exécutant l'une des commandes suivantes :

    • blkid

      sudo  blkid -s UUID
      

      Le résultat ressemble à ce qui suit :

      /dev/sda1: UUID="4f570f2d-fffe-4c7d-8d8f-af347af7612a"
      /dev/sda15: UUID="E0B2-DFAF"
      /dev/nvme0n1: UUID="9e617251-6a92-45ff-ba40-700a9bdeb03e"
      
    • ls -l

      sudo ls -l /dev/disk/by-uuid/
      

      Le résultat ressemble à ce qui suit :

      lrwxrwxrwx 1 root root 10 Sep 22 18:12 4f570f2d-fffe-4c7d-8d8f-af347af7612a -> ../../sda1
      lrwxrwxrwx 1 root root 13 Sep 22 18:15 9e617251-6a92-45ff-ba40-700a9bdeb03e -> ../../nvme0n1
      lrwxrwxrwx 1 root root 11 Sep 22 18:12 E0B2-DFAF -> ../../sda15
      
  4. Ajoutez une entrée pour l'UUID de votre périphérique dans le fichier /etc/fstab.

    UUID=9e617251-6a92-45ff-ba40-700a9bdeb03e /data ext4 defaults 0 0
    

    Dans cet exemple, /data est le point d'installation et ext4 est le type de système de fichiers.

  5. Vérifiez que le périphérique est correctement installé en exécutant la commande mount -av.

    sudo mount -av

    Si le périphérique est correctement installé, le résultat ressemble à ce qui suit :

    /                           : ignored
    /boot/efi                : already mounted
    mount: /data does not contain SELinux labels.
    You just mounted an file system that supports labels which does not
    contain labels, onto an SELinux box. It is likely that confine
    applications will generate AVC messages and not be allowed access to
    this filesystem.  For more details see restorecon(8) and mount(8).
    /data                    : successfully mounted
    

ID de disque persistant

Pour trouver le nom du disque persistant à l'aide de l'ID du disque persistant ou du lien symbolique, procédez comme suit :

  1. Connectez-vous à votre VM.
  2. Exécutez la commande suivante pour récupérer l'ID sur le disque :

    sudo  ls -lh /dev/disk/by-id/google-*

    Le résultat ressemble à ce qui suit :

    lrwxrwxrwx. 1 root root  9 May 16 17:34 google-disk-2 -> ../../sdb
    lrwxrwxrwx. 1 root root  9 May 16 09:09 google-persistent-disk-0 -> ../../sda
    lrwxrwxrwx. 1 root root 10 May 16 09:09 google-persistent-disk-0-part1 -> ../../sda1
    lrwxrwxrwx. 1 root root 10 May 16 09:09 google-persistent-disk-0-part2 -> ../../sda2
    

    Pour les disques NVME, le résultat ressemble à ce qui suit :

    lrwxrwxrwx 1 root root 13 Jun  1 10:27 google-disk-3 -> ../../nvme0n2
    lrwxrwxrwx 1 root root 13 Jun  1 10:25 google-t2a -> ../../nvme0n1
    lrwxrwxrwx 1 root root 15 Jun  1 10:25 google-t2a-part1 -> ../../nvme0n1p1
    lrwxrwxrwx 1 root root 16 Jun  1 10:25 google-t2a-part15 -> ../../nvme0n1p15
    
  3. Ajoutez le lien symbolique au fichier /etc/fstab.

    /dev/disk/by-id/google-disk-2 /data ext4 defaults 0 0
    
  4. Vérifiez que le périphérique est correctement installé en exécutant la commande mount -av.

    sudo mount -av

    Si le périphérique est correctement installé, le résultat ressemble à ce qui suit :

    /                           : ignored
    /boot/efi                : already mounted
    mount: /data does not contain SELinux labels.
    You just mounted an file system that supports labels which does
    not contain labels, onto an SELinux box. It is likely that confine
    applications will generate AVC messages and not be allowed access to this
    file system.  For more details see restorecon(8) and mount(8).
    /data                    : successfully mounted