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

É possível importar discos inicializáveis e não inicializáveis. Para que seus discos virtuais sejam inicializáveis no Compute Engine, eles precisam executar um dos sistemas operacionais compatíveis a seguir.

Limitações

Esse recurso tem as seguintes limitações gerais:

Esse recurso tem as seguintes limitações no Linux:

  • Os discos virtuais do Linux precisam usar grub como carregador de inicialização.

  • Os discos virtuais do Linux precisam atender aos mesmos requisitos das imagens personalizadas, incluindo compatibilidade com dispositivos do controlador de armazenamento Virtio-SCSI.

Esse recurso tem as seguintes limitações no Windows:

  • Quando instalado nos discos virtuais do Windows, o software de lista de permissões de aplicativos, como o CB Protection da Carbon Black (em inglês), pode causar uma falha no processo de importação. Talvez seja necessário desinstalar esse software antes da importação.

  • Em VMs baseadas em Windows, o adaptador de loopback do Microsoft KM-TEST impede o acesso de rede ao servidor de metadados. É necessário desativá-lo ou removê-lo antes da importação.

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 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 causem falha no processo de importação ou que impeçam o disco de funcionar corretamente no Compute Engine.

Como importar discos virtuais

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. Porém, é necessário fazer o upload do arquivo para um bucket do Cloud Storage no mesmo projeto que será usado no processo.

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

Substitua:

  • 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 do Cloud Storage 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 disco 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=7000s",
           "-client_id=api"
         ],
         "name":"gcr.io/compute-image-tools/gce_vm_image_import:release",
         "env":[
           "BUILD_ID=$BUILD_ID"
         ]
       }
     ],
     "timeout":"7200s",
     "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;
    • 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:

  • 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 ele exista em um bucket do Cloud Storage do projeto usado no processo de importação. 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 disco 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=7000s",
            "-client_id=api",
            "-data_disk"
          ],
          "name":"gcr.io/compute-image-tools/gce_vm_image_import:release",
          "env":[
            "BUILD_ID=$BUILD_ID"
          ]
        }
      ],
      "timeout":"7200s",
      "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.

Como importar discos usando redes que não aceitam endereços IP externos

É possível importar discos virtuais usando uma rede que não aceite IPs externos. Basta usar a API Cloud Build e especificar o argumento -no_external_ip.

Nesse método, o Cloud Build tentará importar a imagem sem usar um IP externo.

  1. Adicione o disco 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",
         "-no_external_ip",
         "-timeout=7000s",
         "-client_id=api"
       ],
       "name":"gcr.io/compute-image-tools/gce_vm_image_import:release",
       "env":[
         "BUILD_ID=$BUILD_ID"
       ]
     }
    ],
    "timeout":"7200s",
    "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;
    • source-file: o URI da imagem no Cloud Storage; Por exemplo, gs://my-bucket/my-image.vmdk.
    • os: o sistema operacional da imagem.

Como importar um disco virtual com o carregador de inicialização UEFI

É possível importar discos virtuais com um carregador de inicialização de Interface unificada de firmware extensível (UEFI, na sigla em inglês). Para isso, use a API Cloud Build e especifique o argumento -uefi_compatible.

  1. Adicione o disco 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",
         "-uefi_compatible",
         "-timeout=7000s",
         "-client_id=api"
       ],
       "name":"gcr.io/compute-image-tools/gce_vm_image_import:release",
       "env":[
         "BUILD_ID=$BUILD_ID"
       ]
     }
    ],
    "timeout":"7200s",
    "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;
    • source-file: o URI da imagem no Cloud Storage; Por exemplo, gs://my-bucket/my-image.vmdk.
    • os: o sistema operacional da imagem.

Como importar um disco virtual usando a VPC compartilhada

Como a ferramenta de importação usa a API Cloud Build, antes de importar um disco virtual usando uma VPC compartilhada, é necessário adicionar o papel compute.networkUser à conta de serviço da API Cloud Build.

gcloud projects add-iam-policy-binding host-project-id \
   --member serviceAccount:service-project-num@cloudbuild.gserviceaccount.com \
   --role roles/compute.networkUser

Substitua:

  • host-project-id: ID do projeto em que a VPC compartilhada está localizada.
  • service-project-num: número do projeto para onde você quer importar a imagem.

gcloud

Use o comando gcloud compute images import para importar o disco virtual. O comando a seguir mostra as especificações para importar um disco não inicializável (--data-disk) ou inicializável (--os). Escolha uma opção.

gcloud compute images import image-name \
    --source-file source-file \
    [--data-disk|--os os] \
    --project service-project-id \
    --zone zone \
    --network network \
    --subnet subnet

Substitua:

  • image-name: nome da imagem a ser importada;
  • 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 do Cloud Storage do projeto usado no processo de importação. Especifique o caminho completo do arquivo no formato gs://bucket-name/object-name.
  • Especifique uma das seguintes opções:
    • --data-disk: use esta sinalização se o disco não tiver um sistema operacional inicializável instalado.
    • os: sistema operacional do --source-file. Para ver uma lista de valores compatíveis, revise as opções de sinalização --os do comando gcloud compute images import.
  • service-project-id: ID do projeto em que a imagem será importada;
  • zone: zona para onde quer importar a imagem; Essa zona precisa corresponder à região da sub-rede. Por exemplo, se subnet for us-west1. É necessário que a zona de importação seja uma das seguintes opções: us-west1-a, us-west1-b ou us-west1-c.
  • network: caminho completo de uma rede VPC compartilhada. Por exemplo, projects/host-project-id/global/networks/vpc-network-name.
  • subnet: caminho completo de uma sub-rede VPC compartilhada. Por exemplo, projects/host-project-id/global/networks/vpc-subnet-name.

    Comando de amostra

    gcloud compute images example-image \
     --source-file gs://source-bucket/source-file.vmdk \
     --os centos-7 \
     --project my-image-project \
     --zone us-west1-c \
     --network projects/my-vpc-project/global/networks/my-shared-vpc \
     --subnet projects/my-vpc-project/regions/us-west1/subnetworks/my-shared-subnet
    

API

  1. Adicione o disco virtual ao Cloud Storage.

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

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

    Substitua os seguintes valores args:

    • service-project-id: 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.
    • os: sistema operacional do --source-file.
    • zone: zona para onde quer importar a imagem; Essa zona precisa corresponder à região da sub-rede. Por exemplo, se subnet for us-west1. É necessário que a zona de importação seja uma das seguintes opções: us-west1-a, us-west1-b ou us-west1-c.
    • network: caminho completo de uma rede VPC compartilhada. Por exemplo, projects/host-project-id/global/networks/vpc-network-name.
    • subnet: caminho completo de uma sub-rede VPC compartilhada. Por exemplo, projects/host-project-id/global/networks/vpc-subnet-name.

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:

  • 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