水底

ScalaとかC#とかネットワークとか

最短でQEMUを使っていろんなアーキテクチャの環境を手に入れる

Hivemall/xgboostのテストで使おうとしたけど結局使わなくなったので供養. QEMU全然分からんのでもっと良い方法やオプションがあったら教えてほしいです.


特定のアーキテクチャをちょっと試したいときにOSのインストールとかを考えたりするのは面倒なので, セットアップ済みUbuntu Cloud Imageを使います(勿論他のディストロでも良いが, 対応するarchが多く取り回しが良さそうだった). というか使うだけなんですが.

準備

ホストはUbuntu想定です. まずQEMU等のツールをインストールします.

sudo apt install -y qemu-system qemu-kvm cloud-image-utils

次にベースにするUbuntu Cloud Imageを取得します. ここから必要なバージョン/アーキテクチャを選択してください. amd64(x64), arm64(aarch64), i386(x86), powerpc, ppc64el等々メジャー所(?)は網羅されています. 例として, 16.04/arm64(aarch64) を選択します.

wget https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-arm64-disk1.img -O ubuntu.img

最後にCloud imageを非クラウド環境で利用するためのイメージを作成します. まずYAML形式の設定ファイルを作成します.

  • とりあえずパスワード認証できるようになればいい場合
#cloud-config
password: password
chpasswd: { expire: False }
ssh_pwauth: True
  • ユーザを追加したり公開鍵認証を使いたい場合
#cloud-config
users:
  - name: foo
    ssh-authorized-keys:
     - ssh-rsa AAA...
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash

1行目の #cloud-config というコメントは必須なようです. より細かな設定をしたい場合はcloud-initのドキュメントを参照してください.

設定からディスクイメージを作成します.

cloud-localds cloud.img cloud-config.yml

これで準備が整いました.

起動

デフォルトでも動くんですが遅すぎて禿げるのでKVMを有効 (-enable-kvm) にして起動します. -smp で仮想CPUコア数, -m でメモリ, -redirSSH用のポートバインディングを設定しています.

sudo qemu-system-aarch64 -enable-kvm -smp 2 -m 2048 -nographic -hda ubuntu.img -hdb cloud.img -redir tcp:10022::22

ログインコンソールが表示されたら成功です. デフォルトのユーザ名は ubuntu なので, cloud-configで設定した内容と合わせてログインしましょう. SSH serverも立ち上がっているはずなので, ssh -p 10022 ubuntu@localhost みたいな感じで接続できるはずです.

おわり

跋文

最初はよく分からん状態で, 素のイメージをマウントして, kernelやinitrd取り出して, OSインストールして, いろいろ設定してとかやってて辛かったけど, Cloud imageが全てを解決してくれた.