前書き

DigitalOceanのhttps://www.digitalocean.com/docs/images/custom-images/[Custom Images]機能を使用すると、オンプレミス環境または別のクラウドプラットフォームからDigitalOceanにカスタムLinuxおよびUnixのような仮想ディスクイメージを提供できます。それらを使用してDigitalOcean Dropletsを起動します。

https://www.digitalocean.com/docs/images/custom-images/overview/ [カスタム画像のドキュメント]で説明されているように、カスタム画像アップロードツールでは次の画像タイプがネイティブにサポートされています。

ISO形式の画像は公式にはサポートされていませんが、https://www.digitalocean.com/community/tutorials/how-to-create-a-digitalocean-dropletに従ってVirtualBoxを使用して互換性のある画像を作成およびアップロードする方法を学ぶことができます-from-an-ubuntu-iso-format-image [Ubuntu ISO形式のイメージからDigitalOceanドロップレットを作成する方法]。

DigitalOceanにアップロードするhttps://www.digitalocean.com/docs/images/custom-images/overview/#image-requirements[compatible image]がまだない場合は、ディスクイメージを作成して圧縮できます。 https://www.digitalocean.com/docs/images/custom-images/overview/#image-requirements [前提条件のソフトウェアとドライバーがインストールされている]があれば、UnixライクまたはLinuxシステム。

まず、画像がカスタム画像の要件を満たしていることを確認します。 これを行うには、システムを構成し、いくつかのソフトウェア前提条件をインストールします。 次に、コマンドラインユーティリティ「+ dd 」を使用して画像を作成し、「 gzip +」を使用して画像を圧縮します。 その後、この圧縮画像ファイルをDigitalOcean Spacesにアップロードし、そこからカスタム画像としてインポートできます。 最後に、アップロードされた画像を使用してドロップレットを起動します。

前提条件

可能であれば、DigitalOceanが提供するイメージの1つをベースとして使用するか、https://cloud-images.ubuntu.com/ [Ubuntu Cloud]のような公式の配布が提供するクラウドイメージを使用する必要があります。 その後、https://www.packer.io/ [Packer]やhttps://www.virtualbox.org/[VirtualBox]などのツールを使用して、このベースイメージの上にソフトウェアとアプリケーションをインストールして、新しいイメージを作成できます。 多くのクラウドプロバイダーと仮想化環境では、上記の互換性のある形式のいずれかに仮想ディスクをエクスポートするツールも提供されているため、可能であればこれらを使用してインポートプロセスを簡素化する必要があります。 システムのディスクイメージを手動で作成する必要がある場合は、このガイドの指示に従ってください。 これらの手順はUbuntu 18.04システムでのみテストされており、手順はサーバーのOSと構成によって異なる場合があります。

このチュートリアルを始める前に、次のものが利用可能である必要があります。

  • カスタムイメージhttps://www.digitalocean.com/docs/images/custom-images/overview/#image-requirements [製品ドキュメント]にリストされているすべての要件を満たすLinuxまたはUnixライクなシステム。 たとえば、ブートディスクには次のものが必要です。

  • 最大サイズは100GB

  • `+ grub +`ブートローダーを備えたMBRまたはGPTパーティションテーブル

  • インストールされたVirtIOドライバー

  • イメージングしているシステムで管理者権限を使用できる非ルートユーザー。 Ubuntu 18.04で新しいユーザーを作成して管理者権限を付与するには、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04#step-2-%E2に従ってください%80%94-creating-a-new-user [Ubuntu 18.04での初期サーバー設定]。 Debian 9でこれを行う方法については、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9 [Debian 9での初期サーバー設定]を参照してください。

  • このガイドで作成されたディスクイメージの保存に使用される追加のストレージデバイス。コピーされるディスクと同じ大きさであることが望ましい。 これは、接続されたブロックストレージボリューム、外部USBドライブ、追加の物理ディスクなどです。

  • DigitalOcean SpaceおよびSpaceで使用するために設定された `+ s3cmd `ファイル転送ユーティリティ。 Spaceの作成方法については、Spaces https://www.digitalocean.com/docs/spaces/quickstart/[Quickstart]をご覧ください。 Spaceで使用するために ` s3cmd +`を設定する方法については、https://www.digitalocean.com/docs/spaces/resources/s3cmd/ [s3cmd 2.x Setup Guide]を参照してください。

