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


この記事は何?

自分用のメモとしてM1 Mac miniのUTM上で「ゼロからのOS自作入門」の環境を構築する手順を残します。

動作環境

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

事前準備

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

Ubuntu 20.04のReleaseページにアクセスします。

Server版のISOファイル「ubuntu-20.04.3-live-server-amd64.iso」をダウンロードします。

UTMで Ubuntu 20.04 をインストール

QEMUのコマンドをゴニョゴニョしたくなかったので今回はUTMを利用することにしました。

まず、UTMを起動します。

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

このような初期画面が表示されます。

InformationタブのName欄に「Ubuntu 20.04 amd64」と入力し、Styleから「Operating System」を選択します。

Systemタブに移動します。

Architectureで「x86_64」が選択されていれば特に変更は不要です。
Memoryについては環境によって設定可能な値が変わってくると思いますが、今回は8192MB(8GB)で設定してみます。

Deviceタブに移動します。

「New Device」ボタンをクリックし、Interfaceで「VirtIO」が選択された状態でSizeに任意の値を入力します。今回は30GBで設定してみます。

「Create」ボタンをクリックします。

もう一度「New Device」ボタンをクリックします。「Removable」にチェックし、Interfaceから「USB」を選択します。

「Create」ボタンをクリックします。

Displayタブに移動します。

「Emulated Display Card」の選択肢からホストPCの対応状況に応じて選択します。今回は「virtio-vga」を選択します。

「Save」ボタンをクリックすると、仮想マシンの枠ができあがります。

「CD/DVD」の欄をクリックすると「Browse」と表示されるのでこれをクリックします。

事前にダウンロードしておいたISOファイルを選択します。

再生アイコン(起動ボタン)をクリックすると仮想マシンが起動します。

Ubuntuのインストール画面が表示されるので「Install Ubuntu Server」を選択します。

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

インストールが完了するまでしばらく待ちます。

インストールが完了すると再起動を求められます。

CD/DVDでISOファイルを選択した状態だと再起動時にこのようにエラーが出まくります。

なので、一旦仮想マシンを停止します。

CD/DVDの「Clear」を選択して再度仮想マシンを起動します。

Ubuntuが起動します。

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

$ sudo apt -y install spice-vdagent

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

$ sudo apt -y install ubuntu-desktop

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

$ sudo reboot

再起動後はGUIのログイン画面が表示されます。

ログインするとデスクトップ環境が表示されます。

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

ここからはmikanos-buildのリポジトリのREADMEに従って、環境構築を進めていきます。

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

このような画面が表示されたら起動成功です。

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

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

参考URL