我目前找到的有关此事的所有信息都不足以满足我的口味。它要么已经过时,要么具有误导性,甚至是错误的,要么看起来过于复杂,要么没有涵盖这个具体问题。
目标:
- 可启动 USB 驱动器(支持 UEFI 和旧版 BIOS)
- (基于)live Debian 9(stretch),或者buster或者bullseye
- 持久性(默认情况下,适用于 UEFI 和旧版 BIOS)
- 默认德语键盘布局
- 适合对其他 GNU/Linux 系统进行故障排除
理由:
- 每次使用时都必须设置键盘布局真是令人头疼
- 默认 Debian Live 映像中缺少 cryptsetup 和 efibootmgr
- gnome-terminal 默认有这个烦人的白色背景
无解决方案:
- (重新)构建自定义 debian live 镜像(看起来很乏味,虽然我还没有尝试过)
- unetbootin(在 debianstretch 上启动时要求输入未知密码,我认为它无论如何都不支持 UEFI)
- 一些外国的自动化流程,我看不到发生了什么
Debian 实时和安装映像是 isohybrid 的,可以使用 方便地写入块设备dd
。它们确实可以通过 USB 驱动器工作,这非常好!但是,如果不编辑 grub 和 isolinux 配置(包含在实时 ISO 映像的只读 ISO9660 文件系统中),则不会有持久性,也无法默认使用非英语键盘布局。因此,即使将 live ISO 写入 USB 驱动器后,这些参数仍然无法更改。
答案1
请注意,以下内容对 Debian bookworm 不再起作用(原因如下)。
这是一种创建持久性 Debian live USB 驱动器的方法。它将允许安装缺失的软件包,从那时起,这些软件包将在每次实时启动时使用持久性可用。因为我们在具有读写能力的文件系统上重新创建实时 ISO 映像文件系统内容,所以我们可以更改引导加载程序配置以启用持久性并在引导时设置键盘布局。
此处描述的步骤经过测试,可在 Debian Stretch 上使用,并使用 Buster 和 Bullseye 创建 Debian Stretch 实时映像。
虽然涉及的步骤很多,但是看起来这个方法还是蛮高效的。
免责声明:您将丢失目标 USB 驱动器上的数据,如果您搞乱了下面的命令,您可能会感到非常遗憾。我不对你的行为负责。
感觉很幸运
如果你今天感觉特别幸运的话,可以尝试一下bash 脚本为您自动化该过程。将您的 ISO 映像路径作为第一个参数,将 USB 驱动器块设备名称作为第二个参数。注意这个脚本是极其危险并且在没有首先阅读和理解它的情况下不应该执行它。
长话短说
获取 Debian live ISO 映像,安装软件包 ( apt install syslinux parted
),然后执行以下操作:
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 4GiB
parted /dev/sdX --script mkpart persistence ext4 4GiB 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 4GiB
parted /dev/sdX --script mkpart persistence ext4 4GiB 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 文件系统内容复制到实时分区。
cp -ar /tmp/live-iso/* /tmp/usb-live
持久化配置文件
使用所需的配置文件准备持久性文件系统。如果没有此文件,持久性功能将无法工作。
echo "/ union" > /tmp/usb-persistence/persistence.conf
Grub 支持 UEFI
安装 grub2 以支持 UEFI 引导(这需要grub-efi-amd64-bin
Debian 上的软件包)。我们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 支持
将 syslinuxgptmbr.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
幼虫飞溅
修复 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 的引导加载程序代码。该引导加载程序会查找标有 标志的 GPT 分区legacy_boot
,并从该分区加载 syslinux。然后 Syslinux 接管(加载 menu.cfg、显示菜单等)。
加密持久化
可以首先使用 LUKS 加密持久分区(使用cryptsetup
),然后使用 ext4 对其进行格式化(使用正确的标签),而不是在持久分区上使用纯 ext4。然而,作为文档说,实时系统必须包含该cryptsetup
包。否则,加密分区将无法被实时系统解密。这意味着必须首先构建自定义的实时 ISO。然而,这超出了这个答案的范围。
历史
该--no-uefi-secure-boot
选项以前不是调用的一部分grub-install
。该棒对我来说工作得很好,但随着 Debian buster 的出现,这种情况就停止了,尽管我的机器上仍然禁用了安全启动。
注意到这种方法对 Debian 书虫不再起作用。 ISO 映像中引入了符号链接,无法在 FAT 文件系统上复制。将实时文件系统更改为 ext* 时,我们需要不同的引导加载程序链。此外,isolinux 启动菜单也进行了重构,这需要调整sed
设置持久性和区域设置标志的命令。