手順1-Cloud-InitのインストールとSSHの有効化

まず、https://cloudinit.readthedocs.io/en/latest/ [cloud-Init]初期化パッケージをインストールします。 Cloud-initは、デフォルトのロケール、ホスト名、SSHキー、ネットワークデバイスなどの特定のクラウドインスタンスプロパティを構成するために起動時に実行される一連のスクリプトです。

cloud-initのインストール手順は、インストールしたオペレーティングシステムによって異なります。 一般に、 `+ cloud-init `パッケージはOSのパッケージマネージャーで使用できるはずです。したがって、Debianベースのディストリビューションを使用していない場合は、ディストリビューション固有のパッケージで次の手順で ` apt +`を使用する必要がありますマネージャーコマンド。

`+ cloud-init`のインストール

このガイドでは、Ubuntu 18.04サーバーを使用するため、 `+ apt `を使用して ` cloud-init `パッケージをダウンロードおよびインストールします。 ` cloud-init `がすでにシステムにインストールされているかもしれないことに注意してください(一部のLinuxディストリビューションはデフォルトで ` cloud-init +`をインストールします)。 確認するには、サーバーにログインして次のコマンドを実行します。

cloud-init

次の出力が表示される場合、サーバーに `+ cloud-init +`がすでにインストールされているので、DigitalOceanで使用するための構成を続行できます。

Outputusage: /usr/bin/cloud-init [-h] [--version] [--file FILES] [--debug] [--force]
                          {init,modules,single,query,dhclient-hook,features,analyze,devel,collect-logs,clean,status}
                          ...
/usr/bin/cloud-init: error: the following arguments are required: subcommand

代わりに次が表示される場合は、 `+ cloud-init`をインストールする必要があります。

Outputcloud-init: command not found

`+ cloud-init `をインストールするには、パッケージインデックスを更新し、 ` apt +`を使用してパッケージをインストールします。

sudo apt update
sudo apt install cloud-init

`+ cloud-init `をインストールしたので、DigitalOceanで使用するように設定し、 ` ConfigDrive `データソースを使用するようにします。 Cloud-initデータソースは、 ` cloud-init `がインスタンス構成とメタデータを検索および更新する方法を指示します。 DigitalOcean Dropletsは ` ConfigDrive `データソースを使用するため、Dropletが起動するたびに ` cloud-init +`が検索するデータソースのリストの最初に来ることを確認します。

`+ cloud-init`の設定

デフォルトでは、Ubuntu 18.04では、 `+ cloud-init `は最初に ` NoCloud `データソースを使用するように設定します。 これにより、DigitalOceanでイメージを実行するときに問題が発生するため、 ` ConfigDrive `データソースを使用するように ` cloud-init `を再構成し、DigitalOceanでイメージを起動したときに ` cloud-init +`が再実行されるようにする必要があります。

コマンドラインから、 `+ / etc / cloud / cloud.cfg.d +`ディレクトリに移動します:

cd /etc/cloud/cloud.cfg.d

`+ ls `コマンドを使用して、ディレクトリにある ` cloud-init +`設定ファイルを一覧表示します。

ls
Output05_logging.cfg  50-curtin-networking.cfg  90_dpkg.cfg  curtin-preserve-sources.cfg  README

インストールによっては、これらのファイルの一部が存在しない場合があります。 存在する場合、Ubuntuサーバーのネットワークインターフェースを設定する `+ 50-curtin-networking.cfg `ファイルを削除します。 DigitalOceanでイメージが起動されると、 ` cloud-init +`が実行され、これらのインターフェースが自動的に再構成されるため、このファイルは必要ありません。 このファイルが削除されない場合、このUbuntuイメージから作成されたDigitalOcean Dropletのインターフェイスは誤って設定され、インターネットからアクセスできなくなります。

