도구 상자를 사용하여 노드 문제 디버깅

디버깅과 같은 특정 작업을 위해 Container-Optimized OS에 추가 패키지 또는 도구를 설치해야 할 수도 있습니다. 예를 들어 도구 상자에 tcpdump를 설치하여 노드 연결 문제를 디버깅합니다. Container-Optimized OS에 패키지 관리자가 포함되지 않더라도 사전 설치된 도구 상자 유틸리티를 사용하여 필요한 추가 패키지 또는 도구를 설치할 수 있습니다. 일회용 디버깅 도구를 설치하고 실행할 때는 /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/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의 변수에 새 값을 지정하세요. 예를 들어 toolbox에서 fedora: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 ball을 빌드하고 ${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 유틸리티를 호출한 다음에는 결과 컨테이너 안에서 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 프리픽스만 추가하면 됩니다. 예를 들어 Docker 데몬 실행을 trace하기 위해 strace 유틸리티를 설치하고 실행하려면 다음을 수행할 수 있습니다.

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는 VM 인스턴스가 액세스하도록 승인된 리소스에만 액세스할 수 있습니다. VM 인스턴스에 다른 리소스 액세스 권한을 프로비저닝하는 방법에 대한 자세한 내용은 Compute Engine 문서를 참조하세요.

gcloud CLI 사용에 대한 자세한 내용은 Google Cloud CLI 문서를 참조하세요.

도구 상자 내부 및 외부로 파일 가져오기

호스트의 루트 파일 시스템은 /media/root 경로를 통해 toolbox 내에서 액세스할 수 있습니다. 호스트에서 toolbox의 루트 디렉터리는 /var/lib/toolbox/USER-gcr.io_cos-cloud_toolbox-VERSION/root 경로를 통해 액세스할 수 있습니다. 여기서 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~3GB의 디스크 공간을 사용합니다(디스크 사용량은 Container-Optimized OS 버전에 따라 다름). 도구 상자에서 사용하는 디스크의 여유 공간을 확보하려면 Container-Optimized OS 버전에 따라 다음 작업을 합니다.

Milestone 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입니다.

Milestone 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