示例图片

示例图片

我想创建一个 64GB 多重启动 USB 驱动器。

我希望第一个分区是 32GB fat32 分区,这样我就可以用它从 Windows 访问文件。 (Windows 仅显示可移动驱动器上的第一个分区)。

然后我想在后面的分区上放置几个(或者更多,如果可能的话)Linux 发行版。

我假设我需要一个小的引导分区(最好是 syslinux)...但它不能是第一个分区。

我最好如何进行此设置?

我看过的所有用于制作多重引导 USB 的实用程序(Linux 和 Windows)都没有提供在分区表开头添加额外分区的选项。

答案1

以下要求计算机使用 BIOS 启动或支持某种形式的“传统”启动模式(兼容性支持模块)——至少我认为是这样:我没有使用 EFI 系统的经验。


创建可启动 USB 记忆棒系统Linux你:

  • 创建分区
  • 初始化分区上的文件系统
  • 将 syslinux 安装到分区上
  • 将 syslinux 分区标记为活动状态
  • 安装syslinux'硬盘代码

完成这些步骤后,您应该能够从 U 盘启动,并且在从 U 盘启动时,将看到 syslinux 启动提示符;在那里您可以发出命令来加载更多代码并继续启动过程。

为了不必在每次启动时输入长命令行,可以创建一个文件系统linux.cfg保存命令行,可能是多个。

通常还安装系统Linux模块通过将相应的 *.c32 文件复制到分区的 syslinux 目录中;这些模块的示例是:菜单.c32,链.c32

示例图片

由于我没有可用的 USB 记忆棒,因此我通过以下命令创建了一个 2GB 的映像作为示例:

dd if=/dev/zero of=example.img bs=1k count=2M

然后我通过运行以下命令将其附加到循环设备:

losetup --find --show example.img

该命令需要参数最大部分环形module 要设置为至少与映像文件中的分区数一样大的数字:

rmmod loop
modprobe loop max_part=10

如果循环模块内置于内核中,您可以指定最大部分作为内核的启动参数:

loop.max_part=10

或者,您可以使用以下方法kpartx设置循环设备:

kpartx -av example.img

分区的设备节点可以在下面找到/dev/映射器/。如果您使用kpartx并想要遵循该示例,您应该设置开发部分适当地可变。

变量

对于示例,我设置了以下变量:

# device node
dev=$(losetup --find --show example.img)
# set to e.g. /dev/mapper/loop0 when using kpartx
dev_part=${dev}

# loop devices use the letter 'p' to denote partitions (e.g. /dev/loop0p1)
# drives normally do not (e.g. /dev/sda1)
part_divider=p

# path to syslinux modules and mbr
libpath=/usr/lib/syslinux

# Path to mount point; used when e.g. files need editing
mount_point=/mnt

# The number of the partition that you use to share files with windows
files_part_nr=1
# The number of the boot partition
boot_part_nr=2
# The number of the partition that holds a linux distribution CD's content
dist_part_nr=3

作为示例分布,我选择了微型核心Linux:

