1. 背景#
最近、C 言語のプログラムをデバッグするために gdb を使用する準備をしていたところ、現在の gdb は Mac M1 をサポートしていないことがわかりました。以下の画像をご覧ください。
Mac 上で gdb を使用したい場合、仮想マシンやコンテナなどのアプローチを取る必要があります。
以前は Docker Desktop をインストールして問題を解決しようとしましたが、実行中に常に異常やタイムアウトが発生し、ほとんど使用できませんでした。
最終的には、この問題を解決するために 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 の卒業プロジェクトでもあります。
An open and reliable container runtime
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コマンドを直接実行できるようになります
$ 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