使用工具箱调试节点问题

您可能需要在 Container-Optimized OS 上安装其他软件包或工具以执行某些任务,例如调试。例如,通过在工具箱中安装 tcpdump 来调试节点连接问题。虽然 Container-Optimized OS 软件包管理器,您就可以使用预安装的 工具箱 实用程序安装所需的任何其他软件包或工具。安装和运行一次性调试工具的首选方法是使用 /usr/bin/toolbox

/usr/bin/toolbox 基本上是在类似于 Debian chroot 的环境中为您提供了一个 shell。在调用 /usr/bin/toolbox 时,它会运行以下命令:

  1. 运行 docker pulldocker create 以设置环境。这些命令仅会在您首次调用 /usr/bin/toolbox 时运行。
  2. systemd-nspawn,用于运行给定的命令或(如果没有任何命令)为您提供 shell

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/cos-cloud/toolbox"
TOOLBOX_DOCKER_TAG="v20220722"
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_IMAGETOOLBOX_DOCKER_TAG 变量指定要使用的 Docker 映像。默认的 gcr.io/cos-cloud/toolbox 附带了一些常用工具,例如预装的 Google Cloud CLI。
  • TOOLBOX_BIND 变量指定 rootfs 中可在工具箱环境内使用的路径。

要更改默认设置,请修改 /etc/default/toolbox 文件,或在 ${HOME}/.toolboxrc 中为相应用户指定变量的新值。例如,假设您希望 toolboxfedora:latest 用作其容器,则可以运行以下命令:

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

在 Milestone 93 中,工具箱将无法拉取自定义工具箱映像。如需解决此问题,请构建自定义工具箱 Docker 映像 tar 归档文件,并通过 ${HOME}/.toolboxrc 文件或 /etc/default/toolbox 文件导出。

USER@cos-dev ~ $ echo "TOOLBOX_DOCKER_IMAGE_TARBALL=[docker image tar ball]" > "${HOME}/.toolboxrc"
USER@cos-dev ~ $ 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/cos-cloud/toolbox"
    TOOLBOX_DOCKER_TAG="v20220722"
    TOOLBOX_DOCKER_IMAGE_TARBALL=[location/to/tarball]
    TOOLBOX_BIND="--bind=/:/media/root/ --bind=/mnt/disks/:/media/root/mnt/disks/ --bind=/var/:/media/root/var/ --bind=/home:/media/root/home/"
    : ${USER:=root}
USER@cos-dev ~ $ toolbox

安装和运行工具箱中的工具

调用 toolbox 实用程序来启动 shell 之后,即可在生成的容器中使用 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`

Google Cloud CLI 已预安装在工具箱中:

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 gcloud CLI version is: 287.0.0
The latest available version is: 295.0.0
...

请注意,gcloud CLI 只能访问虚拟机实例有权访问的资源。请参阅 Compute Engine 文档,详细了解如何预配有权访问其他资源的虚拟机实例。

请参阅 Google Cloud CLI 文档,详细了解如何使用 gcloud CLI。

将文件移入或移出工具箱

您可以通过 /media/root 路径在 toolbox 内部访问主机的根文件系统。在主机上,可通过路径 /var/lib/toolbox/USER-gcr.io_cos-cloud_toolbox-VERSION/root 访问 toolbox 的根目录,其中 USER 是您的用户名,VERSIONtoolbox 版本号(例如,v20220722)。

以下示例展示了如何将文件移入和移出 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_cos-cloud_toolbox-v20220722/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

清理工具箱使用的磁盘空间

安装工具箱会消耗 /var 中大约 2 到 3 GB 磁盘空间(磁盘用量因 Container-Optimized OS 版本而异)。如需释放工具箱使用的磁盘空间,请根据您的 Container-Optimized OS 版本执行以下任务:

里程碑 89 及更早版本

# remove files in /var/lib/toolbox
sudo rm -rf /var/lib/toolbox/*

# remove container artifacts
docker image rm $IMAGE_PATH:$TAG

您可以运行 docker image ls 来确定这些值。例如,IMAGE_PATH=gcr.io/cos-cloud/toolboxTAG=v20220722

里程碑 93 及更高版本

# remove files in /var/lib/toolbox
sudo rm -rf /var/lib/toolbox/*

# remove container artifacts
sudo ctr images rm $IMAGE_NAME

您可以运行 sudo ctr images ls -q 来确定此值。例如 IMAGE_NAME=gcr.io/cos-cloud/toolbox:v20220722