📌

自作OSへの道 再現可能な UmuOS ver0.1.1 完成版 ― OSの仕組みを理解するためのベースOSとして ―

に公開

はじめに

お疲れ様です。
研究用OSとして開発していた 再現可能な UmuOS ver0.1.1 が、実装まで含めて完成しましたので記事にまとめます。
また、研究用OSなので、いろいろLinuxカーネルカスタムやユーザーランドの作成等行い、万一どうにもならなくなった際
初期化できるよう、install.shも作成しています。
下記リポジトリを丸っと git clone していただければ repro/0.1.1 配下にスクリプトを準備しています。

本プロジェクトは汎用OSを目指すものではなく、
OSの起動メカニズムを理解・観測・再現するための研究用OS です。
その意味で、今回の実装成功は大きな研究成果だったと考えています。

なお、UmuOS ver0.1.1 のユーザーランドは BusyBox を用いた最小構成で構築しています。
そのため、一般的な Linux 環境と比較すると、

  • 期待したコマンドが存在しない
  • 同名コマンドでも挙動が異なる
  • なぜか動かない、あるいは制限のある機能が存在する

といった BusyBox 依存による差異 が発生します。

これらは不具合や欠陥というよりも、
「なぜ使えないのか」「どこまでが BusyBox の仕様なのか」
を調べ、修正・拡張していくこと自体が 研究対象 であると位置づけています。

もしバグや不足機能を見つけた場合も、
その修正過程や原因調査を含めて、
UmuOS における研究の一部として扱っています。

本記事で扱っている UmuOS ver0.1.1 のソースコードおよび各種ドキュメントは、 以下の GitHub リポジトリにまとめています。


研究開発環境

開発端末

  • MiniPC(MEM 32GB)
  • CPU: 12th Gen Intel(R) Core(TM) i9-12900HK (2.50GHz)
  • OS: Windows 11 Pro 25H2
  • エディタ: Visual Studio Code 1.107.1

開発環境

  • Windows 環境から 自宅サーバー(RockyLinux9.7)上の Ubuntu 24.04 LTS に SSH 接続して開発
  • ビルド、ISO 作成、ディスク操作は Ubuntu 側で実施

実行環境

  • 自宅サーバー: 富士通 PRIMERGY(Xeon / MEM 32GB)
  • OS: RockyLinux9.7
  • 仮想化基盤: QEMU-KVM
  • 管理: 仮想マシンマネージャー (GUI)

UmuOS ver0.1.0 では CentOS Stream 9 の仮想マシンマネージャを前提としていましたが、
ver0.1.1 からは Ubuntu 24.04 LTS 上の QEMU 環境で、シリアル(ttyS0)起動を前提 としています。


UmuOS ver0.1.1 ― 再現可能な最小Linuxブート環境

概要

UmuOS ver0.1.1 は、

「動いたら成功」ではなく
「理解・観測・再現ができて成功」

をゴールにした、最小構成の Linux ブート環境です。

本バージョンは いつでも戻れるベース版 として考えており、
QEMU 上で以下の一連の流れが 再現可能 であることを受入条件としています。


受入条件

以下がすべて成立していること。

  • UEFI → GRUB → Linux kernel → initramfs → ext4 ルートへ switch_root
  • 最終的な / は 永続 ext4(disk.img)
  • 再起動後もファイルが保持される(永続性)
  • ttyS0(シリアル)で root / 一般ユーザー がパスワードログイン可能
  • パスワード暗号化は、SHA-512(6)で /etc/shadow 仕様

手を出さなかったこと(ver0.1.1 ではやらない)

  • ネットワーク常用(NAT / ブリッジ / telnet)
  • GUI / VGA 前提の受入
  • KVM 依存(QEMU accel=tcg 固定)

前回は機能を詰め込みすぎた結果、
修正を重ねるうちに全体像が把握できなくなり破綻しました。
その反省から、ベースとなる最小構成を確定させること を優先しています。


UmuOS ver0.1.1 の仕様

UmuOS ver0.1.1 は、Linux のブート過程を理解・観測・再現することを目的とした
最小構成の OS 環境です。

本バージョンでは「動作したかどうか」ではなく、
「なぜ動作したかを説明できるか」 を成功条件としています。

起動は UEFI 環境下で行い、GRUB を介して Linux カーネルを起動します。
カーネル起動後は initramfs に配置した自作の /init が最初に実行され、
この段階では 永続領域への書き込みを一切行いません。

initramfs の責務は明確に限定しています。

  • カーネルコマンドラインから root=UUID=... を取得
  • /dev 配下のブロックデバイスを自前で走査
  • ext4 superblock を直接読み取り UUID を比較
  • 一致したデバイスを /newroot にマウント
  • switch_root により最終ルートへ移行

この設計では udev や /dev/disk/by-uuid に依存しません。
initramfs 環境で利用可能な最小限の機能のみを用い、
どのデバイスが、なぜ選ばれたのかを必ずログとして観測 できるようにしています。

最終的なルートファイルシステムは ext4 で構成された永続ディスクであり、
BusyBox を用いた最小構成のユーザーランドを提供します。

  • /sbin/init
  • /etc/inittab
  • /etc/init.d/rcS

を最低限の構成として持ち、
シリアルコンソール(ttyS0)上でのログインを受け付けます。

BusyBox の applet は 必ず chroot 環境下で生成 しています。
これにより、シンボリックリンクがホスト環境のパスを指してしまう問題を回避し、
起動後に login が失敗する典型的なトラブルを防いでいます。


UmuOS ver0.1.1 の想定する使われ方

UmuOS ver0.1.1 は、日常利用や実用サービスを目的とした OS ではありません。
本バージョンは、Linux のブート過程と初期化処理を
自分の手で理解し、再現し、検証するための実験基盤 としての利用を想定しています。

UEFI から始まり、GRUB、Linux カーネル、initramfs、ext4 ルートへ至る流れを、
ブラックボックスとして使うのではなく、
どこで何が起きているかを説明できる状態 にすることを目的としています。

initramfs と最終ルートファイルシステムの責務を明確に分離しているため、

  • initramfs の変更で何が壊れるのか
  • switch_root の失敗がどこで起きているのか
  • login が出ない原因はどこにあるのか

を段階的に切り分けて検証できます。

本バージョンは 「戻れる基準点」 としての利用を想定しています。
新しい実験や拡張を行う際には、必ず ver0.1.1 に戻ることで、
問題の原因を明確にできます。

また、UmuOS ver0.1.1 は、次のような発展的な実験を行うための
安全な土台 としての利用も想定しています。

  • BusyBox に依存したユーザーランドから、
    自作コマンドや自作ユーティリティへの段階的な移行
  • ネットワーク機能(NIC 初期化、IP 設定、簡易通信)の追加と検証
  • Linux カーネルの挙動をより深く理解するための、
    カーネル設定変更や起動オプションの検証

これらの実験を行う際にも、
「どこまでが ver0.1.1 で保証されているか」が明確であるため、
変更による影響範囲を限定しながら、安全に検証を進めることができます。

UmuOS ver0.1.1 は完成形ではなく、
理解を積み上げていくための、確定した出発点 として使われることを想定しています。


豊富なドキュメント(失敗例含む)


おわりに

UmuOS ver0.1.1 は完成形ではありません。
理解を積み上げるための、確定した出発点 として使われることを想定しています。
様々な実験、ユーザーランドの実装等、やることはたくさんありますね!

OS の起動メカニズムを自分の手で理解したい方の参考になれば幸いです。

Discussion