Linuxの仮想環境 on M1(Apple Silicon)

Apple SiliconのCPUを搭載したMac(通称"M1 Mac")を購入して、ファンレスでこのパフォーマンス、しかも熱くならない、バッテリー持ちがすごい、何に安い!、などなど、いい意味で衝撃を受けています。

一方で、エンジニア目線で気になるのは、ちゃんと開発ツールが動くのか、だと思います。 特に、LinuxのVM環境は必須で、作っては壊し、壊しては作る(Build & Scrap!)をカジュアルにできないと何かと困ります。これまではVagrant+VirtualBoxでその環境を整えてきたのですが、M1 Macではこれができません。

Multipass

そうこうしているうちに、Ubuntuでお馴染みのCanonicalからMultipassというツールが出てきました。これは、Ubuntuに限られるのですが、Vagrant的にLinux VMを作って・壊すというのがすぐにでき、かつ、M1 Macにも対応しているので、Vagrantのワークフローと同様のことがM1 Mac上でできてしまします。

以下、Multipassの簡単な使い方を見ていきます。

Multipassのインストール

Multipassの公式ページもしくはgithub Releaseからバイナリ(パッケージ)をダウンロードできます。通常通り、ダブルクリックでインストールできます。

インストール後はターミナルからコマンドを実行して確認できます。

% multipass version
multipass   1.8.1+mac
multipassd  1.8.1+mac

基本的な使い方

起動・shellログイン・停止・削除など一通りやってみます。

起動

まず、利用可能なUbuntuのversionをリストします。

% multipass find
Image                       Aliases           Version          Description
18.04                       bionic            20220104         Ubuntu 18.04 LTS
20.04                       focal,lts         20220118         Ubuntu 20.04 LTS
21.10                       impish            20220118         Ubuntu 21.10

LTS(Long Term Support)版と最新のversionは利用可能になっています。

Ubuntuのversionを指定してVMを起動します。指定しない場合は一番新しいLTSが使われるようです。

## デフォルトのUbuntu LTSで立ち上げる
% multipass launch -n my-ubuntu-123

## Ubuntu focalで立ち上げる
% multipass launch -n my-ubuntu-123 focal

## CPU=2コア, RAM=2GB, Disk=10GBで立ち上げる
%  multipass launch -n my-ubuntu-123 -c 2 -m 2g -d 10g

Shellにログインする

% multipass shell my-ubuntu-123

ubuntu@my-ubuntu-123:~$ pwd
/home/ubuntu
...

ログインした後は、Vagrantと同様に、sudoでパスワードなしでrootになれます。

起動しているVMのリスト

% multipass list
Name                    State             IPv4             Image
docker-lab              Running           192.168.64.7     Ubuntu 20.04 LTS
                                          172.17.0.1
                                          172.18.0.1
my-ubuntu-123           Running           192.168.64.9     Ubuntu 20.04 LTS
server-lab              Stopped           --               Ubuntu 20.04 LTS

終了・再開

# 終了
% multipass stop my-ubuntu-123

# 再開
% multipass start my-ubuntu-123

削除

ここはVagrantとは少し異なり、Miultipassの場合は、deleteした後、purgeで完全削除になる。purge前であれば、delete後でも復活させることができる(recover)。

% multipass delete my-ubuntu-123

# 完全削除
% multipass purge my-ubuntu-123

ホストとのファイルの共有

VagrantではゲストOS側上の/vagrant/ディレクトリがホストOS側のVagrant実行ディレクトリに自動的にマウントされ、そこ経由でファイルの共有ができました。

Multipassではmountコマンドを実行して上記と同じことができます。 ここでは、ゲストOS(すでに立ち上がっているmy-ubuntu-123)側の/data/をホストOS側の/Users/foobar123にマウントする例を見ていきます。

# マウント
% multipass mount /Users/foobar123 my-ubuntu-123:/data

# 確認
% multipass info my-ubuntu-123

Name:           my-ubuntu-123
State:          Running
IPv4:           192.168.64.9
Release:        Ubuntu 20.04.3 LTS
Image hash:     6fbeb622aace (Ubuntu 20.04 LTS)
Load:           0.00 0.02 0.00
Disk usage:     1.4G out of 4.7G
Memory usage:   208.8M out of 970.0M
Mounts:         /Users/foobar123 => /data
                    UID map: 501:default
                    GID map: 20:default

実際にShellで入って、/dataディレクトリをlistしてみます。

% multipass shell my-ubuntu-123

ubuntu@my-ubuntu-123:~$
ubuntu@my-ubuntu-123:~$ cd /data/
ubuntu@my-ubuntu-123:~$ ls

drwx------ 1 ubuntu ubuntu   96 Nov  2 20:55  Applications
drwx------ 1 ubuntu ubuntu  288 Jan 26 13:41  Desktop
drwx------ 1 ubuntu ubuntu  192 Jan  7 08:27  Documents
drwx------ 1 ubuntu ubuntu  320 Jan 26 13:31  Downloads
...
....

まとめ

非常にシンプルにVagrant的なワークフローが回せるので重宝してます。 本家にCheatsheetがあったので、貼っておきます。

参考