Linux環境のイメージを作成してDigitalOceanで起動する方法

前書き

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のような公式の配布が提供するクラウド画像を使用する必要があります。 次に、PackerVirtualBoxなどのツールを使用して、このベースイメージの上にソフトウェアとアプリケーションをインストールし、新しいイメージをベイク処理できます。 多くのクラウドプロバイダーと仮想化環境では、上記の互換性のある形式のいずれかに仮想ディスクをエクスポートするツールも提供されているため、可能であればこれらを使用してインポートプロセスを簡素化する必要があります。 システムのディスクイメージを手動で作成する必要がある場合は、このガイドの指示に従ってください。 これらの手順は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

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

Cloud Init dpkg Menu

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のパラメーターの詳細については、ddmanpageを参照してください。

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

Spaces Object Configuration

次に、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を参照してください。