一些背景:
- 来自主要 Windows 背景(尽管我熟悉 Ubuntu 等)并使用 Windows 7 机器来完成此任务
- 已将 GRUB 成功安装到 USB 驱动器(8 GB FAT32 驱动器)的 MBR 中:
- 已在驱动器上创建了基本结构:/boot/grub、/boot/img、/boot/kernel
问题:
我有一些基本的初学者问题,但我无法通过 Google / StackExchange 等找到答案。
- 我知道 /boot/img/[SystemName] 文件夹将存储特定系统的映像,该系统可能使用存储在 /boot/kernel 目录中的各种(或相同)版本的 linux 内核(至少,我就是这样)想要设置一下)
- 然而,大多数这些系统在其目录中只有一个名为“linux”的内核(未说明版本)。我可以找到它们都使用哪个内核,但是将内核本身复制到 /boot/kernel 的最佳位置是什么?
- 获得内核后,我想剩下的大部分工作就是将设备复制到 /boot/img/ 并在 menu.lst 中创建正确的条目,对吗?一旦我可以获得可供参考的内核,我就可以逐个系统地执行此操作。
总体的目标:
我正在尝试创建一个 8GB USB 闪存驱动器,它允许我从 GRUB 启动菜单启动多个操作系统。要添加或减少操作系统,我只需将相应的文件复制到 /boot/img/[SystemName] 和 /boot/kernel 文件夹(根据需要),然后编辑 menu.lst 文件。因此,第一步是找到许多操作系统共享的内核,因为我希望减少重复。
答案1
您想要实现的是扩展引导技术:)但是我认为这是可能的,尽管我的知识不足以提供完整的演练。
首先,正如之前所说,发行版有非常不同的要求。其次,另一方面,好的事情是,您还可以找到需要最低要求的发行版。
我建议使用 GRUB4DOS 作为引导加载程序。看到这个关联如何将其与 USB 一起使用(因为它具有 find --set root -- 命令,如果您有 USB 等移动设备,这一点很重要)。
然后您必须决定要使用多少个分区。标准“完整安装”始终位于单个分区中。因此,如果您有一个 8 GB USB 记忆棒并使用 4 GB 分区(允许最小化安装),您将仅限于 Debian 或 Fedora 等主要发行版的 2 个不同的“完整安装”。
然而,有一些小型且专门的 Linux 发行版。例如“Puppy Linux”非常小,并且有特殊的“节俭安装”模式。它有多种风格(例如,MacPup 试图实现类似 Apple 的桌面,或者 Fatdog64,它是 64 位 Linux)。
在这种“节俭安装”模式下,它仅使用 1 个目录,并且可以与硬盘(或 USB)上的现有 Linux 或 Windows 并行安装。我确信还有其他发行版支持类似的模式。
由于 Puppy Linux 很小(< 150 MB),并且假设您为每次安装保留一个小保存文件(512 MB),您可以轻松地在 USB 记忆棒上安装 10 个不同的操作系统。还有更小的 Linux(Slitaz、Tinycore)可供您使用。
例如,我附加了当前 PC 安装中的 menu.lst (GRUB4DOS) 文件,前 8 个条目都是不同的 Puppy Linux 安装在 hd0,2 上(即第 1 个硬盘上的第 3 个分区),然后有一个最小的Debian 安装在一个小的额外分区中,还有原始的 Windows-XP。
timeout=10
default=0
title Linux Buero (on /dev/sda3)
root (hd0,2)
kernel /puppy431-de/vmlinuz psubdir=puppy431-de pkeys=de ro vga=normal
initrd /puppy431-de/initrd.gz
title Live CD build (on /dev/sda3)
root (hd0,2)
kernel /puppylivecdbuild/vmlinuz psubdir=puppylivecdbuild ro vga=normal
initrd /puppylivecdbuild/initrd.gz
title sage developement(on /dev/sda3)
root (hd0,2)
kernel /Sage46dev/vmlinuz psubdir=Sage46dev pfix=nocopy ro vga=normal
initrd /Sage46dev/initrd.gz
title sage developement test and fun
root (hd0,2)
kernel /Sage-test/vmlinuz psubdir=Sage-test pfix=nocopy,noram ro vga=normal
initrd /Sage-test/initrd.gz
title Lupq 511
find --set-root --ignore-floppies /lupq511/initrd.gz
kernel /lupq511/vmlinuz psubdir="lupq511" pfix=nocopy pkeys=de ro vga=normal
initrd /lupq511/initrd.gz
title Lupu 520 - New kid on the block
find --set-root --ignore-floppies /lupu-520/initrd.gz
kernel /lupu-520/vmlinuz psubdir="lupu-520" pfix=nocopy pkeys=de ro vga=normal
initrd /lupu-520/initrd.gz
title wary beta (on /dev/sda3)
root (hd0,2)
kernel /wary/vmlinuz psubdir=wary ro vga=normal
initrd /wary/initrd.gz
title spup (on /dev/sda3)
root (hd0,2)
kernel /spup/vmlinuz psubdir=spup ro vga=normal
initrd /spup/initrd.gz
title Debian (on /dev/sda2)
find --set-root --ignore-floppies /initrd.img
kernel /vmlinuz root=/dev/sda2 ro
initrd /initrd.img
title Windows NT/2K/XP\nStart Windows if installed on HDD
fallback 7
find --set-root --ignore-floppies /ntldr
chainloader /ntldr
boot
USB 上的 menu.lst 可能看起来类似,
find --set-root --ignore-floppies /lupq511/initrd.gz
如果您使用 USB,GRUB4DOS 命令(在所有驱动器中查找此文件)可能非常有用,因此您不必为驱动器使用固定条目。
根据上述信息,对您原来的问题进行一些评论:
问: * 据我所知, /boot/img/[SystemName] 文件夹将存储特定系统的映像,该系统可能使用存储在 /boot/kernel 目录中的各种(或相同)版本的 Linux 内核(至少,这就是我想要的设置方式)
答:我不确定这是否可行,因为大多数主要发行版都希望拥有其分区的独占权并为其文件安装特定的目录结构。在我看来,最好尊重默认设置并提供发行版所期望的内容,即有些需要独占分区,有些则只需要共享分区上的目录即可。我并不是说不可能以非默认方式将多个操作系统安装到 1 个分区,但它会带来麻烦,并且在我看来对于 Linux 新手来说不切实际。我在帖子底部提到了一个可能的解决方法(“Wubi-like”安装)。
问:* 然而,大多数这些系统在其目录中只有一个名为“linux”的内核(未说明版本)。我可以找到这些都使用哪个内核,但是将内核本身复制到 /boot/kernel 的最佳位置是什么?
答:我认为内核应该正好放在发行版通常有它们的地方。没有必要将它们存储在单独的 /boot/kernel 文件夹中,而且我也不建议尝试在发行版之间共享它们。内核的存储空间很小(例如 2-3 MB)。确实有很多版本和子版本,有时甚至有应用于发行版内核的特定补丁。插入不同/未经测试的内核是一个不必要的实验。
问:* 获得内核后,我想剩下的大部分工作就是将设备复制到 /boot/img/ 并在 menu.lst 中创建正确的条目,对吗?一旦我可以获得可供参考的内核,我就可以逐个系统地执行此操作。
答:如前所述,最好为那些需要它们的发行版创建单独的分区,并将不那么贪婪的发行版混合在它们自己的文件夹中。将内核、initrd 和发行版的其余部分视为一个单元。
最后一个想法。如果您不想使用不同的分区,您可以尝试类似“WUBI”安装的发行版,要求将其完整安装到其自己的分区。这意味着您可以在 USB 上创建具有自己的 ext2/ext3 文件系统的大文件,然后将它们安装为“驱动器”并将操作系统安装到其中。 (我称之为 WUBI,因为这是最著名的应用程序)。
以下应该是引导“Wubi install”的 Grub4dos menu.lst 条目。
# Add the ntfs module - just needed for Installation on a Windows Partition
insmod ntfs
# Set root (normally would be sda1, or hd0,1 Change as necessary
set root=(hd0,1)
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz root=/dev/sda1 loop=/ubuntu/disks/root.disk ro
initrd /boot/initrd/initrd.img
boot
从这里。
你看,有2个“set root”命令,包含Linux的“root.disk”之后的第二个命令被挂载为loop0。
我希望我能给出一些想法,尽管这不是完整的演练。
答案2
这里有两个指南:
我认为两者都为每个内核使用单独的分区。
中的条目“/boot/grub/菜单.lst”是这样的:
title Unity-2010 -- With Persistence
kernel (hd0,0)/isolinux/vmlinuz vga=788 livecd=livecd fromusb
root=Label=Unity-2010 changes_dev=LABEL=Unity-2010 acpi=on fstab=rw,noauto
initrd (hd0,0)/isolinux/initrd.gz
title Unity-2010 -- No Persistence
kernel (hd0,0)/isolinux/vmlinuz vga=788 livecd=livecd fromusb
root=Label=Unity-2010 acpi=on fstab=rw,noauto
initrd (hd0,0)/isolinux/initrd.gz
答案3
这实际上取决于您放在那里的发行版。其中一些在 initramfs 中做了一些令人讨厌的事情,所以这变得很困难。一些实时发行版搜索标签,一些搜索 uuid。你不能提供那个。
解决方案并不容易,您应该为您的实时发行版构建新的定制 ramdisk。
我希望我没有弄错:D
答案4
您肯定需要某种用户空间来配合每个内核。 (程序、配置、工作。)传统上,您将使用至少每个单独的操作系统都有一个分区,并且 GRUB 分区本身将被挂载为 /boot (因此实际上,您不会将 boot 作为该分区的子目录;它将是根目录,而 grub/ 作为子目录。 )