ツールボックスを使用したノードの問題のデバッグ

デバッグなどの特定のタスクを行うには、Container-Optimized OS にパッケージやツールを追加でインストールする必要があります。Container-Optimized OS にはパッケージ マネージャーが含まれていませんが、プリインストールされた ツールボックス ユーティリティを使用して、必要なパッケージやツールを追加でインストールできます。1 回だけデバッグツールをインストールして実行する場合は、/usr/bin/toolbox を使用することをおすすめします。

/usr/bin/toolbox は基本的に、Debian chroot のような環境のシェルを提供します。/usr/bin/toolbox を起動すると、次のコマンドが実行されます。

  1. 環境を設定する docker pulldocker create。これらのコマンドは /usr/bin/toolbox の初回起動時にのみ実行されます。
  2. 所定のコマンドを実行する、または(コマンドがない場合は)シェルを提供する systemd-nspawn

toolbox では、次の点についても留意してください。

  • 初回起動後に toolbox を起動する際には、動作中の Docker デーモンは必要ありません。また、ネットワークやディスクのオーバーヘッドが発生することもありません。
  • toolbox 環境は、各ユーザーが起動するたびにセットアップされます。sudo toolbox を実行すると、root ユーザー用の環境がセットアップされます。
  • toolbox 環境は /var/lib/toolbox に作成され、再起動しても保持されます。
  • toolbox 環境内からルート ファイルシステムのセクション(ユーザーのホーム ディレクトリなど)にアクセスできます。

デプロイ環境に合わせてツールボックスをカスタマイズする

次の例では、ユーザー名が USER で、Container-Optimized OS インスタンス名が cos-dev となっていることを前提としています。

toolbox が使用する Docker イメージと、ルート ファイルシステムで toolbox がアクセスできるパスをカスタマイズすることができます。これらの設定は /etc/default/toolbox ファイルに記述されています。通常、デフォルトの /etc/default/toolbox ファイルは、次のような形になっています。

USER@cos-dev ~ $ cat /etc/default/toolbox
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

TOOLBOX_DOCKER_IMAGE="gcr.io/google-containers/toolbox"
TOOLBOX_DOCKER_TAG="20200404-00"
TOOLBOX_BIND="--bind=/:/media/root/ --bind=/mnt/disks/:/media/root/mnt/disks/ --bind=/var/:/media/root/var/ --bind=/home:/media/root/home/ --bind=/etc/resolv.conf:/etc/resolv.conf"
: ${USER:=root}
  • TOOLBOX_DOCKER_IMAGE 変数と TOOLBOX_DOCKER_TAG 変数には、使用される Docker イメージを指定します。デフォルトの gcr.io/google-containers/toolbox には、gcloud コマンドライン ツールなどのいくつかの一般的なツールがプリインストールされています。
  • TOOLBOX_BIND 変数には、ツールボックス環境内で利用できるようにする rootfs からのパスを指定します。

デフォルト設定を変更するには、/etc/default/toolbox ファイルを変更するか、適切なユーザーの ${HOME}/.toolboxrc 内の変数に新しい値を指定します。たとえば、toolbox でコンテナとして fedora:latest を使用する場合は、次のコマンドを実行します。

USER@cos-dev ~ $ echo "TOOLBOX_DOCKER_IMAGE=fedora" > "${HOME}/.toolboxrc"
USER@cos-dev ~ $ echo "TOOLBOX_DOCKER_TAG=latest" >> "${HOME}/.toolboxrc"
USER@cos-dev ~ $ toolbox

ツールボックスのツールをインストールし、実行する

toolbox ユーティリティを起動してシェルを実行すると、作成されたコンテナ内の apt-get を使用してパッケージをインストールできます。例:

# Inside the toolbox shell
USER@cos-dev ~ $ toolbox
root@cos-dev:~# apt-get update && apt-get install -y htop psmisc
root@cos-dev:~# htop
root@cos-dev:~# pstree -p
root@cos-dev:~# exit

いつも toolbox に入る必要はなく、コマンドの前に toolbox を付けるだけでツールを実行できます。たとえば、strace ユーティリティをインストールして実行し、Docker デーモンの実行をトレースするには、次のようにします。

USER@cos-dev ~ $ toolbox apt-get install -y strace
USER@cos-dev ~ $ toolbox strace -p `pidof dockerd`

Cloud SDK はツールボックスにプリインストールされています。

USER@cos-dev ~ $ toolbox
root@cos-dev:~# which gcloud
/google-cloud-sdk/bin/gcloud
# View installed components
root@cos-dev:~# gcloud components list

Your current Cloud SDK version is: 287.0.0
The latest available version is: 295.0.0
...

gcloud は、VM インスタンスへのアクセスが許可されているリソースにのみアクセスできることに注意してください。他のリソースへのアクセス権を持つ VM インスタンスのプロビジョニングの詳細については、Compute Engine のドキュメントをご覧ください。

gcloud の使用に関する詳細は、Cloud SDK のドキュメントをご覧ください。

ツールボックスへのファイルの入出力

ホストのルート ファイルシステムには、toolbox 内で /media/root パスを介してアクセスできます。ホスト上では、toolbox のルート ディレクトリは、/var/lib/toolbox/USER-gcr.io_google-containers_toolbox-VERSION/root というパスでアクセスできます。ここで、USER はユーザー名、VERSIONtoolbox バージョン番号(20200404-00 など)です。

次の例は、toolbox にファイルを出し入れする方法を示しています。

# Access the host filesystem inside the toolbox
USER@cos-dev ~ $ toolbox
root@cos-dev:~# ls /media/root
bin  boot  dev  etc  home  lib  lib64  ...
root@cos-dev:~# cp /media/root/home/USER/some-file .

# Access toolbox directory from the host
USER@cos-dev ~ $ sudo cp some-file /var/lib/toolbox/USER-gcr.io_google-containers_toolbox-20200404-00/root

# Run a command inside toolbox and save its output in your home directory
USER@cos-dev ~ $ toolbox strace -o /media/root/$HOME/ls.strace ls
USER@cos-dev ~ $ more $HOME/ls.strace