sudo rm 50-curtin-networking.cfg

次に、 `+ dpkg-reconfigure cloud-init `を実行して ` NoCloud `データソースを削除し、 ` cloud-init `がDigitalOceanで使用されている ` ConfigDrive +`データソースを検索して検出するようにします。

sudo dpkg-reconfigure cloud-init

次のグラフィカルメニューが表示されます。

image:https://assets.digitalocean.com/articles/iso_custom_images/cloud_init.png [Cloud Init dpkgメニュー]

`+ NoCloud `データソースが最初に強調表示されます。 「 SPACE」を押して選択を解除し、「+ ENTER」を押します。

最後に、 `+ / etc / netplan +`に移動します。

cd /etc/netplan

以前に削除したネットワークファイル「+ cloud-init 」から生成された「 50-cloud-init.yaml +」ファイルを削除します。

sudo rm 50-cloud-init.yaml

最後のステップは、DigitalOceanでイメージが起動されたときに再実行されるように、最初の `+ cloud-init`実行から構成をクリーンアップすることを確実にすることです。

これを行うには、 `+ cloud-init clean +`を実行します:

sudo cloud-init clean

この時点で、DigitalOceanで使用するために `+ cloud-init +`をインストールして設定しました。 これで、ドロップレットへのSSHアクセスの有効化に進むことができます。

SSHアクセスを有効にする

`+ cloud-init `をインストールして設定したら、次のステップは、前提条件で概説されているように、マシンでルート以外の管理者ユーザーとパスワードを使用できるようにすることです。 このステップは、画像をアップロードしてドロップレットを起動した後に発生する可能性のあるエラーを診断するために不可欠です。 既存のネットワーク構成または不適切な ` cloud-init +`構成がネットワーク上でドロップレットにアクセスできない場合、このユーザーをhttps://www.digitalocean.com/docs/droplets/how-to/connectと組み合わせて使用​​できます-with-console / [DigitalOcean Droplet Console]を使用してシステムにアクセスし、表面化した可能性のある問題を診断します。

非ルート管理ユーザーを設定したら、最後の手順として、SSHサーバーをインストールして実行していることを確認します。 SSHは、多くの一般的なLinuxディストリビューションにしばしばプリインストールされています。 サービスが実行されているかどうかを確認するプロセスは、サーバーのオペレーティングシステムによって異なります。 これを行う方法がわからない場合は、サービスの管理に関するOSのドキュメントを参照してください。 Ubuntuでは、次のコマンドを使用してSSHが稼働していることを確認できます。

sudo service ssh status

次のような出力が表示されるはずです。

Output● ssh.service - OpenBSD Secure Shell server
  Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
  Active: active (running) since Mon 2018-10-22 19:59:38 UTC; 8 days 1h ago
    Docs: man:sshd(8)
          man:sshd_config(5)
 Process: 1092 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 1115 (sshd)
   Tasks: 1 (limit: 4915)
  Memory: 9.7M
  CGroup: /system.slice/ssh.service
          └─1115 /usr/sbin/sshd -D

SSHが稼働していない場合は、 + apt +(Debianベースのディストリビューション)を使用してインストールできます。

sudo apt install openssh-server

デフォルトでは、特に設定しない限り、SSHサーバーは起動時に起動します。 DigitalOceanは自動的に公開キーをコピーし、作成後にDropletへの即時SSHアクセスを許可できるため、これはクラウドでシステムを実行するときに望ましい方法です。

非ルート管理ユーザーを作成し、SSHを有効にし、cloud-initをインストールしたら、ブートディスクのイメージを作成する準備が整います。

手順2-ディスクイメージの作成

このステップでは、 `+ dd `コマンドラインユーティリティを使用してRAW形式のディスクイメージを作成し、 ` gzip `を使用して圧縮します。 次に、 ` s3cmd +`を使用して、DigitalOcean Spacesに画像をアップロードします。

