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

提供:Dev Guides
移動先:案内検索

序章

DigitalOceanのカスタムイメージ機能を使用すると、オンプレミス環境または別のクラウドプラットフォームからカスタムLinuxおよびUnixライクな仮想ディスクイメージをDigitalOceanに取り込み、それらを使用してDigitalOceanドロップレットを起動できます。

カスタム画像のドキュメントで説明されているように、次の画像タイプはカスタム画像アップロードツールによってネイティブにサポートされています。

ISO形式の画像は公式にはサポートされていませんが、 UbuntuISO形式の画像からDigitalOceanドロップレットを作成する方法に従って、VirtualBoxを使用して互換性のある画像を作成およびアップロードする方法を学ぶことができます。

DigitalOceanにアップロードする互換イメージがまだない場合は、前提条件のソフトウェアとドライバーがインストールされていれば、UnixライクまたはLinuxシステムのディスクイメージを作成して圧縮できます。

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

前提条件

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

このチュートリアルを開始する前に、次のものを利用できるようにしておく必要があります。

  • カスタムイメージ製品ドキュメントにリストされているすべての要件を満たすLinuxまたはUnixライクなシステム。 たとえば、ブートディスクには次のものが必要です。
    • 最大サイズ100GB
    • grubブートローダーを備えたMBRまたはGPTパーティションテーブル
    • インストールされているVirtIOドライバー
  • イメージングしているシステムで使用可能な管理者権限を持つroot以外のユーザー。 新しいユーザーを作成し、Ubuntu 18.04で管理者権限を付与するには、 Ubuntu18.04を使用したサーバーの初期設定に従います。 Debian 9でこれを行う方法については、 Debian9を使用したサーバーの初期設定を参照してください。
  • このガイドで作成されたディスクイメージを保存するために使用される追加のストレージデバイス。コピーするディスクと同じ大きさであることが望ましい。 これは、接続されたブロックストレージボリューム、外部USBドライブ、追加の物理ディスクなどです。
  • DigitalOcean Spaceと、Spaceで使用するように構成されたs3cmdファイル転送ユーティリティ。 スペースの作成方法については、スペースクイックスタートを参照してください。 Spaceで使用するs3cmdのセットアップ方法については、s3cmd2.xセットアップガイドを参照してください。

ステップ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でイメージを実行するときに問題が発生するため、cloud-initを再構成してConfigDriveデータソースを使用し、イメージが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ドロップレットのインターフェイスは正しく構成されておらず、インターネットからアクセスできません。

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構成により、Dropletがネットワーク経由でアクセスできなくなる場合は、このユーザーを 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を使用して画像を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つのオプションは、できればイメージするディスクと同じ大きさの別のブロックストレージデバイスを接続することです。 次に、この接続された一時ディスクにイメージを保存して、DigitalOceanSpacesにアップロードできます。

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

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

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

警告:次の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マンページを参照してください。

次に、出力を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にアップロードすることができます。

ステップ3—スペースとカスタム画像への画像のアップロード

前提条件で説明されているように、s3cmdがインストールされ、圧縮イメージを含むマシンのDigitalOceanSpaceで使用できるように構成されている必要があります。

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

注: 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

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

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

次に、パブリックの横にあるラジオボタンをクリックし、更新を押して、イメージをパブリックにアクセスできるようにします。

警告:このプロセス中、スペースパスを使用しているユーザーは一時的に画像に一般公開されます。 画像を一時的に公開したくない場合は、DigitalOcean APIを使用してカスタム画像を作成できます。 カスタム画像に正常に転送された後は、上記の手順で画像をプライベートに設定してください。


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

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

ここから、カスタム画像製品ドキュメントで詳しく説明されているように、このURLを使用して画像をアップロードします。

次に、このイメージからドロップレットを作成できます。 作成時にDropletにSSHキーを追加する必要があることに注意してください。 これを行う方法については、SSHキーをドロップレットに追加する方法を参照してください。

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

デバッグ

ドロップレットにSSHで接続しようとして接続できない場合は、イメージがリストされた要件を満たし、cloud-initとSSHの両方がインストールされて適切に構成されていることを確認してください。 それでもDropletにアクセスできない場合は、 DigitalOcean Droplet Console と、前に作成したroot以外のユーザーを使用して、システムを探索し、ネットワークをデバッグすることができます。cloud-initおよびSSH構成。 イメージをデバッグする別の方法は、 Virtualbox などの仮想化ツールを使用して仮想マシン内でディスクイメージを起動し、VM内からシステムの構成をデバッグすることです。

結論

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

このガイドの手順は、オペレーティングシステム、既存のハードウェア、およびカーネル構成によって異なる場合がありますが、一般に、一般的なLinuxディストリビューションから作成されたイメージはこの方法を使用して機能するはずです。 cloud-initのインストールと構成の手順に注意深く従って、システムが上記の前提条件セクションにリストされているすべての要件を満たしていることを確認してください。

カスタムイメージの詳細については、カスタムイメージの製品ドキュメントを参照してください。