如何在计算引擎中将持久性磁盘从一个项目迁移到另一个项目?

时间:2014-03-02 13:37:13

标签: google-compute-engine

我想知道如何将持久性磁盘(Google Compute Engine)从一个项目迁移到另一个项目?如果它是可行的。

14 个答案:

答案 0 :(得分:18)

如果要复制(非root)永久磁盘,请执行以下步骤:

  1. 转到 Google Developer Console 并从计算机上分离<disk-name>磁盘。
  2. 使用gcloud命令行实用程序切换到旧项目:
    • gcloud config set project <old-project>
  3. 创建<disk-name>磁盘的图片:
    • gcloud compute images create <image-name> --source-disk=<disk-name> --source-disk-zone=<zone>
  4. 上述命令的输出将为您提供图像的完全限定链接(格式为https://www.googleapis.com/compute/v1/projects/<project-name>/global/images/<image-name>)。或者,运行: gcloud compute images list --no-standard-images --uri | grep <image-name>找到链接。
  5. 切换到新项目:
    • gcloud config set project <new-project>
  6. 从图片中创建新磁盘:
    • gcloud compute disks create <new-disk-name> --image=<link-to-the-image> --zone=<zone>

答案 1 :(得分:11)

如上所述Mike Lutz的答案,除了 gcutil现已弃用,但第二个命令也可以gcloud compute instance完成:

1)从你的PD创建你的图像(注意!先读!https://cloud.google.com/compute/docs/images#creating_an_image_from_a_root_persistent_disk

$ gcloud compute images create [example-image] --source-disk [example-disk] --source-disk-zone ZONE --project="old-project-name"

2)在新项目中实例化图像(不言而喻,但您必须有权访问这两个项目)

$ gcloud compute instances create [example-instance-1] --project=[new-project-name] --image="https://www.googleapis.com/compute/v1/projects/[old-project-name]/global/images/[image-name]" --boot-disk-size [XXXGB] --machine-type=[machine-type] --network="default" --zone=[datacenter-zone] 
  • 您可以在&#34;等效REST&#34;
  • 下的图片标签中看到图片的网址

有关其他实例配置选项,请参阅:https://cloud.google.com/sdk/gcloud/reference/compute/instances/create

答案 2 :(得分:2)

在GCE上没有简单的方法可以做到这一点,唯一的方法是完成创建自定义映像的过程,将其导出到云存储桶(两个项目都有权限),然后创建一个新的实例在新项目中使用新的自定义图像。

请按照以下说明操作:https://developers.google.com/compute/docs/images#installinganimage

答案 3 :(得分:2)

如果你可以用它创建一个图像。然后你可以做这样的事情,它会将图像复制到你新项目的磁盘中:

