🦓

MultipassをM1 Macで使う備忘録

4 min read 2

既に基本的なMultipassの使い方は以下で紹介しました。

使い込んでいくうちに、いろいろ気付いたことがあったのでメモ。

機械学習すると落ちる

機械学習のライブラリを使っていると、途中で「Killed」と表示され落ちることがあります。それは、仮想マシンのメモリ不足によるものです。

launchコマンドで、イメージを作成するとき、CPU数を指定する「--cpus」や、メモリを指定する「--mem」、ディスクサイズを指定する「--disk」のパラメータを付けます。

% multipass launch \
    --name 名前 \
    --cpus 8 \
    --mem 14G \
    --disk 50G

プライマリーインスタンスを変更する

Multipassで特定のインスタンスを起動するには、multipass shell (名前)と記述するのですが、multipass shell とタイプしただけで起動するプライマリーインスタンスの機能があります。

このプライマリーインスタンスを変更するには、以下のコマンドを実行します。

% multipass set client.primary-name=(インスタンス名)

適当に作ったらディスクが足りなくなった...

ちなみに、とりあえずデフォルトでVM作って使っていたら、途中で足りなくなることがあると思います。私もそうでした。

M1 Macで以下のバージョンの環境なんですが、、、いろいろインストール先など調べました。

# multipassのバージョン
% multipass version
multipass   1.8.1+mac
multipassd  1.8.1+mac

# multupassのドライバ
% sudo multipass get local.driver
qemu

この場合、以下のJSONに、VMイメージの詳細情報が書かれています。

% sudo vim /var/root/Library/Application\ Support/multipassd/qemu/multipassd-vm-instances.json

CPUやメモリの割当を変えたければ、上記を変えれば良さそうですが、残念ながらディスクスペースに関しては、JSONを書き換えるだけではだめです。

まず、ドライバがqenuなので、qemuのツールをインストールします。

% brew install qemu

次いで、qemu-img resizeを使って、イメージサイズを変更できます。以下、イメージを50Gに変更します。イメージ自体は上記のJSONファイルのfile=xxx.imgのように書かれています。

% sudo qemu-img resize xxx.img 50G

multipassの設定やイメージのありか

ディスクイメージなど、詳しくは詳しくはこちらに書かれています。

% sudo tree /var/root/Library/Application\ Support/multipassd
/var/root/Library/Application\ Support/multipassd
├── certificates
│   ├── localhost.pem
│   └── localhost_key.pem
├── multipass-unique-id
├── multipassd-send-metrics.yaml
├── qemu
│   ├── multipassd-vm-instances.json
│   └── vault
│       ├── instances
│       │   └── primary
│       │       ├── cloud-init-config.iso
│       │       └── ubuntu-20.04-server-cloudimg-arm64.img
│       └── multipassd-instance-image-records.json
├── registered-certs
├── saved_metrics.json
└── ssh-keys
    └── id_rsa

multipass shell でログインできなくなった問題

しばらく使っていると、multipass shellでログインできない状態になってしまいました。。。今回表示されたエラーは次のようなものでした。

% multipass shell
shell failed: ssh failed to authenticate: 'Access denied for 'publickey'. Authentication that can continue: publickey,password'

前回の設定で、Ubuntu Desktopを設定していたので、Desktop側でログインして、SSHのパスワード認証を有効にすることで、SSHからもVMに接続できるようになりました。

もしかすると、SSHの設定をするときに、うっかり、MultipassのデフォルトのSSHキーを上書きしてしまったのが原因かもしれません。どうせ、Ubuntu Desktopを設定したら、パスワードでログインできてしまうので、/etc/ssh/sshd_configを編集して、PasswordAuthentication yesに設定しておくと安心かも。

また、こちらのIssuesを見ると、VMを作る時に、自身のSSHキーを追加しておくと、便利という話も載っています。

$ multipass launch --cloud-init - <<EOF   
ssh_authorized_keys:
  - $(cat ~/.ssh/id_rsa.pub)
EOF

そこで、以下の感じでVMを作ってみましたが良い感じです。ssh ubuntu@192.168.64.7のようにタイプしてSSHでログインできてます。

% multipass launch \
    --name ubuntu \
    --cpus 8 \
    --mem 14G \
    --disk 30G \
    --cloud-init - <<EOF
ssh_authorized_keys:
  - $(cat ~/.ssh/id_rsa.pub)
EOF

Ubuntu内でrebootするとおかしくなる

上記の通り、multipass 1.8.1+macの環境ですが、multipass shellでログイン後、うっかり、sudo rebootしてUbuntuを再起動してしまうと、その後、VMとうまく接続できなくなりがちです。

一度、接続できなくなると、SSHしても何しても動かないので困ります。それで、いろいろ確認してみると、Mutipassのプロセスが原因で何かがうまくいっていない感じです。そこで、Mac自体を再起動すると直ります。

作って壊してを繰り返すのが正しい使い方

なお、上記で、VM作る時に、 multipass launch --cloud-initのように、--cloud-initオプションを付けています。これがmultipassの便利なところで、普段使う設定を全部、YAMLファイルに書いておいて、作業を始めるときに、launchで環境を作成できるようにすると便利です。

OSの環境構築はいつもかなり面倒なので、全部ファイルにまとめておけば便利。上記のように、万が一VMが壊れたとしても、すぐに作業環境を復旧できるので便利。

#cloud-config
repo_update: true
repo_upgrade: all

# インストールするパッケージ一覧
packages:
  - nodejs
  - npm
  - git

# 最初に実行するコマンド一式
runcmd:
  - cd /home/ubuntu && git clone ...

# 公開鍵をコピペしておく
ssh_authorized_keys:
  - ここにSSHの公開鍵

上記を「init.yaml」という名前で保存しておいて、以下のコマンドでVMを作成。

$ multipass launch --name test --cloud-init init.yaml

Discussion

「Ubuntu内でrebootするとおかしくなる」の節で

一度、接続できなくなると、SSHしても何しても動かないので困ります。それで、いろいろ確認してみると、Mutipassのプロセスが原因で何かがうまくいっていない感じです。そこで、Mac自体を再起動すると直ります。

と書かれています。

私も同じ現象に遭遇しました。私の場合は、次の方法で直りました。

  1. ps aux | grep multipassdmultipassd のPIDを調べる。
  2. sudo kill -KILL <PID>multipassd を落とす。
  3. multipassd が復活するまでしばらく待つ。

確かにプロセス落とせ再起動不要ですね。ありがとうございます!

ログインするとコメントできます