U 盘上的 Ubuntu - 在 BIOS 和 UEFI 模式下启动

Cid*_*ori 5 partitioning boot grub2 usb uefi

我想在 U 盘上安装 Ubuntu,我可以插入(几乎)任何计算机并从中启动,并且我可以(几乎)正常使用,就好像它安装在该计算机上一样。我还想在上面有一个数据分区,(几乎)任何计算机都可以使用它,主要是为了存储一些便携式应用程序,以防万一。


有人告诉我,如果我在 BIOS 模式下安装 Ubuntu,我将无法在 UEFI 模式下从计算机启动,反之亦然。

由于我希望能够在任何计算机上启动,这是一个大问题。

在我的情况下,我该怎么做才能在 BIOS 或 UEFI 模式下启动计算机?

我一直在寻找解决方案,但其中大多数是针对与我不同的特定需求,因此很难从这些解决方案中提取最低要求以将它们应用于我的问题。

是否有一个简单、“干净”且非常通用的解决方案来解决这个问题?

我很感激有关为什么特定解决方案是好的或需要特定步骤的原因的一些解释。


我目前的设置:

  • U 盘:SanDisk Ultra Fit (32 Go)
  • 操作系统:Xubuntu 16.04 i386
  • 安装:完全安装(来自使用 Rufus 构建的 Live USB)
  • 驱动程序:无专有
  • 文件系统:
    • 分区表:GPT
      • 2: ESP , /boot/efi, 128 Mio, FAT32, [boot,esp]
      • 3:ABP、128 Mio、HFS+
      • 4: BBP , 2 Mio, [bios_grub]
      • 5:交换,512 Mio
      • 6:, /, 24 Gio, ext4,defaults,errors=remount-ro,lazytime,commit=60
      • 1:数据, /media/data, ~3.6 Gio, FAT32,defaults,lazytime,check=strict
    • 内存:
      • /tmp, tmpfs, defaults,nosuid,nodev,noexec,mode=1777
  • 交换:
    • vm.swappiness=5
    • 交换分区:512 Mio,以备不时之需
    • 内存
    • 交换文件:
      • /var/swap/hib.swp: 与 RAM 大小相同,用于休眠,由启动时的脚本生成
      • /var/swap/opt.swp: 如果需要,由脚本生成
  • 过度配置:~5.6%
    • 内置:~1.2 Gio(显然)
    • 添加:512 Mio
  • 调度程序: deadline

tob*_*ora 8

注意:这里我介绍了手动进行的方式。它有点复杂(并非不可能的想法),但您可以准确控制您想要/需要的东西。如果您什么都不了解,也许使用 MultiSystem 之类的软件对您来说会是更好的解决方案。

有两种方法可以创建这样的 USB 密钥。您可以使用 mdos/MBR 分区表或 GPT 分区表。两者各有优缺点,我先试着描述一下mdos版本,等有时间可能再来介绍GPT版本。

mdos/MBR 分区表

首先,请务必备份所有数据。如果您不知道自己在做什么,这些操作可能会很危险,如果您进行了错误的操作,可能会擦除硬盘驱动器,因此在输入命令之前一定要知道自己在做什么。

第 1 步:找到您的 USB 设备

使用命令

lsblk
Run Code Online (Sandbox Code Playgroud)

找到您的 USB 设备的名称。例如lsblk,您可以运行、插入您的密钥,然后再运行一次lsblk以查看发生了什么变化。出现的设备是您的钥匙,并且会注明有/dev/sdX

第 2 步:创建分区

