Closed9

Apple Silicon上で仮想マシンを管理できる「Tart」を試す

kun432kun432

GitHubレポジトリ

https://github.com/cirruslabs/tart

READMEの日本語訳。翻訳はPLaMo翻訳。


referred from https://github.com/cirruslabs/tart

Tart は、Apple Silicon 上で macOS および Linux の仮想マシン(VM)を構築・実行・管理するための仮想化ツールセットです。 CI エンジニアによって開発されたこのツールは、自動化ニーズに応えるために設計されています。Tart の主な特徴は以下の通りです:

  • Tart は Apple 独自の Virtualization.Framework を採用しており、ネイティブ環境に近いパフォーマンスを実現しています。
  • OCI 互換の任意のコンテナレジストリから仮想マシンをプッシュ/プルできます。
  • Tart 用 Packer プラグインを使用して、仮想マシンの自動作成を効率化できます。
  • あらゆる CI システムと簡単に統合可能です。

Tart は Cirrus Runners サービスの基盤技術です - これは標準の GitHub ホストランナーの代替として機能し、価格の数分の一で2~3倍のパフォーマンス向上を実現します。

公式サイト・公式ドキュメントはこちら

https://tart.run/

ライセンスは「フェアソースライセンス」というものになっている。

https://tart.run/licensing/

https://fair.io/

ざっと見た感じ、個人は無料で使えるが、組織の場合は一定の利用度を超えたら有償ライセンス、という感じみたい。詳細については公式の内容を確認すべし。

kun432kun432

Quick Start

https://tart.run/quick-start/

公式のQuick Startに従って進める。Apple Siliconが動作しているmacOS 13.0(Ventura)以降なら対応している様子。

インストールはHomebrewで。

brew install cirruslabs/cli/tart
tart --version
出力
2.29.0

Usageを確認

tart --help
出力
USAGE: tart <subcommand>

OPTIONS:
  --version               Show the version.
  -h, --help              Show help information.

SUBCOMMANDS:
  create                  Create a VM
  clone                   Clone a VM
  run                     Run a VM
  set                     Modify VM's configuration
  get                     Get a VM's configuration
  list                    List created VMs
  login                   Login to a registry
  logout                  Logout from a registry
  ip                      Get VM's IP address
  exec                    Execute a command in a running VM
  pull                    Pull a VM from a registry
  push                    Push a VM to a registry
  import                  Import VM from a compressed .tvm file
  export                  Export VM to a compressed .tvm file
  prune                   Prune OCI and IPSW caches or local VMs
  rename                  Rename a local VM
  stop                    Stop a VM
  delete                  Delete a VM
  suspend                 Suspend a VM

  See 'tart help <subcommand>' for detailed help.

VMのイメージを「クローン」する。ここではmacOS15のイメージを選択。macOSの仮想イメージが使えるのね。

tart clone ghcr.io/cirruslabs/macos-sequoia-base:latest sequoia-base

どうやらVMイメージは24GBほどの様子。気長に待つ。

出力
pulling manifest...
pulling disk (23.9 GB compressed)...
1%

ダウンロードが終わったのだがエラー・・・

出力
100%
pulling NVRAM...
Error: error: host macOS version is outdated to run this virtual machine

自分の macOS は Sonoma(14.7)なのだが、ホストのバージョンよりも新しいものはダメってことなのかな?Sonomaのイメージに変えて再トライ。

tart clone ghcr.io/cirruslabs/macos-sonoma-base:latest sonoma-base

今度はOK。

出力
pulling manifest...
pulling disk (20.4 GB compressed)...
100%
pulling NVRAM...

ではVMを起動。

tart run sonoma-base

お、ウインドウが開いて起動が始まった。

起動は非常に速く、すぐにデスクトップが表示された。

メモリ8GB、ディスク50GBが割り当てられている様子。

ウインドウを閉じるとVMも停止する模様。

kun432kun432

利用可能なVMイメージ

https://tart.run/quick-start/#vm-images

用意されているVMイメージはざっと見た感じ以下。

  • macOS 12(Monterey)/ 13(Ventura) / 14(Sonoma) / 15(Sequoia)/ 26(Tahoe)
    • base / xcode / vanilla といったバリエーションがある様子。あとCI用のものもあった。
    • 細かいバージョンもタグで指定できる様子
  • Ubuntu / Debian / Fedora / Rocky
    • こちらもCI用のものがあった

