はじめに (対象読者・この記事でわかること)

この記事は、Linuxに興味がある開発者、組み込みシステム開発者、そしてOSの内部構造に好奇心がある方を対象としています。特に、既存のディストリビューションでは満足できず、自分だけのカスタマイズ可能なOSを手作りしてみたいという方に最適です。

この記事を読むことで、Linuxディストリビューションの基本的な構造を理解し、Linuxカーネルのビルド方法から最小限のユーザーランド構築までの一連のプロセスを習得できます。また、自作OSのメリットや開発上の注意点についても学べるでしょう。OS開発という挑戦的なプロジェクトに興味がある方にとって、実践的なガイドとなるはずです。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - Linuxの基本的なコマンド操作 - C言語の基本的な知識 - コンパイルとビルドの基本的な理解 - Gitの基本的な使用方法

LinuxベースOSの基本構造と自作の意義

Linuxディストリビューションは、基本的に3つの主要な要素で構成されています。1つ目がLinuxカーネルで、ハードウェアとソフトウェア間の仲介役を担います。2つ目がユーザーランドと呼ばれる基本ツール群で、シェル、コマンド、ライブラリなどが含まれます。3つ目がパッケージ管理システムで、ソフトウェアのインストールや管理を効率化します。

自作OSの最大のメリットは、必要な機能だけを含む軽量なシステムを構築できる点です。組み込みシステム開発では、リソースが限られるため、不要なサービスやライブラリを排除することが重要です。また、セキュリティ面でも、最小限のコンポーネントのみを使用することで攻撃 surface を減らすことが可能です。

さらに、自作OSを通じてLinuxの内部構造を深く理解することで、トラブルシューティング能力が向上します。システムの問題が発生した際に、原因を特定し迅速に対処できるようになります。

具体的な構築手順

ステップ1:開発環境の準備

まず、自作OS開発に必要なツールをインストールします。以下のコマンドを実行して、必要なパッケージをインストールします。

Bash
sudo apt update sudo apt install build-essential bison flex libncurses5-dev libssl-dev libelf-dev

次に、作業用のディレクトリを作成し、そこに移動します。

Bash
mkdir ~/linux-os-build cd ~/linux-os-build

ステップ2:Linuxカーネルのダウンロードとコンフィギュレーション

Linuxカーネルのソースコードを公式リポジトリからダウンロードします。ここでは、安定版である5.15系を例に説明します。

Bash
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.74.tar.xz tar -xvf linux-5.15.74.tar.xz cd linux-5.15.74

カーネルコンフィギュレーションを行います。まず、デフォルトの設定をコピーします。

Bash
cp /boot/config-$(uname -r) .config

次に、カーネルコンフィギュレーションメニューを開きます。

Bash
make menuconfig

ここでは、組み込みシステム向けに不要なドライバや機能を無効化します。特に、以下の設定を変更します。

  1. General setup → Local version prefix - 自分のOSを識別するためのプレフィックスを設定
  2. Processor type and features → 使用的なプロセッサに合わせて設定
  3. Device Drivers → 不要なデバイスドライバを無効化
  4. File systems → 必要なファイルシステムのみ有効化

設定が完了したら、保存して終了します。

ステップ3:カーネルのビルド

カーネルをビルドします。このプロセスには時間がかかるため、並列ビルドを有効にします。

Bash
make -j$(nproc)

ビルドが完了したら、モジュールをインストールします。

Bash
sudo make modules_install sudo make install

ステップ4:最小限のユーザーランドの構築

次に、最小限のユーザーランドを構築します。ここでは、BusyBoxを使用します。

Bash
cd ~/linux-os-build wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2 tar -xvf busybox-1.35.0.tar.bz2 cd busybox-1.35.0 make menuconfig

BusyBoxの設定では、以下の点に注意します。

  1. Settings → Build Options → Cross compiler prefix - ターゲットシステム用のクロスコンパイラを指定
  2. Settings → Installation Options → "Don't use /usr" にチェック
  3. BusyBox Settings → すべてのアプリケーションを有効化

設定が完了したら、ビルドとインストールを行います。

Bash
make -j$(nproc) make install

これにより、_install ディレクトリに最小限のユーザーランドが作成されます。

ステップ5:ブートローダーの設定

ブートローダーとしてGRUBを使用します。まず、GRUBをインストールします。

Bash
sudo apt install grub2

次に、ブート設定ファイルを作成します。

Bash
sudo nano /etc/grub.d/40_custom

以下の内容を記述します。

menuentry "My Custom Linux" {
    set root=(hd0,0)
    linux /boot/vmlinuz-5.15.74 root=/dev/sda1
    initrd /boot/initrd.img-5.15.74
}

GRUBを更新します。

Bash
sudo update-grub

ステップ6:ディスクイメージの作成

最後に、ディスクイメージを作成します。まず、ルートファイルシステムを作成します。

Bash
cd ~/linux-os-build mkdir rootfs cd rootfs cp -r ../busybox-1.35.0/_install/* . mkdir -p {proc,sys,dev,etc,home,tmp}

必要なデバイスファイルを作成します。

Bash
sudo mknod -m 600 dev/console c 5 1 sudo mknod -m 600 dev/null c 1 3 sudo mknod -m 600 dev/tty c 5 0

initスクリプトを作成します。

Bash
cat > init << EOF #!/bin/sh mount -t proc proc /proc mount -t sysfs sysfs /sys exec /bin/sh EOF chmod +x init

ディスクイメージを作成します。

Bash
cd .. dd if=/dev/zero of=disk.img bs=1M count=64 mkfs.ext4 disk.img sudo mount disk.img /mnt sudo cp -a rootfs/* /mnt/ sudo umount /mnt

ハマった点やエラー解決

問題1:カーネルビルド時にエラーが発生する

error: redefinition of 'struct foo'

解決策: これは、カーネル内で同じ名前の構造体が定義されている場合に発生します。menuconfigで競合するドライバを無効にするか、カーネルのバージョンを変更することで解決できます。

問題2:BusyBoxのビルドでクロスコンパイルが失敗する

cross-compile: command not found

解決策: クロスコンパイラが正しくインストールされていない可能性があります。ターゲットアーキテクチャ用のクロスコンパイラをインストールします。例えば、ARM向けの場合:

Bash
sudo apt install gcc-arm-linux-gnueabihf

そして、BusyBoxの設定で正しいクロスコンパイラパスを指定します。

問題3:ブート時にファイルシステムがマウントできない

VFS: Cannot open root device "sda1" or unknown-block(0,0)

解決策: カーネルパラメータで指定するデバイス名が実際の環境と一致しない可能性があります。initrdを正しく作成し、ブート設定で正しいデバイス名を指定してください。

まとめ

本記事では、LinuxベースOSの自作手順について詳しく解説しました。

  • Linuxカーネルのビルド方法
  • BusyBoxを使用した最小ユーザーランドの構築
  • ブートローダーの設定とディスクイメージの作成
  • 開発中に遭遇する一般的な問題とその解決策

この記事を通して、独自のLinuxディストリビューションを構築するための基本的な知識と手順を習得できたはずです。自作OSは、Linuxの内部構造を深く理解する絶好の機会です。また、組み込みシステム開発においては、リソース効率の良いシステムを構築する上で重要なスキルとなります。

今後は、カーネルのカスタマイズや追加機能の実装など、さらに高度な内容についても記事にする予定です。ぜひ、この知識を基に、自分だけのカスタマイズ可能なOSを開発してみてください。

参考資料

参考にした記事、ドキュメント、書籍などがあれば、必ず記載しましょう。