Práctica recomendada: Usa nombres de dispositivos persistentes en una VM de Linux


En este documento, se describe cómo usar nombres de dispositivos persistentes en tu VM de Linux.

Para las VMs que usan un sistema operativo Linux, los nombres de dispositivos, por ejemplo, /dev/sda, pueden cambiar después de realizar procedimientos como los siguientes:

  • Inicia y detén una VM
  • Desconecta y vuelve a conectar discos
  • Cambia tipos de máquinas

Este cambio de nombre del dispositivo se produce porque los nombres de los dispositivos se asignan a partir de un rango disponible una vez que se inicia una VM o se conecta un dispositivo. Desconectar un dispositivo o detener la VM libera el nombre del dispositivo. Cuando se vuelve a conectar el dispositivo o se reinicia la VM, se asigna un nombre del dispositivo nuevo del rango disponible. El kernel de Linux no garantiza el orden de los dispositivos durante los reinicios.

Un cambio de nombre del dispositivo puede hacer que cualquier aplicación o secuencia de comandos que dependa del nombre original del dispositivo no funcione de forma correcta o que la VM no se inicie después de un reinicio.

Te recomendamos usar nombres de dispositivos persistentes cuando hagas referencia a discos y particiones en las VMs de Linux para evitar este problema. También puedes usar symlinks.

Antes de comenzar

  • Revisa la administración de dispositivos para su sistema operativo Linux:
  • Configura la autenticación si aún no lo hiciste. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine de la siguiente manera

    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.

Nombres de dispositivos en VMs de Linux

Los nombres de los dispositivos Linux para los discos conectados a tu VM dependen de la interfaz que elijas cuando crees los discos. Cuando usas el comando lsblk para el sistema operativo para ver los dispositivos del disco, muestra el prefijo nvme para los discos conectados con la interfaz NVMe y el prefijosd para discos conectados con la interfaz SCSI.

El orden de los números de disco o los controladores NVMe no es predecible ni coherente en los reinicios de las VMs. En el primer inicio, un disco persistente podría ser nvme0n1 (o sda para SCSI). En el segundo inicio, el nombre del dispositivo para el mismo disco persistente podría ser nvme2n1 o nvme0n3 (o sdc para SCSI).

Cuando accedas a discos conectados, debes usar los vínculos simbólicos creados en /dev/disk/by-id/. Estos nombres persisten en los reinicios. Para obtener más información sobre los symlinks, consulta Vínculos simbólicos para discos conectados a una VM.

Nombres de dispositivos SCSI

El formato de un dispositivo de disco conectado a SCSI es sda para el primer disco conectado. Las particiones de disco aparecen como sda1. Cada disco adicional usa una letra secuencial, como sdb y sdc. Cuando se alcanza sdz, los discos siguientes agregados tienen nombres como sdaa, sdab y sdac, hasta sddx.

Nombres de los dispositivos NVMe

El formato de un dispositivo de disco conectado a NVMe en sistemas operativos Linux es nvmenumbernnamespace. El number representa el número de controlador de disco NVMe y namespace es un ID de espacio de nombres de NVMe que asigna el controlador de disco NVMe. Para las particiones, pn se agrega al nombre del dispositivo, en el que n es un número que comienza con 1, lo que denota la nth partición.

El número de controlador comienza en 0. Un solo disco NVMe conectado a tu instancia de procesamiento tiene un nombre del dispositivo de nvme0n1. La mayoría de los tipos de máquinas usan un solo controlador de disco NVMe. Los nombres de los dispositivos NVMe son nvme0n1, nvme0n2, nvme0n3 y así sucesivamente.

Los discos SSD locales conectados a la serie de máquinas de tercera generación o instancias posteriores tienen un controlador NVMe independiente para cada disco. En estas VMs, los nombres de los dispositivos conectados en NVMe de SSD locales se ven como nvme0n1, nvme1n1 y nvme2n1. La cantidad de discos SSD locales conectados depende del tipo de máquina de tu VM.

Las instancias de procesamiento basadas en series de máquinas de tercera generación o posteriores usan NVMe para Persistent Disk y Google Cloud Hyperdisk, y también discos SSD locales. Cada VM tiene 1 controlador NVMe para Hyperdisk y Persistent Disk, y 1 controlador NVMe para cada disco SSD local. El controlador NVMe de Hyperdisk y Persistent Disk tiene un único espacio de nombres de NVMe para todos los discos conectados. Por lo tanto, una instancia de serie de máquinas de tercera generación con un Persistent Disk y un Hyperdisk (cada uno con 2 particiones) y 2 discos SSD locales sin formato usa los siguientes nombres de dispositivos:

  • nvme0n1: Persistent Disk
  • nvme0n1p1
  • nvme0n1p2
  • nvme0n2: Hyperdisk
  • nvme0n2p1
  • nvme0n2p2
  • nvme1n1: la primera SSD local
  • nvme2n1: la segunda SSD local

Usa nombres de dispositivos persistentes

Para configurar un nombre de dispositivo persistente, asigna un nombre de punto de activación para el dispositivo de disco en el archivo fstab. Hay tres maneras de configurar un nombre de dispositivo persistente.

  • A través de una etiqueta. Esta opción requiere que el sistema de archivos admita etiquetas y que agregues una etiqueta a las particiones del disco.
  • Mediante un disco UUID o una partición. Se genera un UUID cuando se crea un disco con una tabla de particiones y el UUID es único por partición.
  • A través de un ID de disco persistente (/dev/disk/by-id) para Persistent Disk o Google Cloud Hyperdisk, o un symlink, que se basa en el nombre del recurso del disco.

Recomendamos usar el UUID de partición o el symlink para las VMs de Linux.

UUID de partición

Para encontrar el UUID de un disco, realiza los siguientes pasos:

  1. Conéctate a tu VM.
  2. Si no conoces el nombre del dispositivo del disco, puedes encontrar el nombre del dispositivo del disco con el symlink.

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

    El resultado es similar a este:

      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. Para recuperar el UUID de la partición del disco, ejecuta de uno de los siguientes comandos:

    • blkid

      sudo  blkid -s UUID
      

      El resultado es similar a este:

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

      El resultado es similar a este:

      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. Agrega una entrada para el UUID de tu dispositivo en el archivo /etc/fstab.

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

    En este ejemplo, /data es el punto de activación y ext4 es el tipo de sistema de archivos.

  5. Ejecuta mount -av para validar que el dispositivo esté activado de forma correcta.

    sudo mount -av

    Si el dispositivo se activó correctamente, el resultado es similar al siguiente:

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

Para encontrar el nombre del dispositivo del disco con el ID de disco persistente, o symlink, completa los siguientes pasos:

  1. Conéctate a tu VM.
  2. Para recuperar el ID en el disco, ejecuta el siguiente comando:

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

    El resultado es similar al siguiente:

    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
    

    Para los discos NVME, el resultado es similar al siguiente:

    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. Agrega el symlink al archivo /etc/fstab.

    /dev/disk/by-id/google-disk-2 /data ext4 defaults 0 0
    
  4. Ejecuta mount -av para validar que el dispositivo esté activado de forma correcta.

    sudo mount -av

    Si el dispositivo se activó correctamente, el resultado es similar al siguiente:

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