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
- MBRまたはGPTパーティションテーブル
grub
ブートローダー - インストールされているVirtIOドライバー
-
イメージングしているシステムで使用可能な管理者権限を持つroot以外のユーザー。 新しいユーザーを作成し、Ubuntu 18.04で管理者権限を付与するには、 Ubuntu18.04を使用したサーバーの初期設定に従います。 Debian 9でこれを行う方法については、 Debian9を使用したサーバーの初期設定を参照してください。
-
このガイドで作成されたディスクイメージを保存するために使用される追加のストレージデバイス。コピーするディスクと同じ大きさであることが望ましい。 これは、接続されたブロックストレージボリューム、外部USBドライブ、追加の物理ディスクなどです。
-
DigitalOceanスペースと
s3cmd
Spaceで使用するように構成されたファイル転送ユーティリティ。 スペースの作成方法については、スペースクイックスタートを参照してください。 設定方法を学ぶにはs3cmd
Spaceで使用する場合は、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
デフォルトでは、Ubuntu18.04では cloud-init
を使用するように自分自身を構成します NoCloud
最初にデータソース。 これにより、DigitalOceanでイメージを実行するときに問題が発生するため、再構成する必要があります cloud-init
を使用するには ConfigDrive
データソースと cloud-init
画像がDigitalOceanで起動されると再実行されます。
コマンドラインから、に移動します /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
インストールによっては、これらのファイルの一部が存在しない場合があります。 存在する場合は、 50-curtin-networking.cfg
ファイル。Ubuntuサーバーのネットワークインターフェイスを構成します。 画像がDigitalOceanで起動されると、 cloud-init
これらのインターフェイスが自動的に実行および再構成されるため、このファイルは必要ありません。 このファイルが削除されていない場合、このUbuntuイメージから作成されたDigitalOceanドロップレットのインターフェイスは正しく構成されておらず、インターネットからアクセスできません。
- sudo rm 50-curtin-networking.cfg
次に、実行します dpkg-reconfigure cloud-init
を削除するには NoCloud
データソース、 cloud-init
検索して見つけます ConfigDrive
DigitalOceanで使用されるデータソース:
- sudo dpkg-reconfigure cloud-init
次のグラフィカルメニューが表示されます。
The NoCloud
データソースが最初に強調表示されます。 プレス SPACE
選択を解除するには、 ENTER
.
最後に、に移動します /etc/netplan
:
- cd /etc/netplan
を削除します 50-cloud-init.yaml
から生成されたファイル cloud-init
以前に削除したネットワークファイル:
- sudo rm 50-cloud-init.yaml
最後のステップは、最初から構成をクリーンアップすることです。 cloud-init
イメージがDigitalOceanで起動されたときに再実行されるように実行します。
これを行うには、 cloud-init clean
:
- sudo cloud-init clean
この時点で、インストールと構成が完了しました cloud-init
DigitalOceanで使用します。 これで、ドロップレットへの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—ディスクイメージの作成
このステップでは、を使用してRAW形式のディスクイメージを作成します。 dd
コマンドラインユーティリティ、およびを使用して圧縮します gzip
. 次に、を使用して画像をDigitalOceanSpacesにアップロードします s3cmd
.
まず、サーバーにログインし、を使用してシステムのブロックデバイスの配置を調べます。 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
この場合、メインのブートディスクは /dev/vda
、25GBディスク、およびプライマリパーティション /
、 は /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
上記のいずれかの方法を使用して、圧縮イメージファイルを作成します。 イメージングするディスクのサイズとイメージの作成に使用する方法によっては、これには数時間かかる場合があります。
圧縮された画像ファイルを作成したら、次を使用してDigitalOceanSpacesにアップロードすることができます。 s3cmd
.
ステップ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内からシステムの構成をデバッグすることです。
結論
このガイドでは、Ubuntu18.04システムのディスクイメージを作成する方法を学習しました。 dd
コマンドラインユーティリティを使用して、ドロップレットを起動できるカスタムイメージとしてDigitalOceanにアップロードします。
このガイドの手順は、オペレーティングシステム、既存のハードウェア、およびカーネル構成によって異なる場合がありますが、一般に、一般的なLinuxディストリビューションから作成されたイメージはこの方法を使用して機能するはずです。 インストールと構成の手順に注意深く従ってください cloud-init
、およびシステムが上記の前提条件セクションにリストされているすべての要件を満たしていることを確認してください。
カスタムイメージの詳細については、カスタムイメージの製品ドキュメントを参照してください。