1. 背景#
最近、C 言語のプログラムをデバッグするために gdb を使用する準備をしていましたが、現在の gdb は Mac M1 をサポートしていないことがわかりました。以下の画像をご覧ください。
Mac 上で gdb を使用するためには、仮想マシンやコンテナなどのアプローチを取る必要があります。
以前は Docker Desktop をインストールして Docker を使用する方法を試しましたが、実行中に常にエラーやタイムアウトが発生し、ほとんど使用できませんでした。
最終的に、この問題を解決するために lima を見つけました。lima は非常に低コストで互換性が高く、Mac で他のシステムを簡単にローカルで実行できるようにすることができます。
ここでは、関連する使用方法と lima を使用して Docker+Ubuntu 環境を構築するプロセスを記録し、同様の問題を抱えている学生たちの助けになればと思います。
2. Lima#
2.1 はじめに#
Linux virtual machines, with a focus on running containers
Lima は、自動ファイル共有とポートフォワーディング(WSL2 と同様)を備えた Linux 仮想マシンを起動します。
Lima の最初の目標は、Mac ユーザー向けに containerd(contaiNERD ctl を含む)を促進することでしたが、Lima は非コンテナアプリケーションにも使用することができます。
簡単に言うと、containerd が実行されている仮想マシンで、Windows 上の WSL2 と同様の機能を提供します。
containerd は、Docker エンジンと同様の機能を持つ業界標準のコンテナランタイムであり、CNCF の卒業プロジェクトでもあります。
containerd は、シンプルさ、堅牢性、移植性に重点を置いた業界標準のコンテナランタイムです。Linux と Windows のデーモンとして利用でき、ホストシステムの完全なコンテナライフサイクルを管理できます。イメージの転送とストレージ、コンテナの実行と監視、低レベルのストレージとネットワークのアタッチなどが含まれます。
2.2 インストール#
Mac にインストールするのは非常に簡単です:
$ brew install lima
$ lima -v
limactl version 0.20.1
Lima をインストールしたら、Lima を使用してさまざまな作業を行うことができます。
現在、Lima の公式サイトでは、archlinux、docker、podman、Kubernetes、ubuntu など、さまざまなテンプレートが提供されており、ほとんどの環境構築のニーズを満たすことができます。次のコマンドで確認できます:
$ limactl start --list-templates
almalinux-8
almalinux-9
almalinux
alpine
apptainer-rootful
apptainer
archlinux
.....
以下では、Lima を使用して Docker+Ubuntu 環境を構築する方法について詳しく説明します。
3. Docker+Ubuntu 環境の構築#
3.1 Docker のインストール#
まず、LimaVM の設定ファイルを保存するディレクトリを作成します:
$ mkdir lima_vm && cd lima_vm
ここでは、公式の設定テンプレートライブラリのdocker.yamlを使用します。まず、その内容を確認します:
$ curl -o docker.yaml https://raw.githubusercontent.com/lima-vm/lima/master/examples/docker.yaml
$ cat docker.yaml
設定ファイルには、各設定項目の詳細な説明が含まれています。興味がある方は自分で参照してください。ここでは、デフォルトの設定ファイルを使用して Lima VM を直接起動できます:
仮想マシンに割り当てる CPU、メモリ、マウントディレクトリを調整する場合、設定ファイルに対応するパラメータが提供されています。
$ limactl start ./docker.yaml
注意事項:
- このコマンドは通常、初期化時に実行され、作成後は繰り返し実行する必要はありません。
- 上記のファイルは初期起動の設定であり、起動後に以下のパスの設定ファイルが自動生成されます。
- 設定を変更する場合は、以下の生成された設定ファイルを編集して再起動する必要があります。
~/.lima/docker/lima.yaml
3.2 具体的な使用方法#
# 現在の実行リストを表示し、名前、SSH、ステータス、CPU、メモリなどを含む
$ limactl list
# シェルに入る
$ limactl shell docker
# 直接docker psコマンドを実行する
$ limactl shell docker docker ps
# VMを停止する
$ limactl stop docker
# VMを削除する
$ limactl delete docker
上記のコマンドでは、docker コマンドを実行する際には、ターミナルに入るか、limactl shell docker
の接頭辞を付ける必要があります。
ローカルで直接 docker cli を実行するためには、次の手順が必要です:
# 1. ローカルにdocker cliをインストールする
$ brew install docker
# 2. dockerの環境変数を設定する
# Nameはlimaの起動時に指定した名前です(例:docker、lima-docker)
# Dirはlimaの起動後に自動生成されるパスです(例:~/.lima/docker/sock/docker.sock)
$ docker context create lima-{{.Name}} --docker "host=unix://{{.Dir}}/sock/docker.sock"
$ docker context use lima-{{.Name}}
# 3. 通常のdocker cliと同様にローカルターミナルでdockerコマンドを実行する
$ docker run hello-world
3.3 Ubuntu コンテナの追加#
現在、Docker イメージには使用できるイメージがすでに存在しています。以下は、Ubuntu 20.04 バージョンをインストールする方法です:
$ docker pull ubuntu:20.04
$ docker images
イメージをインストールしたら、Ubuntu のコンテナを直接作成します:
# コンテナを初期化する
$ docker run --name ubuntu-container -it ubuntu:20.04 bash
これで、Ubuntu のオペレーティングシステムを使用して要件を完了することができます。以下に、よく使用される操作のいくつかを示します:
# 現在のすべてのコンテナとそのステータスを表示する(例:先ほど実行したubuntu-container)
$ docker ps -a
# コンテナが実行されていない場合は、起動する必要があります
$ docker start ubuntu-container
# コンテナのシェルに入る
$ docker exec -it ubuntu-container bash
3.4 gdb のインストール#
Ubuntu コンテナに入ったら、C 言語のプログラムをデバッグするために gdb をインストールできます:
# コンテナに入った後、パッケージを更新する
$ apt update
# gdbをインストールする
$ apt install gdb
参考#
https://zhuanlan.zhihu.com/p/476240258
https://blog.crazyfirelee.tw/posts/sharing/lima/
https://github.com/lima-vm/lima/blob/master/examples/docker.yaml
https://stackoverflow.com/questions/67310123/how-to-install-gdb-on-mac-m1-apple-silicon