efibootmgrを使ってブート順番などを弄くろう

`efibootmgr`についてのコマンドを記述していることは多いですが、使い方についてはあまり触れられていないのが多いようなので、Qiitaに書いておくことにしました。

`efibootmgr`はLinux上でUEFIブートを表示・管理をするためのコマンドです。
ブート順番を変更したり、次回起動時のブートするOSを決めたりすることができます。

# 前提・免責

Ubuntu 20.04 LTS、**UEFI環境**にて動作を確認しています。

`efibootmgr`は特に記述がない限り、root権限が必要なコマンドです。

このコマンドはOSの起動などに大きく影響するコマンドです。
コマンドを実行する際は自己責任でお願いいたします。

# ブートエントリ一覧などを見る

コマンド`efibootmgr`でブート一覧を見ることができます。

*root権限がなくても見ることができます。*

```console
$ efibootmgr
BootCurrent: 0004
Timeout: 0 seconds
BootOrder: 0002,0004,0001,0003,0006,0007,0000
Boot0000* UiApp
Boot0001* UEFI VBOX CD-ROM VB5-1a2b3c4d 
Boot0002* Windows Boot Manager
Boot0003* EFI Internal Shell
Boot0004* ubuntu
Boot0006* UEFI VBOX HARDDISK VBdbe12ec1-fe7f2278 
Boot0007* UEFI VBOX HARDDISK VB309bc1ef-8386bd04 
Boot0008* bootmgfw.efi
```

`-v`(`--verbose`)オプションを付けると、詳細なブートエントリを表示します。
例として、どのデバイス、どのハードディスク、どのファイルのブートなのかが表示されます。

```console
$ efibootmgr -v
BootCurrent: 0004
BootOrder: 0002,0004,0001,0003,0006,0007,0000
Boot0000* UiApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)
Boot0001  UEFI VBOX CD-ROM VB5-1a2b3c4d 	PciRoot(0x0)/Pci(0x1f,0x2)/Sata(5,65535,0)N.....YM....R,Y.
Boot0002* Windows Boot Manager	HD(1,GPT,b128ff07-7f2e-4112-bc45-83f138bf5eac,0x800,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}...d................
Boot0003* EFI Internal Shell	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(7c04a583-9e3e-4f1c-ad65-e05268d0b4d1)
Boot0004* ubuntu	PciRoot(0x0)/Pci(0x1f,0x2)/Sata(1,65535,0)/HD(1,GPT,6a6ad87d-d217-444f-a37f-28141f6d96ab,0x800,0x5f000)/File(\EFI\ubuntu\shimx64.efi)
Boot0006  UEFI VBOX HARDDISK VBdbe12ec1-fe7f2278 	PciRoot(0x0)/Pci(0x1f,0x2)/Sata(0,65535,0)N.....YM....R,Y.
Boot0007  UEFI VBOX HARDDISK VB309bc1ef-8386bd04 	PciRoot(0x0)/Pci(0x1f,0x2)/Sata(1,65535,0)N.....YM....R,Y.
Boot0008* bootmgfw.efi	PciRoot(0x0)/Pci(0x1f,0x2)/Sata(0,65535,0)/HD(1,GPT,b128ff07-7f2e-4112-bc45-83f138bf5eac,0x800,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)
```

## `BootCurrent`

現在ブートしているシステムの番号(HEX値)です。

## `Timeout`

ブートマネージャーのタイムアウト秒数です。

## `BootOrder`

ブート順番です。左から順にブートされます。

## `Boot<番号(HEX値)>`

ブートのエントリです。

番号のあとに`*`が付いている場合は有効なブートエントリです。
付いていない場合は無効なブートエントリとして扱われます。

# 次回ブートするエントリを設定する

`-n`(`--bootnext`)オプションを使用すると次回起動時のブートエントリを指定できます。

```console
# efibootmgr -n <番号(HEX値)>
```

# 次回起動時のブートエントリの指定を解除する

`-N`(`--delete-bootnext`)オプションで次回起動時のブートエントリの指定解除をすることができます。

```console
# efibootmgr -N
```

# ブートエントリを有効にする

`-b`(`--bootnum`)オプションでブートエントリを指定して、`-a`(`--active`)オプションでブートエントリを有効化できます。

```console
# efibootmgr -b <番号(HEX値)> -a
```

# ブートエントリを無効にする

`-b`(`--bootnum`)オプションでブートエントリを指定して、`-A`(`--inactive`)オプションでブートエントリを無効化できます。

```console
# efibootmgr -b <番号(HEX値)> -A
```

# ブート順番を変更する

`-o`(`--bootorder`)オプションでブート順番を変更できます。番号はカンマ(`,`)で区切ります。

```console
# efibootmgr -o <番号(HEX値)、カンマで区切り>
```

例:

```console
# efibootmgr -o 0001,0002,0003
```

# ブートエントリを追加する

`-c`(`--create`)オプションと以下のオプションでブートエントリを追加します。

ブートエントリを追加すると、ブート順番（ブートオーダー）に追加されます。

## `-L`(`--label`)

ブートエントリの表示名を指定します。

## `-d`(`--disk`)

ブートディスクを指定します。例えば、`/dev/sda`などを指定することができます。

## `-l`(`--loader`)

`efi`ファイルといったブートローダを指定します。

## サンプル

以下のようにすると、ブートエントリを追加することができます。

```console
# efibootmgr -c -L Linux -d /dev/sda -l '\EFI\ubuntu\shimx64.efi'
```

# ブートエントリを削除する

`-b`(`--bootnum`)オプションでブートエントリを指定して、`-B`(`--delete-bootnum`)オプションでブートエントリを削除します。

```console
# efibootmgr -b <番号(HEX値)> -B
```

# 参考など

- man efibootmgr(8)

https://wiki.gentoo.org/wiki/Efibootmgr/ja

https://ponu2.blogspot.com/2018/01/uefiwindowslinux.html

*この記事は自分が書いたScrapboxから作成しました。*

https://scrapbox.io/yuzulia/Linux%E3%81%A7UEFI%E3%81%AE%E3%83%96%E3%83%BC%E3%83%88%E9%A0%86%E5%BA%8F%E3%81%A8%E3%81%8B%E3%82%92%E3%81%84%E3%81%98%E3%82%8B