M1(Pro|Max)のMacBook ProにUTMを使ってArch Linuxをインストールする

# はじめに

ARMアーキテクチャCPUであるM1のMacでLinuxを動作させるには、Asahi LinuxのようなネイティブのLinuxを用いるか、QEMU上で動作する仮想マシンとしてLinuxを動作させるかという方法があります。

[UTM](https://mac.getutm.app)はQEMUを使いやすくしたGUIのアプリ。今回はこのUTMを使ってM1(Pro|Max)のMacBook ProにArch Linuxをインストールします。

# UTMのインストール

UTMはApp Storeから1200円で購入することもできますが、GitHubのリリースページから直接ダウンロードすることもできます。https://github.com/utmapp/UTM/releases

# Arch Linuxのイメージを作成する

ここからの作業はUTMでUbuntuを起動してからUbuntu上で作業します。

まず必要なパッケージをインストールします。

```bash
sudo apt install qemu-utils libarchive-tools
```

次にqemuに使う素のimgファイルを作成します。alarmは、(arch linux armの略です)

```bash
qemu-img create alarm.img 32G
```

# パーティション作成

次にalarm.imgにパーティションを作成します。

```bash
gfdisk alarm.img
```

`o`を入力してGPTパーティションテーブルを作成します。

`n`を入力して先頭パーティションを200Mくらいで作成します。

`t`を入力してパーティションタイプをEFI system`ef00`にします。

次にルート(/)に使うパーティンションを作成します。

`n`を入力して残り全ての領域を使ったパーティションを作成します。パーティションタイプはデフォルトのLinux filesystemとしておきます。

次に作成したパーティションにファイルシステムを作成します。`kpartx`コマンドでイメージをloopbackデバイスに登録します。

```bash
sudo kpartx -av alarm.img
```

このコマンドを実行すると、/dev/mapper以下に`loopNpX`のようなデバイスが登録されます。これはイメージファイルのパーティションテーブルからloopbackブロックデバイスをLinuxに認識させています。

次にこのloopbackデバイスにファイルシステムを作成します。

今回はたまたま`loop5`でしたが、loopbackデバイスの使用状況によってloop4だったりloop6だったりするので`lsblk`などでどのloopbackデバイスが作成されたか確認しておきましょう。

```bash
mkfs.vfat -F 32 /dev/mapper/loop5p1
mkfs.ext4 /dev/mapper/loop5p2
```

次に作成したファイルシステムをマウントします。

```bash
mount /dev/mapper/loop5p2 /mnt
mkdir /mnt/boot
mount /dev/mapper/loop5p1 /mnt/boot
```

`/mnt/boot` ディレクトリは必ず作成する必要があります。

次にArchLinuxのARM用イメージを取得します。

```bash
curl -LO http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
```

取得したイメージを`/mnt`に展開します。

```bash
sudo bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C /mnt
```

# fstabの作成

Linuxを正常に起動させるために`fstab`の設定でブロックデバイスと、そのマウント先のマップを指定します、。

vim /mnt/etc/fstab

```config:/mnt/etc/fstab
/dev/disk/by-uuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX  /       ext4 defaults 0 0
/dev/disk/by-uuid/XXXX-XXXX                             /boot   vfat defaults 0 0
```

XXXの部分はUUIDなので、`lsblk`で取得したブロックデバイスに割り当てられたUUIDに書き換えます。

```bash
lsblk | grep loop5 >> /mnt/etc/fstab
```

このコマンドでfstabにUUIDのリストを書き込んでいるので、編集して完成させます。1行目はloop5n2のUUIDを、二行目にはloop5n1のUUIDを記入します。

次に`startup.nsh`に起動用のコマンドを書き込みます。ここで使うUUIDはloop5n1のものです。

```bash
vim /mnt/boot/startup.nsh

Image root=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=\initramfs-linux.img
```

このUUIDも先ほどのUUIDと同じものです。

# qcow2イメージへの変換

まず`/mnt`をアンマウントしてloopbackデバイスを削除します。

```bash
sudo umount -R /mnt
sudo kpartx -d alarm.img
```

次にimgファイルをqcow2に変換します。

```bash
qemu-img convert -O qcow2 alarm.img alarm.qcow2
```

UTMのファイル共有設定をしておくと、UbuntuのNautilusファイルエクスプローラから`dav://127.0.0.1:9843`に接続するとmacOS側のディレクトリが表示できます。

ここに作成した`alarm.qcow2`イメージをドラッグして転送してください。

# UTMでの仮想マシン作成

UTMで新規マシンを作成します。

`System`タブでArchitectureに`ARM64`を指定します。

![Screen Shot 2021-11-11 at 13.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/83a11ce6-7f9b-2bc0-d518-458ab4b1cd64.png)


`Drives`タブから`Import Drive`を行い、先ほど転送したqcow2イメージを取り込みます。

![Screen Shot 2021-11-11 at 13.58.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/bde80a8c-cba7-d789-6bff-7ee9696f8d8e.png)

`Display`タブで`Emulated Display Card`を、`virtio-ramfb-gl (GPU Supported)` を選択します。これを選択すると仮想マシンのグラフィックレンダリングにGPUが使われます。

![Screen Shot 2021-11-11 at 13.58.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/42219971-5936-c402-4b3a-f32139babdfc.png)

設定を画面を閉じ、再生ボタンから起動すると次のようにArch linuxのログイン画面が表示されます。

![Screen Shot 2021-11-11 at 14.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/8cdd89ae-9f0b-2219-1739-c6bb4d83d03e.png)

初期ユーザ名とパスワードはどちらも`root`になっています。ログイン後セキュリティが気になる環境であれば適宜変更してください。

ログインしたら、`pacman`コマンドを正常に使えるようにします。

```bash
pacman-key --init
pacman-key --populate archlinuxarm
```

次に各種パッケージを最新にしますが、もしKernelをアップデートしたくない場合があれば次のようにIgnorePkgで指定します。

```bash
vim /etc/pacman.conf
IgnorePkg = linux-aarch64
```

更新を実行します。

```bash
pacman -Syu
```

ここで再起動をしておいてください。

次にefibootmgrでstartup.nshに依存しないようにします。これは必須ではありませんが快適に使うためにはやっておいた方がいいでしょう。

```bash
efibootmgr --disk /dev/vda \
  --part 1 \
  --create --label "Arch Linux ARM" \
  --loader /Image \
  --unicode 'root=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=\initramfs-linux.img' \
  --verbose
```

# Xの設定

次にXの設定を行います。ここではウィンドウマネジャに`i3`を選択していますが。KDEやGNOMEなど好きなウインドウマネジャがあればそちらを指定しましょう。

```bash
pacman -S i3 xorg-server xorg-xinit
```

次に`~/.xinitrc`に解像度の設定を行います。



```bash:~/.xinitrc
# load system wide xinit
if [ -d /etc/X11/xinit/xinitrc.d ] ; then
    for f in /etc/X11/xinit/xinitrc.d/?*.sh ; do
        [ -x "$f" ] && . "$f"
    done
    unset f
fi

# screen layout
modename="3024x1910_60.00"
xrandr --newmode $modename 493.75  3024 3264 3592 4160  1910 1913 1923 1979 -hsync +vsync
xrandr --addmode Virtual-1 $modename
xrandr --output Virtual-1 --mode $modename

# HiDPI
xrdb -merge ~/.Xresources

# start i3
exec i3
```

次に~/.XresourcesにDPIの設定を書き込んでおきます。



```~/.Xresources
Xft.dpi = 192
```

ここまでできたら、`startx`コマンドを実行するとXが起動するはずです。ただしUTMのバージョンやArch linuxのバージョンなどで動作しないかもしれません。

# 参考

- [Pacman -Syu Kernel Update [SOLVED]: How to Ignore Arch Kernel Upgrades | DigitalOcean](https://www.digitalocean.com/community/tutorials/pacman-syu-kernel-update-solved-how-to-ignore-arch-kernel-upgrades)
- [Virtualisation on M1](https://www.lifeintech.com/2021/10/29/virtualisation-on-m1/)
- [Ubuntu 20.04 | UTM](https://mac.getutm.app/gallery/ubuntu-20-04)
- [UTM](https://getutm.app/guide/)
- [How to boot Arch Linux ARM in QEMU (patched for M1) · GitHub](https://gist.github.com/thalamus/561d028ff5b66310fac1224f3d023c12/ccf166a42646c223c1106ec25416a9c553d3301d)
- [How to run a Minikube on Apple Silicon M1 | by Sophie Kwon | Oct, 2021 | Medium](https://medium.com/@seohee.sophie.kwon/how-to-run-a-minikube-on-apple-silicon-m1-8373c248d669)
- [第672回　UTMを使ってM1 Mac上でUbuntuを動かす：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0672?page=1)
- [Developing on Apple M1 Silicon with Virtual Environments | by John Rofrano | Nerd For Tech | Medium](https://medium.com/nerd-for-tech/developing-on-apple-m1-silicon-with-virtual-environments-4f5f0765fd2f)
- [UTMを使ってM1 MacにUbuntu20.04をインストールして、その中でDockerを動かして、その中でUbuntu20.10を動かしてみる - Qiita](https://qiita.com/akase244/items/726edbdd10085198f61f)

# 所感

macOS上でLinuxを使うことができるようになります。ちょっとした用途には十分かと思いますが、やはり仮想マシンなのでLinuxを直接ホストにインストールして使っている状態に比べて不便なところも多いと感じます。

普段からLinuxがメインの仕事をしている方、特にバックエンドエンジニアやインフラエンジニアの仕事が多い人は、素直にLinuxマシンを直接使った方が良さそうです。

逆にフロントエンドエンジニア、動画編集、写真編集などクリエイティブな業務が多い方はmacOSをメインに使うと良いでしょう。

どっちの仕事も満遍なくやる必要がある方は諦めてどっちも使うしかないかもしれません。筋トレしてより多くの荷物を軽々運べるように己を鍛えましょう。