UEFI Bootloaders (日本語)

From ArchWiki
Revision as of 15:35, 3 October 2013 by Kusakata (Talk | contribs) (Created page with "Category:Boot loaders (日本語) en:UEFI Bootloaders zh-CN:UEFI Bootloaders このページには Linux カーネルを起動することができる様々な U...")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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

Linux Kernel EFISTUB

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

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 can generate a hook that does not need a system level daemon to function. It spawns a background process which waits for the generation of vm-linuz, initramfs-linux.img, and initramfs-linux-fallback.img; then follows step 4 in Setting up EFISTUB

Tip: Save the following script as /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: Save the following script as /root/watch.sh and make it executable
#!/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: Add efistub-update to the list of hooks in /etc/mkinitcpio.conf
/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 の組み合わせによっては手動で調整しないと動かないことがあります [2]。ブートエントリを削除することはできますが作成することは出来なくなります。
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 is a fork of rEFIt Boot Manager (used in Intel Macs) by Rod Smith (author of GPT-fdisk). rEFInd fixes many issues in rEFIt with respect to non-Mac UEFI booting and also has support for booting EFISTUB kernels and contains some features specific to them.

Tip: If you're new to EFISTUB and/or rEFInd, you need to read The rEFInd Boot Manager: Methods of Booting Linux before going any further. This section illustrates only one possible use-case which is not suitable for all configurations.
  1. # pacman -S refind-efirefind-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's configuration file is located in $esp/EFI/refind/refind.conf. The file is well commented.
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 [3] 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: Each line of refind_linux.conf is displayed as a submenu by rEFInd. Access the submenu with "+" or "insert" keys.
Tip: In non-Mac systems, create an entry for rEFInd using efibootmgr where sdX is the UEFI disk, and Y is the UEFI partition number. Run :
 # 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: Save this script as /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: Save the following service file as /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: Save the following service file as /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: Enable the systemd path unit by running :
# systemctl enable refind_update.path
Apple Macs

In case of Apple Macs, try mactel-bootAUR for an experimental "bless" utility for Linux. If that does not work, use "bless" form within OSX to set rEFInd as default bootloader. Assuming UEFISYS partition is mounted at /mnt/efi within OSX, do

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

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

UEFI Shell を使う

It is possible to launch EFISTUB kernel form UEFI Shell as if it is a normal UEFI application. In this case the kernel parameters are passed as normal parameters to the launched EFISTUB kernel file.

> 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

You can also write a simple archlinux.nsh file with your boot parameters and put it in your UEFI System Partition, then run it with:

fs0:
archlinux

Example Script:

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

This way you can specify UUID's without needing to remember the name or type out 20-30 characters.

GRUB 2.xx

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

SYSLINUX 6.xx

Install syslinux (from [testing]) or syslinux-firmware-gitAUR AUR package and copy /usr/lib/syslinux/efi64/* to $esp/EFI/syslinux/ ($esp is the mountpoint of UEFISYS partition) (efi64 is for x86_64 UEFI firmwares, replace with efi32 for ia32 UEFI firmwares), and then create a boot entry using efibootmgr in the firmware boot manager.

ELILO

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

トラブルシューティング

  • 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 に追加されたエントリがブートメニューに表示されるようになるはずです。

参照