Apple SiliconのMacでUbuntuを動かす
VirtualBoxやParallelsがAppleSiliconに対応したら不要かもしれませんが(Parallelsは対応予定あり)、取り急ぎAArch64でUbuntuを動かしたい場合に使える(かも)しれない方法を紹介します。
参考にした記事
セットアップ
QEMUとwgetのインストール
$ brew install qemu wget
vftoolのビルド
Virtualization.framework tool (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イメージの作成
#!/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が少しもっさりしている。
Discussion