Apple SiliconのMacでUbuntuを動かす

6 min read読了の目安(約6100字

VirtualBoxやParallelsがAppleSiliconに対応したら不要かもしれませんが(Parallelsは対応予定あり)、取り急ぎAArch64でUbuntuを動かしたい場合に使える(かも)しれない方法を紹介します。

参考にした記事

https://bee42.com/de/blog/tutorials/kubernetes-on-silicon-preview/

セットアップ

QEMUとwgetのインストール

$ brew install qemu wget

vftoolのビルド

Virtualization.framework tool (vftool)

https://github.com/evansm7/vftool

ビルドしたバイナリを ~/bin にコピーしていますが、PATHが通っているところにコピーしてください(各自の環境に合わせてください)。

$ git clone https://github.com/evansm7/vftool.git
$ cd vftool
$ make
$ cp build/vftool ~/bin
$ vftool
vftool version v0.3 10/12/2020

Syntax:
        vftool <options>

Options:
        -k <kernel path>                 [REQUIRED]
        -a <kernel cmdline arguments>
        -i <initrd path>
        -d <disc image path>
        -c <CDROM image path>            (As -d, but read-only)
        -b <bridged ethernet interface>  (Default NAT)
        -p <number of processors>        (Default 1)
        -m <memory size in MB>           (Default 512MB)
        -t <tty type>                    (0 = stdio, 1 = pty (default))

        Specify multiple discs with multiple -d/-c options, in order (max 8)

Ubuntuイメージの作成

ubuntu-image.sh
#!/bin/bash
RELEASE=focal
VERSION=20.04
URL=https://cloud-images.ubuntu.com/releases/$RELEASE/release/
mkdir -p ubuntu-$RELEASE-$VERSION
cd ubuntu-$RELEASE-$VERSION
wget $URL/unpacked/ubuntu-$VERSION-server-cloudimg-arm64-vmlinuz-generic
wget $URL/unpacked/ubuntu-$VERSION-server-cloudimg-arm64-initrd-generic
wget $URL/ubuntu-$VERSION-server-cloudimg-arm64.tar.gz
mv ubuntu-$VERSION-server-cloudimg-arm64-vmlinuz-generic vmlinux.gz
gunzip vmlinux.gz
mv ubuntu-$VERSION-server-cloudimg-arm64-initrd-generic initrd
tar xvfz ubuntu-$VERSION-server-cloudimg-arm64.tar.gz
mv $RELEASE-server-cloudimg-arm64.img ubuntu-$VERSION-km-disk.img
qemu-img resize ubuntu-$VERSION-km-disk.img +50G

を作って実行する。

$ bash ubuntu-image.sh

すると ubuntu-focal-20.04 ディレクトリが作られ、中には以下のファイルが出来上がる。

README
initrd
ubuntu-20.04-km-disk.img
ubuntu-20.04-server-cloudimg-arm64.tar.gz
vmlinux

Ubuntu起動

ubuntu-focal-20.04 ディレクトリ内でvftoolを使ってUbuntuを起動する。

$ vftool \
  -k vmlinux \
  -i initrd \
  -d ubuntu-20.04-km-disk.img \
  -m 2048 \
  -a "console=hvc0"
2021-03-12 10:00:05.020 vftool[83351:5474717] +++ fd 3 connected to /dev/ttys014
2021-03-12 10:00:05.020 vftool[83351:5474717] +++ Waiting for connection to:  /dev/ttys014

という表示を確認して、

$ screen /dev/ttys014

を別ターミナルで実行して、コンソールに接続する。

接続したら以下のコマンドを実行してrootパーティションの最低限の設定を行う。ルートパスワードは自由に変えてください。

$ mkdir /mnt
$ mount /dev/vda /mnt
$ chroot /mnt
$ touch /etc/cloud/cloud-init.disabled
$ echo 'root:ルートパスワード' | chpasswd
$ echo "km-silicon" >/etc/hostname
$ ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
$ ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa
$ ssh-keygen -f /etc/ssh/ssh_host_ed25519_key -N '' -t ed25519
$ cat <<EOF > /etc/netplan/01-dhcp.yaml 
network:
    renderer: networkd
    ethernets:
        enp0s1:
            dhcp4: true
    version: 2
EOF
$ exit
$ umount /dev/vda

ここまでやったらvftool側をCtrl+cして一旦終了させる。

割り当てメモリ、CPU数を増やし、rootパーティションに/dev/vdaを指定して起動する。

$ vftool \
  -k vmlinux \
  -i initrd \
  -d ubuntu-20.04-km-disk.img \
  -m 4096 \
  -p 2 \
  -a "console=hvc0 root=/dev/vda"

またscreenで接続する

$ screen /dev/ttys014

うまくいっていればログインのコンソールが表示されるので、rootでログインする。

Ubuntu 20.04.2 LTS km-silicon hvc0

km-silicon login:

ログインしたらディスクを拡張する

resize2fs /dev/vda

実行したらvftoolをCtrl+cで終了して再起動し、再度rootでログイン。

自身のSSHの公開鍵をセットしておく。

# cat >~/.ssh/authorized_keys <<EOF
ssh-rsa ...
EOF
# chmod 600 .ssh/authorized_keys

IPアドレスを確認

# ip addr show | grep 192
    inet 192.168.64.4/24 brd 192.168.64.255 scope global dynamic enp0s1

macOS側からSSHしてみる

$ ssh -i SSH秘密鍵 root@192.168.64.4

無事ログインできればOK。

Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-66-generic aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Fri Mar 12 01:15:59 UTC 2021

  System load:             0.0
  Usage of /:              2.5% of 49.75GB
  Memory usage:            4%
  Swap usage:              0%
  Processes:               110
  Users logged in:         1
  IPv4 address for enp0s1: 192.168.64.4
  IPv6 address for enp0s1: fda2:9e8c:1106:6be9:5099:57ff:fe27:afee

 * Introducing self-healing high availability clusters in MicroK8s.
   Simple, hardened, Kubernetes for production, from RaspberryPi to DC.

     https://microk8s.io/high-availability

22 updates can be installed immediately.
15 of these updates are security updates.
To see these additional updates run: apt list --upgradable


Last login: Fri Mar 12 01:09:00 2021

ここから先はDocker入れるなりUbuntu上で好きなように。

番外編 Docker入れて動かしてみた

https://docs.docker.com/engine/install/ubuntu/ の手順にしたがって実行

Dockerのインストール

$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
  "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

UbuntuのDockerイメージを動かしてみる

UbuntuのDockerイメージを動かす

$ docker run -it ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
32d7611b468c: Pull complete
e5be16fdc306: Pull complete
a361e87bde5e: Pull complete
Digest: sha256:b4f9e18267eb98998f6130342baacaeb9553f136142d40959a1b46d6401f0f2b
Status: Downloaded newer image for ubuntu:latest
root@9d2f43c70761:/# uname -a
Linux 9d2f43c70761 5.4.0-66-generic #74-Ubuntu SMP Wed Jan 27 22:56:23 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

問題なく動く。

課題感

  • vftoolの終了方法はCtrl+cで良いのかどうか。
  • macOSとVMとのネットワークの速度がいまいち出ないようで、SSHが少しもっさりしている。