Se você precisar mover os dados do disco de inicialização do Compute Engine para fora do projeto do Compute Engine, exporte uma imagem desse disco para o Cloud Storage como um arquivo tar.gz
. Caso precise criar uma imagem de disco permanente para usar durante a criação de novos discos permanentes no Compute Engine, leia Como criar uma imagem personalizada.
É possível fazer backup ou compartilhar uma imagem personalizada exportando a imagem para o Cloud Storage. Esse método é ideal para compartilhar imagens individuais com projetos que não têm acesso às suas imagens. Outra alternativa é compartilhar imagens concedendo o papel de usuário de imagens do Compute Engine na imagem ou no projeto que a contém.
O diagrama a seguir mostra alguns fluxos de trabalho típicos para a criação e reutilização de uma imagem personalizada.
Antes de começar
- Para usar os exemplos de linha de comando deste guia, faça o seguinte:
- Instale ou atualize para a versão mais recente da Google Cloud CLI.
- Defina uma região e uma zona padrão.
- Para usar os exemplos de API deste guia, configure o acesso à API.
- Leia a página Imagens.
- Se o projeto do qual você quer exportar a imagem tiver uma política de imagem
confiável definida, adicione
projects/compute-image-import
eprojects/compute-image-tools
à lista de editores permitidos. - Saiba como atender aos requisitos antes de exportar imagens em Pré-requisitos para importar e exportar imagens de VM.
Limitações e restrições
Para projetos protegidos com o VPC Service Controls, use um dos seguintes métodos:
- Exportar do mesmo projeto em que a imagem reside
- Exportar a imagem manualmente
Como exportar uma imagem com um comando
Exportar uma imagem para o Cloud Storage
Exporte as imagens usando o Console do Google Cloud, a Google Cloud CLI ou a API Cloud Build.
Console
No console do Google Cloud, acesse a página Imagens.
Clique no nome da imagem que você quer exportar para acessar a página de detalhes dela. Não é possível exportar imagens públicas fornecidas pelo Google. Somente é possível exportar imagens que você já criou ou importou anteriormente.
Na página de detalhes da imagem, clique em Exportar para abrir a página Exportar imagem.
Na página Exportar imagem, escolha o Formato de exportação dela.
Escolha o local do Cloud Storage para exportar a imagem clicando em Procurar.
Escolha um local do Cloud Storage atual para exportar a imagem. Se preferir, siga as instruções para criar um novo intervalo do Cloud Storage e insira um nome para esse bucket.
Depois de escolher um Cloud Storage, escolha um nome de arquivo para a imagem exportada. É possível usar o nome de arquivo padrão ou escolher o próprio nome de arquivo.
Depois de escolher um Cloud Storage e digitar um nome de arquivo para a imagem, clique em Selecionar.
Na página Exportar imagem, clique em Exportar. Depois de escolher Exportar, o console do Google Cloud exibe o Histórico de exportação de imagens, em que é possível ver o processo de exportação de imagem. Para mais detalhes sobre o processo de exportação de imagem, clique no ID do Cloud Build para acessar a página Detalhes de exportação da imagem, em que é possível ver e fazer o download do registro de exportação de imagem.
Entre na página Armazenamento para acessar a imagem exportada.
gcloud
A maneira preferencial de exportar uma imagem para o Cloud Storage é usar o comando gcloud compute images export
. Esse comando usa o Daisy para encadear as várias etapas obrigatórias para exportar uma imagem.
Partimos do princípio que você já criou uma imagem, por exemplo, com o comando gcloud compute images create
.
Usando a Google Cloud CLI, execute:
gcloud compute images export \ --destination-uri DESTINATION_URI \ --image IMAGE_NAME
Substitua:
DESTINATION_URI
: o destino de URI do Cloud Storage para o arquivo de imagem exportado.IMAGE_NAME
: o nome da imagem de disco a ser exportada.
Por padrão, as imagens são exportadas no formato do Compute Engine,
que é um arquivo disk.raw
em formato tar e compactado. Para exportar imagens em
outros formatos compatíveis com o utilitário de imagem de disco QEMU, use a sinalização
--export-format
. Os formatos válidos incluem vmdk
, vhdx
, vpc
, vdi
e qcow2
.
Exemplo
Por exemplo, o comando a seguir exporta uma imagem chamada my-image
de my-project
para um bucket do Cloud Storage chamado my-bucket
. Por
padrão, a imagem é exportada como um disk.raw file
e é compactada no
formato de arquivo tar.gz
.
gcloud compute images export \ --destination-uri gs://my-bucket/my-image.tar.gz \ --image my-image \ --project my-project
Para sinalizações, consulte a
documentação de referência
gcloud compute images export
.
API
Na API, crie uma solicitação POST
para a API Cloud Build.
POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds { "timeout": "7200s", "steps":[ { "args":[ "-timeout=7000s", "-source_image=SOURCE_IMAGE", "-client_id=api", "-format=IMAGE_FORMAT", "-destination_uri=DESTINATION_URI" ], "name":"gcr.io/compute-image-tools/gce_vm_image_export:release", "env":[ "BUILD_ID=$BUILD_ID" ] } ], "tags":[ "gce-daisy", "gce-daisy-image-export" ] }
Substitua:
PROJECT_ID
: o código do projeto que contém a imagem que você quer exportar.SOURCE_IMAGE
: o nome da imagem a ser importada.IMAGE_FORMAT
: o formato da imagem exportada. Os formatos válidos incluemvmdk
,vhdx
,vpc
,vdi
eqcow2
.DESTINATION_URI
: o local do URI do Cloud Storage para onde você quer exportar o arquivo de imagem. Por exemplo,gs://my-bucket/my-exported-image.vmdk
.
Para outros valores args
que podem ser fornecidos, consulte a seção de sinalizações opcionais da página do GitHub sobre exportação de imagens de VM.
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-10-02T18:59:13.393492020Z", "steps": [ { "name": "gcr.io/compute-image-tools/gce_vm_image_export:release", "env": [ "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940" ], "args": [ "-timeout=7056s", "-source_image=my-image", "-client_id=api", "-format=vmdk", "-destination_uri=gs://my-bucket/my-exported-image.vmdk" ] } ], "timeout": "7200s", "projectId": "myproject-12345", "logsBucket": "gs://123456.cloudbuild-logs.googleusercontent.com", "options": { "logging": "LEGACY" }, "logUrl": "https://console.cloud.google.com/cloud-build/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 exportar uma imagem de um projeto usando uma conta de serviço personalizada do Compute Engine
Durante uma exportação de imagem, uma instância de máquina virtual (VM) temporária é criada no seu projeto. A ferramenta de exportação de imagens nesta VM temporária precisa ser autenticada.
Uma conta de serviço é uma identidade anexada a uma VM. Os tokens de acesso da conta de serviço podem ser acessados pelo servidor de metadados de instância e usados para autenticar a ferramenta de exportação de imagens na VM.
Por padrão, o processo de exportação usa o Agente de serviço padrão do Compute Engine do projeto. No entanto, se a conta de serviço padrão do Compute Engine estiver desativada no projeto ou se você quiser usar uma conta de serviço personalizada do Compute Engine, crie uma conta de serviço e especifique-a para o processo de exportação.
Exporte as imagens usando a Google Cloud CLI ou a API Cloud Build.
gcloud
Crie uma conta de serviço e atribua o mínimo de papéis. Para mais informações sobre como criar contas de serviço, consulte Como criar e gerenciar contas de serviço.
A conta de serviço do Compute Engine especificada precisa ter, no mínimo, os seguintes papéis atribuídos:
roles/compute.storageAdmin
roles/storage.objectAdmin
Saiba mais em Conceder os papéis necessários à conta de serviço do Compute Engine.
Use o comando
gcloud compute images export
para exportar a imagem.gcloud compute images export \ --destination-uri DESTINATION_URI \ --image IMAGE_NAME \ --compute-service-account SERVICE_ACCOUNT_EMAIL
Substitua:
DESTINATION_URI
: o destino de URI do Cloud Storage para o arquivo de imagem exportado.IMAGE_NAME
: o nome da imagem de disco a ser exportada.SERVICE_ACCOUNT_EMAIL
: o endereço de e-mail associado à conta de serviço do Compute Engine criada na etapa anterior.
Exemplo
Por exemplo, o comando a seguir exporta uma imagem chamada my-image
de
my-project
para um bucket do Cloud Storage chamado my-bucket
com uma
conta de serviço que tenha o e-mail
image-export-service-account@proj-12345.iam.gserviceaccount.com
. Por
padrão, a imagem é exportada como um arquivo disk.raw
e é compactada no
formato de arquivo tar.gz
.
gcloud compute images export \ --destination-uri gs://my-bucket/my-image.tar.gz \ --image my-image \ --project my-project \ --compute-service-account image-export-service-account@proj-12345.iam.gserviceaccount.com
Para sinalizações, consulte a
documentação de referência
gcloud compute images export
.
API
Crie uma conta de serviço e atribua o mínimo de papéis. Para mais informações sobre como criar contas de serviço, consulte Como criar e gerenciar contas de serviço.
A conta de serviço do Compute Engine especificada precisa ter, no mínimo, os seguintes papéis atribuídos:
roles/compute.storageAdmin
roles/storage.objectAdmin
Saiba mais em Conceder os papéis necessários à conta de serviço do Compute Engine.
Na API, crie uma solicitação
POST
para a API Cloud Build.POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds { "timeout": "7200s", "steps":[ { "args":[ "-timeout=7000s", "-source_image=SOURCE_IMAGE", "-client_id=api", "-format=IMAGE_FORMAT", "-destination_uri=DESTINATION_URI", "-compute_service_account=SERVICE_ACCOUNT_EMAIL" ], "name":"gcr.io/compute-image-tools/gce_vm_image_export:release", "env":[ "BUILD_ID=$BUILD_ID" ] } ], "tags":[ "gce-daisy", "gce-daisy-image-export" ] }
Substitua:
PROJECT_ID
: o código do projeto que contém a imagem que você quer exportar.SOURCE_IMAGE
: o nome da imagem a ser importada.IMAGE_FORMAT
: o for da imagem exportada. Os formatos válidos incluemvmdk
,vhdx
,vpc
,vdi
eqcow2
.DESTINATION_URI
: o local do URI do Cloud Storage para onde você quer exportar o arquivo de imagem. Por exemplo,gs://my-bucket/my-exported-image.vmdk
.SERVICE_ACCOUNT_EMAIL
: o endereço de e-mail associado à conta de serviço do Compute Engine criada na etapa anterior.
Para outros valores args
que podem ser fornecidos, consulte a seção de sinalizações opcionais da página do GitHub sobre exportação de imagens de VM.
Exportar uma imagem usando a VPC compartilhada
Antes de exportar uma imagem que usa uma VPC compartilhada, adicione o
papel compute.networkUser
à conta de serviço do Cloud Build.
Saiba mais em Conceder os papéis necessários à conta de serviço do
Cloud Build.
Exporte a imagem usando a Google Cloud CLI ou a API Cloud Build.
gcloud
Use o comando gcloud compute images export
para exportar a imagem.
gcloud compute images export \ --image IMAGE_NAME \ --destination-uri DESTINATION_URI \ --project PROJECT_ID \ --network NETWORK \ [--subnet SUBNET \] [--zone ZONE]
Substitua:
IMAGE_NAME
: o nome da imagem a ser exportada.DESTINATION_URI
: o local do URI do Cloud Storage para onde você quer exportar o arquivo de imagem.PROJECT_ID
: ID do projeto em que a imagem está localizada.NETWORK
: o caminho completo de uma rede VPC compartilhada. Por exemplo,projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
.SUBNET
: o caminho completo de uma sub-rede VPC compartilhada. Por exemplo,projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
.A especificação desse modo depende do modo de rede VPC.
- Se a rede VPC usar o modo legado, não especifique uma sub-rede.
- Se a rede VPC usar o modo automático, especificar a sub-rede será opcional.
- Se a rede VPC usar o modo personalizado, este campo precisará ser especificado.
ZONE
: a zona a ser usada para a exportação. Essa zona precisa corresponder à região da sub-rede. Por exemplo, seSUBNET
estiver na regiãous-west1
, a zona de exportação precisará ser uma das seguintes:us-west1-a
,us-west1-b
ouus-west1-c
.Na maioria dos casos, especificar uma zona é opcional. Se
SUBNET
for especificado, a zona precisará ser especificada.
Por exemplo, o comando a seguir exporta uma imagem chamada example-image
de my-project
para um bucket do Cloud Storage chamado my-bucket
. Neste
exemplo, a rede de nuvem privada virtual (my-shared-vp
) usa uma sub-rede personalizada
(my-custom-subnet
).
Por padrão, a imagem é exportada como um arquivo disk.raw
e é compactado no
formato de arquivo tar.gz
.
Comando de amostra
gcloud compute images export \ --image example-image \ --destination-uri gs://my-bucket/my-image.tar.gz \ --project my-project \ --network projects/my-vpc-project/global/networks/my-shared-vpc \ --subnet projects/my-vpc-project/regions/us-west1/subnetworks/my-custom-subnet \ --zone us-west1-c
API
Adicione a imagem ao Cloud Storage.
Na API, crie uma solicitação
POST
para a API Cloud Build.POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds { "timeout": "7200s", "steps":[ { "args":[ "-timeout=7000s", "-source_image=SOURCE_IMAGE", "-client_id=api", "-format=IMAGE_FORMAT", "-destination_uri=DESTINATION_URI", "-network=NETWORK", "-subnet=SUBNET", "-zone=ZONE" ], "name":"gcr.io/compute-image-tools/gce_vm_image_export:release", "env":[ "BUILD_ID=$BUILD_ID" ] } ], "tags":[ "gce-daisy", "gce-daisy-image-export" ] }
Substitua:
PROJECT_ID
: o código do projeto que contém a imagem que você quer exportar.SOURCE_IMAGE
: o nome da imagem a ser importada.IMAGE_FORMAT
: o formato da imagem exportada. Os formatos válidos incluemvmdk
,vhdx
,vpc
,vdi
eqcow2
.DESTINATION_URI
: o local do URI do Cloud Storage para onde você quer exportar o arquivo de imagem. Por exemplo,gs://my-bucket/my-exported-image.vmdk
.NETWORK
: caminho completo de uma rede VPC compartilhada. Por exemplo,projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
.SUBNET
: o caminho completo de uma sub-rede VPC compartilhada. Por exemplo,projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
.A especificação desse modo depende do modo de rede VPC.
- Se a rede VPC usar o modo legado, não especifique uma sub-rede.
- Se a rede VPC usar o modo automático, especificar a sub-rede será opcional.
- Se a rede VPC usar o modo personalizado, este campo precisará ser especificado.
ZONE
: a zona a ser usada para a exportação. Essa zona precisa corresponder à região da sub-rede. Por exemplo, seSUBNET
estiver na regiãous-west1
, a zona de exportação precisará ser uma das seguintes:us-west1-a
,us-west1-b
ouus-west1-c
.Na maioria dos casos, especificar uma zona é opcional. Se
SUBNET
for especificado, a zona precisará ser especificada.
Para outros valores
args
que podem ser fornecidos, consulte a seção de sinalizações opcionais da página do GitHub sobre exportação de imagens de VM.
Criar e exportar uma imagem manualmente
Se os comandos gcloud compute images create
e gcloud compute images export
não atenderem aos requisitos, crie e exporte uma imagem manualmente a partir de uma instância do Compute Engine. Esse processo tem etapas distintas para primeiro criar uma imagem e depois exportá-la.
No exemplo a seguir, observe que o disco criado se chama image-disk.
Para criar e exportar uma imagem:
Como opção, interrompa a instância em que o disco está anexado antes de criar a captura de tela. Isso garante a integridade do conteúdo do disco. Substitua
DISK_NAME
pelo nome do disco que você quer usar para criar o snapshot.Crie um snapshot do disco. Nomeie o snapshot como
image-snapshot
.gcloud compute disks snapshot DISK_NAME \ --snapshot-names image-snapshot
Use o snapshot
image-snapshot
para criar um novo disco chamadoimage-disk
executando o seguinte comando:gcloud compute disks create image-disk \ --source-snapshot image-snapshot
Crie um disco temporário chamado
temporary-disk
para reter o arquivotar
e especifique que oSIZE
do disco seja pelo menos 50% maior do que o disco de imagem.É possível desanexar e excluir o disco depois.
gcloud compute disks create temporary-disk \ --size SIZE
em que
SIZE
é o tamanho em Gigabytes ou Terabytes do disco temporário. Por exemplo, especifique100GB
para criar um disco de 100 gigabytes.Crie uma instância e ative o escopo
storage-rw
nela. Além disso, anexeimage-disk
etemporary-disk
à instância como discos secundários com atributosdevice-name
específicos. SubstituaVM_NAME
pelo nome da instância a ser criada.gcloud compute instances create VM_NAME \ --scopes storage-rw \ --disk name=image-disk,device-name=image-disk \ --disk name=temporary-disk,device-name=temporary-disk
Observe que você está transferindo os escopos da conta de serviço para poder fazer upload do arquivo para o Cloud Storage nas etapas posteriores.
Se necessário, analise os detalhes de como iniciar uma nova instância.
Conecte-se à instância. Substitua
VM_NAME
pelo nome da instância a ser conectada.gcloud compute ssh VM_NAME
Formate e ative o disco temporário. A formatação do disco exclui o conteúdo do disco temporário.
sudo mkdir /mnt/tmp
sudo mkfs.ext4 -F /dev/disk/by-id/google-temporary-disk
sudo mount -o discard,defaults /dev/disk/by-id/google-temporary-disk /mnt/tmp
Opcional: ative o disco de imagem e faça outras alterações antes de criar o arquivo
tar
. Por exemplo, exclua os arquivos atuais do diretório/home
se não quiser que eles façam parte da imagem. Ative as partições do disco que precisam ser modificadas, altere os arquivos necessários e desative o disco quando terminar.Crie o diretório em que será ativado o disco ou a partição.
sudo mkdir /mnt/image-disk
Use o comando
ls
para determinar o disco ou a partição de disco que você precisa ativar.ls /dev/disk/by-id/
O comando imprime uma lista de IDs e partições de disco. Por exemplo, o disco a seguir tem uma tabela de partições com uma partição. O ID
google-image-disk
aponta para o disco completo a partir de que você quer criar uma imagem. O IDgoogle-image-disk-part1
aponta para a primeira partição nesse disco. Ative a partição caso seja necessário fazer alterações no disco e crie a imagem do disco completo.google-image-disk google-image-disk-part1
Ative o disco ou a partição. Se o disco tiver uma tabela de partições, ative as partições individuais. Por exemplo, ative
google-image-disk-part1
.sudo mount /dev/disk/by-id/google-image-disk-part1 /mnt/image-disk
Como alternativa, se o disco estiver com formatação bruta sem nenhuma tabela de partições, ative o disco
google-image-disk
completo.sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
Modifique os arquivos no diretório
/mnt/image-disk
para configurar os arquivos no disco. Por exemplo, é possível remover o arquivo/mnt/image-disk/home/[USER]/.ssh/authorized_keys
para impedir que as chaves SSH sejam compartilhadas.Quando terminar de modificar os arquivos, desative o disco.
sudo umount /mnt/image-disk/
Crie um arquivo
tar
da imagem.Após personalizar os arquivos no disco de imagens, crie um arquivo do disco bruto no disco temporário. O nome da imagem do disco bruto precisa ser "disk.raw":
sudo dd if=/dev/disk/by-id/google-image-disk of=/mnt/tmp/disk.raw bs=4096
Em seguida, crie o arquivo
tar.gz
:cd /mnt/tmp
sudo tar czvf myimage.tar.gz disk.raw
Este comando cria uma imagem da instância no seguinte local:
/mnt/tmp/myimage.tar.gz
Faça upload da imagem para o Cloud Storage.
Para fazer upload do arquivo
tar
para o Cloud Storage, use a ferramenta de linha de comando gsutil que vem pré-instalada na instância.Crie um bucket usando
gsutil
.Verifique as diretrizes de nomenclatura de bucket e objeto antes de criar o bucket. Em seguida, crie o bucket usando o seguinte comando: Substitua
BUCKET_NAME
pelo nome do bucket a ser criado.me@example-instance:~$ gsutil mb gs://BUCKET_NAME
Copie o arquivo no novo bucket. Substitua
BUCKET_NAME
pelo nome do bucket onde o arquivo será copiado.me@example-instance:~$ gsutil cp /mnt/tmp/myimage.tar.gz gs://BUCKET_NAME
Você exportou seu arquivo para o Cloud Storage. Agora é possível compartilhar a imagem com outras pessoas ou usar o arquivo tar
para adicionar uma nova imagem a um projeto no Console do Google Cloud.
A seguir
- Compartilhe imagens usando o papel de usuário de imagens.
- Saiba mais sobre os métodos de importação disponíveis para o Compute Engine.