# Download Tiny Core's iso and set variable "isofile" to its destination
# filename
isofile=$(curl -# -OJ -w '%{filename_effective}\n' "http://tinycorelinux.net/6.x/x86/release/TinyCore-current.iso")

卷曲命令执行以下操作:

  • -#在终端上用一个栏显示进度
  • -O将文件写入从 url 派生名称
  • -J从“Content-Disposition”标头而不是 url 派生名称
  • -w将文件名写入标准输出(将存储在变量“isofile”中)

创建分区

膜生物反应器

# Create an empty msdos style partition table
parted -s   "${dev}"   mktable  msdos

# Create two primary partitions (i.e. sdb1, sdb2)
# one holding your files and one for syslinux
parted -s   "${dev}"   mkpart   primary   fat32     0MB   800MB
parted -s   "${dev}"   mkpart   primary    ext2   800MB   900MB

GPT

# Create an empty gpt partition table
parted -s   "${dev}"   mktable  gpt

# Create two primary partitions (i.e. sdb1, sdb2)
# one holding your files and one for syslinux
parted -s   "${dev}"   mkpart   files   fat32     0MB   800MB
parted -s   "${dev}"   mkpart   boot     ext2   800MB   900MB

初始化文件系统

# DATA
mkfs.vfat   "${dev_part}${part_divider}${files_part_nr}"
# BOOT
mkfs.ext2   "${dev_part}${part_divider}${boot_part_nr}"

将 syslinux (extlinux) 安装到分区上

挂载启动分区并运行extlinux

mount   "${dev_part}${part_divider}${boot_part_nr}"   "${mount_point}"
mkdir   "${mount_point}/syslinux"
extlinux -i "${mount_point}/syslinux"

umount   "${mount_point}"

您可以选择分区上的任何其他目录来保存 syslinux 的文件:将文件放在根目录下:extlinux -i "${mount_point}";将文件放在名为的目录下/启动: extlinux -i "${mount_point}/boot"

系统Linux该命令如下所示(您应该不是安装启动分区):

syslinux -i -d /syslinux   "${dev_part}${part_divider}${boot_part_nr}"

将 syslinux 分区标记为活动状态

默认的 syslinux MBR 引导加载程序代码会搜索标记为活动的分区以传递控制权以查找卷引导记录加载。

膜生物反应器

# Mark boot partition as active (MBR)
parted "${dev}"   set   "${boot_part_nr}"   boot         on

GPT

# Mark boot partition as active (GPT)
parted "${dev}"   set   "${boot_part_nr}"   legacy_boot  on

如果你使用g磁盘要对驱动器进行分区,您需要通过点击激活“额外功能”,x以便能够“设置属性”( a)。

安装syslinux MBR代码

dd conv=notrunc bs=440 count=1 if="${libpath}/mbr/mbr.bin" of="${dev}"

对于您使用的 GPT 分区驱动器gptmbr文件代替引导文件bin

还有一个替代加载器替代文件bin不搜索标记为活动的分区,而是使用指定的分区;按照以下方式使用它:

print '\x2' | cat ${libpath}/mbr/altmbr.bin - | dd conv=notrunc bs=440 count=1 iflag=fullblock of=${dev}

开机

添加这一点,您应该能够从设备启动并收到 syslinux 启动提示符。

qemu-system-i386 -drive file="${dev}",format=raw

由于 syslinux 只能从同一分区加载文件,因此您还无法继续操作系统的引导过程。

通过链式加载加载 Linux 发行版

创建分区

创建另一个分区;运行(对于 MBR 类型分区):

parted    "${dev}"   mkpart   primary   ext2   900MB   100%

或使用(对于 GPT):

parted    "${dev}"   mkpart   distribution   ext2   900MB   95%

然后初始化文件系统:

mkfs.ext2 "${dev_part}${part_divider}${dist_part_nr}"

链式装载

系统Linux'链.c32模块允许您链式加载到卷引导记录另一个分区,可用于解决 syslinux 的限制,即只能加载加载分区的文件;这样一来,人们还可以重用 ISO 映像中包含的 syslinux/isolinux 配置文件。

为了能够使用链.c32您需要复制它及其依赖项的模块(libcom32.c32libutil.c32) 进入引导分区上的 syslinux 目录:

mount "${dev_part}${part_divider}${boot_part_nr}" ${mount_point}
cp "${libpath}/modules/bios/libcom32.c32" ${mount_point}syslinux/
cp "${libpath}/modules/bios/chain.c32" ${mount_point}/syslinux
cp "${libpath}/modules/bios/libutil.c32" ${mount_point}/syslinux
umount ${mount_point}

接下来解压 ISO 映像并重命名isolinux.cfg到 syslinux 所期望的名称:系统linux.cfg

mount "${dev_part}${part_divider}${dist_part_nr}" "${mount_point}"
7z x -o"${mount_point}" "${isofile}"
mv "${mount_point}/boot/isolinux/isolinux.cfg" "${mount_point}/boot/isolinux/syslinux.cfg"

我发现在清洁剂中也可以重命名isolinux/文件夹到系统Linux/,尽管这并不是绝对必要的;我还删除了一些不需要的文件:

mv "${mount_point}/boot/isolinux" "${mount_point}/boot/syslinux"
rm "${mount_point}/boot/syslinux/isolinux.bin"
rm -r "${mount_point}/[BOOT]"

TinyCore 的 iso 似乎丢失了libutil.c32(需要菜单.c32):

cp ${libpath}/modules/bios/libutil.c32 "${mount_point}/boot/syslinux"

在分区上安装 Bootloader 并卸载:

extlinux -i ${mount_point}/boot/syslinux
umount ${mount_point}

开机

当您现在启动映像时

qemu-system-i386 -drive file=${dev},format=raw

并在 syslinux 引导提示符下输入以下内容:

chain.c32 hd0 3

你应该受到微型核心Linuxsyslinux 菜单。

配置

挂载启动分区并创建系统linux.cfg文件:

mount ${dev_part}${part_divider}${boot_part_nr} ${mount_point}

cat >${mount_point}/syslinux/syslinux.cfg <<EOF
LABEL tc
MENU LABEL Boot TinyCore
COM32 chain.c32
APPEND hd0 3

umount ${mount_point}

在使用 GPT 格式分区的磁盘上,您可以使用分区的 GUID 或其标签,将guid=或传递label=链.c32:

APPEND label=<LABEL>

或者

APPEND guid=<GUID>

您可以使用blkid来查找两者标签指导


GRUB2

GPT

对于 GPT grub2 需要一个额外的分区来存储它的一些引导代码。您可以使用parted以下命令创建一个:

parted ${dev} grub_boot 95% 100%
parted ${dev} set bios_grub on

gdisk你选择的EF02作为分区的类型。

根据grub信息文档的最小大小应为 31KiB。

安装grub

mount ${dev_part}${part_divider}${boot_part_nr} ${mount_point}
# use --modules="part_gpt" for a gpt partition drive
grub-install -d ${mount_point} --modules="part_msdos ext2"
umount ${mount_point}

我不知道是否--modules绝对有必要——至少使用循环设备 grub 无法在没有它的情况下访问文件。

链式装载

在 grub 引导提示符下键入:

insmod chain
set root=(hd0,3)
chainloader +1
boot

你应该看到微型核心Linux再次进入 syslinux 菜单。

配置

为了微型核心Linux示例将以下内容放入引导分区上的 /grub/grub.cfg 中:

menuentry "Tiny Core Linux" {
    insmod chain
    set root=(hd0,3)
    chainloader +1
}

为了独立于驱动器列出的顺序,您可以通过 UUID 设置根;用。。。来代替set root

search --set root --fs-uuid <UUID>

用于blkid获取 UUID。

启动 ISO

一些发行版的 live CD 可以从 ISO 映像中挂载其文件系统;结合 grub 的loop功能,您可以执行以下操作(作为示例,我使用ArchLinux) 现场CD):

