Prática recomendada: use nomes de dispositivos persistentes numa VM Linux


Este documento descreve como usar a nomenclatura persistente de dispositivos na sua VM Linux.

Para VMs que usam um sistema operativo Linux, os nomes dos dispositivos, por exemplo, /dev/sda, podem mudar depois de realizar procedimentos como os seguintes:

  • Iniciar e parar uma VM
  • Desanexar e voltar a anexar discos
  • Alterar tipos de máquinas

Esta alteração do nome do dispositivo ocorre porque os nomes dos dispositivos são atribuídos a partir de um intervalo disponível assim que uma VM é iniciada ou um dispositivo é anexado. Desassociar um dispositivo ou parar a VM liberta o nome do dispositivo. Quando o dispositivo é novamente associado ou a VM é reiniciada, é atribuído um novo nome de dispositivo a partir do intervalo disponível. O kernel do Linux não garante a ordem dos dispositivos nos reinícios.

Uma alteração do nome do dispositivo pode fazer com que quaisquer aplicações ou scripts que dependam do nome do dispositivo original não funcionem corretamente ou pode fazer com que a MV não seja iniciada após um reinício.

Recomendamos que use a atribuição de nomes persistente aos dispositivos quando fizer referência a discos e partições nas suas VMs Linux para evitar este problema. Também pode usar links simbólicos.

Antes de começar

  • Reveja a gestão de dispositivos para o seu sistema operativo Linux:
  • Se ainda não o tiver feito, configure a autenticação. A autenticação valida a sua identidade para aceder a Google Cloud serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:

    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. Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    2. Set a default region and zone.

Atribuição de nomes de dispositivos em VMs do Linux

Os nomes dos dispositivos Linux para os discos anexados à sua VM dependem da interface que escolher quando criar os discos. Quando usa o comando do sistema operativo lsblk para ver os dispositivos de disco, é apresentado o prefixo nvme para os discos anexados com a interface NVMe e o prefixo sd para os discos anexados com a interface SCSI.

A ordem dos números de discos ou dos controladores NVMe não é previsível nem consistente nos reinícios das VMs. Na primeira inicialização, um disco persistente pode ser nvme0n1 (ou sda para SCSI). No segundo arranque, o nome do dispositivo para o mesmo disco persistente pode ser nvme2n1 ou nvme0n3 (ou sdc para SCSI).

Quando acede a discos anexados, deve usar os links simbólicos criados em /dev/disk/by-id/. Estes nomes persistem nos reinícios. Para mais informações sobre links simbólicos, consulte o artigo Links simbólicos para discos anexados a uma VM.

Nomes dos dispositivos SCSI

O formato de um dispositivo de disco anexado a SCSI é sda para o primeiro disco anexado. As partições do disco aparecem como sda1. Cada disco adicional usa uma letra sequencial, como sdb e sdc. Quando o limite de sdz discos é atingido, os discos adicionados posteriormente têm nomes como sdaa, sdab e sdac, até um máximo de sddx.

Nomes dos dispositivos NVMe

O formato de um dispositivo de disco ligado por NVMe nos sistemas operativos Linux é nvmenumbernnamespace. O elemento number representa o número do controlador de disco NVMe e namespace é um ID do espaço de nomes NVMe atribuído pelo controlador de disco NVMe. Para partições, é anexado pn ao nome do dispositivo, em que n é um número, a começar por 1, que indica a nth partição.

O número do controlador começa em 0. Um único disco NVMe anexado à sua instância de computação tem o nome do dispositivo nvme0n1. A maioria dos tipos de máquinas usa um único controlador de disco NVMe. Os nomes dos dispositivos NVMe são, então, nvme0n1, nvme0n2, nvme0n3, e assim sucessivamente.

Os discos SSD locais associados a instâncias da série de máquinas de terceira geração ou posteriores têm um controlador NVMe separado para cada disco. Nestas VMs, os nomes dos dispositivos ligados por NVMe SSD local têm o seguinte aspeto: nvme0n1, nvme1n1 e nvme2n1. O número de discos SSD locais anexados depende do tipo de máquina da sua VM.

As instâncias de computação baseadas na série de máquinas de terceira geração ou posterior usam NVMe para o Persistent Disk e o Google Cloud Hyperdisk, bem como os discos SSD locais. Cada VM tem 1 controlador NVMe para o disco persistente e o Hyperdisk, e 1 controlador NVMe para cada disco SSD local. O disco persistente e o controlador NVMe do Hyperdisk têm um único espaço de nomes NVMe para todos os discos anexados. Assim, uma instância de série de máquinas de terceira geração com um disco persistente e um Hyperdisk (cada um com 2 partições) e 2 discos SSD locais não formatados usa os seguintes nomes de dispositivos:

  • nvme0n1 – Disco persistente
  • nvme0n1p1
  • nvme0n1p2
  • nvme0n2 – Hyperdisk
  • nvme0n2p1
  • nvme0n2p2
  • nvme1n1 - primeiro SSD local
  • nvme2n1 segundos de SSD local

Use a nomenclatura persistente de dispositivos

Para configurar um nome de dispositivo persistente, atribui um nome de ponto de montagem ao dispositivo de disco no ficheiro fstab. Existem três formas de configurar um nome de dispositivo persistente.

  • Usando uma etiqueta. Esta opção requer que o sistema de ficheiros suporte etiquetas e que adicione uma etiqueta às partições do disco.
  • Usando um UUID de partição ou disco. É gerado um UUID quando é criado um disco com uma tabela de partições, e o UUID é exclusivo por partição.
  • Usando um ID de disco persistente (/dev/disk/by-id) para o disco persistente ou o Google Cloud Hyperdisk, ou um symlink, que se baseia no nome do recurso do disco.

Recomendamos que use o UUID da partição ou o link simbólico para VMs Linux.

UUID da partição

Para encontrar o UUID de um disco, siga estes passos:

  1. Estabeleça ligação à sua VM.
  2. Se não souber o nome do dispositivo do disco, pode encontrar o nome do dispositivo do disco através do link simbólico.

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

    O resultado é semelhante ao seguinte:

      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. Execute um dos seguintes comandos para obter o UUID da partição do disco:

    • blkid

      sudo  blkid -s UUID
      

      O resultado é semelhante ao seguinte:

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

      O resultado é semelhante ao seguinte:

      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. Adicione uma entrada para o UUID do seu dispositivo no ficheiro /etc/fstab.

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

    Neste exemplo, /data é o ponto de montagem e ext4 é o tipo de sistema de ficheiros.

  5. Valide se o dispositivo está montado corretamente executando mount -av.

    sudo mount -av

    Se o dispositivo for montado com êxito, a saída é semelhante à seguinte:

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

Para encontrar o nome do dispositivo de disco através do ID do disco persistente ou do link simbólico, conclua os seguintes passos:

  1. Estabeleça ligação à sua VM.
  2. Execute o seguinte comando para obter o ID no disco:

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

    O resultado é semelhante ao seguinte:

    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 discos NVME, o resultado é semelhante ao seguinte:

    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. Adicione o link simbólico ao ficheiro /etc/fstab.

    /dev/disk/by-id/google-disk-2 /data ext4 defaults 0 0
    
  4. Valide se o dispositivo está montado corretamente executando mount -av.

    sudo mount -av

    Se o dispositivo for montado com êxito, a saída é semelhante à seguinte:

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