「EFI ブートスタブ」の版間の差分
細 |
|||
2行目: | 2行目: | ||
[[en:EFISTUB]] |
[[en:EFISTUB]] |
||
[[es:EFISTUB]] |
[[es:EFISTUB]] |
||
+ | [[ru:EFISTUB]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|Arch ブートプロセス}} |
{{Related|Arch ブートプロセス}} |
||
20行目: | 21行目: | ||
=== カーネルと initramfs を ESP にコピーする === |
=== カーネルと initramfs を ESP にコピーする === |
||
− | + | EFISYS のマウントポイントとして {{ic|/boot}} を使って''いない''場合 ({{ic|/boot/efi}} など)、ブートファイルを EFISYS にコピーする必要があります (EFISYS の場所は {{ic|$esp}} として示します): |
|
− | # |
+ | # mkdir $esp/EFI/arch |
+ | # cp /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-linux |
||
− | # 以下のファイルを移動元から移動先にコピーしてください |
||
+ | # cp /boot/initramfs-linux.img $esp/EFI/arch/initramfs-linux.img |
||
− | {| class="wikitable" |
||
+ | # cp /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-linux-fallback.img |
||
− | !ブートファイルの移動元 |
||
− | !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 |
||
− | |} |
||
− | + | カーネルがアップデートされる度に EFISTUB カーネルを更新する必要があります。また、以下の方法のどれか一つを使うことで EFISTUB カーネルを自動で更新することができます。 |
|
==== systemd ==== |
==== systemd ==== |
||
− | [[systemd |
+ | [[systemd]] にはイベントトリガータスク機能があります。これで、パス上の変更を検知する能力を使って、{{ic|boot}} にある EFISTUB カーネルと initramfs のファイルが更新されたときにそれらを同期させることが可能です。 |
{{Warning|mkinitcpio がカーネルスタブと initramfs を作成するのには時間がかかるので、以下の systemd サービスが新しいカーネルスタブと initramfs の代わりに古いものをコピーしてしまう可能性があります。このエラーの可能性を減らすために、(mkinitcpio によって最後に作成される) initramfs-linux-fallback.img が更新されたか確認する efistub のコピーサービスをバインドすると良いでしょう。}} |
{{Warning|mkinitcpio がカーネルスタブと initramfs を作成するのには時間がかかるので、以下の systemd サービスが新しいカーネルスタブと initramfs の代わりに古いものをコピーしてしまう可能性があります。このエラーの可能性を減らすために、(mkinitcpio によって最後に作成される) initramfs-linux-fallback.img が更新されたか確認する efistub のコピーサービスをバインドすると良いでしょう。}} |
||
62行目: | 52行目: | ||
[Service] |
[Service] |
||
Type=oneshot |
Type=oneshot |
||
− | ExecStart=/usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz- |
+ | ExecStart=/usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-linux |
− | ExecStart=/usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs- |
+ | ExecStart=/usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-linux.img |
− | ExecStart=/usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs- |
+ | ExecStart=/usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-linux-fallback.img |
</nowiki>}} |
</nowiki>}} |
||
70行目: | 60行目: | ||
# systemctl enable efistub-update.path |
# systemctl enable efistub-update.path |
||
+ | 再起動するか、次のコマンドを実行して systemd にパスの監視を開始するように伝える必要があります: |
||
− | ==== Incron ==== |
||
+ | # systemctl start efistub-update.path |
||
+ | |||
+ | ==== Incron を使う ==== |
||
{{Pkg|incron}} を使って更新後に EFISTUB カーネルを同期するスクリプトを実行することができます。 |
{{Pkg|incron}} を使って更新後に EFISTUB カーネルを同期するスクリプトを実行することができます。 |
||
77行目: | 70行目: | ||
{{bc|<nowiki> |
{{bc|<nowiki> |
||
#!/usr/bin/env bash |
#!/usr/bin/env bash |
||
− | /usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz- |
+ | /usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-linux |
− | /usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs- |
+ | /usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-linux.img |
− | /usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs- |
+ | /usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-linux-fallback.img</nowiki>}} |
− | </nowiki>}} |
||
{{Tip|下のスクリプトを {{ic|/etc/incron.d/efistub-update.conf}} として保存してください}} |
{{Tip|下のスクリプトを {{ic|/etc/incron.d/efistub-update.conf}} として保存してください}} |
||
93行目: | 85行目: | ||
</nowiki>}}}} |
</nowiki>}}}} |
||
− | ==== Mkinitcpio フック ==== |
+ | ==== Mkinitcpio フックを使う ==== |
Mkinitcpio はフックを生成することができシステムレベルデーモンを機能させる必要はありません。ファイルをコピーする前にバックグラウンドプロセスを生成して {{ic|vm-linuz}}, {{ic|initramfs-linux.img}}, {{ic|initramfs-linux-fallback.img}} の生成を待ちます。 |
Mkinitcpio はフックを生成することができシステムレベルデーモンを機能させる必要はありません。ファイルをコピーする前にバックグラウンドプロセスを生成して {{ic|vm-linuz}}, {{ic|initramfs-linux.img}}, {{ic|initramfs-linux-fallback.img}} の生成を待ちます。 |
||
120行目: | 112行目: | ||
done |
done |
||
− | /usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz- |
+ | /usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-linux |
− | /usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs- |
+ | /usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-linux.img |
− | /usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs- |
+ | /usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-linux-fallback.img |
echo "Synced kernel with ESP" |
echo "Synced kernel with ESP" |
||
129行目: | 121行目: | ||
{{Tip|{{ic|efistub-update}} を {{ic|/etc/mkinitcpio.conf}} 内の hook のリストに加えて下さい}} |
{{Tip|{{ic|efistub-update}} を {{ic|/etc/mkinitcpio.conf}} 内の hook のリストに加えて下さい}} |
||
− | ==== バインドマウント ==== |
+ | ==== バインドマウントを使う ==== |
ESP を {{ic|/boot}} にマウントする代わりに、バインドマウントを使うことで ESP のディレクトリを {{ic|/boot}} にマウントすることができます ({{ic|mount(8)}} を参照)。これによって ESP を自由に扱えるようにしつつ pacman が直接カーネルを更新できるようにすることができます。ファイルをコピーする他の方法よりもずっとシンプルな方法になります。 |
ESP を {{ic|/boot}} にマウントする代わりに、バインドマウントを使うことで ESP のディレクトリを {{ic|/boot}} にマウントすることができます ({{ic|mount(8)}} を参照)。これによって ESP を自由に扱えるようにしつつ pacman が直接カーネルを更新できるようにすることができます。ファイルをコピーする他の方法よりもずっとシンプルな方法になります。 |
||
191行目: | 183行目: | ||
# mount -t efivarfs efivarfs /sys/firmware/efi/efivars # 既にマウントされている場合は無視して下さい |
# mount -t efivarfs efivarfs /sys/firmware/efi/efivars # 既にマウントされている場合は無視して下さい |
||
− | # efibootmgr -d |
+ | # efibootmgr -d /dev/sd'''X''' -p '''Y''' -c -L "Arch Linux" -l /EFI/arch/vmlinuz-linux -u "root='''/dev/sda2''' rw initrd=/EFI/arch/initramfs-linux.img" |
作成されたエントリが問題ないか確認するために次のコマンドを実行すると良いでしょう: |
作成されたエントリが問題ないか確認するために次のコマンドを実行すると良いでしょう: |
2015年2月21日 (土) 21:05時点における版
Linux カーネル (linux>=3.3) は EFISTUB (EFI BOOT STUB)
ブートをサポートしています。カーネル設定で CONFIG_EFI_STUB=y
を設定することで有効にすることができ、Arch Linux のカーネルではデフォルトで有効にされています (詳しくは EFI Boot Stub を参照してください)。
EFISTUB カーネルだけでは他のカーネルを起動することはできません。よってブートメニューエントリごとに EFISTUB カーネル + Initramfs のペアが必要です。このため、複数のカーネルを使う場合は、UEFI Boot Manager を使うことが推奨されています。
目次
EFISTUB の設定
- EFI System Partition を作成してください。
/boot
(推奨) かどこか他の好きなところに (他のディストロやツールは大抵/boot/efi
を使っています) EFI System Partition をマウントしてください。以後このマウントポイントは$esp
として示します。
カーネルと initramfs を ESP にコピーする
EFISYS のマウントポイントとして /boot
を使っていない場合 (/boot/efi
など)、ブートファイルを EFISYS にコピーする必要があります (EFISYS の場所は $esp
として示します):
# mkdir $esp/EFI/arch # cp /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-linux # cp /boot/initramfs-linux.img $esp/EFI/arch/initramfs-linux.img # cp /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-linux-fallback.img
カーネルがアップデートされる度に EFISTUB カーネルを更新する必要があります。また、以下の方法のどれか一つを使うことで EFISTUB カーネルを自動で更新することができます。
systemd
systemd にはイベントトリガータスク機能があります。これで、パス上の変更を検知する能力を使って、boot
にある EFISTUB カーネルと initramfs のファイルが更新されたときにそれらを同期させることが可能です。
/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
/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-linux ExecStart=/usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-linux.img ExecStart=/usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-linux-fallback.img
次のコマンドでサービスを有効にしてください:
# systemctl enable efistub-update.path
再起動するか、次のコマンドを実行して systemd にパスの監視を開始するように伝える必要があります:
# systemctl start efistub-update.path
Incron を使う
incron を使って更新後に EFISTUB カーネルを同期するスクリプトを実行することができます。
#!/usr/bin/env bash /usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-linux /usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-linux.img /usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-linux-fallback.img
/boot/initramfs-linux-fallback.img IN_CLOSE_WRITE /usr/local/bin/efistub-update.sh
Mkinitcpio フックを使う
Mkinitcpio はフックを生成することができシステムレベルデーモンを機能させる必要はありません。ファイルをコピーする前にバックグラウンドプロセスを生成して vm-linuz
, initramfs-linux.img
, initramfs-linux-fallback.img
の生成を待ちます。
#!/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 }
#!/usr/bin/env bash while [[ -d "/proc/$PPID" ]]; do sleep 1 done /usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-linux /usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-linux.img /usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-linux-fallback.img echo "Synced kernel with ESP"
バインドマウントを使う
ESP を /boot
にマウントする代わりに、バインドマウントを使うことで ESP のディレクトリを /boot
にマウントすることができます (mount(8)
を参照)。これによって ESP を自由に扱えるようにしつつ pacman が直接カーネルを更新できるようにすることができます。ファイルをコピーする他の方法よりもずっとシンプルな方法になります。
上に書かれているように、ESP のディレクトリに全てのブートファイルをコピーしますが、ESP は /boot
の外にマウントします (例: /esp
)。そしてディレクトリをバインドマウントします:
# mount --bind /esp/EFI/arch/ /boot
ファイルが /boot
に現れるようにしたい場合、fstab を編集して永続化させます:
/etc/fstab
/esp/EFI/arch /boot none defaults,bind 0 0
EFISTUB の起動
以下の方法のどれか一つを使うことで 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
スクリプト例:
$ESP/archlinux.nsh
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 を指定することができます。
ブートマネージャを使わずに直接起動する
UEFI ブートエントリに直接カーネルパラメータを埋め込むことが可能です。つまりあなたの UEFI ブートオーダー・GUI を使って GRUB など他のブートローダーを使わずに直接 Arch Linux を起動することができます (下のコマンドの X
と Y
は EFI System Partition があるディスクとパーティションに置き換えてください、root=
パラメータは root にあわせて変更してください)。
# mount -t efivarfs efivarfs /sys/firmware/efi/efivars # 既にマウントされている場合は無視して下さい # efibootmgr -d /dev/sdX -p Y -c -L "Arch Linux" -l /EFI/arch/vmlinuz-linux -u "root=/dev/sda2 rw initrd=/EFI/arch/initramfs-linux.img"
作成されたエントリが問題ないか確認するために次のコマンドを実行すると良いでしょう:
# efibootmgr -v
ブートの順番を設定するには、次を実行します:
# efibootmgr -o XXXX,XXXX
XXXX は `efibootmgr` コマンドによって出力されるそれぞれのエントリの番号に置き換えてください。
efibootmgr の詳細は UEFI#efibootmgr で説明しています。フォーラムの投稿 https://bbs.archlinux.org/viewtopic.php?pid=1090040#p1090040 。