幾天來,我到處搜索,看看是否有人遇到和我一樣的問題。這是我的 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 自開機)
efistub 上的官方 Debian 維基 和 Debian 和 efistub 的位元二進位指南
但它們都不起作用。
問題一:
我的韌體找不到EFI/Debian/vmlinuz.efi
(但它確實找到了 rEFInd efi 應用程序,以及我第一次安裝 Debian 時的 grub)
問題2:
當啟動vmlinuz.efi
通過時rEFInd
,它會停止啟動過程,並顯示 initramfs 提示並錯誤告訴我它無法掛載/找到根目錄。
也
cat /proc/cmdline
不回顯 my /proc/cmdline
,而是一個通用的,沒有任何指定的根安裝選項
問題3:
正如我使用的指南efibootmgr
,但每次重新啟動時,我的新條目都會被刪除。
我對 (U)EFI 世界相當陌生,但我真的希望我能完成這項工作。由於我現在幾乎沒有想法,如果您知道任何可以幫助我的事情,請大聲說出來!
謝謝。
答案1
這個問題很老了,但由於它沒有答案,而且我最近使用上述配置啟動了我的 archlinux 系統,讓我寫下我是如何做到的。我的規格:
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 建置過程中可用的三個鉤子開始:
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 $!
上面的命令基本上會取得您的 kernel 、 iniramfs 和核心參數,並將它們轉換為單一 EFISTUB ,您可以直接從韌體 (UEFI) 啟動。
這裡:
$cmdline
基本上是您的核心參數,它必須至少包含根路徑,例如在您的情況下root=/dev/Debian/root $SPLASH
應該是您想要在啟動時顯示為啟動畫面的影像。
$EFISTUB
linuxx64.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
代表create(建立一個新的啟動項目)-d
用於指向ESP所在的磁碟。-p
指向該磁碟的分割區號。-L
用於為啟動項提供適當的標籤。-l
指向載入器(基本上是efistub)。我假設它位於 ESP 中的 EFI/debian 目錄下,並且安裝在 /efi 下。
提示:在啟動時efistub
,我發現使用UEFI
shell 非常方便。您可以從該 shell 嘗試很多事情,包括使用自訂核心參數引導核心efistub
等。
上面的指南是在沒有任何引導程式幫助的情況下引導 EFISTUB。如果您要啟動多個作業系統(核心),那麼您可以新增啟動載入程式來管理不同的efistubs
.
答案2
我想,你可以找到debian安裝盤並插入PC。然後從磁碟啟動並通過故障排除選單並恢復 vmlinuz 檔案和其他啟動檔案。