試しにUbuntu-24.04を起動してみる。なお、こちらは2.7GBと比較的小さかった。

tart clone ghcr.io/cirruslabs/ubuntu:24.04 ubuntu-24.04
出力
pulling manifest...
pulling disk (2.7 GB compressed)...
100%
pulling NVRAM...
tart run ubuntu-24.04

こちらはコンソールが立ち上がった。GUIは自分でセットアップしないといけないのかな?ちなみにID/PWは admin / adminでログインできる。

メモリ4GB、ディスク約20G、が割り当てられている様子

でこれはsetサブコマンドで変更できるみたい。

tart set --help
出力
OVERVIEW: Modify VM's configuration

USAGE: tart set <name> [--cpu <cpu>] [--memory <memory>] [--display <display>] [--display-refit] [--no-display-refit] [--random-mac] [--random-serial] [--disk <path>] [--disk-size <disk-size>]

ARGUMENTS:
  <name>                  VM name

OPTIONS:
  --cpu <cpu>             Number of VM CPUs
  --memory <memory>       VM memory size in megabytes
  --display <display>     VM display resolution in a format of <width>x<height>. For example, 1200x800
  --display-refit/--no-display-refit
                          Whether to automatically reconfigure the VM's display to fit the window
  --random-mac            Generate a new random MAC address for the VM.
  --random-serial         Generate a new random serial number for the macOS VM.
  --disk <path>           Replace the VM's disk contents with the disk contents at path.
  --disk-size <disk-size> Resize the VMs disk to the specified size in GB (note that the disk size can
                          only be increased to avoid losing data)
        See https://tart.run/faq/#disk-resizing for more details.
  --version               Show the version.
  -h, --help              Show help information.

ディスクとメモリを増やしてみる。一旦VMを止めて以下を実行

tart set --disk-size 50 ubuntu-24.04
tart set --memory 4096 ubuntu-24.04  # メモリはメガバイト指定

getで確認ができる。

tart get ubuntu-24.04
出力
OS    CPU Memory Disk DiskFormat Size  Display  State
linux 4   4096   50   raw        4.295 1024x768 stopped

変更されている様子。

なお、これらのVMイメージは Packer で作成されているようで、テンプレートもGitHubで公開されている。対応していないディストリビューションなんかも頑張ればできるかもしれない、しらんけど。

https://github.com/cirruslabs/macos-image-templates

https://github.com/cirruslabs/linux-image-templates

kun432kun432

こちらはコンソールが立ち上がった。GUIは自分でセットアップしないといけないのかな?

Linuxの場合にGUIではなくコンソールが立ち上がったけど、以下の記事にある通り簡単にGUI化できる(こんな簡単だとは知らなかった)

https://developer.mamezou-tech.com/blogs/2024/02/12/tart-vm/

sudo apt update
sudo apt install ubuntu-desktop

パッケージ数が多いのでそこそこ時間はかかるが、インストールが終わったらVMをリブートすればGUIが立ち上がる。

kun432kun432

SSHアクセス

VM側でSSHアクセスが許可されていればSSHでもアクセスできる。例えば SonomaなmacOS VMが立ち上がっている場合。

 tart run sonoma-base

tart ip <VM名> でVMのIPアドレスが取得できるので以下のようにすれば接続できる。

ssh admin@$(tart ip sonoma-base)

VMなのでガンガン作っては消しすることになるので、Known_hosts を更新しないようにすると良さそう。

ssh -o "StrictHostKeyChecking no" -o "UserKnownHostsFile=/dev/null" admin@$(tart ip sonoma-base)

なお、Tartのネットワークは、自分の環境だと

  • 192.168.65.0/24 がVMのネットワーク
  • ホスト側のMacで、ブリッジインタフェースが作成され、ホストに 192.168.65.1 が割り当てられる。ホストがこのVMネットワークのルータとなる。
  • VM 側では、DHCPで 192.168.65.13 が割り当てられる。

という感じに見える。

このネットワークの設定は、どうやら以下で設定されているものが使用されるみたい。

