这是一种创建具有持久性的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-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
将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_boot
flag和chainload syslinux 的GPT 分区。然后,Syslinux接管(加载menu.cfg,显示菜单等)。
加密的持久性
除了可以在持久性分区上不使用普通ext4之外,还可以先使用LUKS(使用cryptsetup
)对持久性分区进行加密,然后再使用ext4对其进行格式化(使用适当的标签)。但是,如文档所述,实时系统必须包括该cryptsetup
软件包。否则,实时系统将无法解密加密分区。这意味着必须先构建自定义实时ISO。但是,这超出了此答案的范围。
历史
该--no-uefi-secure-boot
选项以前不是调用的一部分grub-install
。摇杆对我来说很好用,但是即使我的机器上仍然禁用了安全启动,Debian破坏者也停止了使用。