Best Practice: Namen nichtflüchtiger Geräte auf einer Linux-VM verwenden


In diesem Dokument wird beschrieben, wie Sie auf Ihrer Linux-VM nichtflüchtige Gerätenamen verwenden.

Bei VMs mit einem Linux-Betriebssystem können sich Gerätenamen wie /dev/sda nach den folgenden Verfahren ändern:

  • VM starten und anhalten
  • Laufwerke trennen und neu anhängen
  • Maschinentypen ändern

Die Änderung des Gerätenamens tritt auf, weil Gerätenamen aus einem verfügbaren Bereich zugewiesen werden, sobald eine VM gestartet oder ein Gerät angehängt wird. Wenn Sie ein Gerät trennen oder die VM beenden, wird der Gerätename freigegeben. Wenn das Gerät wieder angehängt wird oder die VM neu gestartet wurde, wird aus dem verfügbaren Bereich ein neuer Gerätename zugewiesen. Der Linux-Kernel garantiert nicht die Gerätereihenfolge bei allen Startvorgängen.

Die Änderung eines Gerätenamens kann dazu führen, dass alle Anwendungen oder Skripts, die vom ursprünglichen Gerätenamen abhängig sind, nicht ordnungsgemäß funktionieren oder dass die VM nach einem Neustart nicht startet.

Sie sollten die Benennung von nichtflüchtigen Geräten verwenden, wenn Sie auf Laufwerke und Partitionen auf Ihren Linux-VMs verweisen. So lässt sich dieses Problem vermeiden. Sie können auch Symlinks verwenden.

Vorbereitung

  • Prüfen Sie die Geräteverwaltung für Ihr Linux-Betriebssystem:
  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud-Dienste und APIs überprüft. Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich so bei Compute Engine authentifizieren.

    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.

Gerätebenennung auf Linux-VMs

Die Linux-Gerätenamen für die an Ihre VM angehängten Laufwerke hängen von der Schnittstelle ab, die Sie beim Erstellen der Laufwerke auswählen. Wenn Sie den Betriebssystembefehl lsblk verwenden, um Ihre Geräte aufzurufen, wird das Präfix nvme für Laufwerke angezeigt, die mit der NVMe-Schnittstelle verbunden sind, und das Präfix sd für Laufwerke, die mit der SCSI-Schnittstelle verbunden sind.

Die Reihenfolge der Laufwerknummern oder NVMe-Controller ist nicht vorhersehbar oder konsistent bei VM-Neustarts. Beim ersten Start kann ein nichtflüchtiger Speicher nvme0n1 (oder sda für SCSI) sein. Beim zweiten Start kann der Gerätename für denselben nichtflüchtigen Speicher nvme2n1 oder nvme0n3 (oder sdc für SCSI) lauten.

Verwenden Sie für den Zugriff auf angeschlossene Laufwerke stattdessen die in /dev/disk/by-id/ erstellten symbolischen Links. Diese Namen bleiben auch nach einem Neustart bestehen. Weitere Informationen zu Symbollinks finden Sie unter Symbolische Links für an eine VM angeschlossene Laufwerke.

SCSI-Gerätenamen

Das Format eines SCSI-angehängten Laufwerks ist sda für das erste angehängte Laufwerk. Die Laufwerkpartitionen werden als sda1 angezeigt. Jedes zusätzliche Laufwerk verwendet einen sequenziellen Buchstaben wie sdb und sdc. Wenn sdz erreicht ist, haben die nächsten hinzugefügten Laufwerke Namen wie sdaa, sdab und sdac bis zu sddx

NVMe-Gerätenamen

Das Format eines NVMe-angebundenen Laufwerkgeräts in Linux-Betriebssystemen ist nvmenumbernnamespace. number steht für die Nummer des NVMe-Laufwerks-Controllers und namespace ist eine NVMe-Space-ID, die vom NVMe-Laufwerks-Controller zugewiesen wird. Bei Partitionen wird pn an den Gerätenamen angehängt, wobei n eine Zahl ist, die mit 1 beginnt und die n-teth Partition angibt.

Die Controllernummer beginnt bei 0. Ein einzelnes NVMe-Laufwerk, das mit Ihrer Compute-Instanz verbunden ist, hat den Gerätenamen nvme0n1. Die meisten Maschinentypen verwenden einen einzelnen NVMe-Laufwerks-Controller. Die Namen der NVMe-Geräte sind dann nvme0n1, nvme0n2, nvme0n3 usw.