まず、サーバーにログインし、 `+ lsblk +`を使用してシステムのブロックデバイスの配置を調べます。

lsblk

次のようなものが表示されるはずです。

OutputNAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 12.7M  1 loop /snap/amazon-ssm-agent/495
loop1    7:1    0 87.9M  1 loop /snap/core/5328
vda    252:0    0   25G  0 disk
└─vda1 252:1    0   25G  0 part /
vdb    252:16   0  420K  1 disk

この場合、メインブートディスクは25GBのディスクである「+ / dev / vda 」であり、「 / 」にマウントされているプラ​​イマリパーティションは「 / dev / vda1 」です。 ほとんどの場合、「 / 」にマウントされたパーティションを含むディスクがイメージのソースディスクになります。 ` dd `を使用して、 ` / dev / vda +`のイメージを作成します。

この時点で、ディスクイメージを保存する場所を決定する必要があります。 1つのオプションは、できればイメージ作成するディスクと同じ大きさの別のブロックストレージデバイスを接続することです。 次に、この接続された一時ディスクに画像を保存し、DigitalOcean Spacesにアップロードできます。

サーバーに物理的にアクセスできる場合は、追加のドライブをマシンに追加するか、外部USBディスクなどの別のストレージデバイスを接続できます。

このガイドで説明する別のオプションは、SSHを介してローカルマシンにイメージをコピーし、そこからSpacesにアップロードすることです。

どの方法を選択する場合でも、圧縮イメージを保存するストレージデバイスに十分な空き領域があることを確認してください。 イメージングしているディスクの大部分が空の場合、圧縮されたイメージファイルは元のディスクよりも大幅に小さいと予想できます。

オプション1:イメージをローカルで作成する

実行する `+ dd +`コマンドの構文は次のようになります。

dd if= bs=4M conv=sparse | pv -s 25G | gzip >

この場合、イメージへの入力ディスクとして「+ / dev / vda 」を選択し、入力/出力ブロックサイズを(デフォルトの512バイトから)4MBに設定しています。 これにより、通常は少し速度が上がります。 さらに、 ` conv = sparse `フラグを使用して、空のスペースをスキップして出力ファイルのサイズを最小化します。 ` dd `のパラメーターの詳細については、 ` dd +` manpageをご覧ください。

次に、出力を `+ pv `パイプビューアーユーティリティにパイプして、転送の進行状況を視覚的に追跡できるようにします(このパイプはオプションであり、パッケージマネージャーを使用して ` pv `をインストールする必要があります)。 初期ディスクのサイズがわかっている場合(この場合は25G)、「-s 25G 」を「 pv +」パイプに追加して、転送が完了するタイミングのETAを取得できます。

次に、すべてを「+ gzip 」にパイプし、サーバーに接続した一時ブロックストレージボリューム上の「 ubuntu.gz 」というファイルに保存します。 ` / mnt / tmp_disk +`を、サーバーに接続した外部ストレージデバイスへのパスに置き換えます。

オプション2:SSHを介したイメージの作成

リモートマシンに追加のストレージをプロビジョニングする代わりに、ローカルマシンに十分なディスクスペースがある場合は、SSHを介してコピーを実行することもできます。 利用可能な帯域幅によっては、これが遅くなる可能性があり、ネットワークを介したデータ転送に追加コストが発生する可能性があることに注意してください。

SSH経由でディスクをコピーおよび圧縮するには、* local *マシンで次のコマンドを実行します。

ssh @ "sudo dd if= bs=4M conv=sparse | gzip -1 -" | dd of=

この場合、リモートサーバーにSSHで接続し、そこで「+ dd 」コマンドを実行し、出力を「 gzip」にパイプします。 次に、ネットワーク経由で「+ gzip 」出力を転送し、「 ubuntu.gz 」としてローカルに保存します。 このコマンドを実行する前に、ローカルマシンで「 dd +」ユーティリティが使用可能であることを確認してください。

