介绍
DigitalOcean的 自定义图像功能允许您将自定义Linux和Unix类型的虚拟磁盘图像从本地环境或其他云平台带到DigitalOcean,并使用它们启动DigitalOcean Droplets。
如在 [自定义图像文档] 中所述(https://www.digitalocean.com/docs/images/custom-images/overview/),自定义图像上传工具可支持以下图像类型:
- Raw (
.img
) - qcow2
- [VHDX](https://en.wikipedia.org/wiki/VHD_(file_format)# Virtual_Hard_Disk_(VHDX))
- VDI
- VMDK
虽然官方不支持ISO格式图像,但您可以通过以下方法学习如何使用VirtualBox创建和上传兼容图像:How to Create a DigitalOcean Droplet from an Ubuntu ISO Format Image(https://andsky.com/tech/tutorials/how-to-create-a-digitalocean-droplet-from-an-ubuntu-iso-format-image)。
如果您还没有(https://www.digitalocean.com/docs/images/custom-images/overview/# image-requirements)上传到DigitalOcean,您可以创建和压缩您的Unix或Linux系统的磁盘图像,只要它有(https://www.digitalocean.com/docs/images/custom-images/overview/ image-requirements)。
首先,我们将确保我们的图像符合自定义图像的要求,以便这样做,我们将配置系统并安装一些软件前提条件,然后,我们将使用dd
命令行实用程序创建图像,并使用gzip
压缩它,然后,我们将这个压缩图像文件上传到DigitalOcean Spaces,从那里我们可以将其导入为自定义图像。
前提条件
如果可能的话,您应该使用数字海洋提供的图像之一作为底片,或者使用官方发行提供的云像像 [Ubuntu Cloud] (https://cloud-images.ubuntu.com/). 然后可以在此底像上安装软件和应用程序来烘烤出新的图像,使用诸如[Packer] (https://www.packer.io/)和[VirtualBox] (https://www.virtualbox.org/]等工具. 许多云提供商和虚拟化环境也提供了将虚拟磁盘导出到上述相容格式之一的工具,因此,如果可能的话,您应该使用这些工具来简化导入过程. 在需要手动创建系统磁盘映像时,可以遵循本指南中的指令. 注意这些指令仅用Ubuntu 18.04系统进行测试,步骤可能因您服务器的OS和配置而异.
在您开始使用本教程之前,您应该拥有以下内容:
- 符合自定义图像产品文档所列所有要求的Linux或Unix类系统。 例如,你的启动磁盘必须:
- 最大尺寸为100GB
- MBR或GPT分区表,装有 " grub " 装货机
- 安装了Virtio司机 一个拥有行政特权的非本地用户, 要创建新用户,并赋予其在Ubuntu 18.04上的行政权限,请遵循我们的初始服务器设置与Ubuntu 18.04. 要学习如何在 Debian 9 上做到这一点,请咨询 [Initial Server setup with Debian 9] (https://andsky.com/tech/tutorials/initial-server-setup-with-debian-9).
- 联合国 一个额外的存储设备,用于存储本向导中创建的磁盘图像,最好与被复制的磁盘一样大. 这可以是附加块存储量,外部USB驱动器,额外的物理磁盘等.
- 数字海洋空间和
s3cmd'文件传输工具,配置用于空间。 要学习如何创建空间,请参考空间[快起 (https://www.digitalocean.com/docs/spaces/quickstart/). 为了了解如何设置
s3cmd'与您的空间使用,请参考s3cmd 2.x设置指南。 .
步骤 1 — 安装 Cloud-Init 并启用 SSH
首先,我们将安装 cloud-Init初始化包. Cloud-init 是一个在启动时运行的脚本组合,以配置某些云实例属性,如默认位置、主机名、SSH 密钥和网络设备。
安装 cloud-init 的步骤将取决于您所安装的操作系统。一般来说,cloud-init
包应该在您的操作系统的包管理器中可用,所以如果您不使用基于 Debian 的发行版,您应该在以下步骤中用您的发行版特定的包管理器命令代替apt
。
安装cloud-init
在本指南中,我们将使用Ubuntu 18.04服务器,因此将使用)。
1cloud-init
如果您看到以下输出,则cloud-init
已安装在您的服务器上,您可以继续将其配置用于DigitalOcean:
1[secondary_label Output]
2usage: /usr/bin/cloud-init [-h] [--version] [--file FILES] [--debug] [--force]
3 {init,modules,single,query,dhclient-hook,features,analyze,devel,collect-logs,clean,status}
4 ...
5/usr/bin/cloud-init: error: the following arguments are required: subcommand
如果您看到以下内容,则需要安装cloud-init
:
1[secondary_label Output]
2cloud-init: command not found
要安装cloud-init
,更新您的包索引,然后使用apt
安装包:
1sudo apt update
2sudo apt install cloud-init
现在我们已经安装了cloud-init
,我们将将其配置用于DigitalOcean,确保它使用ConfigDrive
数据源。云-init数据源决定cloud-init
如何搜索和更新实例配置和元数据。
重新配置Cloud-init
默认情况下,在Ubuntu 18.04上,cloud-init
会配置为先使用NoCloud
数据源,这会导致在DigitalOcean上运行图像时出现问题,因此我们需要重新配置cloud-init
以使用ConfigDrive
数据源,并确保cloud-init
在DigitalOcean上启动图像时重新启动。
从命令行导航到 /etc/cloud/cloud.cfg.d
目录:
1cd /etc/cloud/cloud.cfg.d
使用ls
命令列出目录中存在的cloud-init
配置文件:
1ls
1[secondary_label Output]
205_logging.cfg 50-curtin-networking.cfg 90_dpkg.cfg curtin-preserve-sources.cfg README
根据您的安装情况, 其中一些文件可能不存在 。 如果存在, 请删除 50- curtin- networking.cfg
文件, 该文件为您的 Ubuntu 服务器配置网络接口 。 当图像在 Digital Ocean 上启动时, `cloud-init' 将自动运行并重新配置这些接口, 因此此文件没有必要 。 如果不删除此文件, 从此 Ubuntu 图像创建的 DigitalOcean Droplet 将会有其界面配置错误, 并且无法从 Internet 访问 :
1sudo rm 50-curtin-networking.cfg
接下来,我们将运行dpkg-reconfigure cloud-init
来删除NoCloud
数据源,确保cloud-init
搜索并找到用于DigitalOcean的ConfigDrive
数据源:
1sudo dpkg-reconfigure cloud-init
您应该看到以下图形菜单:
NoCloud
数据源最初被突出。 按SPACE
解除选项,然后按ENTER
。
最后,导航到 /etc/netplan
:
1cd /etc/netplan
删除从我们之前删除的cloud-init
网络文件中生成的50-cloud-init.yaml
文件:
1sudo rm 50-cloud-init.yaml
最后一步是确保我们清理最初的云启动
运行的配置,以便在DigitalOcean上启动图像时重新启动。
要做到这一点,请运行cloud-init clean
:
1sudo cloud-init clean
此时,您已经安装并配置了cloud-init
以便与DigitalOcean一起使用。
启用 SSH 访问
一旦你安装和配置了) 访问您的系统并诊断任何可能浮出水面的问题 .
一旦你设置了你的非根管理用户,最后一步是确保你有一个SSH服务器安装和运行。SSH通常在许多流行的Linux发行版上预安装。检查服务是否正在运行的过程将取决于你的服务器的操作系统.. 如果你不确定如何做到这一点,请参阅你的操作系统的管理服务文档。
1sudo service ssh status
你应该看到以下结果:
1[secondary_label Output]
2● ssh.service - OpenBSD Secure Shell server
3 Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
4 Active: active (running) since Mon 2018-10-22 19:59:38 UTC; 8 days 1h ago
5 Docs: man:sshd(8)
6 man:sshd_config(5)
7 Process: 1092 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
8 Main PID: 1115 (sshd)
9 Tasks: 1 (limit: 4915)
10 Memory: 9.7M
11 CGroup: /system.slice/ssh.service
12 └─1115 /usr/sbin/sshd -D
如果 SSH 没有启动并运行,您可以使用) 安装它:
1sudo apt install openssh-server
默认情况下,SSH 服务器将启动,除非配置不同,这是在在云中运行系统时的理想选择,因为DigitalOcean 可以自动复制到您的公共密钥中,并在创建后立即向您提供 SSH 访问。
一旦您创建了非 root 管理用户,启用了 SSH,并安装了 Cloud-init,您可以继续创建启动磁盘的图像。
第2步:创建磁盘图像
在此步骤中,我们将使用dd
命令行实用程序创建一个RAW格式磁盘图像,并使用gzip
压缩它,然后使用s3cmd
将图像上传到DigitalOcean Spaces。
首先,登录您的服务器,并使用lsblk
检查您的系统的区块设备布局:
1lsblk
你应该看到一些如下:
1[secondary_label Output]
2NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
3loop0 7:0 0 12.7M 1 loop /snap/amazon-ssm-agent/495
4loop1 7:1 0 87.9M 1 loop /snap/core/5328
5vda 252:0 0 25G 0 disk
6└─vda1 252:1 0 25G 0 part /
7vdb 252:16 0 420K 1 disk
在这种情况下,我们注意到我们的主要启动磁盘是/dev/vda
,一个25GB的磁盘,而安装在/
的主要分区是/dev/vda1
。
在此时,您应该决定将磁盘图像存储在何处。一个选项是附加另一个区块存储设备,最好是大于您要图像的磁盘。
如果您对服务器有物理访问权限,则可以将额外的驱动器添加到机器中,或连接其他存储设备,例如外部USB驱动器。
我们将在本指南中展示的另一个选项是将图像通过SSH复制到本地机器,您可以将其上传到Spaces。
无论您选择使用哪种方法,请确保存储压缩图像的存储设备有足够的可用空间. 如果您正在成像的磁盘大多是空的,您可以预计压缩图像文件要比原始磁盘小得多。
<$>[警告] 警告: 在运行以下dd
命令之前,请确保任何关键应用程序已经停止,并且您的系统尽可能安静。
选项1:本地创建图像
我们要执行的dd
命令的语法如下:
1dd if=/dev/vda bs=4M conv=sparse | pv -s 25G | gzip > /mnt/tmp_disk/ubuntu.gz
在这种情况下,我们正在选择)。 这通常会加速一些东西。此外,我们正在使用)。
然后,我们将输出管道导向) 如果您知道初始磁盘的大小(在这种情况下是25G),您可以将25G
添加到pv
管道中,以获得转移完成时的ETA。
然后我们将其全部管道到gzip
,并将其保存到一个名为ubuntu.gz
的文件中,在我们已连接到服务器的临时区块存储量上。
选项 2:通过 SSH 创建图像
如果您在本地计算机上有足够的磁盘空间,而不是为您的远程计算机提供额外的存储空间,则也可以通过 SSH 执行副本。
要通过 SSH 复制和压缩磁盘,请在您的 本地 计算机上执行以下命令:
1[environment local]
2ssh remote_user@your_server_ip "sudo dd if=/dev/vda bs=4M conv=sparse | gzip -1 -" | dd of=ubuntu.gz
在这种情况下,我们正在将gzip
输出传输到我们的远程服务器中,在那里执行dd
命令,然后输出到gzip
。
1which dd
1[secondary_label Output]
2/bin/dd
使用上述任何方法创建压缩图像文件,这可能需要几个小时,这取决于您正在成像的磁盘的大小和您使用的创建图像的方法。
一旦您创建了压缩图像文件,您可以继续将其上传到您的DigitalOcean空间使用s3cmd
。
步骤 3 – 将图像上传到空间和自定义图像
如前提所述,您应该安装和配置s3cmd
,以便在包含压缩图像的机器上与您的 DigitalOcean Space 一起使用。
查找压缩的图像文件,并使用s3cmd
将其上传到您的空间:
例如,如果您的空间的 URL 是 https://example-space-name.nyc3.digitaloceanspaces.com
,那么您的空间的名称是 example-space-name
。
1[environment local]
2s3cmd put /path_to_image/ubuntu.gz s3://your_space_name
一旦上传完成,请使用DigitalOcean [控制面板]导航到您的空间(https://cloud.digitalocean.com/spaces),并在文件列表中找到图像。我们将暂时使图像公开访问,以便自定义图像可以访问它并保存副本。
在图像列表的右侧,单击 更多 下载菜单,然后单击** 管理权限** :
然后,点击 公共 旁边的无线电按钮,然后点击** 更新** 以使图像公开可用。
<$>[警告] 警告: 在此过程中,您的图像将暂时向任何使用其 Spaces 路径的人公开访问。如果您希望避免暂时向公众发布您的图像,您可以使用 DigitalOcean API创建自定义图像。在您的图像成功转移到自定义图像后,请确保将您的图像设置为** Private** 。
通过在控制面板上浮动图像名称来获取图像的 Spaces URL,并在出现的窗口中点击 Copy URL 。
现在,在左侧导航栏中导航到 图像 ,然后导航到** 自定义图像** 。
从这里上传您的图像使用此URL,如在自定义图像(https://www.digitalocean.com/docs/images/custom-images/how-to/upload/)。
然后你可以 创建一个Droplet从这个图像. 注意你需要在创建时添加一个SSH密钥到Droplet。 要了解如何做到这一点,请参阅 如何添加SSH密钥到Droplets。
一旦您的 Droplet 启动,如果您可以 SSH 到它,您已成功推出您的自定义图像作为一个 DigitalOcean Droplet。
调试
如果您试图将 SSH 输入您的 Droplet 并无法连接, 请确保您的图像符合所列要求, 并安装和正确配置 SSH 。 如果您仍然无法访问 Droplet, 可以尝试使用 [DigitalOcean Droplet Console] (https://www.digitalocean.com/docs/droplets/how-to/connect-with-console/) 以及您早些时候创建的非根用户来探索此系统并调试您的网络, cloud-init
和 SSH 配置 。 调试您图像的另一种方法是使用像 [Virtualbox] (https://www.virtualbox.org/] 这样的虚拟化工具来启动虚拟机内部的磁盘图像,并从VM内部调试您的系统配置.
结论
在本指南中,您已经学会了如何使用dd
命令行实用程序创建Ubuntu 18.04系统的磁盘图像,并将其上传到DigitalOcean作为自定义图像,您可以从中启动Droplets。
本指南中的步骤可能因您的操作系统,已存在的硬件,以及内核配置而不同,但一般来说,从受欢迎的Linux发行所创建的图像应该使用这种方法来工作. 确保认真跟踪安装和配置 " 云闪 " 的步骤,并确保您的系统符合上文先决条件部分所列的所有要求.
有关自定义图像的更多信息,请参阅 自定义图像产品文档。