- Home
- Packages
- Forums
- Wiki
- Bugs
- AUR
- Download

# UEFI Bootloaders (日本語)

From ArchWiki

このページには Linux カーネルを起動することができる様々な UEFI ブートローダの情報が含まれています。このページを読む前に UEFI と GPT のページを読むことを推奨します。ここでは以下のブートローダが説明されています:

## Linux Kernel EFISTUB

Warning: カーネルバージョンとマザーボードのモデルによっては EFISTUB の起動が失敗するというバグが報告されています。詳しくは [1] や [2] を見て下さい。

Linux カーネル (linux>=3.3) は `EFISTUB (EFI BOOT STUB)` ブートをサポートしています。カーネル設定で `CONFIG_EFI_STUB=y` を設定することで有効にすることができ、Arch Linux のカーネルではデフォルトに有効にされています (詳しくは The EFI Boot Stub を参照してください)。

EFISTUB カーネルだけでは他のカーネルを起動することはできません。よってブートメニューエントリごとに EFISTUB カーネル + Initramfs のペアが必要です。このため、複数のカーネルを使う場合は、UEFI Boot Manager を使うことが推奨されています。

### EFISTUB の設定

1. EFI System Partition を作成してください。
2. `/boot` (Gummiboot を使用するか、ブートマネージャを使わないときに推奨) かどこか好きなところに (他のディストロやツールは大抵 `/boot/efi` を使っています) EFI System Partition をマウントしてください。以後このマウントポイントは `$esp` として示します。

#### ファイルを適切な場所に移動する

Warning: 以下の手順は EFISYS のマウントポイントとして `/boot` を使っていない場合にのみ必要です。マウントポイントとして `/boot` を選んだ時は、#EFISTUB の起動 に進むことができます。

1. `$esp/EFI/arch/` を作成してください
2. 以下のファイルを移動元から移動先にコピーしてください

ブートファイルの移動元 | UEFI の移動先
--- | ---
/boot/vmlinuz-linux | $esp/EFI/arch/vmlinuz-arch.efi
/boot/initramfs-linux.img | $esp/EFI/arch/initramfs-arch.img
/boot/initramfs-linux-fallback.img | $esp/EFI/arch/initramfs-arch-fallback.img

