1 of 19

MikanOSのビルドを自動化してみた

by だいみょーじん

2 of 19

目次

  • 自己紹介
  • 告知
  • 今日のテーマ
  • MikanOSのビルド手順を復習
  • ブートローダのビルドをシェルスクリプト化
  • MikanOS本体のビルドをシェルスクリプト化
  • ビルドのための環境構築部分も自動化したい
  • Dockerを使おう!
  • QEMUでMikanOSを実行
  • makeでビルドできるようにする
  • GitHub Actionsによるビルド
  • まとめ

2

3 of 19

自己紹介

  • だいみょーじん
  • 自動車業界のエンジニア
  • HeliOSというRust製のOSを開発中
  • 好きな言語:Rust,Haskell

3

4 of 19

告知!

  • 昨日のOSC大阪でナカタニさんがosdev-jpとして自作OSの展示を行っていただきました!ナカタニさんお疲れ様です!
  • それに引き続き,OSC 2025 Tokyo/Springでは私だいみょーじんがosdev-jpとして出展します!
    • 2025年2月21日(金)~2025年2月22日(土)
    • 駒澤大学 駒沢キャンパス

4

昨日のOSC大阪の様子

5 of 19

今日のテーマ

  • OSCに展示する予定のOSのひとつに,みかん本でおなじみのMikanOSがある
  • みかん本に書いてある手順でMikanOSをビルドしてみて,少々面倒に感じた
  • MikanOSのビルドを自動化してみた!

5

6 of 19

MikanOSのビルド手順を復習

  • mikanos-build をosbookとしてクローン
  • ansibleで必要なツールをインストール
  • mikanosをクローン
  • EDKIIのディレクトリにMikanOSブートローダーのディレクトリをリンク
  • edksetup.shを読み込むことでEDKIIのビルドに必要な環境変数を設定
  • 自動生成されたConf/target.txtを編集
  • ブートローダをビルド
  • osbook/devenv/buildenv.shを読み込むことでMikanOSのビルドに必要な環境変数を設定
  • MikanOSをビルド
  • MikanOSのイメージファイルdisk.imgが完成

この一連の手順を自動化する

6

7 of 19

ブートローダのビルドをシェルスクリプト化(build_boot_loader.sh)

  • mikanos-build をosbookとしてクローン
  • ansibleで必要なツールをインストール
  • mikanosをクローン
  • EDKIIのディレクトリにMikanOSブートローダーのディレクトリをリンク
  • edksetup.shを読み込むことでEDKIIのビルドに必要な環境変数を設定
  • 自動生成されたConf/target.txtを編集
  • ブートローダをビルド
  • osbook/devenv/buildenv.shを読み込むことでMikanOSのビルドに必要な環境変数を設定
  • MikanOSをビルド
  • MikanOSのイメージファイルdisk.imgが完成

7

#!/bin/bash

source edksetup.sh

cd Conf

sed -i "s/^ACTIVE_PLATFORM[\t ]*=[\t ]*.*$/ACTIVE_PLATFORM = MikanLoaderPkg\/MikanLoaderPkg.dsc/" target.txt

sed -i "s/^TARGET[\t ]*=[\t ]*.*$/TARGET = DEBUG/" target.txt

sed -i "s/^TARGET_ARCH[\t ]*=[\t ]*.*$/TARGET_ARCH = X64/" target.txt

sed -i "s/^TOOL_CHAIN_TAG[\t ]*=[\t ]*.*$/TOOL_CHAIN_TAG = CLANG38/" target.txt

build

8 of 19

MikanOS本体のビルドをシェルスクリプト化(build_mikanos.sh)

  • mikanos-build をosbookとしてクローン
  • ansibleで必要なツールをインストール
  • mikanosをクローン
  • EDKIIのディレクトリにMikanOSブートローダーのディレクトリをリンク
  • edksetup.shを読み込むことでEDKIIのビルドに必要な環境変数を設定
  • 自動生成されたConf/target.txtを編集
  • ブートローダをビルド
  • osbook/devenv/buildenv.shを読み込むことでMikanOSのビルドに必要な環境変数を設定
  • MikanOSをビルド
  • MikanOSのイメージファイルdisk.imgが完成

8

#!/bin/bash

source ../osbook/devenv/buildenv.sh

./build.sh

9 of 19

ビルドのための環境構築部分も自動化したい

  • mikanos-build をosbookとしてクローン
  • ansibleで必要なツールをインストール ←ここら辺も自動化したいなあ
  • mikanosをクローン
  • EDKIIのディレクトリにMikanOSブートローダーのディレクトリをリンク
  • edksetup.shを読み込むことでEDKIIのビルドに必要な環境変数を設定
  • 自動生成されたConf/target.txtを編集
  • ブートローダをビルド
  • osbook/devenv/buildenv.shを読み込むことでMikanOSのビルドに必要な環境変数を設定
  • MikanOSをビルド
  • MikanOSのイメージファイルdisk.imgが完成

9

10 of 19

