Debian

UEFI + BIOS 可啟動的實時 Debian 拉伸 amd64 具有持久性

  • May 19, 2019

我目前在這件事上找到的所有資訊都不足以滿足我的口味。它要麼過時、具有誤導性,甚至是錯誤的,似乎過於復雜或沒有涵蓋這個特定問題。

目標:

  • 可啟動 USB 驅動器(支持 UEFI 和舊版 BIOS)
  • (基於) live Debian 9 (stretch)
  • 持久性(預設情況下,適用於 UEFI 和舊版 BIOS)
  • 預設情況下的德語鍵盤佈局
  • 適合對其他 GNU/Linux 系統進行故障排除

原因:

  • 每次使用時都必須設置鍵盤佈局真是令人頭疼
  • 預設 Debian 實時映像中缺少 cryptsetup 和 efibootmgr
  • gnome-terminal 預設有這個煩人的白色背景

沒有解決方案:

  • (重新)建構自定義 debian 實時映像(這似乎很乏味,雖然我還沒有嘗試過)
  • unetbootin(在 debian stretch 上啟動時要求輸入未知密碼,我認為它不支持 UEFI)
  • 一些外國的自動化流程,我看不到發生了什麼

Debian live 和 install 鏡像是 isohybrid,可以方便地使用dd. 他們確實可以通過這樣的 USB 驅動器工作,這非常好!但是,如果不編輯 grub 和 isolinux 配置,就沒有持久性,也無法從預設的非英語鍵盤佈局開始,這些配置包含在實時 ISO 映像的只讀 ISO9660 文件系統中。因此,即使將實時 ISO 寫入 USB 驅動器,這些參數仍然無法更改。

這是一種創建具有持久性的 Debian live USB 驅動器的方法。它將允許安裝失去的包,從那時起,這些包將在每次使用持久性的實時啟動時可用。因為我們在具有讀寫能力的文件系統上重新創建了實時 ISO 映像文件系統內容,所以我們可以更改引導載入程序配置以啟用持久性並在引導時設置鍵盤佈局。

此處描述的步驟經過測試可在 Debian stretch 和 buster 上執行以創建 Debian stretch 實時映像。

涉及的步驟很多,但似乎這種方法還是相當有效的。

**免責聲明:**您將失去目標 USB 驅動器上的數據,如果您弄亂了以下命令,之後您可能會感到非常抱歉。我不對你的行為負責。

感覺很幸運

如果您今天感到特別幸運,您可以嘗試使用 bash 腳本為您自動執行該過程。將您的 ISO 映像路徑作為第一個參數,將 USB 驅動器塊設備名稱作為第二個參數。請注意,這個腳本非常危險,如果不先閱讀和理解它,您不應該執行它。

TL; 博士

獲取 Debian live ISO 映像,然後執行以下操作:

umount /dev/sdX*
parted /dev/sdX --script mktable gpt
parted /dev/sdX --script mkpart EFI fat16 1MiB 10MiB
parted /dev/sdX --script mkpart live fat16 10MiB 3GiB
parted /dev/sdX --script mkpart persistence ext4 3GiB 100%
parted /dev/sdX --script set 1 msftdata on
parted /dev/sdX --script set 2 legacy_boot on
parted /dev/sdX --script set 2 msftdata on

mkfs.vfat -n EFI /dev/sdX1
mkfs.vfat -n LIVE /dev/sdX2
mkfs.ext4 -F -L persistence /dev/sdX3

mkdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
mount /dev/sdX1 /tmp/usb-efi
mount /dev/sdX2 /tmp/usb-live
mount /dev/sdX3 /tmp/usb-persistence
mount -oro live.iso /tmp/live-iso

