Partition

帶有額外第一個分區的多重引導 USB

  • December 2, 2015

我想創建一個 64GB 的多重引導 USB 驅動器。

我希望第一個分區是 32GB fat32 分區,這樣我就可以用它來從 Windows 訪問文件。(Windows 僅顯示可移動驅動器上的第一個分區)。

然後,我想在以後的分區上放置幾個(或更多)Linux 發行版。

我假設我需要一個小的引導分區(最好是 syslinux)……但它不能是第一個分區。

我將如何最好地進行此設置?

我看過的所有用於製作多重引導 USB 的實用程序(linux 和 windows)都沒有提供在分區表的開頭有一個額外分區的選項。

我相信您正在尋找的工具是YUMI。我在 64G USB 驅動器上的設置幾乎完全相同。您沒有指定是否希望這些是 Live 發行版或完整安裝,但這是我的個人設置:

使用 YUMI 指定的任何格式格式化的 64G USB 快閃記憶體驅動器(我忘記了,但我相信它是 Fat32 ——但這並不重要,因為它只是“開箱即用”)。在 YUMI 中,您可以選擇多個 Linux ISO,這將使您能夠從您在啟動時選擇的任何一個進行 Live Boot。

但是,需要注意的一點是,如果您的 USB 驅動器目前不是 YUMI 喜歡的格式,則需要相應地重新格式化驅動器,因此在重新格式化之前確保任何重要文件目前未儲存在驅動器上安裝您的第一個 Linux 發行版。

YUMI 自動將這些發行版中的每一個儲存在該 USB 驅動器的根目錄中名為 的目錄中multiboot,其中包含與 YUMI 相關的所有內容以及執行 Linux 發行版所需的內容。您可以使用此 USB 驅動器的其餘部分來儲存您想要的任何內容。

就我個人而言,我有包含重要工具和攜帶式應用程序的 win、osx 和 nix 文件夾,這些目錄位於同一個 USB 驅動器上,就在 multiboot 目錄旁邊。如果我正常啟動到作業系統,然後插入這個 USB 驅動器,我的所有文件都可以使用。

但是,如果我在 Windows 機器上,我可以直接從這個 USB 快閃記憶體驅動器啟動到 YUMI 引導載入程序(我相信它是 GRUB 的一種定制形式),它允許我從所有現場選擇它已安裝在 multiboot 目錄中的發行版。我認為它甚至提供了正常啟動 Windows 的選項,或者它可能只是一個退出選項,它只是重新啟動,然後我可以從內部驅動器正常啟動 Windows。

如果你想在重啟後持久保存文件並像完整安裝一樣執行 Linux,我相信 YUMI 可以選擇在驅動器上創建一個單獨的靜態分區,但它聲稱僅限於 Ubuntu。它也可能適用於 Debian,但我從未嘗試過這種方法。再說一次,我可能會將此特定功能與UNetbootin中包含的功能完全混淆,我上次使用它不支持 YUMI 支持的所有多引導選項。在我個人看來,YUMI比 UNetbootin要好得多。

然而,應該知道,我在使用 YUMI 時確實遇到了一個缺點:

有一次,我通過 YUMI 安裝了 Backtrack、Knoppix、Crunchbang 和 Linux Mint 的實時版本。幾個月後,我想在 YUMI 中載入這個 USB 並刪除 Backtrack 並用 Kali Linux 替換它,但是 YUMI 告訴我他們已經升級了他們的引導載入程序,因此,如果我想安裝額外的發行版,我會重新格式化驅動器並使用他們的新引導載入程序從頭開始,這與我之前安裝的使用舊引導載入程序的舊發行版不兼容。

這不是什麼大不了的事,但是這對我的普通文件的內容來說會很煩人,tar把它們從 USB 上移開,然後重新安裝我希望通過 YUMI 保留的所有其他 Live ISO。但是,如果您想在重新啟動時使用單獨的分區來儲存文件(就像我說的,我可能只是與 UNetbootin 的一個功能混淆,而不是 YUMI),那麼它很可能會破壞交易。

