使用工具箱调试节点问题

您可能需要在 Container-Optimized OS 上安装其他软件包或工具以执行某些任务,例如调试。虽然 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/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_IMAGETOOLBOX_DOCKER_TAG 变量指定要使用的 Docker 映像。默认的 gcr.io/google-containers/toolbox 附带了一些常用工具,例如预装的 gcloud 命令行工具。
  • TOOLBOX_BIND 变量指定 rootfs 中可在工具箱环境内使用的路径。

要更改默认设置,请修改 /etc/default/toolbox 文件,或在 ${HOME}/.toolboxrc 中为相应用户指定变量的新值。例如,假设您希望 toolboxfedora: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 实用程序来启动 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`

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 只能访问虚拟机实例有权访问的资源。请参阅 Compute Engine 文档,详细了解如何预配有权访问其他资源的虚拟机实例。

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

将文件移入或移出工具箱

您可以通过 /media/root 路径在 toolbox 内部访问主机的根文件系统。在主机上,可通过路径 /var/lib/toolbox/USER-gcr.io_google-containers_toolbox-VERSION/root 访问 toolbox 的根目录,其中 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