isofile=archlinux-2015.11.01-dual.iso

mount ${dev_part}${part_divider}${dist_part_nr} ${mount_point}

cp ${isofile} ${mount_point}

umount ${mount_point}

然后在您的中使用以下内容grub配置文件:

menuentry "Archlinux LiveCD" {
    insmod loopback

    set isofile="archlinux-2015.11.01-dual.iso"
    search --set isodrive --file /$isofile
    probe --fs-uuid --set uuid $isodrive

    loopback loop ($isodrive)/$isofile
    set root=loop

    echo "Loading kernel vmlinuz"
    linux /arch/boot/i686/vmlinuz img_loop=$isofile img_dev=/dev/disk/by-uuid/$uuid
    echo "Loading initial ramdisk archiso.img"
    initrd /arch/boot/i686/archiso.img
}

我在以下位置找到了 Archlinux ISO 所需的启动参数archiso git 树

答案2

我相信您正在寻找的工具是由美。我在 64G USB 驱动器上的设置几乎与您所指的完全相同。您没有指定是否希望这些是实时发行版还是完整安装,但这是我的个人设置:

使用 YUMI 指定的任何格式格式化的 64G USB 闪存驱动器(我忘记了,但我相信它是 Fat32 ——但这并不重要,因为它只是“开箱即用”)。在 YUMI 中,您可以选择多个 Linux ISO,这将使您能够从启动时选择的任何一个进行实时启动。

然而,需要注意的一件事是,如果您的 USB 驱动器当前不是 YUMI 喜欢的格式,它会将要需要相应地重新格式化驱动器,因此在重新格式化驱动器以安装您的第一个 Linux 发行版之前,请确保驱动器上当前没有存储任何重要文件。

