Como importar discos virtuais

Se você tiver discos virtuais no ambiente local com software e configurações necessários (às vezes chamados de discos dourados ou imagens douradas), poderá economizar tempo importando esses discos virtuais no Compute Engine e usar a imagem resultante para criar máquinas virtuais. A ferramenta de importação é compatível com a maioria dos formatos de arquivo de disco virtual, incluindo VMDK e VHD.

Se você exportou o disco do Compute Engine, é possível criar imagens do disco.

Para informações sobre como criar um sistema automatizado para migrar várias máquinas virtuais (VMs, na sigla em inglês), consulte Como migrar VMs para o Compute Engine.

Antes de começar

Ativar a API Cloud Build

A ferramenta de importação do dispositivo virtual usa o Cloud Build.

Na maioria dos casos, gcloud compute images import tenta conceder essas permissões à conta de serviço do Cloud Build. No entanto, é possível concedê-las manualmente para garantir que as permissões necessárias estejam aplicadas.

Console

  1. Ative a API Cloud Build.

    Ativar a API Cloud Build

    Ao ativar a API Cloud Build a partir do Console, o Compute Engine concede à conta de serviço do Cloud Build os papéis a seguir para que o serviço possa importar instâncias para o Compute Engine:

    • roles/iam.serviceAccountTokenCreator
    • roles/compute.admin
    • roles/iam.serviceAccountUser

    A ferramenta de importação também usa a conta de serviço padrão do Compute Engine. Por padrão, a conta de serviço do Compute Engine tem o papel de editor de projetos do Cloud IAM. Se esse papel for removido, o processo de importação poderá falhar. Para adicionar o papel novamente à conta de serviço, consulte Como conceder acesso. Para mais informações sobre a conta de serviço padrão do Compute Engine, consulte Conta de serviço padrão do Compute Engine.

gcloud

Para configurar o serviço Cloud Build usando a ferramenta de linha de comando gcloud, siga estas etapas:

  1. Ative o Cloud Build.

    gcloud services enable cloudbuild.googleapis.com

    A ferramenta de importação também usa a conta de serviço padrão do Compute Engine. Por padrão, a conta de serviço do Compute Engine tem o papel de editor de projetos do Cloud IAM. Se esse papel for removido, o processo de importação poderá falhar. Para adicionar o papel novamente à conta de serviço, consulte Como conceder acesso. Para mais informações sobre a conta de serviço padrão do Compute Engine, consulte Conta de serviço padrão do Compute Engine.

  2. Adicione o papel compute.admin à conta de serviço da API Cloud Build.

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member serviceAccount:PROJECT_NUM@cloudbuild.gserviceaccount.com \
       --role roles/compute.admin
    
  3. Adicione o papel iam.serviceAccountUser à conta de serviço da API Cloud Build.

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member serviceAccount:PROJECT_NUM@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountUser
    
  4. Adicione o papel iam.serviceAccountTokenCreator à conta de serviço da API Cloud Build.

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member serviceAccount:PROJECT_NUM@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountTokenCreator
    

    Substitua:

Sistemas operacionais compatíveis

Para que os discos virtuais sejam inicializáveis no Compute Engine, eles precisam executar um dos sistemas operacionais a seguir.

  • Sistemas operacionais Linux:
    • CentOS 6, CentOS 7 e CentOS 8
    • Debian 8, Debian 9
    • Red Hat Enterprise Linux 6, Red Hat Enterprise Linux 7 e Red Hat Enterprise Linux 8
    • Ubuntu 14.04 LTS, Ubuntu 16.04 LTS e Ubuntu 18.04 LTS
    • SUSE Linux Enterprise Server 12, SUSE Linux Enterprise Server 15 e OpenSUSE 15
  • Sistemas operacionais Windows:
    • Windows Server 2012, Windows Server 2012 R2, Windows Server 2012 R2 Core
    • Windows Server 2016, Windows Server 2016 Core
    • Windows Server 2019, Windows Server 2019 Core
    • Windows 7 SP1 (32 e 64 bits, somente para BYOL)
    • Windows 8.1 (32 e 64 bits, somente BYOL)
    • Windows 10, versões 1709, 1803, 1903, 1909 (32 e 64 bits, somente BYOL)

Limitações