Dockerを使おう!

  • Dockerfileに環境構築の手順を記述
    • とりあえず必要なツールをインストール

10

FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt update

RUN apt upgrade -y

RUN apt install -y ansible

RUN apt install -y dosfstools

RUN apt install -y git

11 of 19

Dockerを使おう!

  • Dockerfileに環境構築の手順を記述
    • MikanOSをビルドする準備を整える

11

WORKDIR /root

RUN git clone https://github.com/uchan-nos/mikanos-build.git osbook

WORKDIR /root/osbook

RUN git checkout 8d4882122ec548ef680b6b5a2ae841a0fd4d07a1

COPY osbook.patch /root/osbook.patch

RUN git apply ../osbook.patch

WORKDIR /root/osbook/devenv

RUN ansible-playbook -i ansible_inventory ansible_provision.yml

WORKDIR /root

RUN git clone https://github.com/uchan-nos/mikanos.git

WORKDIR /root/mikanos

RUN git checkout b5f7740c04002e67a95af16a5c6e073b664bf3f5

WORKDIR /root/edk2

RUN ln -s /root/mikanos/MikanLoaderPkg .

COPY build_boot_loader.sh /root/edk2/build_boot_loader.sh

COPY build_mikanos.sh /root/mikanos/build_mikanos.sh

WORKDIR /root

12 of 19

Dockerを使おう!

  • Dockerを使ったMikanOSのビルド手順
    • Dockerfileに従ってMikanOSをビルドするための環境を構築
    • Dockerコンテナ上でbuild_boot_loader.shを実行してブートローダをビルド
    • Dockerコンテナ上でbuild_mikanos.shを実行してMikanOS本体をビルド
    • DockerコンテナからビルドされたMikanOSのイメージファイルdisk.imgを取り出す

12

13 of 19

Dockerを使おう!

  • Dockerを使ったMikanOSのビルド手順

13

#!/bin/bash

image=$1

container=$2

vnc_port=$3

target=$4

# Build a docker image.

if [ -z "$(docker images --format {{.Repository}} | grep -x $image)" ]; then

docker build --build-arg vnc_port=$vnc_port --no-cache -t $image .

fi

# Create a docker conatiner.

if [ -z "$(docker ps -a --format {{.N ames}} | grep -x $container)" ]; then

docker create -i -t -p $vnc_port:$vnc_port --privileged --name $container $image /bin/bash

docker start $container

docker exec --workdir /root/edk2 $container ./build_boot_loader.sh

docker exec --workdir /root/mikanos $container ./build_mikanos.sh

docker stop $container

fi

# Download MikanOS image file.

docker cp $container:/root/mikanos/$4 $4

14 of 19

QEMUでMikanOSを実行

  • Docker上でQEMUを動かし,ホスト上のVNC viewerを介して人間とやり取りするようにすればできそう

14

15 of 19

QEMUでMikanOSを実行

  • mikanos-build/devenv/run_image.shのQEMU実行コマンドに,VNCのオプション”-vnc :0”を追加するパッチを当てる
    • QEMUは5900番ポートでVNC接続を待機するようになる

  • さらに,DockerfileのEXPOSEコマンドにより,Dockerコンテナの5900番ポートに穴をあける
    • Dockerコンテナ上で動くQEMUとホスト上で動くVNC viewerが通信できるようになる

15

16 of 19

QEMUでMikanOSを実行

  • 最後に,MakefileにDockerコンテナ上のQEMU上のMikanOSを起動するコマンドを書いておく

  • “make run”してQEMUが立ち上がったのを確認し,VNC viewerでlocalhost:5900にアクセスするとMikanOSを操作できる

16

.PHONY: run

run:

docker start $(CONTAINER)

docker exec --workdir /root/mikanos $(CONTAINER) ./build.sh run

17 of 19

makeでビルドできるようにする

  • Makefileを置いたので,ついでに”make”でビルドできるようにする

  • 1コマンドでMikanOSをビルドできるように

17

$(MOUNT): $(TARGET)

mkdir $@

sudo mount -o loop $^ $@

$(TARGET):

./build.sh $(IMAGE) $(CONTAINER) $(VNC_PORT) $(TARGET)

18 of 19

GitHub Actionsによるビルド

  • .github/workflow/build.ymlにビルドの手順を記述し,GitHubからビルド済みのMikanOSをダウンロードできるように

18

name: build

on:

push:

branches:

- main

jobs:

build:

name: build

runs-on: ubuntu-latest

steps:

- name: Checkout the repository

uses: actions/checkout@main

- name: Build MikanOS

run: make

- name: Upload MikanOS

uses: actions/upload-artifact@main

with:

name: MikanOS

path: disk

19 of 19

まとめ

  • MikanOSのビルドを自動化した
  • Dockerを使うことで,1コマンドで環境構築からビルドまでできるようになった
  • VNC通信によりDocker上のQEMU上のMikanOSを操作できるようにした
  • GitHub Actionsを使うことで,GitHubからビルド済みのMikanOSをダウンロードできるようにした

  • 今回の制作物

19

ご清聴ありがとうございました!