前書き
DigitalOceanのCustom Images機能を使用すると、カスタムLinuxおよびUnixライクな仮想ディスクイメージをオンプレミス環境または別のクラウドプラットフォームからDigitalOceanに取り込み、それらを使用してDigitalOceanドロップレットを起動できます。
Custom Images documentationで説明されているように、次の画像タイプはカスタム画像アップロードツールによってネイティブにサポートされています。
ISO形式の画像は公式にはサポートされていませんが、How to Create a DigitalOcean Droplet from an Ubuntu ISO Format Imageを実行すると、VirtualBoxを使用して互換性のある画像を作成およびアップロードする方法を学ぶことができます。
DigitalOceanにアップロードするcompatible imageがまだない場合は、prerequisite software and drivers installedがあれば、UnixライクまたはLinuxシステムのディスクイメージを作成して圧縮できます。
まず、画像がカスタム画像の要件を満たしていることを確認します。 これを行うには、システムを構成し、いくつかのソフトウェア前提条件をインストールします。 次に、dd
コマンドラインユーティリティを使用してイメージを作成し、gzip
を使用して圧縮します。 その後、この圧縮画像ファイルをDigitalOcean Spacesにアップロードし、そこからカスタム画像としてインポートできます。 最後に、アップロードされた画像を使用してドロップレットを起動します。
前提条件
可能であれば、DigitalOceanが提供する画像のいずれかをベースとして使用するか、Ubuntu Cloudのような公式の配布が提供するクラウド画像を使用する必要があります。 次に、PackerやVirtualBoxなどのツールを使用して、このベースイメージの上にソフトウェアとアプリケーションをインストールし、新しいイメージをベイク処理できます。 多くのクラウドプロバイダーと仮想化環境では、上記の互換性のある形式のいずれかに仮想ディスクをエクスポートするツールも提供されているため、可能であればこれらを使用してインポートプロセスを簡素化する必要があります。 システムのディスクイメージを手動で作成する必要がある場合は、このガイドの指示に従ってください。 これらの手順はUbuntu 18.04システムでのみテストされており、手順はサーバーのOSと構成によって異なる場合があります。
このチュートリアルを開始する前に、次のものが利用可能である必要があります。
-
カスタムイメージproduct documentationにリストされているすべての要件を満たすLinuxまたはUnixライクなシステム。 たとえば、ブートディスクには次のものが必要です。
-
最大サイズは100GB
-
grub
ブートローダーを備えたMBRまたはGPTパーティションテーブル -
インストールされたVirtIOドライバー
-
-
イメージングしているシステムで管理者権限を使用できる非ルートユーザー。 新しいユーザーを作成し、Ubuntu 18.04で管理者権限を付与するには、Initial Server Setup with Ubuntu 18.04に従ってください。 Debian 9でこれを行う方法については、Initial Server Setup with Debian 9を参照してください。
-
このガイドで作成されたディスクイメージを保存するために使用される追加のストレージデバイス。コピーされるディスクと同じ大きさであることが望ましい。 これは、接続されたブロックストレージボリューム、外部USBドライブ、追加の物理ディスクなどです。
-
DigitalOcean Spaceと、Spaceで使用するように構成された
s3cmd
ファイル転送ユーティリティ。 スペースの作成方法については、スペースQuickstartを参照してください。 Spaceで使用するためにs3cmd
を設定する方法については、s3cmd 2.x Setup Guideを参照してください。
[[step-1 -—- installing-cloud-init-and-enabling-ssh]] ==ステップ1—Cloud-InitのインストールとSSHの有効化
まず、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ドロップレットはConfigDrive
データソースを使用するため、ドロップレットが起動するたびに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
次のグラフィカルメニューが表示されます。
NoCloud
データソースが最初に強調表示されます。 SPACE
を押して選択を解除し、ENTER
を押します。
最後に、/etc/netplan
に移動します。
cd /etc/netplan
以前に削除したcloud-init
ネットワークファイルから生成された50-cloud-init.yaml
ファイルを削除します。
sudo rm 50-cloud-init.yaml
最後のステップは、最初のcloud-init
の実行から構成をクリーンアップして、イメージがDigitalOceanで起動されたときに再実行されるようにすることです。
これを行うには、cloud-init clean
を実行します。
sudo cloud-init clean
この時点で、DigitalOceanで使用するためのcloud-init
をインストールして構成しました。 これで、ドロップレットへのSSHアクセスの有効化に進むことができます。
SSHアクセスを有効にする
cloud-init
をインストールして構成したら、次のステップは、前提条件で概説されているように、root以外の管理者ユーザーとパスワードをマシンで使用できるようにすることです。 このステップは、画像をアップロードしてドロップレットを起動した後に発生する可能性のあるエラーを診断するために不可欠です。 既存のネットワーク構成または不適切なcloud-init
構成により、ドロップレットがネットワーク経由でアクセスできなくなった場合は、このユーザーを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をインストールしたら、ブートディスクのイメージを作成する準備が整います。
[[step-2 -—- creating-disk-image]] ==ステップ2—ディスクイメージの作成
このステップでは、dd
コマンドラインユーティリティを使用してRAW形式のディスクイメージを作成し、gzip
を使用して圧縮します。 次に、s3cmd
を使用して画像をDigitalOceanSpacesにアップロードします。
まず、サーバーにログインし、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にアップロードすることです。
どの方法を選択する場合でも、圧縮イメージを保存するストレージデバイスに十分な空き領域があることを確認してください。 イメージングしているディスクの大部分が空の場合、圧縮されたイメージファイルは元のディスクよりも大幅に小さいと予想できます。
[.warning]#Warning:次のdd
コマンドを実行する前に、重要なアプリケーションがすべて停止され、システムが可能な限り静かであることを確認してください。 アクティブに使用されているディスクをコピーすると、ファイルが破損する可能性があるため、データを大量に消費する操作を停止し、実行中のアプリケーションをできるだけ多くシャットダウンしてください。
#
オプション1:イメージをローカルで作成する
実行するdd
コマンドの構文は次のようになります。
dd if=/dev/vda bs=4M conv=sparse | pv -s 25G | gzip > /mnt/tmp_disk/ubuntu.gz
この場合、イメージする入力ディスクとして/dev/vda
を選択し、入出力ブロックサイズを4MB(デフォルトの512バイトから)に設定しています。 これにより、通常は少し速度が上がります。 さらに、conv=sparse
フラグを使用して、空のスペースをスキップすることで出力ファイルのサイズを最小化します。 dd
のパラメーターの詳細については、dd
manpageを参照してください。
次に、出力をpv
パイプビューアユーティリティにパイプして、転送の進行状況を視覚的に追跡できるようにします(このパイプはオプションであり、パッケージマネージャーを使用してpv
をインストールする必要があります)。 初期ディスクのサイズ(この場合は25G)がわかっている場合は、-s 25G
をpv
パイプに追加して、転送がいつ完了するかについてのETAを取得できます。
次に、すべてをgzip
にパイプ処理し、サーバーに接続した一時ブロックストレージボリューム上のubuntu.gz
というファイルに保存します。 /mnt/tmp_disk
を、サーバーに接続した外部ストレージデバイスへのパスに置き換えます。
オプション2:SSHを介したイメージの作成
リモートマシンに追加のストレージをプロビジョニングする代わりに、ローカルマシンに十分なディスクスペースがある場合は、SSHを介してコピーを実行することもできます。 利用可能な帯域幅によっては、これが遅くなる可能性があり、ネットワークを介したデータ転送に追加コストが発生する可能性があることに注意してください。
SSH経由でディスクをコピーして圧縮するには、localマシンで次のコマンドを実行します。
ssh remote_user@your_server_ip "sudo dd if=/dev/vda bs=4M conv=sparse | gzip -1 -" | dd of=ubuntu.gz
この場合、リモートサーバーにSSHで接続し、そこでdd
コマンドを実行し、出力をgzip
にパイプします。 次に、gzip
の出力をネットワーク経由で転送し、ubuntu.gz
としてローカルに保存します。 このコマンドを実行する前に、ローカルマシンでdd
ユーティリティが使用可能であることを確認してください。
which dd
Output/bin/dd
上記の方法のいずれかを使用して、圧縮イメージファイルを作成します。 イメージングするディスクのサイズとイメージの作成に使用する方法によっては、これには数時間かかる場合があります。
圧縮された画像ファイルを作成したら、s3cmd
を使用してDigitalOceanSpacesにアップロードすることができます。
[[step-3 -—- uploading-image-to-spaces-and-custom-images]] ==ステップ3—画像をスペースとカスタム画像にアップロードする
前提条件で説明されているように、圧縮イメージを含むマシンのDigitalOcean Spaceで使用するために、s3cmd
をインストールして構成する必要があります。
圧縮された画像ファイルを見つけ、s3cmd
を使用してスペースにアップロードします。
[.note]#Note:your_space_name
は、URLではなくスペースの名前に置き換える必要があります。 たとえば、スペースのURLがhttps://example-space-name.nyc3.digitaloceanspaces.com
の場合、スペースの名前はexample-space-name
。
#です。
s3cmd put /path_to_image/ubuntu.gz s3://your_space_name
アップロードが完了したら、DigitalOceanControl Panelを使用してスペースに移動し、ファイルのリストで画像を見つけます。 カスタム画像が画像にアクセスしてコピーを保存できるように、画像を一時的に公開します。
画像リストの右側で、Moreドロップダウンメニューをクリックしてから、Manage Permissionsをクリックします。
次に、Publicの横にあるラジオボタンをクリックし、Updateを押して、画像を一般公開します。
[.warning]#Warning:このプロセス中、スペースパスを持つすべての人が画像に一時的に公開されます。 画像を一時的に公開したくない場合は、DigitalOceanAPIを使用してカスタム画像を作成できます。 画像がカスタム画像に正常に転送されたら、上記の手順を使用して画像をPrivateに設定してください。
#
コントロールパネルの画像名にカーソルを合わせて画像のスペースURLを取得し、ポップアップするウィンドウでCopy URLを押します。
次に、左側のナビゲーションバーでImagesに移動し、次にCustom Imagesに移動します。
ここから、カスタム画像Product Documentationで詳しく説明されているように、このURLを使用して画像をアップロードします。
その後、create a Droplet from this imageを実行できます。 作成時にドロップレットにSSHキーを追加する必要があることに注意してください。 これを行う方法については、How to Add SSH Keys to Dropletsを参照してください。
Dropletが起動したら、SSHにドロップできれば、カスタムイメージをDigitalOcean Dropletとして正常に起動できます。
デバッグ
ドロップレットにSSHで接続しようとして接続できない場合は、イメージがリストされた要件を満たし、cloud-init
とSSHの両方がインストールされ、適切に構成されていることを確認してください。 それでもドロップレットにアクセスできない場合は、DigitalOcean Droplet Consoleと、前に作成したroot以外のユーザーを使用して、システムを探索し、ネットワーク、cloud-init
、およびSSH構成をデバッグしてみてください。 イメージをデバッグするもう1つの方法は、Virtualboxなどの仮想化ツールを使用して仮想マシン内でディスクイメージを起動し、VM内からシステムの構成をデバッグすることです。
結論
このガイドでは、dd
コマンドラインユーティリティを使用してUbuntu 18.04システムのディスクイメージを作成し、ドロップレットを起動できるカスタムイメージとしてDigitalOceanにアップロードする方法を学習しました。
このガイドの手順は、オペレーティングシステム、既存のハードウェア、およびカーネル構成によって異なる場合がありますが、一般的に、一般的なLinuxディストリビューションから作成されたイメージはこの方法を使用して機能します。 cloud-init
のインストールと設定の手順を注意深く実行し、システムが上記のprerequisitesセクションにリストされているすべての要件を満たしていることを確認してください。
カスタムイメージの詳細については、Custom Images product documentationを参照してください。