sudo defaults read /Library/Preferences/SystemConfiguration/com.apple.vmnet.plist
出力
{
    (snip)
    "Shared_Net_Address" = "192.168.65.1";
    "Shared_Net_Mask" = "255.255.255.0";
}

このネットワークアドレスやDHCPなどの設定を変更する場合は以下を参照

https://tart.run/faq/#changing-the-default-nat-subnet

https://tart.run/faq/#changing-the-default-dhcp-lease-time

kun432kun432

ホスト側ディレクトリのマウント

--dir でVMにホスト側のディレクトリをマウントさせることができる

テスト用にディレクトリとファイルを作成。

mkdir test_dir
echo "this is a test file" > test_dir/a.txt

このディレクトリを指定してVMを起動。

tart run --dir=test:./test_dir sonoma-base

Mac VMの場合は「共有フォルダ(My Shared Files)」にマウントされる。

次にLinuxの場合、こちらはVM内で手動で設定を行う必要がある。とりあえず上と同様にVMを上げる。

tart run --dir=test:./test_dir ubuntu-24.04

VM側でマウントポイントを作成してマウントしてやる。このあたりは Virtualization Framework で用意されているみたい。

sudo mkdir /mnt/shared
sudo mount -t virtiofs com.apple.virtio-fs.automount /mnt/shared

これでアクセスできる

find /mnt/shared
出力
/mnt/shared
/mnt/shared/test
/mnt/shared/test/a.txt
cat /mnt/shared/test/a.txt
出力
this is a test file

その他、以下についても記載されているので、詳細はドキュメント参照。

  • 読み込み専用にする場合
  • 複数のディレクトリをマウントする場合
  • マウントポイントを変更する場合
  • 起動時に自動でマウントする場合
kun432kun432

Quick Startはこれでおしまい。ざっと触ってみた感じの所感としては

  • MacのVMを動かせる
  • VMの動作が非常に高速

というところが良いのかな?Virtualization Framework、全く理解してないけど、このあたりの恩恵はそこから来ているのかもしれないなと思ったり。

あと、GUIなホスト上でGUIなVMを動かす場合、ショートカットキーやホットキーなどの入力周りが気になる。一般的にMacの場合はGUIが前提になると思うので、そのフレームワーク上に乗っかっているのであれば、ある程度操作性とかも考慮されているのではなかろうか?ここは未確認なのであくまでも現時点では期待だけ。少し使ってみて確認してみたいところ。

反面、ホストは当然ながらMacのみとなるので、やや汎用性には欠ける。あと自分はLinuxのVMを動かすことがメインになると思うので、高速動作ってところは嬉しいけど、MacのVMが動くことにそれほど魅力を感じてはいないかな。

とりあえずLinuxのVMでGUIの使い勝手を確認してみたい。

kun432kun432

その他

VMの管理

https://tart.run/integrations/vm-management/

上の方で、VMはどうやらPackerで作成されていると書いていたが、tartのCLIでISO(Linuxの場合) / IPSW(iPhoneSoftware: iOSやMacで使用されるファームウェアらしい)からも作成できるみたい。

Arch LinxuとかOmarchyとかでいけるんだろうか?ちょっと試してみたいところ。実はこれが最初のモチベーションだったり。

CI/CDとオーケストレーション

GitHubのREADMEなどを見ると、開発元のCirrus Labsは、GitHub Actionsで動かすRunnerを、いろんな環境(Apple Silicon、Linux ARM64/AMD64、GPUなど)で動かせるというサービスを提供している様子。

https://cirrus-runners.app/

そこで培われたノウハウを元に作られたのがTartらしいので、当然CI/CDというところに強みがあるのだろう。ドキュメントにも、セルフホストやGitLabでの使用例が記載されている(GitHub Actionsの場合は彼らのサービスサイトに飛ばされるけど)。その場合はTartをさらにラップしたCirrus CLIを使うみたい。

https://tart.run/integrations/cirrus-cli/

https://tart.run/integrations/gitlab-runner/

また、複数台ホストでのオーケストレーション向けにOrchardというものも用意されているみたい。

https://tart.run/orchard/quick-start/

Tartはこれらの中で最も低レベルにVMを操作するものという感じみたい。

このスクラップは12日前にクローズされました