您可以使用任何您喜欢的程序:gparted, fdisk, cfdisk(用于 的命令行工具fdisk)... 然后执行以下操作

  • 首先启动程序(sudo gpartedsudo fdisk /dev/sdX取决于您选择的程序)
  • 然后将您的设备重置为具有msdos分区表(在gparted“设备/创建新分区表”中,fdisk类型为o.
  • 然后创建三个分区。第一个是 FAT32,它将是数据的分区(也可以是 NTFS、ext 或任何其他文件系统),第二个是 EFI 分区(基于 FAT)并且必须是可引导的并且大约 150M,最后一个是带有iso的分区,并且必须是可引导的并且是FAT32(如果您使用ext2,则可以引导,但您将无法使用持久性)。这是您在流程结束时想要的东西(请注意标志(图中的褶皱),它们很重要):

分割结果

如果你想用 来创建它们fdisk,你应该有这样的东西:

$ sudo fdisk -l /dev/sdc
Disque /dev/sdc : 14,3 GiB, 15376000000 octets, 30031250 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x2d844503

Périphérique Amorçage    Début      Fin Secteurs Taille Id Type
/dev/sdc1                 2048 14682111 14680064     7G  b W95 FAT32
/dev/sdc2    *        14682112 14989311   307200   150M ef EFI (FAT-12/16/32)
/dev/sdc3    *        14989312 30031249 15041938   7,2G  b W95 FAT32
Run Code Online (Sandbox Code Playgroud)

为此,请执行以下步骤:

sudo fdisk /dev/sdX
o

n
p
1
<Enter>
+7G     # Or any size you want, just be sure to let arount 2G at the end of the device
t
b

n
p
2
<Enter>
+150M
t
ef

n
p
3
<Enter>
<Enter>
t
b

w

sudo mkfs.fat -F32 /dev/sdX1
sudo mkfs.vfat /dev/sdX2
sudo mkfs.fat -F32 /dev/sdX3
Run Code Online (Sandbox Code Playgroud)

第 3 步:挂载分区

现在,安装它们以在它们上面写字

mkdir /tmp/usb{2,3}
sudo mount /dev/sdX2 /tmp/usb2/
sudo mount /dev/sdX3 /tmp/usb3/
Run Code Online (Sandbox Code Playgroud)

第四步:在两个分区(EFI和非EFI)上安装grub

然后,您需要在两个分区上安装 grub。确保安装了 grub,然后运行:

sudo grub-install -v --no-floppy --boot-directory=/tmp/usb3 --target=i386-pc /dev/sdX
sudo grub-install -v --no-floppy --boot-directory=/tmp/usb2 --efi-directory=/tmp/usb2 --removable --target=x86_64-efi /dev/sdX
Run Code Online (Sandbox Code Playgroud)

第五步:复制iso文件并配置grub

然后将您的iso文件复制到以下文件夹中:

sudo cp <your iso file> /tmp/usb3/linux-iso
Run Code Online (Sandbox Code Playgroud)

并把grub配置在两个平配置/tmp/usb2/grub/grub.cfg/tmp/usb3/grub/grub.cfg(注:它可以在grub2 /的grub.cfg取决于你的grub版本)

insmod loopback
insmod iso9660

menuentry 'XUbuntu 16.04 "Xenial Xerus" - amd64' {
          set isofile="/linux-iso/xubuntu-16.04.1-desktop-amd64.iso"
          search --no-floppy --set -f $isofile
          loopback loop $isofile
          linux  (loop)/casper/vmlinuz.efi locale=fr_FR bootkbd=fr console-setup/layoutcode=fr iso-scan/filename=$isofile boot=casper file=/cdrom/preseed/ubuntu.seed noprompt ro quiet splash noeject --
          initrd (loop)/casper/initrd.lz
} 
Run Code Online (Sandbox Code Playgroud)

注意:你应该编辑这个文件以匹配好的iso文件,这里我们假设我们把文件放在 .iso 文件中/tmp/usb3/linux-iso/xubuntu-16.04.1-desktop-amd64.iso

重新启动,并在 UEFI 和非 UEFI 模式下尝试它:它应该可以工作,但你不应该有持久性!

第 6 步:添加单个持久性

添加持久性非常容易。这个想法是在第三个分区(实际上任何 FAT32 分区都可以接受)创建一个casper-rw包含一些 ext2 文件系统的空文件。然后它会被定位在iso文件的上面,这样如果系统被修改了,这个文件casper-rw就会记录这些修改。如果您只想记录家庭,那么执行完全相同的步骤,但使用文件名home-rw而不是casper-rw(如果您只关心文档数据,并且如果您希望避免后面解释的完全持久性问题,这可能很有用) . 最后,请注意,您可以在 ext2 中创建一个分区,而不是文件,其标签为casper-rwhome-rw 它会给出完全相同的结果,除了您将能够进行超过 4Gb 的修改(FAT32 系统中的最大大小)。

要创建文件,只需运行:

sudo dd if=/dev/zero of=/mnt/usb3/casper-rw bs=1M count=512
Run Code Online (Sandbox Code Playgroud)

(这里是512M,不过你可以把数据大小改到4G)

persistentlinux ...文件中添加行/mnt/usb{2,3}/grub/grub.cfg(修改两个文件)。它应该是这样的:

insmod loopback
insmod iso9660

menuentry 'XUbuntu persistent 16.04 "Xenial Xerus" - amd64' {
          set isofile="/linux-iso/xubuntu-16.04.1-desktop-amd64.iso"
          search --no-floppy --set -f $isofile
          loopback loop $isofile
          linux  (loop)/casper/vmlinuz.efi locale=fr_FR bootkbd=fr console-setup/layoutcode=fr iso-scan/filename=$isofile boot=casper persistent file=/cdrom/preseed/ubuntu.seed noprompt ro quiet splash noeject --
          initrd (loop)/casper/initrd.lz
}
Run Code Online (Sandbox Code Playgroud)

现在重启:你应该有坚持!您甚至可以像这样混合持久性和非持久性文件:

insmod loopback
insmod iso9660

menuentry 'XUbuntu 16.04 "Xenial Xerus" - amd64' {
          set isofile="/linux-iso/xubuntu-16.04.1-desktop-amd64.iso"
          search --no-floppy --set -f $isofile
          loopback loop $isofile
          linux  (loop)/casper/vmlinuz.efi locale=fr_FR bootkbd=fr console-setup/layoutcode=fr iso-scan/filename=$isofile boot=casper file=/cdrom/preseed/ubuntu.seed noprompt ro quiet splash noeject --
          initrd (loop)/casper/initrd.lz
}
menuentry 'XUbuntu persistent 16.04 "Xenial Xerus" - amd64' {
          set isofile="/linux-iso/xubuntu-16.04.1-desktop-amd64.iso"
          search --no-floppy --set -f $isofile
          loopback loop $isofile
          linux  (loop)/casper/vmlinuz.efi locale=fr_FR bootkbd=fr console-setup/layoutcode=fr iso-scan/filename=$isofile boot=casper persistent file=/cdrom/preseed/ubuntu.seed noprompt ro quiet splash noeject --
          initrd (loop)/casper/initrd.lz
}
Run Code Online (Sandbox Code Playgroud)

多重持久化

目前,密钥中的所有操作系统都具有相同的持久性文件。如果它casper-rw是共享的,如果可以破坏一切(一个操作系统中的数据与另一个操作系统中的数据无关)。要为每个系统拥有一个持久文件,很容易,将文件放在给定的文件夹中,例如persist/xubuntu

mkdir /mnt/usb3/persist/xubuntu/
sudo dd if=/dev/zero of=/mnt/usb3/persist/xubuntu/casper-rw bs=1M count=512
Run Code Online (Sandbox Code Playgroud)

并添加persistent persistent-path=/persist/xubuntugrub.cfg文件:

insmod loopback
insmod iso9660

menuentry 'XUbuntu persistent 16.04 "Xenial Xerus" - amd64' {
          set isofile="/linux-iso/xubuntu-16.04.1-desktop-amd64.iso"
          search --no-floppy --set -f $isofile
          loopback loop $isofile
          linux  (loop)/casper/vmlinuz.efi locale=fr_FR bootkbd=fr console-setup/layoutcode=fr iso-scan/filename=$isofile boot=casper persistent persistent-path=/persist/xubuntu file=/cdrom/preseed/ubuntu.seed noprompt ro quiet splash noeject --
          initrd (loop)/casper/initrd.lz
}
Run Code Online (Sandbox Code Playgroud)

您还可以注意到,我没有找到casper-rw为每个操作系统设置一个分区的方法,所以我没有看到如何为所有操作系统提供超过 4Gb 的多个持久性和持久性。如果有人有想法,我很高兴听到。也许分区安装可以暂时解决这个问题?

坚持的缺点

当您使用持久化时,您应该意识到升级可能是危险的。如果修改涉及内核,它确实会破坏你的系统,所以避免做太多的修改。而且,有时候换了电脑就不合适了,有人解释说换了网卡就断网了。如果您想升级您的系统,您应该考虑将它直接安装在 USB 密钥上(就像 USB 密钥是磁盘一样),但是如果您在需要专有软件的计算机上尝试您的密钥,则此方法可能会失败包含在已安装的操作系统中。如果有人有绕过这些缺点的解决方案,我会很高兴听到它。

来源

要配置 grub 以匹配其他系统,或者如果您想使用 GPT 而不是 MBR,您可能会对以下链接感兴趣:

享受吧,如果您有任何问题,请毫不犹豫地提出。