cp -ar /tmp/live-iso/* /tmp/usb-live

echo "/ union" > /tmp/usb-persistence/persistence.conf

grub-install --no-uefi-secure-boot --removable --target=x86_64-efi --boot-directory=/tmp/usb-live/boot/ --efi-directory=/tmp/usb-efi /dev/sdX

dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/mbr/gptmbr.bin of=/dev/sdX
syslinux --install /dev/sdX2

mv /tmp/usb-live/isolinux /tmp/usb-live/syslinux
mv /tmp/usb-live/syslinux/isolinux.bin /tmp/usb-live/syslinux/syslinux.bin
mv /tmp/usb-live/syslinux/isolinux.cfg /tmp/usb-live/syslinux/syslinux.cfg

sed --in-place 's#isolinux/splash#syslinux/splash#' /tmp/usb-live/boot/grub/grub.cfg

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 persistence/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 keyboard-layouts=de locales=en_US.UTF-8,de_DE.UTF-8/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

umount /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
rmdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso

詳細並帶有一些解釋

您將需要以提升的權限執行以下大多數命令,即sudo在大多數 GNU/Linux 系統上使用。

下載

使用您選擇的視窗管理器下載 Debian live ISO 映像:

https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/

我們將下載的 ISO 映像簡稱為“live.iso”。

確定目標驅動器

使用 查找作為 USB 驅動器的設備lsblk。我們稱之為/dev/sdX.

解除安裝

使用解除安裝驅動器上的現有分區umount /dev/sdX*

創建分區

我們需要一個 EFI 引導分區,以便 UEFI PC 從 USB 驅動器引導。然後我們需要一個足夠大的分區來保存原始的實時 ISO 文件系統映像內容。該分區必須legacy_boot設置標誌。然後我們添加持久化分區,用完 USB 驅動器的所有剩餘空間。您可以使用任何支持 GPT 的分區工具來做到這一點(注意legacy_boot標誌)。這是一個使用範例parted

parted /dev/sdX --script mktable gpt
parted /dev/sdX --script mkpart EFI fat16 1MiB 10MiB
parted /dev/sdX --script mkpart live fat16 10MiB 3GiB
parted /dev/sdX --script mkpart persistence ext4 3GiB 100%
parted /dev/sdX --script set 1 msftdata on
parted /dev/sdX --script set 2 legacy_boot on
parted /dev/sdX --script set 2 msftdata on

這將創建一個 GPT 分區表和一個保護性 MBR 分區表。

創建文件系統

我們希望 EFI 和活動分區上的 FAT 和ext4持久性分區上的 FAT,並且我們需要持久性功能工作的標籤persistence

mkfs.vfat -n EFI /dev/sdX1
mkfs.vfat -n LIVE /dev/sdX2
mkfs.ext4 -F -L persistence /dev/sdX3

掛載資源

我們需要在臨時掛載點掛載源 ISO 和目標分區。

mkdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
mount /dev/sdX1 /tmp/usb-efi
mount /dev/sdX2 /tmp/usb-live
mount /dev/sdX3 /tmp/usb-persistence
mount -oro live.iso /tmp/live-iso

安裝直播系統

將實時 ISO 文件系統內容複製到 LIVE 分區。

cp -ar /tmp/live-iso/* /tmp/usb-live

持久性.conf

使用所需的配置文件準備持久性文件系統。沒有此文件,持久性功能將無法工作。

echo "/ union" > /tmp/usb-persistence/persistence.conf

用於 UEFI 支持的 Grub

安裝 grub2 以獲得 UEFI 引導支持(這需要grub-efi-amd64-binDebian 上的軟體包)。我們強制grub-install不使用 UEFI 安全啟動,這顯然不適用於該選項--removable

grub-install --no-uefi-secure-boot --removable --target=x86_64-efi --boot-directory=/tmp/usb-live/boot/ --efi-directory=/tmp/usb-efi /dev/sdX

用於舊版 BIOS 支持的 Syslinux

將 syslinux gptmbr.binbootloader 安裝到驅動器(下載 syslinux 或安裝包syslinux-common)。然後將 syslinux 安裝到 live 分區。

dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/mbr/gptmbr.bin of=/dev/sdX
syslinux --install /dev/sdX2

Isolinux 修復

重用原始 live ISO 的 isolinux 配置來使用 syslinux。

mv /tmp/usb-live/isolinux /tmp/usb-live/syslinux
mv /tmp/usb-live/syslinux/isolinux.bin /tmp/usb-live/syslinux/syslinux.bin
mv /tmp/usb-live/syslinux/isolinux.cfg /tmp/usb-live/syslinux/syslinux.cfg

核心參數

現在我們將實時系統文件複製到實際的讀寫文件系統,我們可以操作 grub 和 syslinux 配置。

將持久性核心參數添加到menu.cfggrub.cfgpersistence在這兩個文件中,在各自第一行的末尾添加關鍵字boot=live

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 persistence/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

設置鍵盤佈局核心參數。在這兩個文件中,在各自第一行的末尾添加關鍵字boot=live

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 keyboard-layouts=de locales=en_US.UTF-8,de_DE.UTF-8/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

蠐螬飛濺

修復 grub 啟動圖像(可選;我們將其移至另一個目錄)。

sed --in-place 's#isolinux/splash#syslinux/splash#' /tmp/usb-live/boot/grub/grub.cfg

解除安裝和清理

umount /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
rmdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso

為什麼這適用於 UEFI 和 BIOS

在 UEFI 模式下啟動時,PC 會掃描我們在 GPT 分區表中定義的 FAT 分區。第一個 FAT 分區帶有 UEFI grub 引導載入程序,找到它是因為它位於 UEFI 為可移動驅動器指定的路徑中(執行此操作的--removable開關grub-install)。無需 UEFI 啟動項即可執行,我們只需讓 PC 嘗試從 USB 驅動器啟動。該 grub 被配置為從那裡獲取它(載入 grub.cfg、顯示菜單等)。

當以 BIOS 模式啟動並選擇從 USB 驅動器啟動時,PC 將執行gptmbr.bin我們寫入 USB 驅動器保護 MBR 的引導載入程式碼。該引導載入程序查找標有legacy_boot標誌的 GPT 分區,並從該分區中鍊式載入 syslinux。然後 Syslinux 接管(載入 menu.cfg、顯示菜單等)。

加密持久性

與其在持久性分區上使用普通的 ext4,不如先用 LUKS 加密持久性分區(使用cryptsetup),然後用 ext4 格式化(使用正確的標籤)。但是,正如文件所述,實時系統必須包含該cryptsetup軟體包。否則,加密分區無法被直播系統解密。這意味著必須首先建構自定義的實時 ISO。但是,這超出了此答案的範圍。

歷史

--no-uefi-secure-boot選項以前不是呼叫的一部分grub-install。棒對我來說工作得很好,但是在我的機器上仍然禁用了安全啟動,但 Debian buster 停止了。

引用自:https://unix.stackexchange.com/questions/382817