Este recurso tem as seguintes limitações:

  • Os discos virtuais do Linux precisam usar grub como carregador de inicialização.
  • Os carregadores de inicialização UEFI não são compatíveis com Windows nem com Linux.
  • Os discos virtuais do Linux precisam atender aos mesmos requisitos das imagens de personalizadas, incluindo compatibilidade com dispositivos do controlador de armazenamento Virtio-SCSI.
  • Quando instalados nos discos virtuais do Windows, os softwares de lista de permissões de aplicativos, como o Cb Protection da Carbon Black, pode causar a falha do processo de importação. Talvez seja necessário desinstalá-los antes da importação.
  • Se você estiver importando um disco virtual executando o RHEL, o recurso "Traga sua própria licença" (BYOL, na sigla em inglês) só será aceito se o pacote python-boto (em inglês) estiver instalado no disco virtual antes da importação.
  • Os sistemas operacionais em discos virtuais precisam ser compatíveis com ACPI (em inglês).

Permissões

A ferramenta de importação de imagens realiza várias etapas quando você importa um arquivo de disco virtual, incluindo upload do arquivo para o Cloud Storage, criação de um novo bucket, download do arquivo para o Compute Engine e criação de uma imagem no Compute Engine a partir do arquivo de disco. Esse processo ocorre automaticamente. Para possibilitar uma experiência perfeita ao usar esse recurso, o Google recomenda que sua conta tenha os seguintes papéis:

  • roles/storage.admin
  • roles/viewer
  • roles/resourcemanager.projectIamAdmin

O processo de importação usa a conta de serviço padrão do Compute Engine como parte do fluxo de trabalho. Por padrão, essa conta tem a permissão roles/editor, que é suficiente para o processo. No entanto, se você tiver modificado os papéis e as permissões padrão da conta de serviço do Compute Engine, verifique se ela ainda tem os seguintes papéis:

  • roles/compute.storageAdmin
  • roles/storage.objectViewer

Como importar discos virtuais

Como verificar a compatibilidade

Antes de tentar importar o disco para sua VM, faça o download da ferramenta de pré-verificação (em inglês) e execute-a dentro da VM. Ela procura quaisquer problemas de compatibilidade (em inglês) que possam causar falha no processo de importação ou que impeçam o disco de funcionar corretamente no Compute Engine.

Como importar um disco virtual inicializável

Console

  1. No Console do Google Cloud, faça upload do arquivo do disco virtual para o Cloud Storage.
  2. Acesse a página Criar uma imagem.

    Acessar a página "Criar uma imagem"

  3. Especifique um Nome para a imagem.
  4. Em Origem, selecione Disco virtual (VMDK, VHD...).
  5. Navegue até o local de armazenamento do arquivo do Cloud Storage ou insira-o manualmente.
  6. Selecione o sistema operacional disponível no disco importado. Também é possível fazer as alterações a seguir:

    • Instale pacotes de convidado. O Google recomenda que você instale o ambiente de convidado. Para mais informações sobre o ambiente de convidado, clique aqui.

    • Para sistemas operacionais Windows ou Red Hat Enterprise Linux (RHEL), também é possível escolher uma opção de licenciamento. Além disso, é possível trazer sua própria licença ou permitir que o Compute Engine forneça uma. Para mais informações sobre como trazer sua própria licença no Windows, consulte Trazer sua própria licença.

  7. Opcional: especifique mais propriedades para sua imagem. Por exemplo, organize essa imagem como parte de uma família de imagens.

  8. Clique em Criar para importar a imagem.

gcloud

Use o comando gcloud compute images import para criar uma imagem inicializável do Compute Engine. Embora o Compute Engine possa iniciar a maioria das imagens de disco de inicialização, o comando import garante que o disco tenha os drivers necessários e os pacotes de ambiente de convidado mais recentes, que são necessários para iniciar uma instância e se conectar a ela usando SSH ou RDP.

Importe os arquivos do disco virtual de um bucket do Cloud Storage ou da estação de trabalho local.

Se você importar o arquivo do disco virtual da estação de trabalho, a ferramenta de importação fará upload do arquivo para um bucket do Cloud Storage automaticamente.

Se preferir, faça você mesmo o upload do arquivo do disco virtual para o Cloud Storage antes de iniciar o processo de importação. No entanto, é necessário fazer upload do arquivo para um bucket de armazenamento no mesmo projeto que será usado no processo de importação.

gcloud compute images import image-name \
    --source-file source-file \
    --os os

Substitua as seguintes informações:

  • image-name: o nome da imagem de destino.
  • source-file: o arquivo de disco virtual. Pode ser um arquivo local ou armazenado no Cloud Storage. Se o disco virtual for um arquivo local, forneça um caminho absoluto ou relativo. Se o arquivo de disco virtual já estiver armazenado no Cloud Storage, será preciso que ele exista em um bucket de armazenamento do projeto usado no processo de importação. Especifique o caminho completo do arquivo no formato gs://bucket-name/object-name.
  • os: o sistema operacional de --source-file. Para ver uma lista de valores compatíveis, revise as opções de sinalização --os do comando gcloud compute images import.

    Para conferir instruções sobre como importar imagens com licenças atuais para o Google Cloud, consulte Como trazer suas próprias licenças.