YUMI 自动将这些发行版中的每一个存储在该 USB 驱动器根目录中名为 的目录中multiboot,其中包含与 YUMI 相关的所有内容以及运行 Linux 发行版所需的内容。您可以使用此 USB 驱动器的其余部分来存储您想要的任何内容。

就我个人而言,我有 win、osx 和 nix 文件夹,其中包含重要的工具和便携式应用程序,这些目录位于同一 USB 驱动器上,与多重引导目录相邻。如果我正常启动操作系统,然后插入此 USB 驱动器,我的所有文件都可以使用。

但是,如果我使用的是 Windows 计算机,我可以直接从该 USB 闪存驱动器引导到 YUMI 引导加载程序(我相信这是 GRUB 的定制形式),并且它允许我从所有实时引导程序中进行选择它已安装在多重引导目录中的发行版。我认为它甚至提供了正常启动 Windows 的选项,或者它可能只是一个退出选项,只需重新启动,然后我就可以从内部驱动器正常启动 Windows。

如果你想在重新启动时持久保留文件并像完整安装一样运行 Linux,我相信 YUMI 可以选择在驱动器上创建单独的静态分区,但它声称是有限的仅有的到Ubuntu。它可能也适用于 Debian,但我从未尝试过这种方法。话又说回来,我可能会将此特定功能与包含在其中的功能完全混淆。UNet启动程序,我上次使用的,不支持 YUMI 支持的所有多重启动选项。我个人认为YUMI是好多了比UNetbootin。

然而,应该知道,我在使用 YUMI 时确实遇到了一个缺点:

有一次,我通过 YUMI 安装了 Backtrack、Knoppix、Crunchbang 和 Linux Mint 的实时版本。几个月后,我想在 YUMI 中加载这个 USB 并删除 Backtrack 并将其替换为 Kali Linux,但 YUMI 告诉我他们已经升级了引导加载程序,因此,如果我想安装其他发行版,我会重新格式化驱动器并使用新的引导加载程序从头开始,这与我之前安装的使用旧引导加载程序的旧发行版不兼容。

这不会是一个大问题,但它会对tar我的普通文件的内容造成干扰,并将它们从 USB 中移出,然后重新安装我希望通过 YUMI 保留的所有其他 Live ISO。然而,如果你想有一个单独的分区来存储重新启动后的文件(就像我说的,我可能只是混淆了 UNetbootin 的一个功能,而不是 YUMI),那么这很可能是一个大问题。

话虽这么说,从你的具体问题来看,我相信 YUMI 应该充分有利于你想要实现的目的。这是一个很棒的工具,过去对我很有帮助。

答案3

无论您找到什么工具在开始时创建额外的引导分区,都会导致 Windows 出现问题,因为 Windows 只会显示第一个分区。但是,如果您不介意将 syslinux 文件放在 FAT32 分区的根目录中,则可以简单地在那里安装 syslinux。

这就是我要做的:

  1. 根据需要对驱动器进行分区,第一个分区是 32GB FAT32
  2. 使用 syslinux 逐一安装您喜欢的 Linux 发行版
  3. 安装每个发行版后,在某处备份其 syslinux 配置文件

完成后,您应该可以轻松启动您的最后一个发行版,并在其之前安装用于启动发行版的正确配置文件。然后你必须创建系统Linux菜单在其配置文件和链备份配置中启动您已安装的每个发行版。

答案4

在最新的硬件(2007 年及以上)上,USB 闪存驱动器没什么特别的(只是另一个硬盘驱动器)。因此,您可以使用Windows安装光盘将其格式化为常规的“小硬盘(MBR)”。你可以在第一个 32GB 主分区上安装 Windows(你可以使用 NTFS,因为 fat 不太适合这个大小),然后添加一个扩展分区,将其分割成 12GB 的块,然后像往常一样安装 Linux。您可以使用所有发行版共享且可安装的 /home 分区,并回收相同的 UID/GUID 以使您的主目录可移植。只需确保 Windows 和 Linux 都启用了所有 SSD 优化,并且不要完全填满拇指驱动器。

相关内容