{gcloud compute instances create my-instance-1 --project = [new-project-id] --image =&#34; https://www.googleapis.com/compute/v1/projects/ [old -project-ID] /全局/图像/ [图像名]&#34;}

答案 4 :(得分:2)

在上面添加Amos的答案,为了避免必须从其实例中分离pd以便从中创建图像,我使用了以下序列:

在源项目中:

  1. 从要克隆的所需引导磁盘创建SNAPSHOT。
  2. 从该快照创建新的永久磁盘。
  3. 从新pd。
  4. 创建图像

    在目标项目中:

    1. 使用新创建的图像的网址创建VM实例。
    2. 完成后,您可以删除源项目中创建的磁盘和图像。

答案 5 :(得分:2)

如果有其他人从谷歌搜索到这里,今天你可以直接从另一个项目的快照在一个项目中创建一个磁盘,而无需创建任何临时物理磁盘或图像。

  1. 创建快照:gcloud compute disks snapshot your-disk-name --snapshot-names=your-snapshot-name --project=source-project --zone=source-zone

  2. 描述快照并找到selfLink:gcloud compute snapshots describe your-snapshot-name --project=source-project

  3. 在创建磁盘时使用selfLink而不是快照名称 新项目:gcloud compute disks create your-new-disk-name --project=destination-project --zone=destination-zone --source-snapshot=https://www.googleapis.com/compute/v1/projects/source-project/global/snapshots/your-snapshot-name

答案 6 :(得分:1)

虽然以下内容不会直接迁移持久性磁盘,但它只允许您使用两个命令在另一个项目上复制一个。

如果您将文档IanGSY引用中的进程组合起来将磁盘转换为&#34;图像&#34;即:

gcloud compute images create example-image --source-disk example-disk --source-disk-zone ZONE

(上述命令仅在驱动器不活动(已连接)时有效,如果必须丢弃VM,请确保不要让它删除驱动器 - 确保&#34;删除启动删除实例时的磁盘&#34;如果您使用网络用户界面,则不会检查!)

并使用Jens所暗示的内容(在SO:How to share google compute engine images across projects?的答案中详细说明)I.E:

gcutil --service_version="v1" --project=<ID-of-your-project> addinstance <name-you-for-instance> --machine_type=<type-of-machine> --network="default" --external_ip_address="ephemeral" --zone=<datacenter-zone> --image="https://www.googleapis.com/compute/v1/projects/<ID-of-image-owners-project>/global/images/<image-id>" --persistent_boot_disk="true"

您将在另一个项目中获得给定磁盘的副本。

答案 7 :(得分:0)

请勿使用在云存储桶中创建映像文件并共享它的过程。它还不是很强大(尚)。 Amos在源项目中创建图像并在目标项目中从该图像创建实例的方法更加清晰,对我来说非常有用。

请注意命令行选项,因为gcloud实用程序有点不稳定。

答案 8 :(得分:0)

我很难将磁盘上的数据从我的一个项目获取到另一个项目。尽我所能遵循这里和Google的所有指示但是在没有先创建实例的情况下无法创建全新的磁盘。这就是我最终做的事情......(受到许多其他答案的影响很大)

在原始项目中:

  • 转到IAM并查找您的电子邮件地址。在角色中添加角色:Compute Engine =&gt;计算图像用户(这假设你是两个项目的所有者。我也不是100%肯定这是最后的必要步骤)
  • 创建新图片。将“Source”设置为“Disk”。然后选择你的磁盘。

在目的地项目中:

  • 打开Goog​​le Cloud Shell(GCE控制台右上角的按钮)
  • 运行此命令从磁盘创建一个新的INSTANCE:gcloud compute instances create NAMEFORNEWINSTANCE --image IMAGENAMEYOUCHOSE --image-project ORIGINALPROJECTNAME(是的,我们正在创建一个新实例,即使您真的只想创建一个新磁盘。我无法让它工作只需创建一个新磁盘。)
  • 找到刚刚创建的实例。停下来。编辑它。取消选中“删除实例时删除引导磁盘”复选框。保存更改。 删除实例。不要选中该框以删除引导磁盘。
  • 转到“磁盘”面板。您应该看到一个名称与您为NAMEFORNEWINSTANCE
  • 选择的内容相同的磁盘

附加磁盘:(不完全相同的主题,但是为任何需要知道如何操作的人提供这些步骤)

  • 在Google Cloud Shell中运行:gcloud compute instances attach-disk NAMEOFINSTANCETOATTACHTO --disk=NAMEOFDISK(同样,NAMEOFDISK应与您为NAMEFORNEWINSTANCE选择的相同)您应该在Disks面板中看到它现在已附加到您的新实例。
  • SSH连接到您附加的实例
  • 创建一个新目录以将此磁盘装载到:sudo mkdir /DIRECTORYNAME
  • 运行lsblk以查看磁盘列表,其名称,大小和挂载点。尝试在那里找到你附加的磁盘。大小应与您在“磁盘”面板中看到的大小相匹配,不应安装到任何内容
  • 使用以下代码将磁盘装入您的目录:sudo mount /dev/NAME_FOUND_IN_STEP_ABOVE /DIRECTORY

答案 9 :(得分:0)

如果数据不是太大(例如,小于1 TB(?)),则可以直接使用两个VM(每个都有随附的磁盘)直接复制它,这样会更容易:

  • 在目标VM上,生成一个临时ssh密钥:ssh-keygen -t rsa
  • 在源VM上,使用控制台添加生成的公共密钥的内容(来自目标的~/.ssh/id_rsa.pub)。您也可以将其作为新行添加到目标的~/.ssh/authorized_keys
  • 使用rsync或scp复制数据。

  • 如果您的数据需要sudo,则需要执行额外的步骤-启用sudo rsync

    • 在源头上,使用sudo visudo并添加username ALL=NOPASSWD:/usr/bin/rsync(更改用户名,并使用which rsync,以防路径不同)
    • 使用rsync -av --rsync-path="sudo rsync" -e='ssh -o "UserKnownHostsFile /dev/null" -i ~username/.ssh/id_rsa' username@source.ip.address:/source/path/ /target/path(两次更新用户名并使用正确的source.ip.address)

答案 10 :(得分:0)

使用GUI

内部项目1:

1)通过转到https://console.cloud.google.com/iam-admin/iam并授予访问权限,然后单击“添加”,然后输入与project2关联的电子邮件,然后将角色选择为Compute Engine> Compute Image User(可能还需要Compute Storage Admin角色)

2)从磁盘https://console.cloud.google.com/compute/imagesAdd创建映像

