rEFInd

提供: ArchWiki
2017年2月11日 (土) 23:50時点におけるWAKAME.temp (トーク | 投稿記録)による版 (コマンド名が古かった(?)ので最新パッケージに含まれるコマンドに更新)
ナビゲーションに移動 検索に移動

関連記事

rEFInd は UEFI のブートマネージャです。既にメンテナンスされてない rEFIt のフォークであり、Mac 以外の UEFI ブートに関して多数の問題が修正されています。プラットフォームに依存せず、複数の OS を簡単に起動できるように設計されています。

ノート: この記事では EFI System Partition (ESP) のマウントポイントを $esp で示します。

インストール

公式リポジトリから refind-efi をインストールしてください。

スクリプトによる設定

rEFInd パッケージには /usr/bin/refind-install というスクリプトが含まれており、簡単に rEFInd をデフォルトの EFI ブートエントリに設定できます。このスクリプトにはオプションが存在し、様々なセットアップや UEFI 実装に対応していますが、大抵は次を実行するだけで設定が可能です:

# refind-install

このコマンドは EFI システムパーティションを検出して、rEFInd のファイルを ESP 上の /EFI/refind/ にコピーし、efibootmgr を使って rEFInd をデフォルトの EFI ブートエントリとして追加します。

ノート: デフォルトでは refind-install は root ファイルシステムのドライバーだけをインストールします。他にもドライバーが必要な場合は #ファイルシステムのドライバー を見て下さい。

また、デフォルト/フォールバックのブートパスである /EFI/BOOT/BOOT*.EFI に rEFInd をインストールすることもできます。ブータブルな USB フラッシュドライブや、efibootmgr による NVRAM の変更に問題を抱えているシステム等で有用です:

# refind-install --usedefault /dev/sdXY

/dev/sdXY は ESP のパーティションに置き換えて下さい。オプションについてはインストールスクリプトのコメントを見て下さい。

rEFInd のファイルを ESP にインストールしたら、rEFInd が作成した refind_linux.conf (カーネルと同じディレクトリにあります) に必要なカーネルパラメータ (例: root=) が含まれていることを確認してください。このファイルが作成されていない場合は、手動で #カーネルパラメータを指定 する必要があります。そうしないと次の起動時にカーネルパニックが発生します。

デフォルトでは、rEFInd は全てのドライブをスキャンして、発見した EFI ブートローダーのブートエントリを追加します。それにはカーネルも含まれます (Arch ではデフォルトで EFISTUB が有効になっているためです)。そのため、この時点でシステムを起動することができます。

ヒント: デフォルトのオプションが問題ないか確認するために ESP にあるデフォルト設定 /EFI/refind/refind.conf を編集してみると良いでしょう。

手動設定

ヒント: rEFInd は様々な方法で Linux を起動することができます。The rEFInd Boot Manager: Methods of Booting Linux でそれらの方法が触れられています。このセクションでは EFISTUB を使用する場合の方法を説明しています。
ノート: 32ビットの IA32 EFI を使っている場合、下のコマンドにある x64ia32 に置き換えてください。

refind-install スクリプトが上手く動かない場合、rEFInd を手動で設定することができます。

まず実行可能ファイルを ESP にコピーしてください:

# cp /usr/share/refind/refind_x64.efi $esp/EFI/refind/

それから efibootmgr を使って UEFI の NVRAM にブートエントリを作成してください (X と Y はあなたの ESP のマウントポイントに合わせて置き換えて下さい)。rEFInd をデフォルトの UEFI のパス /EFI/BOOT/BOOTX64.EFI にインストールした場合は、このステップは省略してもかまいません。

# efibootmgr -c -d /dev/sdX -p Y -l /EFI/refind/refind_x64.efi -L "rEFInd Boot Manager"

この時点で rEFInd で起動することができるようになっているはずです。ただしカーネルを起動することはできません。カーネルが ESP にない場合、(適切なドライバーが存在するとき) rEFInd はパーティションをマウントしてカーネルを検索することができます:

# mkdir $esp/EFI/refind/drivers
# cp /usr/share/refind/drivers_x64/myrootfs_x64.efi $esp/EFI/refind/drivers

これで rEFInd はカーネルのブートエントリが用意できますが、適切なカーネルパラメータを指定しません。#カーネルパラメータの指定 を行って下さい。それによって rEFInd を使ってカーネルを起動することができるようになります。この段階で起動ができない、または rEFInd の設定を変更したい場合、設定ファイルを使ってオプションを変更することができます:

