Vagrant から Lima にのりかえる - AL2 も動くよ。

## はじめに
Conteiner Native な時代になったとは言え、VM は不滅でしょう。
VM で動く OS は Provisoning Script で構築するのが標準的に行われています。
Provisioning Script の開発は、Cloud 上の Computing resources や、手元の Local VM ですることが多いのではないでしょうか。
Provisioning Script をメンテナンスし続けるためには、開発環境がとても重要になります。
ここでは、Provisioning Script の開発環境として Lima 使う方法について説明してみたいと思います。

## Local VM で Provisioning Script を開発する
VM 環境の Provisioning Script の開発と言えば、Local VM を使った開発が便利です。
Vagrant なら Sahara plugin で rollback と apply を繰り返せる為、動作確認がとても楽です。
こういったナレッジは 2011 年頃から 10 年以上続けられてきたのかなと思います。

しかし、Virtual Box の Apple Silicon 対応が停滞したことにより、Mac において実質公平に手が届く Local VM を使うオプションが閉ざされているのが実情となりました。
これは、Virtual Box の [Testbuilds](https://www.virtualbox.org/wiki/Testbuilds) に更新があれば状況が変わるかもしれません。
現状、Apple Silicon においては、QEMU を拡張した UTM にも期待したいですが [UTM Provider](https://github.com/hashicorp/vagrant/issues/12518) 追加の進展がなく Vagrant 以外の選択肢を求める動機もあるように思います。

https://github.com/lima-vm/lima/discussions/1749

この課題を解決する選択肢として挙げられるのが、Lima への移行だと考えます。
Lima は、Vagrant の様に VM の定義を設定ファイルにて行うことができます。
また、利用する VM となる QEMU は Apple Silicon に対応しており、目的に合致しています。
QEMU なので VM の実行は Intel-on-ARM や ARM-on-Intel もサポートされています。
この他、Vagrant でしてきたことが 表 1-1 で示す様に、概ね揃っています。
このことから、Lima への置き換えによる開発は十分できると言えます。

▼ 表 1-1 Vagrant と Lima の置き換え対応表
| Vagrant でしてきたこと | Lima に置き換えると |
| :--- | :--- |
| Sahara plugin  による Image rollback | Lima Snapshot 機能による Image rollback |
| Host OS のディレクトリマウント | sshfs を用いたディレクトリマウント |
| Provisioning Tool による構築 | SSH と Local マウントを共にサポート |
| 複数 VM を建てて内部通信で環境構築 | VM を複数起動可能で通信も可能 |
| Packer 等で独自イメージ作成 | サポートは無いが、Script で実装は可能 |
| Guest Agent の追加 | cidata として cloud-init でサポート |
| Vagrant Cloud からイメージ取得 | 公式の標準イメージが取れるのみ |
| Community Plugin による開発支援 | なし |
## Snapshot 取得と Rollback 
任意の時点を復元ポイントとして保持し、任意のタイミングで戻すことができる機能。
Lima における Snapshot 機能は現時点では Experimental features 扱いとなっています。
こちらは QEMU のスナップショットモード機能に依存する形で実現している様です。

Snapshot 取得には `limactl snapshot create <vm_name> --tag "<snapshot_name>"` の形式で実行することで実現します。
```
❯ limactl snapshot create fedora --tag "fedora-$(date '+%Y%m%d%H%M%S')"
WARN[0000] `limactl snapshot` is experimental
INFO[0000] Sending HMP savevm command
```

取得した Snapshot の一覧は `limactl snapshot list <vm_name>` で一望できます。
```
❯ limactl snapshot list fedora
WARN[0000] `limactl snapshot` is experimental
INFO[0000] Sending HMP info command
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
--        fedora-20240221135928 1.72 GiB 2024-02-21 13:59:28 00:13:03.327
```

Rollback 方法は `limactl snapshot apply <vm_name> --tag <snapshot_name>` で適用します。これは複数の復元ポイントの中から任意の時点を選択できると解釈して良いです。
```
❯ limactl snapshot apply fedora --tag fedora-20240221135928
WARN[0000] `limactl snapshot` is experimental
INFO[0000] Sending HMP loadvm command

```

Snapshot 削除方法は `limactl snapshot delete <vm_name> --tag <snapshot_name>` で削除となります。
```
❯ limactl snapshot delete fedora --tag fedora-20240221135928
WARN[0000] `limactl snapshot` is experimental
INFO[0000] Sending HMP delvm command
```

## Host Path の Mount
VM 上から Host 側のファイルやディレクトリをマウントする方法は QEMU の機能を使った Experimental な方法もいくつか提供されていますが、Lima は標準で CIDATA 内部の lima.env ファイルで `LIMA_CIDATA_HOSTHOME_MOUNTPOINT` に指定されたディレクトリをマウントする様に作られています。こちらは自動で作られるので設定不要です。
Host Path を Mount して読み書きができるので、Provisioning Script の実行に使えます。

default で設定される sshfs 以外を使うケースは、他のマウントオプションも用意されてるので、そちらも試してみると良いと思います。

https://lima-vm.io/docs/config/mount/

## Provisioning Script の開発
前述した様に Host Path の読み書きが出来るので、VM 内で Provisioning を実行できます。
また、Snapshot を利用して Rollback すれば、繰り返し変更の動作を確認可能です。
具体例として、Ansible Playbook の Local 実行用の開発環境として便利です。
## Image ファイルの共有
Lima には公式の [templates](https://lima-vm.io/docs/templates/) が存在していますが、コミュニティのイメージを利用する仕組みは存在しないため、都度 Provisioning が必須となリます。
最近ではセキュリティの観点から、誰かが作ってくれた非公式なイメージを使うモチベーションが昔ほど少なくなってきてるのかなと思います。
それでも公開や共有したいケースであれば、個人でイメージをホストして共有することもできます。

* `https://` スキームを付けた場合は Web 経由でイメージを取得する動きになリます。
* スキームなしなら、直接そのパスにアクセスして VM を起動する様になります。
```yaml
vmType: "qemu"
arch: "x86_64"
cpus: 2
memory: "8Gib"
images:
  - location: "https://example.com/original-image.qcow2"
    arch: "x86_64"
    digest: "sha256:xxx..."
  - location: "/home/example/lima-vm/original-image.qcow2"
    arch: "x86_64"
    digest: "sha256:xxx..."
mounts:
  - location: "~"
  - location: "/tmp/lima"
    writable: true
containerd:
  system: false
  user: false
firmware:
  legacyBIOS: true
cpuType:
  x86_64: "Haswell-v4"
```

## Lima で Template に無い OS を使う

qcow2 形式のイメージを用意できれば、iso から作成することも可能であり、QEMU と cloud-init が使えれば、テンプレートに無い OS の利用も可能となります。
具体例として AWS が公式で公開中の Amazon Linux 2 を Lima 用にビルドしてみます。

こちらは、現時点で AWS のサポート期限が予告されていますが、現行でまだ利用しているケースもあるかなと思いますので、対象としてみました。

Lima 用にパッケージ追加や cloud-init の設定が必要なためスクリプトを作成しました。

https://github.com/tigerroll/amzn2-lima

これをクローンして build.sh を実行すると、QEMU が起動してビルドされます。
手順に従い amzn2.yaml を指定すると Amazon Linux 2 が起動します。

`limactl shell amzn2` でログインして、カーネル情報と motd の情報をチェックすると Amazon Linux 2 であることが確認できます。
```
❯ limactl shell amzn2
[tigerroll@lima-amzn2 amzn2-lima]$ uname -a
Linux lima-amzn2 4.14.336-256.559.amzn2.x86_64 #1 SMP Tue Feb 13 09:50:28 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
[tigerroll@lima-amzn2 amzn2-lima]$ cat /etc/motd
   ,     #_
   ~\_  ####_        Amazon Linux 2
  ~~  \_#####\
  ~~     \###|       AL2 End of Life is 2025-06-30.
  ~~       \#/ ___
   ~~       V~' '->
    ~~~         /    A newer version of Amazon Linux is available!
      ~~._.   _/
         _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
       _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/

[tigerroll@lima-amzn2 amzn2-lima]$
```

ディレクトリのマウント状況も確認してみました。
Lima で Host Path をマウントできてることが確認できます。
```
[tigerroll@lima-amzn2 amzn2-lima]$ df
Filesystem       1K-blocks     Used Available Use% Mounted on
devtmpfs           4060036        0   4060036   0% /dev
tmpfs              4077392        0   4077392   0% /dev/shm
tmpfs              4077392      544   4076848   1% /run
tmpfs              4077392        0   4077392   0% /sys/fs/cgroup
/dev/vda1        104842736  1805048 103037688   2% /
/dev/sr0             38228    38228         0 100% /mnt/lima-cidata
tmpfs               815480        0    815480   0% /run/user/1000
:/home/tigerroll 498443264 82431564 414262452  17% /home/tigerroll
:/tmp/lima         8111920     1828   8110092   1% /tmp/lima
[tigerroll@lima-amzn2 amzn2-lima]$
```

## 所感
Apple Silicon ユーザにも手の届く VM 環境を提供できる素晴らしい結果でした。
ここまで出来ると、もう Lima で十分やれるなと思うばかりです。
Lima は Mac だけでなく Linux や WLS2 もサポートしてるので、のりかえを検討しても良いかもしれません。