話雖如此,從您的具體問題來看,我相信 YUMI 應該充分有利於您所尋求實現的目標。這是一個很棒的工具,過去對我很有幫助。

以下要求電腦使用 BIOS 來引導或支持某種形式的“傳統”引導模式(兼容性支持模組)——至少我認為可以:我沒有使用 EFI 系統的經驗。


要使用syslinux創建可啟動的 USB 記憶棒,請執行以下操作:

  • 創建分區
  • 初始化分區上的文件系統
  • 將 syslinux 安裝到分區上
  • 將 syslinux 分區標記為活動的
  • 安裝 syslinux 的mbr程式碼

完成這些步驟後,您應該能夠從 U 盤啟動,並且在從 U 盤啟動時,會看到 syslinux 啟動提示;在那裡您可以發出命令以載入更多程式碼並繼續啟動過程。

為了不必在每次啟動時輸入長命令行,可以創建一個文件syslinux.cfg來保存命令行,可能是多個。

通常也可以通過將相應的 .c32 文件複製到分區的 syslinux 目錄來安裝syslinux 模組;*這些模組的範例是:menu.c32chain.c32

範例圖像

由於我周圍沒有免費的 USB 記憶棒,我通過發出以下命令為範例創建了一個 2GB 的圖像:

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

然後我通過執行將其連接到循環設備:

losetup --find --show example.img

此命令要求將循環模組的參數max_part設置**為至少與映像文件中的分區數一樣大的數字:

rmmod loop
modprobe loop max_part=10

如果循環模組內置在核心中,您可以將max_part指定為核心的引導參數:

loop.max_part=10

或者,您可以使用kpartx設置循環設備:

kpartx -av example.img

分區的設備節點可以在*/dev/mapper/下面找到。如果您使用kpartx並希望遵循該範例,則應適當設置dev_part*變數。

變數

對於範例,我設置了以下變數:

# 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

作為範例發行版,我選擇了Tiny Core 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")

curl命令執行以下操作:

  • -#在終端上顯示進度條
  • -O從 url 派生名稱將文件寫入 a
  • -J從“Content-Disposition”標頭而不是 url 派生名稱
  • -w將文件名寫入標準輸出(將儲存在變數“isofile”中)

創建分區

MBR

# 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}"; 將文件放在名為*/boot*的目錄下:extlinux -i "${mount_point}/boot"

使用syslinux,命令如下所示(您不應該安裝引導分區):

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

將 syslinux 分區標記為活動的

預設的 syslinux MBR 引導載入程式碼搜尋標記為活動的分區以傳遞控制以找到要載入的捲引導記錄。

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

如果您使用gdisk對驅動器進行分區,您需要通過點擊來啟動“額外功能” x,以便能夠“設置屬性”(a)。

安裝 syslinux MBR 程式碼

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

對於 GPT 分區驅動器,您使用gptmbr.bin而不是mbr.bin

還有一個替代載入器altmbr.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}"

鍊式載入

Syslinux 的chain.c32模組允許您鍊式載入到另一個分區的捲引導記錄,這可用於解決 syslinux 的限制,即只能載入載入分區的文件;這樣一來,人們還可以重用 ISO 映像中包含的 syslinux/isolinux 配置文件。

為了能夠使用chain.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 期望的名稱:syslinux.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/文件夾重命名為syslinux/,儘管這不是絕對必要的;我還刪除了一些不需要的文件:

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(需要menu.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

您應該會看到Tiny Core Linux syslinux 菜單。

配置

掛載引導分區並創建一個syslinux.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=chain.c32

APPEND label=<LABEL>

或者

APPEND guid=<GUID>

您可以使用blkid來查找labelguid


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

您應該會再次看到Tiny Core Linux syslinux 菜單。

配置

對於Tiny Core 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)Live 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.cfg中使用以下內容:

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
}

我在archiso git tree中找到了 Archlinux ISO 所需的引導參數。

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