Easyboot でカーネルを起動する
==========================

[Easyboot](https://gitlab.com/bztsrc/easyboot) は、さまざまな OS カーネルと Multiboot2 準拠カーネルをさまざまな形式でロードできるオールインワンのブート マネージャーおよび起動可能なディスク イメージ作成ツールです。

[[_TOC_]]

インストール
----------

```
 easyboot [-v|-vv] [-s <mb>] [-b <mb>] [-u <guid>] [-p <t> <u> <i>] [-e] [-c] <indir> <outfile|device>

  -v, -vv         冗長性/検証性を高める
  -s <mb>         ディスクイメージのサイズをメガバイト単位で設定します (デフォルトは 35M)
  -b <mb>         ブートパーティションのサイズをメガバイト単位で設定します (デフォルトは 33M)。
  -u <guid>       ブート パーティションの一意の識別子を設定します (デフォルトはランダム)
  -p <t> <u> <i>  追加のパーティションを追加する (タイプ guid、一意の guid、イメージ ファイル)
  -e              El Torito Boot Catalogを追加 (BIOS / EFI CDROM ブートのサポート)
  -c              画像ファイルが存在する場合でも、常に新しい画像ファイルを作成します
  <indir>         このディレクトリの内容をブート パーティションに使用します
  <outfile>       出力イメージまたはデバイスファイル名
```

**Easyboot** ツールは、GUID パーティション テーブルを使用して、FAT32 としてフォーマットされ、「EFI システム パーティション」(略して ESP) と名付けられた単一のパーティションを持つ
`(outfile)` という名前の起動可能なディスク イメージを作成します。そのパーティションの内容は、指定した `(indir)` から取得されます。そのディレクトリに、`easyboot/menu.cfg`
という単純なプレーン テキスト構成ファイルを配置する必要があります。行末が NL または CRLF であれば、任意のテキスト エディターで簡単に編集できます。構成によっては、このディレクトリに
`easyboot/*.plg` という [プラグイン](plugins.md) も必要になる場合があります。

このイメージは Raspberry Pi でも起動でき、qemu でも動作します。ただし、実際のマシンで起動するには、`(indir)` ディレクトリにさらにファームウェア ファイル
`bootcode.bin`、`fixup.dat`、`start.elf`、および .dtb ファイルが必要になります。これらは、Raspberry Pi の [公式リポジトリ](https://github.com/raspberrypi/firmware/tree/master/boot)
からダウンロードできます。

このツールには、オプションのコマンドライン フラグもいくつかあります。`-s (mb)` は、生成されたディスク イメージの全体サイズをメガバイト単位で設定し、`-b (mb)`
はブート パーティションのサイズをメガバイト単位で設定します。当然、前者は後者よりも大きくなければなりません。指定しない場合は、
パーティション サイズは指定されたディレクトリのサイズ (最小の FAT32 である 33 MB) から計算され、ディスク サイズはデフォルトでそれより 2 MB 大きくなります
(パーティション テーブルに必要なアラインメントとスペースのため)。これら 2 つのサイズ値の間に 2 MB 以上の差がある場合は、`fdisk` などのサード パーティ ツールを使用して、
必要に応じてイメージにパーティションを追加できます (または、以下の `-p` を参照してください)。予測可能なレイアウトが必要な場合は、`-u <guid>` フラグを使用して、
ブート パーティションの一意の識別子 (UniquePartitionGUID) を指定することもできます。

オプションで、`-p` フラグを使用してパーティションを追加することもできます。これには、(PartitionTypeGUID)、(UniquePartitionGUID)、
およびパーティションの内容を含むイメージ ファイルの名前の 3 つの引数が必要です。このフラグは複数回繰り返すことができます。

`-e` フラグは、生成されたイメージに El Torito ブート カタログを追加するので、USB スティックとしてだけでなく、BIOS / EFI CDROM としても起動できるようになります。

`(outfile)` がデバイス ファイル (例: Linux では `/dev/sda`、BSD では `/dev/disk0`、Windows では `\\.\PhysicalDrive0`) の場合、GPT も ESP も作成されず、
デバイス上に既に存在するものを検索します。`(indir)` 内のすべてのファイルは引き続きブート パーティションにコピーされ、ローダーがインストールされます。
`(outfile)` が既に存在するイメージ ファイルの場合も、この方法は機能します (この場合、`-c` フラグを使用して、常に最初に新しい空のイメージ ファイルを作成します)。

構成
----

`easyboot/menu.cfg` ファイルには、次の行が含まれている場合があります (grub.cfg の構文と非常によく似ており、設定ファイルの例は [こちら](menu.cfg) にあります)。

### コメント

`#` で始まるすべての行はコメントと見なされ、行末までスキップされます。

### 冗長レベル

`verbose` で始まる行を使用して詳細レベルを設定できます。

```
verbose (0-3)
```

これは、ブート コンソールに出力する情報量をローダーに指示します。Verbose 0 は完全に静か (デフォルト) を意味し、
Verbose 3 はロードされたカーネル セグメントとエントリ ポイントのマシン コードをダンプします。

### フレームバッファ

`framebuffer` で始まる行で特定の画面解像度を要求できます。形式は次のとおりです。

```
framebuffer (幅) (高さ) (ピクセルあたりのビット数) [#(前景色)] [#(背景色)] [#(プログレスバーの色)]
```

**Easyboot** は、この行が存在しない場合でもフレームバッファを設定します (デフォルトでは 800 x 600 x 32bpp)。ただし、この行が存在する場合は、
指定された解像度を設定しようとします。パレット モードはサポートされていないため、ピクセルあたりのビット数は少なくとも 15 である必要があります。

4 番目のオプションの色パラメータが指定されている場合、ハッシュマークで始まり、その後に 6 桁の 16 進数 (赤赤緑緑青青) が続く HTML 表記にする必要があります。たとえば、
`#ff0000` は明るい赤で、`#007f7f` は暗いシアンです。これは前景色、つまりフォントの色を設定します。同様に、5 番目のオプションの色パラメータが指定されている場合も
HTML 表記にする必要があり、背景色を設定します。最後のオプションの色パラメータも同様で、プログレス バーの背景色を設定します。

色が指定されていない場合は、デフォルトで黒の背景に白の文字が表示され、進行状況バーの背景は濃い灰色になります。

### デフォルトの起動オプション

`default` で始まる行は、指定されたタイムアウト後にユーザーの操作なしで起動するメニュー エントリを設定します。

```
default (メニューエントリインデックス) (タイムアウトミリ秒)
```

メニューエントリ インデックスは 1 から 9 までの数字です。タイムアウトはミリ秒単位なので、1000 は 1 秒になります。

### メニューの配置

`menualign` で始まる行は、ブート オプションの表示方法を変更します。

```
menualign ("vertical"|"horizontal")
```

デフォルトではメニューは水平 (`horizontal`) ですが、垂直 (`vertical`) に変更できます。

### ブートオプション

`menuentry` で始まる行で最大 9 個のメニューエントリを指定できます。形式は次のとおりです。

```
menuentry (アイコン) [ラベル]
```

各アイコンについて、ブート パーティションに `easyboot/(アイコン).tga` ファイルが存在する必要があります。画像は、ラン レングス エンコードされ、カラー マップされた
[Targa 形式](../en/TGA.txt) である必要があります。これは、これが最も圧縮された形式であるためです (ファイルの最初の 3 バイトは、この順序で `0`、`1`、`9`
である必要があります。仕様のデータ型 9 を参照してください)。その寸法は、高さ 64 ピクセル、幅 64 ピクセルである必要があります。

GIMP からこの形式で保存するには、まず「Image > Mode > Indexed...」を選択し、ポップアップ ウィンドウで「Maximum number of colors」を 256 に設定します。次に「File > Export As...」を選択し、`.tga` で終わるファイル名を入力し、ポップアップ ウィンドウで「RLE compression」をチェックします。コマンド ライン変換ツールの場合は、ImageMagick の `convert (任意の画像ファイル) -colors 256 -compress RLE アイコン.tga` を使用できます。

オプションの ラベル パラメータは、メニューに ASCII のバージョンまたはリリース情報を表示するためのもので、任意の文字列用ではありません。したがって、
スペースを節約するために、`easyboot/font.sfn` も提供しない限り、UTF-8 はサポートされません。(UNICODE フォントは、[スケーラブル スクリーン フォント](https://gitlab.com/bztsrc/scalable-font2)
は非常に効率的ですが、それでも約 820K あり、多くのストレージを必要とします。対照的に、GRUB の unicode.pf2 ははるかに大きく、約 2392K ですが、
両方のフォントには 8x16 および 16x16 ビットマップに約 55600 個のグリフが含まれています。埋め込まれた ASCII フォントには、8x16 ビットマップと 96 個のグリフしかありません。)

`menuentry` 行の後に続くすべての行は、その行が別の menuentry 行である場合を除き、その menuentry に属します。便宜上、GRUB のようにブロックを使用できますが、
これは単なる構文上の糖衣です。中括弧は空白文字として処理されます。必要に応じて、Python スクリプトや Makefile のように中括弧を省略してタブを使用することもできます。

例えば
```
menuentry FreeBSD backup
{
    kernel bsd.old/boot
}
```

### パーティションを選択

`partition` で始まる行は GPT パーティションを選択します。`menuentry` 行が前になければなりません。

```
partition (パーティション固有のUUID)
```

このパーティションは、ブート オプションのルート ファイル システムとして使用されます。カーネルとモジュールはこのパーティションからロードされ、
ブート プロトコルに応じてカーネルにも渡されます。指定されたパーティションはブート ディスクとは別のディスクに存在する可能性があります。
**Easyboot** はブート中にすべての GPT パーティション ディスクを反復して、そのパーティションを見つけます。

便宜上、パーティションは `kernel` 行でも検索されます (下記参照)。指定されたブート コマンド ラインに `root=(UUID)` または `root=*=(UUID)` 文字列が含まれている場合、
別の `partition` 行は必要ありません。

パーティションが明示的に指定されていない場合は、カーネルとモジュールはブート パーティションからロードされます。

### カーネルを指定する

`kernel` で始まる行は、どのファイルをどのパラメータで起動するかを指定します。`menuentry` 行が前になければなりません。

```
kernel (カーネルファイルへのパス) (オプションのブートコマンドライン引数)
```

パスは、既存のファイル、実行可能なカーネル バイナリを指している必要があり、ルート (またはブート) パーティション上の絶対 UTF-8 パスである必要があります。
カーネルがパーティションのルート ディレクトリにない場合、ディレクトリ区切り文字は常に `/` です (UEFI システムの場合も同様)。名前にスペースが含まれている場合は、
`\` でエスケープする必要があります。パスの後に、スペースで区切られたコマンド ライン引数が続く場合があります。Multiboot2 準拠のカーネルの場合、
これらのコマンド ライン引数は *ブートコマンドライン* (タイプ 1) タグで渡されます。**Easyboot** によって変更されることはなく、パーティション指定子の検索以外は解析されません。

デフォルトでは、**Easyboot** は ELF64 および PE32+/COFF 形式の Multiboot2 準拠カーネルを起動できます (UEFI システムでは UEFI アプリケーションも同様)。
通常、このプロトコルは上位半分カーネルを許可しませんが、**Easyboot** は、上位半分カーネル以外の通常のカーネルを壊さない方法でプロトコルに少し違反します。
他のカーネルを起動する場合は、カーネル ローダー [プラグイン](plugins.md) が必要になります。

注: ブート プロトコルを選択するために「linux」や「multiboot」などの特別なコマンドを使用する必要がある GRUB とは異なり、ここではコマンドが 1 つだけあり、
プロトコルは実行時にカーネルから自動検出されます。

### さらにモジュールをロードする

`module` で始まる行を使用して、カーネルとともに任意のファイル (初期 RAM ディスク、カーネル ドライバーなど) をロードできます。`menuentry` 行が前になければなりません。
この行は各 menuentry 内で複数回繰り返すことができることに注意してください。ブート プロトコルが initrd をサポートしている場合、最初の `module` 行が initrd と見なされます。

```
module (ファイルへのパス) (オプションのモジュールコマンドライン引数)
```

パスは既存のファイルを指す必要があり、ルート (またはブート) パーティション上の絶対 UTF-8 パスである必要があります。スペースで区切られたコマンド ライン引数が続く場合があります。
ファイルが圧縮されており、解凍 [プラグイン](plugins.md) がある場合、モジュールは透過的に解凍されます。これらのロードされた (および解凍された) モジュールに関する情報は、
*モジュール* (タイプ 3) タグで Multiboot2 準拠カーネルに渡されます。

特別なケースは、モジュールがバイト `DSDT`、`GUDT`、または `0xD00DFEED` で始まる場合です。これらの場合、ファイルは *モジュール* タグに追加されず、ACPI
テーブルがパッチされ、その DSDT ポインタがこのファイルの内容を指すようになります。これにより、バグのある BIOS の ACPI テーブルをユーザー提供のテーブルに簡単に置き換えることができます。

### ブートスプラッシュロゴ

`bootsplash` で始まる行を配置すると、ブート オプションが選択されたときに画面の中央にロゴを表示することもできます。`menuentry` 行が前になければなりません。

```
bootsplash [#(背景色)] (tga ファイルへのパス)
```

背景色はオプションであり、ハッシュマークで始まり、その後に 6 桁の 16 進数 (赤赤緑緑青青) が続く HTML 表記で指定する必要があります。最初の引数が `#`
で始まらない場合は、パス引数であるとみなされます。

パスは既存のファイルを指す必要があり、ブート (ルートではない) パーティション上の絶対 UTF-8 パスである必要があります。画像は、メニュー アイコンと同様に、
ラン レングス エンコードされたカラー マップの Targa 形式である必要があります。サイズは、画面に収まるものであれば何でもかまいません。

### マルチコアサポート

すべてのプロセッサ コアでカーネルを一度に起動するには、`multicore` ディレクティブを指定します (64 ビット カーネルのみ)。`menuentry` 行が前になければなりません。

```
multicore
```

トラブルシューティング
------------------

問題が発生した場合は、`easyboot -vv` フラグを付けて実行してください。これにより検証が実行され、イメージ作成時に結果が詳細に出力されます。それ以外の場合は、
詳細な起動時メッセージを取得するには、`easyboot/menu.cfg` に `verbose 3` を追加します。

左上隅に赤い背景の`PMBR-ERR`文字列が表示されている場合は、CPU が非常に古く、64 ビット ロング モードをサポートしていないか、
ブート セクターがローダーをブートストラップできなかったことを意味します。これは BIOS マシンでのみ発生する可能性があり、UEFI または RaspberryPi では発生しません。

| メッセージ                          | 説明                                                                        |
|-------------------------------------|-----------------------------------------------------------------------------|
| `Booting [X]...`                    | Xブートオプション（メニューエントリインデックス）が選択されたことを示します |
| `Loading 'X' (Y bytes)...`          | 長さ Y のファイル X がロードされています                                    |
| `Parsing kernel...`                 | カーネルが見つかりました。現在そのフォーマットを検出しています              |
| `Starting X boot...`                | Xシステムのブートローダーが検出されたことを示しています                     |
| `Starting X kernel...`              | Xシステムのカーネルが検出されたことを示しています                           |
| `Transfering X control to Y`        | YアドレスのXモードエントリポイントが呼び出されようとしていることを示します  |

最後のメッセージが表示された後に問題が発生した場合、問題は **Easyboot** ローダーではなく、オペレーティング システムのブート手順で発生したことを意味します。そのため、
回答については、特定のオペレーティング システムのドキュメントを参照する必要があります。それ以外の場合は、gitlab で [問題](https://gitlab.com/bztsrc/easyboot/-/issues) を開いてください。

### Multiboot1

必要なプラグイン： [grubmb1](../../src/plugins/grubmb1.c)

### Multiboot2

これは最も柔軟性が高く、プラグインを介して複数のバリエーションがサポートされています。

- ELF64 または PE32+ と簡素化された Multiboot2： プラグインは不要
- 簡素化された Multiboot2 と 32 ビット エントリ ポイントを備えた ELF32： [elf32](../../src/plugins/elf32.c)
- 簡素化された Multiboot2 と 32 ビット エントリ ポイントを備えた a.out (struct exec)： [aout](../../src/plugins/aout.c)
- 32 ビット エントリ ポイントを備えた GRUB 互換の Multiboot2： [grubmb2](../../src/plugins/grubmb2.c)

違いに注意してください： [簡素化された Multiboot2](ABI.md) は埋め込みタグを必要とせず、上位半分のカーネルをサポートし、Multiboot2、SysV、および fastcall ABI
に従って渡されるパラメーターを備えたクリーンな 64 ビット エントリ ポイントもサポートします。

一方、[GRUB 互換の Multiboot2](https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html) は埋め込みタグを必要とし、
上位半分のカーネルも 64 ビット カーネルもサポートせず、エントリ ポイントは常に 32 ビットであり、パラメータは `eax`、`ebx` でのみ渡されます。

### Windows

プラグインは必要ありませんが、[Secure Boot](secureboot.md)を設定する必要があります。

```
menuentry win {
  kernel EFI/Microsoft/BOOT/BOOTMGRW.EFI
}
```

### Linux

必要なプラグイン： [linux](../../src/plugins/linux.c), [ext234](../../src/plugins/ext234.c)

カーネルがブート パーティションに配置されていない場合は、コマンド ラインを使用してルート パーティションを指定できます。

```
menuentry linux {
  kernel vmlinuz-linux root=PARTUUID=01020304-0506-0708-0a0b0c0d0e0f1011
}
```

### OpenBSD

必要なプラグイン： [obsdboot](../../src/plugins/obsdboot.c), [ufs44](../../src/plugins/ufs44.c)

```
menuentry openbsd {
  partition 01020304-0506-0708-0a0b0c0d0e0f1011
  kernel boot
}
```

警告! OpenBSD を起動する場合は [elf32](../../src/plugins/elf32.c) プラグインを使用しないでください。その `boot` は、32 ビット SysV ABI
エントリ ポイントを持つ ELF であると誤って主張していますが、実際には 16 ビットのリアル モード エントリがあります。

### FreeBSD

必要なプラグイン： [fbsdboot](../../src/plugins/fbsdboot.c), [ufs2](../../src/plugins/ufs2.c)

レガシー BIOS システムでは、ローダー `boot` を指定します。

```
menuentry freebsd {
  partition 01020304-0506-0708-0a0b0c0d0e0f1011
  kernel boot/boot
}
```

UEFI マシンでは、ブート パーティションで `loader.efi` を使用します (プラグインは不要です)。

```
menuentry freebsd {
  kernel boot/loader.efi
}
```

ルート ファイル システムが ZFS の場合は、この 1 つのファイル (BIOS では `boot`、UEFI では `loader.efi`) を `(indir)` にコピーし、ルート パーティションを指定しないでください。

### FreeDOS

必要なプラグイン： [fdos](../../src/plugins/fdos.c)

FreeDOS のファイルを `(indir)` に移動します (FreeDOS はブート パーティションをルート パーティションとして使用します)。

```
menuentry freedos {
  kernel KERNEL.SYS
}
```

著作権と `- InitDisk` を印刷した後に起動が停止する場合、FreeDOS カーネルは FAT32 サポートなしでコンパイルされています。名前に `f32` を含む別のカーネルをダウンロードしてください。

### ReactOS

必要なプラグイン： [reactos](../../src/plugins/reactos.c)

```
menuentry reactos {
  kernel FREELDR.SYS
}
```

### MenuetOS

必要なプラグイン： [menuet](../../src/plugins/menuet.c)

```
menuentry menuetos {
  kernel KERNEL.MNT
  module CONFIG.MNT
  module RAMDISK.MNT
}
```

自動構成をオフにするには、コマンドラインに `noauto` を追加します。

### KolibriOS

必要なプラグイン： [kolibri](../../src/plugins/kolibri.c)

```
menuentry kolibrios {
  kernel KERNEL.MNT syspath=/rd/1/ launcher_start=1
  module KOLIBRI.IMG
  module DEVICES.DAT
}
```

このプラグインは UEFI マシンでも動作しますが、ブート パーティションで `uefi4kos.efi` を使用することもできます (プラグインは必要ありません)。

### SerenityOS

必要なプラグイン： [grubmb1](../../src/plugins/grubmb1.c)

```
menuentry serenityos {
  kernel boot/Prekernel
  module boot/Kernel
}
```

### Haiku

必要なプラグイン： [grubmb1](../../src/plugins/grubmb1.c), [befs](../../src/plugins/befs.c)

```
menuentry haiku {
  partition 01020304-0506-0708-0a0b0c0d0e0f1011
  kernel system/packages/haiku_loader-r1~beta4_hrev56578_59-1-x86_64.hpkg
}
```

UEFI マシンでは、ブート パーティションで `haiku_loader.efi` を使用します (プラグインは不要です)。

### OS/Z

```
menuentry osz {
  kernel ibmpc/core
  module ibmpc/initrd
}
```

プラグインは必要ありません。