Lokale SSD-Laufwerke, die an Maschinen der dritten Generation oder höher angeschlossen sind, haben einen separaten NVMe-Controller für jedes Laufwerk. Auf diesen VMs sehen die Namen der lokalen SSD-NVMe-angehängten-Geräte so aus: nvme0n1, nvme1n1 und nvme2n1. Die Anzahl der angehängten lokalen SSD-Laufwerke hängt vom Maschinentyp Ihrer VM ab.

Compute-Instanzen, die auf Maschinenserien der dritten Generation oder höher basieren, verwenden NVMe sowohl für Persistent Disk als auch für Google Cloud Hyperdisk sowie auch für lokale SSD-Laufwerke. Jede VM hat einen NVMe-Controller für Persistent Disk und Hyperdisk sowie einen NVMe-Controller für jedes lokale SSD-Laufwerk. Der NVMe-Controller für Persistent Disk und Hyperdisk hat einen einzelnen NVMe-Namespace für alle angehängten Laufwerke. Eine Instanz einer Maschinenserie der dritten Generation mit einem Persistent Disk und einem Hyperdisk (jeweils mit zwei Partitionen) und zwei nicht formatierten lokalen SSD-Laufwerken verwendet daher die folgenden Gerätenamen:

  • nvme0n1: Persistent Disk
  • nvme0n1p1
  • nvme0n1p2
  • nvme0n2: Hyperdisk
  • nvme0n2p1
  • nvme0n2p2
  • nvme1n1: erste lokale SSD
  • nvme2n1: zweite lokale SSD

Benennung nichtflüchtiger Geräte verwenden

Um einen nichtflüchtigen Gerätenamen zu konfigurieren, weisen Sie dem Laufwerkgerät einen Namen für den Bereitstellungspunkt in der Datei fstab zu. Es gibt drei Möglichkeiten, einen nichtflüchtigen Gerätenamen zu konfigurieren.

  • Mit einem Label Für diese Option ist erforderlich, dass das Dateisystem Labels unterstützt und dass Sie den Laufwerkpartitionen ein Label hinzufügen.
  • Durch Verwendung einer Partitions- oder eines Laufwerk-UUID. Eine UUID wird generiert, wenn ein Laufwerk mit einer Partitionstabelle erstellt wird. Die UUID ist für jede Partition eindeutig.
  • Durch Verwendung einer ID des nichtflüchtigen Speichers (/dev/disk/by-id) für Persistent Disk oder Google Cloud Hyperdisk oder eines symlink, der auf dem Namen der Laufwerksressource basiert.

Wir empfehlen die Verwendung der Partitions-UUID oder des Symlinks für Linux-VMs.

Partitions-UUID

So ermitteln Sie die UUID für ein Laufwerk:

  1. Mit VM verbinden.
  2. Wenn Sie den Gerätenamen des Laufwerks nicht kennen, können Sie den Gerätenamen des Laufwerks über den Symlink finden.

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

    Die Ausgabe sieht in etwa so aus:

      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. Rufen Sie die UUID der Partition für das Laufwerk mit einem der folgenden Befehle ab:

    • blkid

      sudo  blkid -s UUID
      

      Die Ausgabe sieht in etwa so aus:

      /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/
      

      Die Ausgabe sieht in etwa so aus:

      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. Fügen Sie in der Datei /etc/fstab einen Eintrag für die UUID für Ihr Gerät hinzu.

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

    In diesem Beispiel ist /data der Bereitstellungspunkt und ext4 der Dateisystemtyp.

  5. Prüfen Sie, ob das Gerät ordnungsgemäß bereitgestellt wurde. Führen Sie dazu mount -av aus.

    sudo mount -av

    Wenn das Gerät bereitgestellt wurde, sieht die Ausgabe in etwa so aus:

    /                           : 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 des nichtflüchtigen Speichers

Führen Sie die folgenden Schritte aus, um den Namen des Laufwerks mithilfe der ID des nichtflüchtigen Speichers oder des Symlinks zu ermitteln:

  1. Mit VM verbinden.
  2. Rufen Sie die ID auf dem Laufwerk ab, indem Sie den folgenden Befehl ausführen:

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

    Die Ausgabe sieht in etwa so aus:

    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
    

    Bei NVME-Laufwerken sieht die Ausgabe in etwa so aus:

    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. Fügen Sie der Datei /etc/fstab den Symlink hinzu.

    /dev/disk/by-id/google-disk-2 /data ext4 defaults 0 0
    
  4. Prüfen Sie, ob das Gerät ordnungsgemäß bereitgestellt wurde. Führen Sie dazu mount -av aus.

    sudo mount -av

    Wenn das Gerät bereitgestellt wurde, sieht die Ausgabe in etwa so aus:

    /                           : 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