MultipassをM1 Macで使う備忘録
既に基本的な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
- (参考) マニュアル > サンプルファイル
- (参考) Multipassで気軽にUbuntuサーバーを作ったり壊したりする
Discussion
「Ubuntu内でrebootするとおかしくなる」の節で
と書かれています。
私も同じ現象に遭遇しました。私の場合は、次の方法で直りました。
ps aux | grep multipassd
でmultipassd
のPIDを調べる。sudo kill -KILL <PID>
でmultipassd
を落とす。multipassd
が復活するまでしばらく待つ。確かにプロセス落とせ再起動不要ですね。ありがとうございます!