# cp /usr/share/refind/refind.conf-sample $esp/EFI/refind/refind.conf

サンプル設定ファイルにたくさんコメントが付いているので開いてみて下さい。

設定ファイルに textonly を設定していない場合、rEFInd のアイコンをコピーしないとプレースホルダが表示されます:

# cp -r /usr/share/refind/icons $esp/EFI/refind/

フォントをコピーして refind.conffont 設定を変更することで他のフォントを使うこともできます:

# cp -r /usr/share/refind/fonts $esp/EFI/refind/
ヒント: rEFInd のメニューで F10 を押すと ESP の一番上のディレクトリにスクリーンショットが保存されます。

ファイルシステムのドライバー

ノート: rEFInd ではカーネルを特定の場所に置く必要はありませんが、ESP 上にカーネルがない場合、rEFInd のファイルシステムドライバーを使って読みだす必要が出て来ます。

rEFInd は現在以下のファイルシステムの読み取り専用ドライバーを備えています:

ヒント: 追加できるドライバーについては The rEFInd Boot Manager: Using EFI Drivers: Finding Additional EFI Drivers を見て下さい。

rEFInd にドライバーをインストール

rEFInd は自動的にインストールディレクトリのサブディレクトリである driversdrivers_arch (例: drivers_x64) から全てのドライバーをロードします。

# cp /usr/share/refind/drivers_x64/drivername_x64.efi $esp/EFI/refind/drivers_x64/
ヒント: rEFInd のスクリプトを使ってインストールする場合、--alldrivers オプションを使って全てのドライバーをインストールできます。ブータブルな USB フラッシュドライブなどで有用です:
# refind-install --usedefault /dev/sdXY --alldrivers

UEFI シェルでドライバーを使う

UEFI シェルで rEFInd のドライバーを使いたいときは load コマンドを使ってロードし、map -r でマップされたドライブをリフレッシュしてください。

# load FS0:\EFI\refind\drivers\ext4_x64.efi
# map -r

これで UEFI シェルからファイルシステムにアクセスすることができるようになります。

カーネルパラメータを指定

rEFInd がカーネルに渡すカーネルパラメータを設定する方法は2つあります。

rEFInd によってカーネルが自動で検出される場合

rEFInd が自動的にカーネルを検出する場合、カーネルと同じディレクトリにカーネルパラメータを記述した refind_linux.conf ファイルを配置することができます。ファイルのサンプルとしては /usr/share/refind/refind_linux.conf-sample を見て下さい。refind_linux.conf の最初のアンコメントした行がカーネルのデフォルトパラメータになります。それ以降の行は +, F2, Insert を使ってアクセスできるサブメニューのエントリを作成します。

もしくは、次を実行してみて下さい:

# mkrlconf

/boot のカーネルを確認して自動的に refind_linux.conf を生成します。基本的なカーネルパラメータしか設定しないので、作成されたファイルに問題がないか確認をしましょう。

initrd= パラメータを指定しなかった場合、rEFInd は自動的にカーネルと同じディレクトリにある RAM ディスクのファイル名を検索して追加します。initrd= パラメータを複数設定する必要があるときは (例: マイクロコード)、refind_linux.conf で手動でパラメータを設定してください。

手動でブートエントリを記述

カーネルが自動検出されない場合、もしくはメニューエントリのオプションを自分で設定したい場合、手動で refind.conf にブートエントリを作成することができます。scanfor には manual を含めて下さい、そうしないとエントリが rEFInd のメニューに表示されません。カーネルパラメータは options キーワードで設定できます。rEFInd は initrd キーワードで指定されたファイルを使って initrd= パラメータを追加します。initrd を追加する必要がある場合 (例: マイクロコード)、options で指定してください (initrd キーワードで指定された initrd が最後に追加されます)。

$esp/EFI/refind/refind.conf
...

menuentry "Arch Linux" {
        icon     /EFI/refind/icons/os_arch.png
        volume   Boot
        loader   /boot/vmlinuz-linux
        initrd   /boot/initramfs-linux.img
        options  "root=PARTUUID=XXXXXXXX rootfstype=XXXX rw add_efi_memmap"
        submenuentry "Boot using fallback initramfs" {
                initrd /boot/initramfs-linux-fallback.img
        }
}

volume はカーネルイメージがあるパーティションのファイルシステム LABEL, PARTLABEL, PARTUUID, ボリューム番号 (例: 0:) のどれかに変更する必要があります。ボリュームラベルの例は Ext3#Assigning a label を見て下さい。

既存の UEFI Windows 環境で rEFInd を使う

