UEFI + BIOS可启动实时Debian Stretch Amd64持久化


20

我目前在此问题上找到的所有信息都不足以满足我的口味。它要么已过时,令人误解甚至是错误的,但似乎过于复杂或没有涵盖这个特定问题。

目标:

  • 可启动USB驱动器(同时支持UEFI和旧版BIOS)
  • (基于)实时Debian 9(拉伸)
  • 持久性(默认情况下以及对于UEFI和旧版BIOS)
  • 默认为德语键盘布局
  • 适合对其他GNU / Linux系统进行故障排除

原因:

  • 每次使用都必须设置键盘布局真是令人头疼
  • 默认的Debian Live映像中缺少cryptsetup和efibootmgr
  • gnome-terminal默认情况下有这种令人讨厌的白色背景

没有解决方案:

  • (重新)构建自定义的debian live图像(看起来很乏味,尽管我还没有尝试过)
  • unetbootin(在debian Stretch上启动时询问未知密码,我认为它仍然不支持UEFI)
  • 一些国外的自动化过程,我看不到发生了什么

Debian实时映像和安装映像是混合的,可以使用方便地将其写入阻止设备dd。而且它们确实可以通过USB驱动器工作,这非常好!但是,如果不编辑grub和isolinux配置(默认包含在实时ISO映像的非常只读的ISO9660文件系统中),则默认情况下将没有持久性,也没有方法以默认的非英语键盘布局开始。因此,即使将实时ISO写入USB驱动器之后,这些参数仍然无法更改。

Answers:


30

这是一种创建具有持久性的Debian live USB驱动器的方法。它将允许安装缺少的软件包,从那时起,将使用持久性在每次实时启动中都可用。因为我们在具有读写功能的文件系统上重新创建了实时ISO映像文件系统的内容,所以我们可以更改引导加载程序配置以启用持久性并在引导时设置键盘布局。

经过测试,这里描述的步骤可以在Debian Stretch和Buster上工作以创建Debian Stretch动态图像。

涉及很多步骤,但看来此方法仍然非常有效。

免责声明:您将丢失目标USB驱动器上的数据,如果您弄乱了以下命令,此后您可能会感到非常抱歉。我对您的行为不承担任何责任。

感觉很幸运

如果您今天感到特别幸运,可以尝试使用bash脚本为您自动化该过程。将其ISO映像路径作为第一个参数,并将USB驱动器块设备名称作为第二个参数。请注意,此脚本极具危险性,您必须先阅读和理解它,然后才能执行它。

TL; DR

获取Debian实时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在持久性分区上使用,我们需要标签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

persistence.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

Syslinux支持旧版BIOS

将syslinux gptmbr.bin引导加载程序安装到驱动器上(下载syslinux或安装软件包syslinux-common)。然后将syslinux安装到活动分区。

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

Isolinux修复

重用原始实时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.cfg和中grub.cfg。在两个文件中,将关键字添加到persistence相应第一行的末尾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

rub飞溅

修复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_bootflag和chainload syslinux 的GPT 分区。然后,Syslinux接管(加载menu.cfg,显示菜单等)。

加密的持久性

除了可以在持久性分区上不使用普通ext4之外,还可以先使用LUKS(使用cryptsetup)对持久性分区进行加密,然后再使用ext4对其进行格式化(使用适当的标签)。但是,如文档所述,实时系统必须包括该cryptsetup软件包。否则,实时系统将无法解密加密分区。这意味着必须先构建自定义实时ISO。但是,这超出了此答案的范围。

历史

--no-uefi-secure-boot选项以前不是调用的一部分grub-install。摇杆对我来说很好用,但是即使我的机器上仍然禁用了安全启动,Debian破坏者也停止了使用。


1
我刚刚在这里创建了一个帐户,以感谢您。优秀的手册。小建议-将持久分区加密是很好的。
彼得·哈维利切克

1
@PetrHavlicek对。我认为这很容易做到,但是自从与其他问题一起创建此问与答以来,我都花了业余时间,因此我仍然不得不重新考虑这个想法(并感谢您的赞赏:)。
schlimmchen

很棒!不过,有些额外的解释会很好。(确保您可以在手册页上查找所有内容,但是,例如,mktable虽然与mklable相同,但未真正记录为此类,等等)
mikuszefski

是否可以在FAT格式的USB记忆棒上仅包含一个持久卷的文件?可以通过循环挂载文件来实现。但是,如何告诉Debians initrd使用文件而不是分区呢?
ceving

为此,请参见debian-live.alioth.debian.org/live-manual/stable/manual/html/…。简而言之:在任何文件系统的根目录中创建一个图像(稀疏)文件,将该文件命名为“ persistence”并对其进行格式化,例如,使用ext4。
schlimmchen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.