Linux環境のイメージを作成してDigitalOceanで起動する方法
序章
DigitalOceanのカスタムイメージ機能を使用すると、オンプレミス環境または別のクラウドプラットフォームからカスタムLinuxおよびUnixライクな仮想ディスクイメージをDigitalOceanに取り込み、それらを使用してDigitalOceanドロップレットを起動できます。
カスタム画像のドキュメントで説明されているように、次の画像タイプはカスタム画像アップロードツールによってネイティブにサポートされています。
ISO形式の画像は公式にはサポートされていませんが、 UbuntuISO形式の画像からDigitalOceanドロップレットを作成する方法に従って、VirtualBoxを使用して互換性のある画像を作成およびアップロードする方法を学ぶことができます。
DigitalOceanにアップロードする互換イメージがまだない場合は、前提条件のソフトウェアとドライバーがインストールされていれば、UnixライクまたはLinuxシステムのディスクイメージを作成して圧縮できます。 。
まず、画像がカスタム画像の要件を満たしていることを確認します。 これを行うには、システムを構成し、いくつかのソフトウェアの前提条件をインストールします。 次に、dd
コマンドラインユーティリティを使用してイメージを作成し、gzip
を使用して圧縮します。 その後、この圧縮画像ファイルをDigitalOcean Spacesにアップロードし、そこからカスタム画像としてインポートします。 最後に、アップロードされた画像を使用してドロップレットを起動します。
前提条件
可能であれば、DigitalOceanが提供する画像のいずれかをベースとして使用するか、 UbuntuCloudのような公式の配布が提供するクラウド画像を使用する必要があります。 次に、PackerやVirtualBoxなどのツールを使用して、このベースイメージの上にソフトウェアとアプリケーションをインストールして新しいイメージをベイク処理できます。 多くのクラウドプロバイダーと仮想化環境には、仮想ディスクを上記の互換性のある形式の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 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にアップロードすることができます。
ステップ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
のインストールと構成の手順に注意深く従って、システムが上記の前提条件セクションにリストされているすべての要件を満たしていることを確認してください。
カスタムイメージの詳細については、カスタムイメージの製品ドキュメントを参照してください。