Difference between revisions of "EFISTUB (日本語)"

From ArchWiki
Jump to navigation Jump to search
Line 1: Line 1:
[[Category:Boot loaders (日本語)]]
[[Category:Boot loaders (日本語)]]
{{Related articles start (日本語)}}
{{Related2|Arch Boot Process (日本語)|Arch ブートプロセス}}
{{Related2|Boot Loaders (日本語)|ブートローダー}}
{{Related2|Unified Extensible Firmware Interface (日本語)|Unified Extensible Firmware Interface}}
{{Related articles end}}
{{Warning|1=カーネルバージョンとマザーボードのモデルによっては EFISTUB の起動が失敗するというバグが報告されています。詳しくは [https://bugs.archlinux.org/task/33745] や [https://bbs.archlinux.org/viewtopic.php?id=156670] を見て下さい。}}
{{Warning|1=カーネルバージョンとマザーボードのモデルによっては EFISTUB の起動が失敗するというバグが報告されています。詳しくは [https://bugs.archlinux.org/task/33745] や [https://bbs.archlinux.org/viewtopic.php?id=156670] を見て下さい。}}
Line 89: Line 94:
==== Mkinitcpio フック ====
==== Mkinitcpio フック ====
Mkinitcpio はフックを生成することができシステムレベルデーモンを機能させる必要はありません。バックグラウンドプロセスを生成して {{ic|vm-linuz}}, {{ic|initramfs-linux.img}}, {{ic|initramfs-linux-fallback.img}} の生成を待ち; そして [[#EFISTUB の設定]] の手順4に従います。
Mkinitcpio はフックを生成することができシステムレベルデーモンを機能させる必要はありません。ファイルをコピーする前にバックグラウンドプロセスを生成して {{ic|vm-linuz}}, {{ic|initramfs-linux.img}}, {{ic|initramfs-linux-fallback.img}} の生成を待ちます。
{{Tip|下のスクリプトを {{ic|/usr/lib/initcpio/install/efistub-update}} として保存してください}}
{{Tip|下のスクリプトを {{ic|/usr/lib/initcpio/install/efistub-update}} として保存してください}}
Line 123: Line 128:
{{Tip|{{ic|efistub-update}} を {{ic|/etc/mkinitcpio.conf}} 内の hook のリストに加えて下さい}}
{{Tip|{{ic|efistub-update}} を {{ic|/etc/mkinitcpio.conf}} 内の hook のリストに加えて下さい}}
==== /etc/fstab バインドマウント ====
==== バインドマウント ====
ESP を {{ic|/boot}} にマウントする代わりに、バインドマウントを使うことで ESP のディレクトリを {{ic|/boot}} にマウントすることができます ({{ic|mount(8)}} を参照)。これによって ESP を自由に扱えるようにしつつ pacman が直接カーネルを更新できるようにすることができます。ファイルをコピーする他の方法よりもずっとシンプルな方法になります。
* The following method should work similarly with any distribution that does not symlink in {{ic|/boot}}. ''See Warnings for caveats.''
* This involves no special scripts, services, or bootloader filesystem drivers.
{{Note|1=バインドマウントを利用するには FAT32 に対応するカーネルとブートローダーが必要です。通常の Arch のインストールでは問題になりませんが、他のディストリビューションでは問題になることがあります (つまり {{ic|/boot}} にシンボリックリンクを必要とするディストリビューション)。フォーラムの[https://bbs.archlinux.org/viewtopic.php?pid=1331867#p1331867 この投稿]を見て下さい。}}
* 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).
[[#カーネルと initramfs ESP にコピーする|上]]に書かれているように、ESP のディレクトリに全てのブートファイルをコピーしますが、ESP は {{ic|/boot}} の外にマウントします (例: {{ic|/esp}})。そしてディレクトリをバインドマウントします:
* Beyond initial configuration this should persist without special consideration or maintenance.
* This should be transparent to any action normally affecting {{ic|/boot}} and the files therein.}}
# mount --bind /esp/EFI/arch/ /boot
* This requires both a kernel and a bootloader compatible with the FAT32 filesystem.
ファイルが {{ic|/boot}} に現れるようにしたい場合、[[fstab (日本語)|fstab]] を編集して永続化させます:
* Because the FAT32 filesystem cannot handle symlinks, this will not behave as intended with an installation that requires them in {{ic|/boot}}.
* Initial configuration requires {{ic|root}} level access.
* This may require a large EFI system partition in order to accomodate multiple installations.
/esp/EFI/arch /boot none defaults,bind 0 0
* All kernels will require at least a {{ic|1=root=''system root''}} parameter passed at boot.
* per rEFInd's author: ''OpenSUSE definitely uses symbolic links in {{ic|/boot}}... Fedora, Ubuntu, and ... OpenSUSE all refuse a FAT partition as {{ic|/boot}} in ... setup [which] can be worked around [in] {{ic|/etc/fstab}}.'' Forum post [[https://bbs.archlinux.org/viewtopic.php?pid=1331867#p1331867 here]].}}
; 方法: 通常は EFI system partition {{ic|/boot/efi}} サブフォルダにマウントしますが、以下ではその逆を行います。
{{Warning|この方法を使って起動するには {{ic|1=root=''system_root''}} [[カーネルパラメータ#パラメータ一覧|カーネルパラメータ]]を使う必要があります。}}
* 他で記述されているように FAT32 フォーマットの {{ic|ef00}} タイプの EFI system partition を作成してください。
:* 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 {{ic|esp}}.}}
* マウントポイントを作成して EFI system partition をファイルシステムのどこかにマウントしてください。例:
: {{ic|$ mkdir /esp<br />$ mount -L esp /esp}}
* システムの {{ic|/boot}} ファイルを含めるため、EFI system parition の {{ic|/EFI/boot}} にフォルダを作成してください。例:
: {{ic|$ 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 {{ic|/EFI/boot/*/}} by default.
:* Keying {{ic|F2}} on a highlighted refind boot menu entry enables adding the required {{ic|1=root=}} kernel parameter to an auto-added or otherwise unconfigured menu entry.}}
* {{ic|/boot}} にある全てのファイルを削除して EFI system partition に新しくフォルダを作成します。例:
: {{ic|$ mv /boot/* /esp/EFI/boot/arch64-laptop/}}
* EFI system partition に新しく生成したフォルダを {{ic|/boot}} にバインドマウントしてください。例:
: {{ic|$ mount --bind /esp/EFI/boot/arch64-laptop /boot}}
* {{ic|$ ls /boot/}} でファイルが大丈夫か確認してから、{{ic|/etc/fstab}} を編集して変更を永続的にしてください。例:
: {{ic|##/etc/fstab<br />LABEL&#61;arch64-laptop_rootfs / ext4 defaults 0 0<br />LABEL&#61;esp /esp vfat defaults 0 0<br />/esp/EFI/boot/arch64-laptop /boot none defaults,bind 0 0}}
* 必要に応じて {{ic|1=root=}} カーネルブートパラメータを適用するようにブートローダを更新してください。例:
: {{ic|##/boot/refind_linux.conf<br />... root&#61;LABEL&#61;arch64-laptop_rootfs ...}}
{{Note|[https://www.archlinux.org/packages/extra/any/refind-efi/ refind-efi 0.2.7] 現在、refind は {{ic|/boot}} にあるカーネルを自動で検知します。名前を変更して {{ic|.efi}} 拡張子を付ける必要はありません。そのため、同期スクリプトは [[#rEFInd を使う|refind]] を使うなら必要ありません。ただし、カーネルが保存されている Linux のファイルシステムを読み込むために EFI ドライバーをインストールしなくてはなりません。}}
== EFISTUB の起動 ==
== EFISTUB の起動 ==

Revision as of 14:15, 2 December 2014

Template:Related articles start (日本語)

  • Arch ブートプロセス
  • ブートローダー
  • Unified Extensible Firmware Interface
  • Warning: カーネルバージョンとマザーボードのモデルによっては EFISTUB の起動が失敗するというバグが報告されています。詳しくは [1][2] を見て下さい。

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

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

    EFISTUB の設定

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

    カーネルと initramfs を 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 カーネルを自動で更新することができます:


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

    Warning: mkinitcpio がカーネルスタブと initramfs を作成するのには時間がかかるので、以下の systemd サービスが新しいカーネルスタブと initramfs の代わりに古いものをコピーしてしまう可能性があります。このエラーの可能性を減らすために、(mkinitcpio によって最後に作成される) initramfs-linux-fallback.img が更新されたか確認する efistub のコピーサービスをバインドすると良いでしょう。
    Description=Copy EFISTUB Kernel to UEFISYS Partition
    Description=Copy EFISTUB Kernel to UEFISYS Partition
    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


    # systemctl enable efistub-update.path


    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 フック

    Mkinitcpio はフックを生成することができシステムレベルデーモンを機能させる必要はありません。ファイルをコピーする前にバックグラウンドプロセスを生成して vm-linuz, initramfs-linux.img, initramfs-linux-fallback.img の生成を待ちます。

    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
    Tip: 下のスクリプトを /root/watch.sh として保存し実行可能にしてください
    #!/usr/bin/env bash
    while [[ -d "/proc/$PPID" ]]; do
    	sleep 1
    /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 のリストに加えて下さい


    ESP を /boot にマウントする代わりに、バインドマウントを使うことで ESP のディレクトリを /boot にマウントすることができます (mount(8) を参照)。これによって ESP を自由に扱えるようにしつつ pacman が直接カーネルを更新できるようにすることができます。ファイルをコピーする他の方法よりもずっとシンプルな方法になります。

    Note: バインドマウントを利用するには FAT32 に対応するカーネルとブートローダーが必要です。通常の Arch のインストールでは問題になりませんが、他のディストリビューションでは問題になることがあります (つまり /boot にシンボリックリンクを必要とするディストリビューション)。フォーラムのこの投稿を見て下さい。

    に書かれているように、ESP のディレクトリに全てのブートファイルをコピーしますが、ESP は /boot の外にマウントします (例: /esp)。そしてディレクトリをバインドマウントします:

    # mount --bind /esp/EFI/arch/ /boot

    ファイルが /boot に現れるようにしたい場合、fstab を編集して永続化させます:

    /esp/EFI/arch /boot none defaults,bind 0 0
    Warning: この方法を使って起動するには root=system_root カーネルパラメータを使う必要があります。

    EFISTUB の起動

    Warning: Linux Kernel EFISTUB initramfs のパスは EFI System Partition のルートからの相対パスでなければなりません。例えば、initramfs が $esp/EFI/arch/initramfs-linux.img にあったとしたら、適切な UEFI 行は initrd=/EFI/arch/initramfs-linux.imginitrd=\EFI\arch\initramfs-linux.img になります。

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

    gummiboot を使う

    Gummiboot は EFISTUB カーネルのナイスなメニューを提供する UEFI Boot Manager です。EFISTUB ブートの推奨ブートマネージャです。詳細は gummiboot を見て下さい。

    rEFInd を使う

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

    UEFI Shell を使う

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

    > fs0:
    > cd \EFI\arch
    > vmlinuz-arch.efi root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 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 を指定することができます。


    Warning: カーネルと efibootmgr の組み合わせによっては手動で調整しないと動かないことがあります [3]。ブートエントリを削除することはできますが作成することは出来なくなります。
    Note: UEFI ファームウェアによってはブートエントリの uefi アプリケーションにコマンドラインパラメータを埋め込むことができません。

    UEFI ブートエントリに直接カーネルパラメータを埋め込むことが可能です。つまりあなたの UEFI ブートオーダー・GUI を使って GRUB など他のブートローダーを使わずに直接 Arch Linux を起動することができます (下のコマンドの XY は EFI System Partition があるディスクとパーティションに置き換えてください、root= パラメータは root にあわせて変更してください)。

    # mount -t efivarfs efivarfs /sys/firmware/efi/efivars              # 既にマウントされている場合は無視して下さい
    # efibootmgr -d /dev/sdX -p Y -c -L "Arch Linux" -l /vmlinuz-linux -u "root=/dev/sda2 rw initrd=/initramfs-linux.img"


    # efibootmgr -v


    # efibootmgr -o XXXX,XXXX

    XXXX は `efibootmgr` コマンドによって出力されるそれぞれのエントリの番号に置き換えてください。

    Tip: シェルスクリプトでブートエントリを作成するコマンドをどこかに保存しておけば、修正 (例えばカーネルパラメータの変更) が楽になります。

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