Warning: カーネルがアップデートされる度に EFISTUB カーネルを更新する必要があります (#EFISTUB の設定 にある手順4に従って下さい。失敗すると起動が出来なくなります。また、以下の方法のどれか一つを使うことで EFISTUB カーネルを自動で更新することができます:

##### Systemd

Systemd にはイベントトリガータスク機能があります。ここで、パス上の変更を検知する能力を使って、`boot` にある EFISTUB カーネルと initramfs のファイルが更新されたときにそれらを同期させることが可能です。

Warning: mkinitcpio がカーネルスタブと initramfs を作成するのには時間がかかるので、以下の systemd サービスが新しいカーネルスタブと initramfs の代わりに古いものをコピーしてしまう可能性があります。このエラーを減らすために、(mkinitcpio によって最後に作成される) initramfs-linux-fallback.img が更新されたか確認する efistub のコピーサービスをバインドすると良いでしょう。
Tip: 下のスクリプトを `/etc/systemd/system/efistub-update.path` として保存してください

    [Unit]
    Description=Copy EFISTUB Kernel to UEFISYS Partition

    [Path]
    PathChanged=/boot/initramfs-linux-fallback.img

    [Install]
    WantedBy=multi-user.target

Tip: 下のスクリプトを `/etc/systemd/system/efistub-update.service` として保存してください

    [Unit]
    Description=Copy EFISTUB Kernel to UEFISYS Partition

    [Service]
    Type=oneshot
    ExecStart=/usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-arch.efi
    ExecStart=/usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-arch.img
    ExecStart=/usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-arch-fallback.img

Tip: 以上のサービスを次のコマンドで有効にしてください

    # systemctl enable efistub-update.path

##### Incron

incron は更新後に EFISTUB カーネルを同期するスクリプトを実行することができます。

Tip: 下のスクリプトを `/usr/local/bin/efistub-update.sh` として保存してください

    #!/usr/bin/env bash
    /usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-arch.efi
    /usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-arch.img
    /usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-arch-fallback.img

Tip: 下のスクリプトを `/etc/incron.d/efistub-update.conf` として保存してください
Note: 最初のパラメータ `/boot/initramfs-linux-fallback.img` は監視するファイルです。2番目のパラメータ `IN_CLOSE_WRITE` は監視するイベントです。3番目のパラメータ `/usr/local/bin/efistub-update.sh` は起動するスクリプトです。

    /boot/initramfs-linux-fallback.img IN_CLOSE_WRITE /usr/local/bin/efistub-update.sh

Tip: この方法を使うには、incron が有効になっている必要があります。有効になっていない場合は次を実行してください

    # systemctl enable incrond.service

##### Mkinitcpio hook

Mkinitcpio はフックを生成することができシステムレベルデーモンを機能させる必要はありません。バックグラウンドプロセスを生成して `vm-linuz`, `initramfs-linux.img`, `initramfs-linux-fallback.img` の生成を待ち; そして #EFISTUB の設定 の手順4に従います。

Tip: 下のスクリプトを `/usr/lib/initcpio/install/efistub-update` として保存してください

    #!/usr/bin/env bash

    build() {
    	/root/watch.sh &
    }

    help() {
    	cat <<HELPEOF
    This hook waits for mkinitcpio to finish and copies the finished ramdisk and kernel to the ESP
    HELPEOF
    }

Tip: 下のスクリプトを `/root/watch.sh` として保存し実行可能にしてください

    #!/usr/bin/env bash

    while [[ -d "/proc/$PPID" ]]; do
    	sleep 1
    done

    /usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-arch.efi
    /usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-arch.img
    /usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-arch-fallback.img

    echo "Synced kernel with ESP"

Tip: `efistub-update` を `/etc/mkinitcpio.conf` 内の hook のリストに加えて下さい

##### /etc/fstab バインドマウント

Note:

- The following method should work similarly with any distribution that does not symlink in `/boot`. See Warnings for caveats.
- This involves no special scripts, services, or bootloader filesystem drivers.
- This centralizes and organizes kernels and initrds across installations on one partition.
- This avoids possible limitations imposed by firmware and/or the bootloader on boot device configuration as can often occur with RAID and/or LVM (excepting the standard FAT32 EFI system partition, of course).
- Beyond initial configuration this should persist without special consideration or maintenance.
- This should be transparent to any action normally affecting `/boot` and the files therein.

Warning:

- This requires both a kernel and a bootloader compatible with the FAT32 filesystem.
- Because the FAT32 filesystem cannot handle symlinks, this will not behave as intended with an installation that requires them in `/boot`.
- Initial configuration requires `root` level access.
- This may require a large EFI system partition in order to accomodate multiple installations.
- All kernels will require at least a `root=system root` parameter passed at boot.
- per rEFInd's author: OpenSUSE definitely uses symbolic links in `/boot`... Fedora, Ubuntu, and ... OpenSUSE all refuse a FAT partition as `/boot` in ... setup [which] can be worked around [in] `/etc/fstab`. Forum post [here].

Method
  Whereas the general convention is to mount the EFI system partition to a `/boot/efi` subfolder, the following will achieve the opposite.

- Create a `ef00` type EFI system partition of FAT32 format as described elsewhere.

  Tip:
  - It may be beneficial to make it several gigabytes in size to accomodate multiple installations.
  - Use the GPT partition name feature for added convenience. For example name the partition `esp`.

- Create a mount-point and mount the EFI system partition somewhere on the filesystem. For example:

  `$ mkdir /esp
  $ mount -L esp /esp`

- Create a folder in `/EFI/boot` on the EFI system partition to contain your system's `/boot` files. For example:

  `$ mkdir /esp/EFI/boot/arch64-laptop`
  Tip:
  - The refind bootloader automatically detects and adds EFI loadable kernel files installed to the EFI system partition in `/EFI/boot/*/` by default.
  - Keying `F2` on a highlighted refind boot menu entry enables adding the required `root=` kernel parameter to an auto-added or otherwise unconfigured menu entry.

- Move all files in `/boot` to the newly created folder on your EFI system partition. For example:

  `$ mv /boot/* /esp/EFI/boot/arch64-laptop/`

- Bind mount the newly populated folder on your EFI system partition to `/boot`. For example:

  `$ mount --bind /esp/EFI/boot/arch64-laptop /boot`

- Verify your files are available as expected with `$ ls /boot/` then persist the configuration by editing `/etc/fstab`. For example:

  `##/etc/fstab
  LABEL=arch64-laptop_rootfs / ext4 defaults 0 0
  LABEL=esp /esp vfat defaults 0 0
  /esp/EFI/boot/arch64-laptop /boot none defaults,bind 0 0`

- Update your bootloader to apply the `root=` kernel boot parameter as necessary. For example:

  `##/boot/refind_linux.conf
  ... root=LABEL=arch64-laptop_rootfs ...`

Note: As of refind-efi 0.2.7, refind automatically detects kernels in `/boot`. They do not have to be renamed to have a `.efi` extension either. Hence, the following sync scripts aren't needed if using refind. You do need to isntall an EFI driver to read the Linux filesystem on which the kernel is stored, though.

### EFISTUB の起動

Warning: Linux Kernel EFISTUB initramfs path should be relative to the EFI System Partition's root. For example, if the initramfs is located in `$esp/EFI/arch/initramfs-linux.img`, the corresponding UEFI formatted line should be `initrd=/EFI/arch/initramfs-linux.img` or `initrd=\EFI\arch\initramfs-linux.img`.

以下の方法のどれか一つを使うことで EFISTUB カーネルを起動することができます:

#### efibootmgr エントリを使って直接起動する

Warning: カーネルと efibootmgr の組み合わせによっては手動で調整しないと動かないことがあります [3]。ブートエントリを削除することはできますが作成することは出来なくなります。
Note: Some UEFI firmwares may not support embedding command line parameters to uefi applications in the boot entries.

efibootmgr によって作成したブートエントリに直接カーネルパラメータを埋め込むことが可能です。つまりあなたの UEFI ブート順・GUI を使って GRUB などの他のブートローダーを使わずに直接 Arch Linux を起動することができます (下のコマンドで、EFI System Partition は `/dev/sdX` 上に、パーティションは `Y` にあると仮定しています)。

    # efibootmgr -c -d /dev/sdX -p Y -l /EFI/arch/vmlinuz-arch.efi -L "Arch Linux (EFISTUB)" -u "$(cat /proc/cmdline)"

作成されたエントリが問題ないか確認するために次のコマンドを実行すると良いでしょう:

    # efibootmgr -v

また、ブートオプションの順番を新しく割り当てて (`efibootmgr -o`) Arch のエントリを最後に持ってくることで、失敗した時にシステムが楽にリカバーできます。

Tip: Save the command for creating your boot entry in a shell script somewhere, which makes it easier to modify (when changing kernel parameters, for example).

efibootmgr の詳細は UEFI#efibootmgr で説明しています。フォーラムの投稿 https://bbs.archlinux.org/viewtopic.php?pid=1090040#p1090040 。

#### gummiboot を使う

Gummiboot は EFISTUB カーネルのナイスなメニューを提供する UEFI Boot Manager です。gummiboot として [core] から利用でき、EFISTUB ブートの推奨ブートマネージャです。詳細は gummiboot を見て下さい。

#### rEFInd を使う

rEFInd は (Intel Mac で使われている) rEFIt Boot Manager の Rod Smith (GPT-fdisk の作者) によるフォークです。rEFInd は Mac 以外の UEFI ブートについて rEFIt の多くの問題を修正してあり EFISTUB カーネルをサポートしています。

Tip: もし EFISTUB や rEFInd を初めて知ったのなら、先に進む前に The rEFInd Boot Manager: Methods of Booting Linux を読んで下さい。このセクションはひとつのユースケースを説明しているだけであり全ての設定に適しているというわけではありません。

1. `# pacman -S refind-efi` で refind-efi パッケージをインストールしてください
2. 以下のファイルを rEFInd の移動元ディレクトリから移動先にコピーしてください

Note: <arch> はシステムアーキテクチャのビット数を示しています。`$ uname -m` を実行してアーキテクチャの情報を入手してください。32ビット環境なら <arch> を <arch> に、64ビット環境なら <arch> を "x64" に置き換えてください。

rEFInd ファイルの移動元 | UEFI の移動先
--- | ---
/usr/share/refind/refind_<arch>.efi | $esp/EFI/refind/refind_<arch>.efi
/usr/share/refind/refind.conf-sample | $esp/EFI/refind/refind.conf
/usr/share/refind/icons | $esp/EFI/refind/icons
/usr/share/refind/drivers_<arch> | $esp/EFI/refind/drivers

Tip: rEFInd の設定ファイルは `$esp/EFI/refind/refind.conf` です。このファイルには注釈が沢山つけられています。
Note: As of refind-efi 0.2.7, refind can auto-detect kernels in `/boot`, if there are UEFI drivers for the filesystem used by /boot partition (or / partition if no separate /boot is used) in the ESP, and are loaded by rEFInd. This is enabled in the default configuration in `refind.conf` (you may need to include the PATH to the drivers folders in the ESP). See [4] for more info.

`refind_linux.conf` 設定ファイルを下のテンプレートのように編集してください。PARTUUID の後の文字列はあなたの root の PARTUUID に置き換えてください。

Note: Please notice the difference between the standard UUID and the PARTUUID shown by `$ ls -l /dev/disk/by-partuuid/`

    refind_linux.conf

    "Boot with defaults" "root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rw rootfstype=ext4 add_efi_memmap systemd.unit=graphical.target"
    "Boot to Terminal"   "root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rw rootfstype=ext4 add_efi_memmap systemd.unit=multi-user.target"

Tip: `refind_linux.conf` のそれぞれの行は rEFInd によってサブメニューとして表示されます。サブメニューは "+" や "insert" キーで開けます。
Tip: Mac 以外のシステムでは、efibootmgr を使って rEFInd のエントリを作成してください。sdX は UEFI のディスク、Y は UEFI のパーティション番号に置き換えてください。次を実行:

     # efibootmgr -c -d /dev/sdX -p Y -l /EFI/refind/refind_<arch>.efi -L "rEFInd"

##### Systemd Automation

Tip: To automate the process of copying refind files and updating the nvram (if needed) use the following script
Note: 下のスクリプトを `/usr/lib/systemd/scripts/refind_name_patchv2` として保存してください
Tip: If you want to change the directory that refind is installed in the UEFISYS partition, just change the value of $refind_dir in the script

    #!/usr/bin/env bash
    ## COPYRIGHT 2013 : MARK E. LEE (BLUERIDER) : mlee24@binghamton.edu; mark@markelee.com

    ## LOG
    ## 1/17/2013 : Version 2 of refind_name_patch is released
    ##           : Supports long subdirectory location for refind
    ##           : Updates nvram when needed
    ##           : 10% speed boost
    ## 7/15/2013 : Changed arch to match 32-bit (ia32) and 64-bit (x64) naming scheme
    ##           : Changed directory copying in update-efi-dir to copy tools and drivers directories explicitly
    ##           : Changed efibootmgr writing code to be more concise and added (-w) to write the entry as per dusktreader's excellent guide : https://docs.google.com/document/d/1pvgm3BprpXoadsQi38FxqMOCUZhcSqFhZ26FZBkmn9I/edit
    ##           : Function to check if NVRAM boot entry was already listed was fixed to use awk and an if then clause
    ##           : ref_bin_escape was modified from : ref_bin_escape=${ref_bin//\//\\\\} to remove extra backslashes (error does not show up when using cmdline)
    ## 7/29/2013 : Changed location of tools,drivers, and binary directory to match capricious upstream move to /usr/share/refind

    function main () {  ## main insertion function
      declare -r refind_dir="/boot/efi/EFI/refind"; ## set the refind directory
      arch=$(uname -m | awk -F'_' '{if ($1 == "x86") {print "x"$2} else if ($1 == "i686") {print "ia32"}}') &&  ## get bit architecture
      update-efi-dir;  ## updates or creates the refind directory
      update-efi-nvram;  ## updates nvram if needed
    }

    function update-efi-dir () {  ## setup the refind directory
      if [ ! -d $refind_dir ]; then  ## check if refind directory exists
        echo "Couldn't find $refind_dir";
        mkdir $refind_dir &&  ## make the refind directory if needed
        echo "Made $refind_dir";
      fi;
      if [ "$arch" ]; then  ## check if anything was stored in $arch
        cp -r /usr/share/refind/{refind_$arch.efi,keys,images,icons,fonts,docs,{tools,drivers}_$arch} $refind_dir/  && ## update the bins and dirs
        echo "Updated binaries and directory files for refind at $refind_dir";
       else
        echo "Failed to detect an x86 architecture";
        exit;
      fi;
    }

    function update-efi-nvram () { ## update the nvram with efibootmgr
      declare -r ref_bin=${refind_dir/\/boot\/efi}/refind_$arch.efi;  ## get path of refind binary (without /boot/efi)
      declare -r ref_bin_escape=${ref_bin//\//\\};  ## insert escape characters into $ref_bin
      [ "$(efibootmgr -v | awk "/${ref_bin_escape//\\/\\\\}/")" ] && ( ## check if boot entry is in nvram \
        echo "Found boot entry, no need to update nvram";
        ) || ( ## if boot entry is not in nvram; add it
        declare -r esp=$(mount -l | awk '/ESP/ {print $1}') &&  ## get ESP partition
        efibootmgr -cgw -d ${esp:0:8} -p ${esp:8} -L "rEFInd" -l $ref_bin_escape && ## update nvram
        echo "
        Updated nvram with entry rEFInd to boot $ref_bin
        Did not copy configuration files, please move refind.conf to $refind_dir/";
        )
    }
    main;  ## run the main insertion function

Note: As of refind-efi 0.2.7, refind automatically detects kernels in `/boot`. They do not have to be renamed to have a `.efi` extension either. Hence, the following sync scripts aren't needed if using refind. You do need to isntall an EFI driver to read the Linux filesystem on which the kernel is stored, though.
Note: 下のサービスファイルを `/usr/lib/systemd/system/refind_update.path` として保存してください

    [Unit]
    Description=Update rEFInd bootloader files

    [Path]
    PathChanged=/usr/share/refind/refind_<arch>.efi
    Unit=refind_update.service

    [Install]
    WantedBy=multi-user.target

Note: 下のサービスファイルを `/usr/lib/systemd/system/refind_update.service` として保存してください

    [Unit]
    Description=Update rEFInd directories, binaries, and nvram

    [Service]
    Type=oneshot
    ExecStart=/usr/bin/bash /usr/lib/systemd/scripts/refind_name_patchv2
    RemainAfterExit=no

Tip: 次を実行して systemd のパスユニットを有効にしてください:

    # systemctl enable refind_update.path

##### Apple Macs

Apple Mac の場合、Linux 用の実験的な "bless" ユーティリティが含まれている mactel-boot を試して下さい。これが動作しないときは、OSX の中から "bless" を使って rEFInd をデフォルトのブートローダに設定してください。OSX の中で UEFISYS パーティションが `/mnt/efi` にマウントされているとして、次を実行します:

    $ sudo bless --setBoot --folder /mnt/efi/EFI/refind --file /mnt/efi/EFI/refind/refind_x64.efi

##### VirtualBox

VirtualBox の場合については、VirtualBox (日本語)#Virtualbox の EFI モードで Arch を使う を参照してください。

#### UEFI Shell を使う

通常の UEFI アプリケーションのように UEFI Shell から EFISTUB カーネルを起動することが可能です。この場合カーネルパラメータは通常のパラメータとして起動する EFISTUB カーネルファイルに渡します。

    > fs0:
    > cd \EFI\arch
    > vmlinuz-arch.efi root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 ro rootfstype=ext4 add_efi_memmap initrd=EFI/arch/initramfs-arch.img

また、ブートパラメータを記述したシンプルな `archlinux.nsh` ファイルを書いて UEFI System Partition に置き、それを実行することもできます:

    fs0:
    archlinux

スクリプト例:

    echo -on
    \EFI\arch\vmlinuz-arch.efi root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rootfstype=ext4 add_efi_memmap initrd=EFI/arch/initramfs-arch.img

この方法では名前をメモしておいたり20-30文字も入力せずとも UUID を指定することができます。

## GRUB 2.xx

GRUB 2.x には自分自身のファイルシステムドライバーが含まれており、ファイルにアクセスするのにファームウェアに依存していません。GRUB は直接 `/boot` からファイルを読み込むことができ UEFISYS パーティションの中にカーネルや initramfs のファイルを必要としません。詳細は GRUB (日本語)#UEFI_システム_2 で説明しています。bzr の開発バージョンを使う場合 AUR のパッケージを試して下さい - grub-bzr。

## SYSLINUX 6.xx

([testing] から) syslinux または syslinux-firmware-git AUR パッケージをインストールして `/usr/lib/syslinux/efi64/*` を `$esp/EFI/syslinux/` にコピーしてください (`$esp` は UEFISYS パーティションのマウントポイント) (`efi64` は x86_64 UEFI ファームウェア用です、ia32 UEFI ファームウェアなら `efi32` に置き換えてください)。そして efibootmgr を使ってファームウェアブートマネージャにブートエントリを作成してください。

## ELILO

ELILO は LILO Boot Loader の UEFI バージョンです。初めは Intel の Itanium 環境用に作成され EFI (UEFI の前身) だけをサポートしていました。最古の Linux 向け UEFI ブートローダーです。依然としてゆったりとしたペースで開発されています。上流ではコンパイル済みのバイナリを http://sourceforge.net/projects/elilo/ で提供しています。Elilo の設定ファイル `elilo.conf` は LILO の設定ファイルに似ています。AUR のパッケージ - elilo-efi。

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

- Intel Z77 など、いくつかの UEFI マザーボードでは、efi シェルから efibootmgr や bcfg でエントリを追加して NVRAM に書き加えられてもブートメニューのリストに表示されません。

  これを解決するには、Windows ブートマネージャが ESP パーティションに存在していると UEFI ファームウェアを騙す必要があります。

  EFI シェルを起動してから、以下を実行して USB ドライブから bootx64.efi ファイルを bootmgfw.efi ファイルとして ESP パーティションにコピーしてください:

    FS1:
    cd EFI
    mkdir Microsoft
    cd Microsoft
    mkdir Boot
    cp FS0:\EFI\BOOT\bootx64.efi FS1:\EFI\Microsoft\Boot\bootmgfw.efi

  再起動後、NVRAM に追加されたエントリがブートメニューに表示されるようになるはずです。

## 参照

- Rod Smith - Managing EFI Boot Loaders for Linux
- Rod Smith - rEFInd, a fork or rEFIt
- Linux Kernel Documentation on EFISTUB
- Linux Kernel EFISTUB Git Commit
- Rod Smith's page on EFISTUB
- rEFInd Documentation for booting EFISTUB Kernels

Retrieved from "https://wiki.archlinux.org/index.php?title=UEFI_Bootloaders_(日本語)&oldid=278371"
Category:

- Boot loaders (日本語)

## Navigation menu