

##### 質問内容

ラズベリーパイで動作するlinux ベースのOSを作成したいのですがその為に行う手順が知りたいです。  
色々調べたのですが以下のことがわかりません。OSといってもCUIの原始的なのを作りたくて画面にHello
Worldなどの文字を表示させてみたいです。取りえずどうやって実装して実行するのでしょうか？

##### 知りたい事

linuxカーネルを使ってOSを作成して画面にHello World
するまでの手順が知りたいのですがlinuxカーネルを用意することまでわかったのですがそこからどうやって動作するコードを書いてビルドするのでしょうか？

##### 調べたこと

１，linux カーネルをはコンフィグレーションを行いビルドしてブートする際実行される。  
２，OSが起動するまでの手順

##### 参考サイト

linuxカーネルをビルド(質問): [make [source directory cannot contain spaces or colons.]
の対処方法が知りたい](https://ja.stackoverflow.com/questions/92781/make-source-
directory-cannot-contain-spaces-or-
colons-%e3%81%ae%e5%af%be%e5%87%a6%e6%96%b9%e6%b3%95%e3%81%8c%e7%9f%a5%e3%82%8a%e3%81%9f%e3%81%84?noredirect=1#comment105832_92781)  
A: <https://kozos.jp/kozos/>  
B: <http://yuma.ohgami.jp/x86_64-Jisaku-OS/>  
起動の仕組み: <https://www.pmi-sfbac.org/linux-kernel/>  
linux: <https://ja.wikipedia.org/wiki/Linux>  
linux カーネル:
<https://ja.wikipedia.org/wiki/Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB>  
linux カーネルダウンロード: <https://www.kernel.org/>  
PC起動: <https://behind-memoirs.hatenablog.com/entry/2017/11/14/021856>


CC BY-SA 4.0
2022-12-14T12:28:37.967
92788
2022-12-16T10:28:27.603
55177
question
linux
linux ベースのOSを作成する手順が知りたい。


* * *

### 「Linux系 OSを作成」について

CUIの原始的なものでも, OSを用意するのはそんなに簡単ではありません  
他の質問に回答した [Linux From Scratch](https://www.linuxfromscratch.org/) が, Linux系
OSを作る際に参考になるでしょう

Raspberry Pi は規模も小さくハードも限定されるので OSは比較的コンパクトにできるかもしれない  
けれど OSを構築する際の前提知識は それほど変わりません。どちらにしてもある程度の知識と技術は必要です。  
LFSブックを実践することで学べる手順や実績は, Raspberry Piへの応用のためのいわば基礎知識です

(ちなみに, できあがる Linux系 OSは **CUIの原始的なもの** であり, GUI版の LFSはこれとは別にあります)  
[LFSブック日本語版 (lfsbookja): Version 11.2](http://lfsbookja.osdn.jp/11.2-ja/) より  
ii. 対象読者

> 「既にある Linux をダウンロードしてインストールすれば良いのに、どうして苦労してまで手作業で Linux を構築しようとするのか。」  
>  本プロジェクトを提供する最大の理由は Linux システムがどのようにして動作しているのか、これを学ぶためのお手伝いをすることです。 LFS
> システムを構築してみれば、さまざまなものが連携し依存しながら動作している様子を知ることができます。 そうした経験をした人であれば Linux
> システムを自分の望む形に作りかえる手法も身につけることができます。  
>  LFS の重要な利点として、他の Linux システムに依存することなく、システムをより適切に制御できる点が挙げられます。 LFS
> システムではあなたが運転台に立って、システムのあらゆる側面への指示を下していきます。  
>  さらに非常にコンパクトな Linux システムを作る方法も身につけられます。・・・

iv. 必要な知識

> LFS システムの構築作業は決して単純なものではありません。 ある程度の Unix システム管理の知識が必要です。
> 問題を解決したり、説明されているコマンドを正しく実行することが求められます。
> ファイルやディレクトリのコピー、それらの表示確認、カレントディレクトリの変更、といったことは最低でも知っていなければなりません。 さらに Linux
> の各種ソフトウェアを使ったりインストールしたりする知識も必要です。

vi. 各パッケージを用いる理由

> 既に説明しているように LFS が目指すのは、完成した形での実用可能な基盤システムを構築することです。 LFS
> に含まれるパッケージ群は、パッケージの個々を構築していくために必要となるものばかりです。 そこからは最小限の基盤となるシステムを作り出します。
> そしてユーザーの望みに応じて、より完璧なシステムへと拡張していくものとなります。 LFS は極小システムを意味するわけではありません。
> 厳密には必要のないパッケージであっても、重要なものとして含んでいるものもあります。
> 以下に示す一覧は、本書内の各パッケージの採用根拠について説明するものです。

### カーネル + HelloWorld について

起動し表示するだけで, **OSとしての機能はありません**

  * [https://ja.wikipedia.org/wiki/カーネル](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB)
  * [https://ja.wikipedia.org/wiki/オペレーティングシステム](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)

カーネルは カーネルコンフィギュレーションによって組み込まれた機能により以下を行なうけれど, OSそのものとは異なる

  * 起動時には各種リソースの初期化を行なう (例えば メモリー, PCIe, GPU など)
  * 初期化後には, OSやアプリから呼び出される機能の集合体として存在する

#### 作成手順

まず最初に 知識として, PCのブートプロセスは 大まかに次のような流れで進みます

  * PowerON ⇛ BIOS ⇛ GRUB(ブートローダー) ⇛ Linuxカーネル ⇛ [initramfs / initrd](https://ja.wikipedia.org/wiki/Initrd) ⇛ Linux OS
  * (BIOSでなく UEFIの場合は別の経路で GRUBをロードし実行)

上記の過程の initramfs を置き換え, "Hello World"を表示します

  * 既存の Linux OSのカーネルを取り出す (ここでは Ubuntuを使用)
  * initramfsを作成
  * 上記 2つを GRUBに指定し起動する (今回は無視, qemuにて動作確認)

Ubuntuでは `/boot/` 以下にカーネルと `initrd.img` が含まれている  
(Ubuntu以外のディストリビューションでは `/boot`ではないかもしれない)

[code]

    $ ls -ltr /boot/{vm*,init*}
    -rw------- 1 root root 11548672 11月 24 22:15 /boot/vmlinuz-5.15.0-57-generic
    lrwxrwxrwx 1 root root       25 11月 30 20:58 /boot/vmlinuz -> vmlinuz-5.15.0-57-generic
    lrwxrwxrwx 1 root root       28 11月 30 20:58 /boot/initrd.img -> initrd.img-5.15.0-57-generic
    -rw-r--r-- 1 root root 63433212 12月 14 12:38 /boot/initrd.img-5.15.0-57-generic
    
[/code]

また, Ubuntuでは次のコマンドが用意されているので, 既存の `initrd.img` の内容を確認してみるなどよいかもしれません

  * `lsinitramfs` (一覧), `unmkinitramfs` (展開), `mkinitramfs` (作成)

initramfs (`initrd.img.gz`) の作成

[code]

    #include <stdio.h>
    #include <time.h>
    
    int main(void) {
        printf("------------\n");
        printf("Hello, world\n");
        sleep(60);
    }
    
[/code]

作業ディレクトリを用意し, そこでコンパイルします。  
initramfs 実行時点ではダイナミックリンクは未だ使用できないはずなので, staticリンクで  
(本来の Ubuntuの `mkinitramfs` では余分な処理が付加されるようなので) オーソドックスな方法で作成します  
ちなみに [init](https://ja.wikipedia.org/wiki/Init) とは一般的に UNIX系 OSの最初のプロセスです

[code]

    $ cd tmp
    $ gcc -o init -static hello.c
    $ find . | cpio -o -H newc | gzip > ../initrd.img.gz
    
[/code]

動作確認

[code]

    $ qemu-system-x86_64 -m 2G -enable-kvm -kernel vmlinuz -initrd initrd.img.gz
    
[/code]

[![カーネル +
HelloWorld](https://i.stack.imgur.com/JRVFB.png)](https://i.stack.imgur.com/JRVFB.png)

### Raspberry Pi との違い

CPUアーキテクチャーも異なりますが, ブートローダー辺りも異なります

  * PCの BIOS に相当する機能 ブートローダーは Pi4 とそれ以外とで異なる

    * Bootloader documentation [rpi-eeprom](https://github.com/raspberrypi/rpi-eeprom)
    * Raspberry Pi (all versions) bootloader and GPU firmware [firmware](https://github.com/raspberrypi/firmware)
  * GRUBに相当するブートローダーとして [U-Boot](https://ja.wikipedia.org/wiki/Das_U-Boot) があるが, 使わなくても大丈夫なはず


CC BY-SA 4.0
2022-12-16T10:28:27.603
92820
2022-12-16T10:28:27.603
43025
92788
answer