M1 Mac miniのUTM上で「ゼロからのOS自作入門」の環境を構築する

### この記事は何？

自分用のメモとしてM1 Mac miniのUTM上で「[ゼロからのOS自作入門](https://book.mynavi.jp/ec/products/detail/id=121220)」の環境を構築する手順を残します。

### 動作環境

- Macのバージョン: macOS Big Sur 11.0.1(Apple M1)
- UTMのバージョン: 2.4.1

### 事前準備

「ゼロからのOS自作入門」の「付録A 開発環境のインストール」を参照すると、「[mikanos-build](https://github.com/uchan-nos/mikanos-build)」というGitHubのリポジトリのURLが記載されており、このリポジトリのREADMEの中で「Ubuntu 18.04 で動作を確認しています」とありますが、今回は Ubuntu 20.04 で環境を構築してみようと思うので、対象となるISOファイルをダウンロードしておきます。

[Ubuntu 20.04のReleaseページ](https://releases.ubuntu.com/focal/)にアクセスします。
![スクリーンショット 2022-01-11 19.56.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/0adf423e-103a-9cc7-5ebc-2a32fe41cda3.png)


Server版のISOファイル「[ubuntu-20.04.3-live-server-amd64.iso](https://releases.ubuntu.com/focal/ubuntu-20.04.3-live-server-amd64.iso)」をダウンロードします。
![スクリーンショット_2022-01-11_19_55_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/e508c593-8182-1738-eb93-ad2ecc51707d.png)

### UTMで Ubuntu 20.04 をインストール

QEMUのコマンドをゴニョゴニョしたくなかったので今回は[UTM](https://mac.getutm.app/)を利用することにしました。

まず、UTMを起動します。
![スクリーンショット 2022-01-10 21.52.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/3c0809f3-cb5f-9e35-6bde-b34ab8bef980.png)

UTMの「＋」ボタンをクリックして「Start from Scratch」をクリックします。

![スクリーンショット 2022-01-10 21.54.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/76794ec7-01b2-59c8-049e-ad04a2e46700.png)

このような初期画面が表示されます。
![スクリーンショット 2022-01-10 23.46.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/61e97084-7af7-869f-a1a8-2c2960de1f4c.png)

InformationタブのName欄に「Ubuntu 20.04 amd64」と入力し、Styleから「Operating System」を選択します。
![スクリーンショット 2022-01-11 19.58.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/23f6e6ad-ea08-4bce-fbd8-24263aeca40c.png)

Systemタブに移動します。
![スクリーンショット 2022-01-10 23.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/46a4b1d5-9641-accb-02ec-2e1e8db3dbca.png)

Architectureで「x86_64」が選択されていれば特に変更は不要です。
Memoryについては環境によって設定可能な値が変わってくると思いますが、今回は8192MB(8GB)で設定してみます。
![スクリーンショット 2022-01-10 23.49.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/92b82330-fa76-85e3-5ac9-a93c79e85240.png)

Deviceタブに移動します。
![スクリーンショット 2022-01-10 23.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/8585521a-5ca3-7ad3-637f-5d3f25ff0279.png)

「New Device」ボタンをクリックし、Interfaceで「VirtIO」が選択された状態でSizeに任意の値を入力します。今回は30GBで設定してみます。
![スクリーンショット 2022-01-10 23.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/8efb8fdf-a5eb-1718-4c9d-c9f9548a93de.png)

「Create」ボタンをクリックします。
![スクリーンショット 2022-01-10 23.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/cacb4f56-8efc-888f-24a7-41f811f8d406.png)

もう一度「New Device」ボタンをクリックします。「Removable」にチェックし、Interfaceから「USB」を選択します。
![スクリーンショット 2022-01-10 23.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/46e0aaa1-7231-3904-ac6e-f8be61079a33.png)

「Create」ボタンをクリックします。
![スクリーンショット 2022-01-10 23.53.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/bfe7beee-3e56-f8b9-85b5-a0d4b442e0fc.png)

Displayタブに移動します。
![スクリーンショット 2022-01-11 22.26.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/30353287-712e-ec2f-a75f-5ceaf19bc424.png)

「Emulated Display Card」の選択肢からホストPCの対応状況に応じて選択します。今回は「virtio-vga」を選択します。
![スクリーンショット 2022-01-11 22.26.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/637bbbc7-2e89-f548-ea6a-72870864ae1e.png)

「Save」ボタンをクリックすると、仮想マシンの枠ができあがります。
![スクリーンショット 2022-01-11 20.01.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/07a9ff2d-653a-92d6-b2b9-f65a6cad9579.png)

「CD/DVD」の欄をクリックすると「Browse」と表示されるのでこれをクリックします。
![スクリーンショット 2022-01-11 20.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/579ed46b-d221-f31c-41fc-d08e1086647e.png)

事前にダウンロードしておいたISOファイルを選択します。
![スクリーンショット 2022-01-11 22.41.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/364f368f-a845-22f5-f059-46b82d10f955.png)

再生アイコン（起動ボタン）をクリックすると仮想マシンが起動します。
![スクリーンショット 2022-01-11 22.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/b3d8a10b-274a-a2da-dbb6-bfbf9e70bfdd.png)

Ubuntuのインストール画面が表示されるので「Install Ubuntu Server」を選択します。
![スクリーンショット 2022-01-11 22.30.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/8693569f-a009-df11-08cd-563c71c964e3.png)

Ubuntuの詳細なインストール手順については割愛します。

インストールが完了するまでしばらく待ちます。
![スクリーンショット 2022-01-11 22.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/af3755bd-0a5b-37e5-cdf7-3ca0edcf967d.png)

インストールが完了すると再起動を求められます。
![スクリーンショット 2022-01-11 23.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/dfcbb24c-2439-45cb-8d11-820f175b2014.png)

CD/DVDでISOファイルを選択した状態だと再起動時にこのようにエラーが出まくります。
![スクリーンショット 2022-01-11 23.53.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/d45a778d-5f83-af78-5ee4-101f794244d7.png)

なので、一旦仮想マシンを停止します。
![スクリーンショット 2022-01-11 23.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/df07f8f5-3fd3-c199-376e-39970d9fa33b.png)

CD/DVDの「Clear」を選択して再度仮想マシンを起動します。
![スクリーンショット 2022-01-11 23.57.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/bcd7b400-1397-3215-daa9-b22e890f336f.png)

Ubuntuが起動します。
![スクリーンショット 2022-01-11 23.59.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/9c0d5004-1800-78d7-016f-3eb554dd6c8a.png)

ホストPCとゲストPC間でクリップボードが共有ができるように spice-vdagent をインストールします。

```
$ sudo apt -y install spice-vdagent
```

開発時にGUI環境が必要なので、 ubuntu-desktop をインストールします。

```
$ sudo apt -y install ubuntu-desktop
```

ubuntu-desktop のインストールが完了したら再起動します。

```
$ sudo reboot
```

再起動後はGUIのログイン画面が表示されます。
![スクリーンショット 2022-01-12 1.00.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/5e84fadd-73ab-9bb7-3e72-ba18910adea9.png)

ログインするとデスクトップ環境が表示されます。
![スクリーンショット 2022-01-12 1.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/acb68715-4768-17b9-1f20-e587443047d9.png)

ターミナルを起動します。

![スクリーンショット 2022-01-12 19.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/4edf033b-cac6-20fa-4c01-c00f30e22dfa.png)

ここからは[mikanos-build](https://github.com/uchan-nos/mikanos-build)のリポジトリの[README](https://github.com/uchan-nos/mikanos-build/blob/master/README.md)に従って、環境構築を進めていきます。

mikanos-buildのリポジトリを git clone します。

```
$ cd $HOME
$ git clone https://github.com/uchan-nos/mikanos-build.git osbook
```

Ansibleを使って環境のプロビジョニングを行います。

```
$ sudo apt -y install ansible
$ cd $HOME/osbook/devenv
$ ansible-playbook -K -i ansible_inventory ansible_provision.yml
・
・
・
PLAY RECAP *********************************************************************
localhost                  : ok=8    changed=6    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   
```

プロビジョニングによって `iasl` コマンドがインストールされているか確認します。バージョン番号が表示されたら成功しています。

```
$ iasl -v

Intel ACPI Component Architecture
ASL+ Optimizing Compiler/Disassembler version 20190509
Copyright (c) 2000 - 2019 Intel Corporation
```

プロビジョニングによって `edk2` ディレクトリが作成されているか確認します。ディレクトリの情報が表示されたら成功しています。

```
$ ls -ld $HOME/edk2
drwxrwxr-x 33 akase244 akase244 4096 Jan 12 10:50 /home/akase244/edk2
```

mikanosのリポジトリを git clone します。

```
$ cd $HOME
$ git clone https://github.com/uchan-nos/mikanos.git
```

ブートローダーをビルドします。

```
$ cd $HOME/edk2
$ ln -s /home/akase244/mikanos/MikanLoaderPkg ./
$ source edksetup.sh
Using EDK2 in-source Basetools
WORKSPACE: /home/akase244/edk2
EDK_TOOLS_PATH: /home/akase244/edk2/BaseTools
CONF_PATH: /home/akase244/edk2/Conf
Copying $EDK_TOOLS_PATH/Conf/build_rule.template
     to /home/akase244/edk2/Conf/build_rule.txt
Copying $EDK_TOOLS_PATH/Conf/tools_def.template
     to /home/akase244/edk2/Conf/tools_def.txt
Copying $EDK_TOOLS_PATH/Conf/target.template
     to /home/akase244/edk2/Conf/target.txt
$ cp Conf/target.txt Conf/target.txt.orig
$ vim Conf/target.txt
$ diff Conf/target.txt Conf/target.txt.orig 
20c20
< ACTIVE_PLATFORM       = MikanLoaderPkg/MikanLoaderPkg.dsc
---
> ACTIVE_PLATFORM       = EmulatorPkg/EmulatorPkg.dsc
44c44
< TARGET_ARCH           = X64
---
> TARGET_ARCH           = IA32
54c54
< TOOL_CHAIN_TAG        = CLANG38
---
> TOOL_CHAIN_TAG        = VS2015x86

$ build
・
・
・
- Done -
Build end time: 11:29:02, Jan.12 2022
Build total time: 00:02:58
```

以下のファイルが存在していたらビルド成功です。

```
$ ls -l Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi
-rw-rw-r-- 1 akase244 akase244 12032 Jan 12 11:29 Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi
```

mikanosをビルドします。

```
$ source $HOME/osbook/devenv/buildenv.sh
$ cd /home/akase244/mikanos
$ ./build.sh
```

ビルドの途中でsudoのパスワード入力を求められるので入力します。

```
[sudo] password for akase244: 
```

ビルドが完了したらQEMUを起動してみます。

```
$ ./build.sh run
```

このような画面が表示されたら起動成功です。
![スクリーンショット 2022-01-12 20.41.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/80a4fdbb-8102-f1d7-348c-fca60efc46c5.png)

起動確認を終えたらQEMUを終了します。

```
QEMU 4.2.1 monitor - type 'help' for more information
(qemu) quit
```

### 参考URL
- [UTMを使ってM1 MacにUbuntu20.04をインストールして、その中でDockerを動かして、その中でUbuntu20.10を動かしてみる](https://qiita.com/akase244/items/726edbdd10085198f61f)
- [Windows で MikanOS (その1:VMware)](https://qiita.com/ShigeakiAsai/items/d14e0260c1f386dc24d9)
- [linux ド素人だけど OS 自作 みかん 本にチャレンジしてみた](https://qiita.com/AKpirion/items/2ed219403a06b3b8c7d5)
- [linux ド素人だけど OS 自作 みかん 本の環境とか色々 かじってみた](https://qiita.com/AKpirion/items/be3d4e6c8ead22b64bee)
- [macで自作OS with EDK2](https://qiita.com/Lich/items/9d78534e828930a83cc2)
- [【ゼロからのOS自作入門】WSLでHelloWorldするまで](https://qiita.com/all_fort/items/5165214c97ab76f568a5)
- [Mac で始める「ゼロからのOS自作入門」](https://qiita.com/yamoridon/items/4905765cc6e4f320c9b5)
- [WSL2のapt installエラー発生時にやったこと](https://qiita.com/TomokiRyo/items/5245e89c2a188f774a9c)
- [ゼロからのOS自作入門をMacで勉強する方法 (Docker使用)](https://qiita.com/meruneru/items/0b7aa23ea505a80d60f5)
- [【ゼロからのOS自作入門】フォロー1日目](https://qiita.com/bolte/items/254f35729e83b1669432)
- [Vagrantを利用してMikanOSをビルドする](https://qiita.com/mikecat_mixc/items/5feacac02658a4516e74)
- [QEMU/KVM ホスト・ゲスト間の文字コピペ設定](http://bluearth.cocolog-nifty.com/blog/2017/09/qemukvm-8734.html)