Se você especificar um arquivo local, o upload poderá demorar muito, dependendo do tamanho do disco virtual e da velocidade da conexão de rede. A operação de importação pode demorar bastante para ser executada, dependendo do tamanho do disco.

Comando de amostra

No exemplo a seguir, importamos um disco virtual debian-9 denominado my_server.vmdk armazenado em gs://your_gcs_bucket.

gcloud compute images import my-imported-image \
    --source-file gs://your_gcs_bucket/my_server.vmdk \
    --os debian-9

Parâmetros opcionais

Por padrão, os pacotes de ambiente de convidado são adicionados a todas as imagens de disco de inicialização importadas. Se você não quiser esses pacotes, adicione a sinalização --no-guest-environment ao comando de importação.

API

  1. Adicione o dispositivo virtual ao Cloud Storage.

  2. Na API, crie uma solicitação POST para a API Cloud Build.

    POST https://cloudbuild.googleapis.com/v1/projects/project-id/builds
    {
     "steps":[
       {
         "args":[
           "-image_name=image-name",
           "-source_file=source-file",
           "-os=os",
           "-timeout=timeout",
           "-client_id=api"
         ],
         "name":"gcr.io/compute-image-tools/gce_vm_image_import:release",
         "env":[
           "BUILD_ID=$BUILD_ID"
         ]
       }
     ],
     "timeout":"timeout",
     "tags":[
       "gce-daisy",
       "gce-daisy-image-import"
     ]
    }
    

    Substitua:

    • project-id: o ID do projeto em que a imagem será importada;
    • image-name: o nome da imagem a ser importada;
    • timeout: o tempo máximo de duração de um build antes de falhar com uma mensagem TIMEOUT. Na API, o tempo precisa ser especificado em segundos. O valor 7200s funciona na maioria dos cenários.
    • source-file: o URI da imagem no Cloud Storage. Por exemplo, gs://my-bucket/my-image.vmdk.
    • os: o sistema operacional da imagem.

    Para outros valores args que podem ser fornecidos, consulte a seção de sinalizações opcionais da página do GitHub de importação de imagens de VM (em inglês).

    Exemplo de resposta

    A resposta de amostra a seguir é parecida com a resposta retornada:

    {
     "name": "operations/build/myproject-12345/operation-1578608233418",
     "metadata": {
      "@type": "type.googleapis.com/google.devtools.cloudbuild.v1.BuildOperationMetadata",
      "build": {
       "id": "3a2055bc-ccbd-4101-9434-d376b88b8940",
       "status": "QUEUED",
       "createTime": "2019-09-20T15:55:29.353258929Z",
       "steps": [
        {
         "name": "gcr.io/compute-image-tools/gce_vm_image_import:release",
         "env": [
          "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940"
         ],
         "args": [
          "-timeout=7056s",
          "-image_name=my-image",
          "-client_id=api",
          "-data-disk",
          "-source_file=gs://my-bucket/my-image.vmdk"
         ]
        }
       ],
       "timeout": "7200s",
       "projectId": "myproject-12345",
       "logsBucket": "gs://123456.cloudbuild-logs.googleusercontent.com",
       "options": {
        "logging": "LEGACY"
       },
       "logUrl": "https://console.cloud.google.com/gcr/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=123456"
      }
    }
    

    Há algumas maneiras de monitorar seu build:

    • Execute uma solicitação projects.builds.get usando o build-id retornado.
    • Revise os registros hospedados no logUrl fornecido.

Como importar um disco virtual não inicializável

Console

  1. No Console do Google Cloud, faça upload do arquivo do disco virtual para o Cloud Storage.
  2. Acesse a página Criar uma imagem.

    Acessar a página "Criar uma imagem"

  3. Especifique um Nome para a imagem.
  4. Em Origem, selecione Disco virtual (VMDK, VHD...).
  5. Navegue até o local de armazenamento do arquivo do Cloud Storage ou insira-o manualmente.
  6. No sistema operacional, selecione Nenhum sistema operacional. Apenas dados.
  7. Opcional: especifique mais propriedades para sua imagem. Por exemplo, organize essa imagem como parte de uma família de imagens.
  8. Clique em Criar para importar a imagem.

gcloud

É possível usar o comando gcloud compute images import para criar uma imagem do Compute Engine que não seja inicializável. Se seu disco virtual não tiver um sistema operacional inicializável instalado, importe-o usando a sinalização --data-disk no lugar da sinalização --os. Esse procedimento ignora a etapa que instala os drivers e os pacotes do ambiente de convidado para tornar a imagem inicializável no Compute Engine.

gcloud compute images import image-name \
    --source-file source-file \
    --data-disk

Substitua as seguintes informações:

  • image-name: o nome da imagem de destino.
  • source-file: o arquivo de disco virtual. Pode ser um arquivo local ou armazenado no Cloud Storage. Se o disco virtual for um arquivo local, será possível usar um caminho absoluto ou relativo. Se o arquivo de disco virtual já estiver armazenado no Cloud Storage, será preciso que o arquivo exista em um bucket de armazenamento do projeto usado no processo de importação e você especifique o caminho completo do arquivo no formato gs://bucket-name/object-name.

Comando de amostra

No exemplo a seguir, importamos um disco virtual denominado my-disk.vmdk armazenado em gs://my-gcs-bucket/.

gcloud compute images import my-imported-image \
    --source-file gs://my-gcs-bucket/my-disk.vmdk \
    --data-disk

API

  1. Adicione o dispositivo virtual ao Cloud Storage.

  2. Na API, crie uma solicitação POST para a API Cloud Build.

    POST https://cloudbuild.googleapis.com/v1/projects/project-id/builds
    {
      "steps":[
        {
          "args":[
            "-image_name=image-name",
            "-source_file=source-file",
            "-timeout=timeout",
            "-client_id=api",
            "-data_disk"
          ],
          "name":"gcr.io/compute-image-tools/gce_vm_image_import:release",
          "env":[
            "BUILD_ID=$BUILD_ID"
          ]
        }
      ],
      "timeout":"timeout",
      "tags":[
        "gce-daisy",
        "gce-daisy-image-import"
      ]
    }
    

    Substitua os seguintes valores args:

    • project-id: o ID do projeto em que a imagem será importada;
    • image-name: o nome da imagem a ser importada;
    • source-file: o URI da imagem no Cloud Storage. Por exemplo, gs://my-bucket/my-image.vmdk.
    • timeout: o tempo máximo de duração de um build antes de falhar com uma mensagem TIMEOUT. Na API, o tempo precisa ser especificado em segundos. O valor 7200s funciona na maioria dos cenários.

Como tornar uma imagem inicializável

Se você tiver uma imagem personalizada do Compute Engine que tenha um sistema operacional inicializável, mas não tenha os devidos drivers ou pacotes de ambiente de convidado do Compute Engine, poderá usar a ferramenta de importação de imagem para torná-la inicializável no Compute Engine.

Use a sinalização --source-image para especificar uma imagem personalizada que será inicializável, em vez de usar a sinalização --source-file, que especifica um novo disco para importar.

gcloud compute images import image-name \
    --source-image source-image-name \
    --os os

Substitua as seguintes informações:

  • image-name: o nome da imagem de destino
  • source-image-name: o nome da imagem de origem
  • os: o sistema operacional de --source-image. Para ver uma lista de valores compatíveis, revise as opções de sinalização --os do comando gcloud compute images import.

    Para conferir instruções sobre como importar imagens com licenças atuais para o Google Cloud, consulte Como trazer suas próprias licenças.

Comando de amostra

No exemplo a seguir, transformamos uma imagem do Compute Engine denominada my-image em uma imagem inicializável chamada my-bootable-image. Neste exemplo, o sistema operacional instalado na imagem é o Ubuntu 16.04.

gcloud compute images import
my-bootable-image --source-image=my-image --os=ubuntu-1604

Limpeza de recursos

Há cobranças para os arquivos armazenados no Cloud Storage e as imagens no Compute Engine. A ferramenta de importação envia o arquivo de disco virtual para o Cloud Storage e cria uma imagem personalizada do Compute Engine.

Depois de verificar se a imagem foi importada e inicializada corretamente como uma instância do Compute Engine, você pode excluir o arquivo de disco virtual do Cloud Storage. A ferramenta imprime o URI do arquivo à medida que o carrega no Cloud Storage. Esse URI tem o seguinte formato: gs://bucket-name/tmpimage/image-name.

Se você importou uma imagem usando a sinalização --data-disk e executou a ferramenta import uma segunda vez com a sinalização --source-image para tornar essa imagem inicializável, a primeira imagem ainda existirá. Se você não precisar da imagem, pense em excluí-la. Se você especificar o mesmo nome de imagem para as sinalizações --image e --source-image, a imagem será substituída automaticamente, sem necessidade de nenhuma outra limpeza.

A seguir