EFISTUBの構築

EFISTUBの構築

数日間、私はグーグルであらゆる場所を検索し、私と同じ問題を抱えている人がいないか調べました。これが私のLenovo Z50-70のLinuxカーネルです(多分重要でしょう)

 $ uname -a
Linux Z50-Debian 4.7.0-1-amd64 #1 SMP Debian 4.7.8-1 (2016-10-19) x86_64 GNU/Linux

 $ lvdisplay  |grep -i path
  LV Path                /dev/Debian/Home
  LV Path                /dev/Debian/Root
  LV Path                /dev/Debian/Swap

# gdisk /dev/sda -l |grep 0
GPT fdisk (gdisk) version 1.0.1
Disk identifier (GUID): 4A75B640-D8A2-03A2-906D-9D9228B6E800
Partitions will be aligned on 2048-sector boundaries
Total free space is 3707 sectors (1.8 MiB)
   1            2048         3653631   1.7 GiB     2700  Basic data partition
   2         3653632         4601855   463.0 MiB   EF00  EFI system partition
   3         4601856         6752255   1.0 GiB     EF00  Basic data partition
   4         6752256         7014399   128.0 MiB   0C01  Microsoft reserved ...
   5         7014400       907063665   429.2 GiB   0700  Basic data partition
   6       907065344       908787711   841.0 MiB   2700  
   7       908787712       910155775   668.0 MiB   EF00  
   8       910155776       953745407   20.8 GiB    8E00  Linux
   9       953745408       976773119   11.0 GiB    2700  Basic data partition

私はefi-stub(カーネルUEFIセルフブートローダー)を使用するために2つのガイドに従いました。

efistub の公式 Debian Wiki そして Debian と efistub の bitbinary ガイド

しかし、どれも機能しませんでした。

問題 1:EFI/Debian/vmlinuz.efi私のファームウェアは(ただし、最初にDebianをインストールしたときにはrEFInd efiアプリとgrubは見つかりました)を見つけられ ませんでした。

問題2:vmlinuz.efiを 起動するとrEFInd、initramfs プロンプトと、ルートをマウント/見つけることができなかったというエラーが表示され、ブート プロセスが停止します。

また

cat /proc/cmdline 

私のはエコーしません/proc/cmdlineが、ルートマウントのオプションが指定されていない一般的なものです

問題3: 私が使用したガイドどおりですefibootmgrが、再起動するたびに新しいエントリが削除されます。

私は (U)EFI の世界では比較的初心者ですが、これがうまく機能するようになればと本当に願っています。今のところアイデアがほとんどないので、何か役立つことをご存知でしたら、ぜひ教えてください。

ありがとう。

答え1

この質問は古いものですが、回答がないので、最近、上記の構成で Arch Linux システムを起動したので、その方法を書いておきます。私の仕様:

OS : arch Linux (mainline kernel, Linux-zen kernel, linux-clear kernel).
System : HP laptop with UEFI 2.

それとは別に、私は自分のキーを使用してセキュア ブートを設定しようとしていました (これにより、設定がさらに複雑になりました)。ただし、ここではその部分については触れません。

initramfsまず最初に、 を正しく設定する必要がありますhooks。これが、あなたが抱えている問題の要点です (おそらく、私もそうでした)。私は、Arch Linux が ramdisk/initramfs を構築する方法についてしか知りません。Debian (または、使用しているその他のディストリビューション) 用にプロセスを変換する必要があるかもしれません。

私は、makinitcpio initramfs 構築プロセスで利用可能な 3 つのフックから始めました。

base hook ( this is the main and necessary hook )
udev hook ( it does the detection of the devices  of the system including the hard disk and root filesystem ).
LVM hook ( since you have LVM, this hooks would include the device mapper and set up the LVM volumes ).

EFISTUBの構築

binutils パッケージの objcopy ツールを使用します。

objcopy \
    --add-section .osrel="/etc/os-release"                          --change-section-vma .osrel=0x20000    \
    --add-section .cmdline=<(echo -n "${cmdline}")                  --change-section-vma .cmdline=0x30000  \
    --add-section .splash="${SPLASH}"                               --change-section-vma .splash=0x40000   \
    --add-section .linux="${linux}"                                 --change-section-vma .linux=0x2000000  \
    --add-section .initrd=<(cat "${INITRD_PREPEND[@]}" "${initrd}") --change-section-vma .initrd=0x3000000 \
    "${EFISTUB}" "${output}"
  wait $!

上記のコマンドは基本的に、カーネル、iniramfs、カーネル パラメータを取得し、それらをファームウェア (UEFI) から直接起動できる単一の EFISTUB に変換します。

ここでは、 $cmdline基本的にカーネル パラメータであり、少なくともルート パスが含まれている必要があります。たとえば、この場合は、root=/dev/Debian/root $SPLASH起動時にスプラッシュ スクリーンとして表示するイメージが含まれている必要があります。

$EFISTUBlinuxx64.efi.stubは に付属するジェネリックですsystemd。 では、通常、ディレクトリArch Linuxの下に配置されます。/use/lib/systemd/efi/

$outputファイルを出力する場所です (ファームウェアが検出できるように、```ESP (EFI システム パーティション) 内にある必要があります)。

次に、 の助けを借りてefibootmgr、新しく作成された のブート エントリを作成できますEFISTUB

# efibootmgr -c -d /dev/sda -p 2 -L "Debian EFISTUB" -l /efi/EFI/debian/linux-efi.efi 

上記の例では、

  • -c作成を意味します(新しいブートエントリを作成します)
  • -dESP があるディスクを指すためのものです。
  • -pそのディスクのパーティション番号を指します。
  • -Lブート エントリに適切なラベルを付けるためです。
  • -lローダー (基本的には efistub) を指します。これは ESP の EFI/debian ディレクトリの下に配置され、/efi の下にマウントされていると想定しました。

ヒント: 起動中にefistub、シェルがあると非常に便利だとわかりました。カスタム カーネル パラメータを使用してUEFIカーネルを起動するなど、シェルからさまざまなことを試すことができます。efistub

上記のガイドは、ブートローダーを使用せずに EFISTUB を起動する方法です。複数の OS (カーネル) を起動する場合は、異なる OS を管理するためにブートローダーを追加できますefistubs

答え2

Debian インストール ディスクを見つけて PC に接続すれば、それが可能だと思います。次に、ディスクから起動し、トラブルシューティング メニューと回復 vmlinuz ファイルおよびその他の起動ファイルを渡します。

関連情報