which dd
Output/bin/dd

上記の方法のいずれかを使用して、圧縮イメージファイルを作成します。 イメージングするディスクのサイズとイメージの作成に使用する方法によっては、これには数時間かかる場合があります。

圧縮画像ファイルを作成したら、 `+ s3cmd +`を使用してDigitalOcean Spacesにアップロードすることができます。

ステップ3-スペースおよびカスタム画像への画像のアップロード

前提条件で説明されているように、圧縮イメージを含むマシン上のDigitalOcean Spaceで使用するために、 `+ s3cmd +`をインストールして設定する必要があります。

圧縮された画像ファイルを見つけ、 `+ s3cmd +`を使用してSpaceにアップロードします。

s3cmd put  s3://

アップロードが完了したら、DigitalOcean https://cloud.digitalocean.com/spaces [コントロールパネル]を使用してSpaceに移動し、ファイルのリストで画像を見つけます。 カスタム画像が画像にアクセスしてコピーを保存できるように、画像を一時的に公開します。

画像リストの右側で、[その他]ドロップダウンメニューをクリックし、[権限の管理]をクリックします。

image:https://assets.digitalocean.com/articles/custom_images_migration/public_image.png [Spaces Object Configuration]

次に、[公開]の横のラジオボタンをクリックし、[更新]をクリックして、画像を一般公開します。

コントロールパネルの画像名にカーソルを合わせて画像のスペースURLを取得し、ポップアップウィンドウで[URLをコピー]を押します。

次に、左側のナビゲーションバーで[画像]に移動し、[カスタム画像]に移動します。

ここから、カスタム画像https://www.digitalocean.com/docs/images/custom-images/how-to/upload/ [製品ドキュメント]で詳述されているように、このURLを使用して画像をアップロードします。

その後、https://www.digitalocean.com/docs/images/custom-images/how-to/create-droplets/ [この画像からドロップレットを作成]を実行できます。 作成時にドロップレットにSSHキーを追加する必要があることに注意してください。 これを行う方法については、https://www.digitalocean.com/docs/droplets/how-to/add-ssh-keys/ [SSHキーをドロップレットに追加する方法]を参照してください。

Dropletが起動したら、SSHにドロップできれば、カスタムイメージをDigitalOcean Dropletとして正常に起動できます。

デバッグ

DropletにSSHで接続しようとしても接続できない場合は、イメージがリストの要件を満たし、 `+ cloud-init `とSSHの両方がインストールされ、適切に構成されていることを確認してください。 それでもドロップレットにアクセスできない場合は、https://www.digitalocean.com/docs/droplets/how-to/connect-with-console/ [DigitalOcean Droplet Console]と非ルートを使用してみてください。システムを探索し、ネットワーク、 ` cloud-init +`およびSSH構成をデバッグするために以前に作成したユーザー。 イメージをデバッグするもう1つの方法は、https://www.virtualbox.org/ [Virtualbox]などの仮想化ツールを使用して、仮想マシン内でディスクイメージを起動し、VM内からシステムの構成をデバッグすることです。

結論

このガイドでは、 `+ dd +`コマンドラインユーティリティを使用してUbuntu 18.04システムのディスクイメージを作成し、Dropletsを起動できるカスタムイメージとしてDigitalOceanにアップロードする方法を学びました。

このガイドの手順は、オペレーティングシステム、既存のハードウェア、およびカーネル構成によって異なる場合がありますが、一般的に、一般的なLinuxディストリビューションから作成されたイメージはこの方法を使用して機能します。 `+ cloud-init +`のインストールと設定の手順に注意深く従い、システムがhttps://www.digitalocean.com/community/tutorials/how-to-create-にリストされているすべての要件を満たしていることを確認してください。上記のLinux環境のイメージとデジタル海上での起動#prerequisites [prerequisites]セクション。

カスタムイメージの詳細については、https://www.digitalocean.com/docs/images/custom-images/ [カスタムイメージの製品ドキュメント]を参照してください。