ノート: 基本的には Windows と Arch のデュアルブートに書かれていることが適用されます。

rEFInd は UEFI の Windows をインストールしたときに作成される EFI システムパーティションに対応しているため、Windows と一緒に Arch をインストールする際にもうひとつ FAT32 パーティションを作成・フォーマットする必要はありません。Windows の ESP をマウントして通常通りに rEFInd をインストールするだけです。デフォルトで、rEFInd の自動検出機能が既存の Windows (リカバリ) ブートローダーを認識するはずです。

rEFInd を更新する

refind パッケージの新しいバージョンを pacman でアップデートとしてインストールした場合、上のセクションにあるような refind.conf や refind_linux.conf を除いて、refind のディレクトリとファイルをコピーする必要があります。

rEFInd を自動で最新バージョンに更新するために、(cronjob で) refind-install を実行することができます。もしくは下で記述しているように systemd のスクリプトを使います。 以下のようにコマンドは実行されます:

/usr/bin/refind-install
Installing rEFInd on Linux....
ESP was found at /boot/efi using vfat
Found rEFInd installation in /boot/efi/EFI/refind; upgrading it.
Installing driver for ext4 (ext4_x64.efi)
Copied rEFInd binary files

Notice: Backed up existing icons directory as icons-backup.
Existing refind.conf file found; copying sample file as refind.conf-sample
to avoid overwriting your customizations.

rEFInd has been set as the default boot manager.
Existing //boot/refind_linux.conf found; not overwriting.

Installation has completed successfully.

Systemd による自動化

以下のスクリプトを使うことで、refind ファイルのコピーと (必要ならば) nvram の更新を自動化することができます。

ノート: UEFISYS パーティションで refind をインストールするディレクトリを変更したい場合は、スクリプトの中の $refind_dir の値を変更してください。
/usr/lib/systemd/scripts/refind_name_patchv2
#!/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
/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
/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

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

# systemctl enable refind_update.path

Apple Mac

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

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

VirtualBox

VirtualBox#Virtualbox の EFI モードで Arch を使う を参照してください。

ツール

rEFInd は様々なサードパーティ製のツールをサポートしています。ツールは別個にインストールする必要があります。refind.confshowtools を編集して表示したいツールを選択してください。

$esp/EFI/refind/refind.conf
...
# Which non-bootloader tools to show on the tools line, and in what
# order to display them:
#  shell            - the EFI shell (requires external program; see rEFInd
#                     documentation for details)
#  memtest          - the memtest86 program, in EFI/tools, EFI/memtest86,
#                     EFI/memtest, EFI/tools/memtest86, or EFI/tools/memtest
#  gptsync          - the (dangerous) gptsync.efi utility (requires external
#                     program; see rEFInd documentation for details)
#  gdisk            - the gdisk partitioning program
#  apple_recovery   - boots the Apple Recovery HD partition, if present
#  windows_recovery - boots an OEM Windows recovery tool, if present
#                     (see also the windows_recovery_files option)
#  mok_tool         - makes available the Machine Owner Key (MOK) maintenance
#                     tool, MokManager.efi, used on Secure Boot systems
#  about            - an "about this program" option
#  exit             - a tag to exit from rEFInd
#  shutdown         - shuts down the computer (a bug causes this to reboot
#                     many UEFI systems)
#  reboot           - a tag to reboot the computer
#  firmware         - a tag to reboot the computer into the firmware's
#                     user interface (ignored on older computers)
#  netboot          - launch the ipxe.efi tool for network (PXE) booting
# Default is shell,memtest,gdisk,apple_recovery,windows_recovery,mok_tool,about,shutdown,reboot,firmware
#
showtools shell, memtest, netboot, about, reboot, firmware
...

UEFI シェル

UEFI シェルを見て下さい。

EFI System Partition のルートに shellx64.efi をコピーして下さい。

Memtest86

AUR から memtest86-efiAUR をインストールして $esp/EFI/tools/ にコピーしてください。

# cp /usr/share/memtest86-efi/bootx64.efi $esp/EFI/tools/memtest86.efi

iPXE

ノート: rEFInd における PXE のサポートはまだ実験段階です。

refind-efi には iPXE UEFI バイナリが含まれており、$esp/EFI/tools/ にコピーするだけで使えます。

# cp /usr/share/refind/tools_x64/ipxe_discovery_x64.efi $esp/EFI/tools/ipxe_discovery.efi
# cp /usr/share/refind/tools_x64/ipxe_x64.efi $esp/EFI/tools/ipxe.efi

参照