内部项目2:

3)创建一个新实例,然后在“启动磁盘”下单击更改https://console.cloud.google.com/compute/instancesAdd

4)选择“自定义图片”标签,然后在“从...中选择图片”下选择project1

5)选择列出的共享磁盘名称

6)继续新的实例设置

答案 11 :(得分:0)

有官方指南只需要 3 个步骤即可实现目标,因为可以跨项目访问快照:https://cloud.google.com/compute/docs/disks/create-snapshots#sharing_snapshots

gcloud compute disks snapshot disk-1 --project project-a --snapshot-names snapshot-1
gcloud compute disks create disk-2  --project project-b --source-snapshot projects/project-a/global/snapshots/snapshot-1
gcloud compute instances attach-disk instance-1 --project project-b --disk disk-2

答案 12 :(得分:0)

添加我的答案,因为一切似乎都过时了。 GCP 允许在项目之间移动图像,整个解决方案都围绕此展开。

我有 2 个 GCP 项目 A 和 B。A 中的永久性磁盘需要转移到 B。

 1. Create an image from your persistent disk in A.
 2. In B, create a new image and select the source as the image from A.
 3. In B, create a disk from the image (from 2)
 4. (Cleanup) Delete the images in both A and B.

所有这些都可以通过用户界面完成(2021 年 1 月 15 日)。

答案 13 :(得分:-1)

上面Amos描述的方法使用命令“gcloud compute instances create”来解决OP请求的任务。当他使用“--image”标志时,他提供了google网址(这很长,我必须查找并每次检查它的语法)。

同样的“gcloud compute instances create”命令也会带一个“--image-project”标志,其中OP请求的任务以相同的方式解决,除了它接受你的图像和项目名称,所以你不必记住或查找更长的uri。

命令也接受“--image”和“--image-project”标志:“gcloud compute disks create”,因此您可以将原始项目的永久磁盘的原始项目映像迁移到新项目中的新持久性磁盘,无需创建正在运行(即可计费)的实例。

这两种方法都要求在新项目中创建实例或磁盘之前,在原始项目中创建要迁移的磁盘映像。

我刚刚将一个磁盘从我的开发项目迁移到了一个生产项目,我的会话看起来如下:

  1. 在我的原始项目中,我创建了一个我想要迁移的磁盘的映像(首先它必须从任何正在运行的实例中分离)其他人可能有一个不同于我使用的磁盘区域,所以相应修改:

    gcloud config set project originalproject

    gcloud compute images create imageofmydisk --description“我的磁盘映像,可以部署” - 家庭“grsec-4.6.5” - source-disk mydisk --source-disk-zone us-central1-f < / p>

  2. 切换到我的新项目,我根据我在旧项目中新创建的磁盘映像创建了一个新磁盘:

    gcloud config set project newproject

    gcloud计算磁盘创建mynewdisk --description“mynewdisk的描述”--type pd-ssd --image imageofmydisk --image-project originalproject

  3. 因此,我完成了OP请求的任务,无需记忆或每次查找图像的完整URL。