在单个分区中安装多个 Linux 发行版

在单个分区中安装多个 Linux 发行版

我目前使用的是 Ubuntu 13.04、elementaryos 和 Windows 8。我还想安装 Backtrack 以供偶尔使用。但是,我已经超出了分区限制。那么,是否可以合并两个分区并在其中安装所有 Linux 发行版单分区共享交换

答案1

本书的写作目的是便于读者从头到尾阅读、略读或跳过部分章节。不过,我强烈建议读者阅读最后一部分(“你可能根本不会受到 4 个分区的限制“),然后再决定做什么,以防您有一个 GPT 格式的磁盘或不受 4 个分区限制。

同一分区上有多个“文件系统”:...可能

在同一个分区安装多个Linux系统可能是可能的,但需要对系统进行大量修改,才能使它们访问正确的文件。

例如,不同的操作系统通常会使用不同的可执行文件init。但的可执行文件init始终应该存在于/sbin/init。对于此问题和类似问题,您至少必须让系统使用高度自定义的内核启动参数。要解决某些问题,您可能必须手动重新编译内核。您还必须更改安装库的默认位置以及在使用库的程序运行时查找库的位置,以便安装在一个操作系统中的程序不会使用另一个操作系统的同一库的不同版本(有时会不兼容)。要使包管理器按预期工作,您可能必须编辑其源代码并重新编译(这意味着您无法更新他们以正常方式)。

原则上,这一切都是可能的。实际上,这可能是不可能的:你很可能永远无法让它达到可接受的稳定水平。然而,如果你真的想尝试这一点,你可能想要研究修改系统的可能性,以便它们chroot分成单独的chroot 监狱在启动初期。我相信这是可能的,并且可以提供必要的稳定性。也许其他人会发布带有具体解决方案的答案。

共享交换:非常简单,但您可以使用一个或多个交换文件,而不用交换分区!

相反,您可以而且很容易让不同的 GNU/Linux 操作系统使用相同的交换分区。一般来说,您无法让一个系统休眠并启动另一个系统,但很多人根本不使用休眠。

无论如何,如果你想减少使用的分区数量,你可以彻底废除交换分区使用交换文件反而(您甚至可以使用同一个交换文件进行多个操作系统交换。)

但你应该实际上如果分区数量限制为 4 个,则这样做......

...创建扩展分区。它充当分区的容器,让您有效地拥有四个以上的分区在分区表类型仅支持 4 个“主”分区的磁盘上

为此,请从实时 CD/DVD/USB 闪存驱动器启动并运行 GParted。如果您已经有四个分区,则必须先删除一个分区。这可以是交换分区,因为virtualxtc 建议——前提是您没有休眠。(因此,在执行此操作之前,请先关闭或重新启动,而不是休眠。)

以下是一些屏幕截图,展示了创建扩展分区的简单情况。(当然,这里的大小是不切实际的,因为我使用了一个小型闪存驱动器来创建屏幕截图。)

创建扩展分区

右键单击未分配空间(在代表磁盘的水平栏中,或其下方的列表中),然后单击新的

  • 或者(左键)单击它并在菜单中单击分区 > 新建。
  • 或者(左键)单击它并按插入钥匙。

这将打开上面显示的窗口。单击创建为并选择扩展分区. (默认情况下主分区,这不是您想要的。)

使扩展分区达到最大大小。

现在,您可以根据需要在扩展分区内创建其他分区,从而绕过 4 个分区的限制。

你可以像在 GParted 中创建任何分区一样执行此操作...只需里面扩展分区,充当其他分区的容器。这些分区称为“逻辑分区”,以区别于不包含在扩展分区内的“主分区”。

完成此操作后,它将看起来像这样(然后您可以单击工具栏中的复选标记,执行编辑>应用所有操作,以应用您的更改。

GParted 屏幕截图显示了要在扩展分区内创建的分区

与往常一样,在执行任何分区之前,最好确保至少所有重要文件(例​​如文档)都已备份。

最后,你也许不是真的完全被限制为 4 个分区!

众所周知,分区在使用前会进行格式化。但磁盘本身也经过了某种“格式化”。分区格式决定了它们可以存储什么类型的数据以及数据(通常是文件)的存储方式。但磁盘是通过分区表和其他信息进行“格式化”的。分区表不止一个种类分区表。“msdos”分区表(有时称为“msdos disklabel”或“MBR 分区表”,尽管在其他情况下使用“MBR”)仅限于四个主分区。

但其他一些分区表类型则完全不受此限制,您可能正在使用此类类型。当然,如果 GParted 已经告诉您无法创建另一个主分区,但情况不太可能如此。

但如今许多硬盘,尤其是装有 Windows 8 的磁盘(尤其是预装的磁盘)和大于 2 TB 的磁盘,都经过格式化谷氨酰胺磷酸酶

GPT(GUID 分区表)不会限制您只能创建四个分区;您可以创建更多分区,而无需付出任何特殊努力或采取任何变通方法。因此,如果您还没有尝试过,我建议您这样做。有时人们认为他们被限制为四个,但实际上有一个 GPT 磁盘,并且根本没有限制。

要查明您是否具有“msdos”分区表或其他限制较少的分区表类型,一种方法是尝试创建第五个分区(不将其放在扩展分区内——除“msdos”分区表外,通常不可能创建扩展分区)。

另一种方法是直接在 GParted 中检查。为此,请单击查看 > 设备信息。分区列表左侧的磁盘水平表示下方将出现一个 **设备信息* 窗格。

GParted 屏幕截图显示分区表的类型为 msdos

相反,如果您有 GPT 磁盘,您将看到“gpt”而不是“msdos”。(还有其他类型的分区表,在 PC 上,GPT 和“msdos”是最有可能的。)

GParted 屏幕截图显示分区表类型为 gpt

请注意,虽然可以在 GParted 中将具有“msdos”分区表的磁盘转换为 GPT 磁盘(使用设备 > 创建分区表...),这样做将“擦除”磁盘上的所有数据!(这就是为什么我不推荐将其作为解决你的问题的方法。)

答案2

这是有可能的,我确实在同一个分区中安装了多个发行版,我将在下面解释如何操作。我有点自豪,因为我将给出它的第一个运行示例。

我找到了几种将 chroot 转变为可启动子文件夹的不同方法,但他们没有提到他们的方法是否完美地运行,并且缺乏分步指南。

https://unix.stackexchange.com/questions/39423/boot-linux-system-from-a-subdirectory-on-a-partition https://unix.stackexchange.com/questions/43283/boot-into-chroot-directory-leaves-the-root-partition-read-only https://superuser.com/questions/384437/booting-linux-system-from-chroot-is-there-a-better-way-to-do-this https://bbs.archlinux.org/viewtopic.php?pid=932362#p932362 如何从基于 debootstrap 的安装启动? http://markmail.org/message/vgttmcos2mr363nc https://serverfault.com/questions/174347/is-it-possible-to-mount-a-subdirectory-as-the-root-file-system-at-kernel-startup

一开始我联系了 Kasper Dupont,他制作了一个内核补丁来实现它。我把上面的链接发给了他,然后他想出了一个脚本,看起来是第一个链接中脚本的改进版本。

以下是我的做法:

注意,以下所有命令都将在 chroot 中执行(第 3 步中的 menuentry 部分除外),如下所示

sudo chroot /precise

记住挂载 mount /proc、mount /dev、mount /sys、mount /dev/pts

1) 在“/precise”中安装 chroot。这是普通的 chroot,但您必须做一些额外的事情,例如安装内核、添加用户、将分区的 uuid 添加到 fstab 等。您可以按照本教程自行完成 debootstrap(chroot)。您不需要安装部件,因为您将通过用户会话进行安装。http://www.thegeekstuff.com/2010/01/debootstrap-minimal-debian-ubuntu-installation/ https://help.ubuntu.com/community/DebootstrapChroot

2)将下面的脚本命名为“rootdir”,并将其移动到“/precise”chroot 中的“/usr/share/initramfs-tools/hooks”目录中,如果不可执行,则使其可执行。然后运行“update-initramfs -u -k all”

3)为我们的子目录准备 grub 菜单项以进行启动。我将下面的菜单项添加到“/etc/grub.d/40_custom”文件并更新 grub。

update-grub

这里您需要将 chroot 的路径传递给“rootdir”参数。

 menuentry "boot into chroot" {
 set root='hd0,msdos6'
  linux /precise/boot/vmlinuz-3.8.0-34-generic root=UUID=c2d1b866-a0fd-4214-     b79b-11b2af29da4d rootdir=/precise ro quiet splash
  initrd /precise/boot/initrd.img-3.8.0-34-generic
 }

我的分区号sda6,我的grub看成是msdos6,你按照你的设置传过去就行。注意“/boot/initrd.img-3.8.0-34-generic”和“/boot/vmlinuz-3.8.0-34-generic”是相对路径,它们指向的是“/precise/boot/…”

第二件要注意的事情是传递分区的 uuid,在我的情况下它是 sda6 uuid,您可以使用 blkid 找到分区的 uuid。

最后将 uuid 添加到 fstab 以自动挂载分区(在我的情况下为 sda6)

  UUID=c2d1b866-a0fd-4214-b79b-11b2af29da4d /               ext4    errors=remount-ro 0       1

脚本的作用是修补 initrd,让其根据 grub rootdir 参数挂载子目录。

希望对你有帮助。

 #!/bin/bash
 set -e

 if [ "$1" = prereqs ]; then
     exit 0
 fi

 . /usr/share/initramfs-tools/hook-functions

 DEFAULT_DIR="$(/usr/bin/grub-mkrelpath /)"

 cat >"$DESTDIR"/scripts/local-bottom/rootdir <<EOF
 #!/bin/sh

 PREREQ=""
 prereqs()
 {
      echo "\$PREREQ"
 }

 case \$1 in
    prereqs)
 prereqs
      exit 0
      ;;
 esac

 ROOTDIR="$DEFAULT_DIR"

 for x in \$(cat /proc/cmdline); do
     case \${x} in
     rootdir=*)
         ROOTDIR="\${x#rootdir=}"
         ;;
     esac
 done

 if [ -n "\${ROOTDIR#/}" ] && [ -d "/root/\${ROOTDIR}" ]
 then
     [ -d /rootfs ] || mkdir -m 0700 /rootfs
     mount --move "/root" "/rootfs"
     mount --bind "/rootfs/\${ROOTDIR}" "/root"
     umount "/rootfs"
 fi

 EOF

 chmod 0755 "$DESTDIR"/scripts/local-bottom/rootdir

编辑:步骤 3 的菜单项部分不在 chroot 中。它在用户会话中。

答案3

由于 Eliah窃取了我原来的答案并将其变成了一小说,我将告诉您几种在现有分区中运行另一个 Linux 发行版而不会出现问题的方法;所有这些都需要某种划分,以便每个发行版的程序、脚本和配置文件不会重叠;这传统上是使用分区的主要原因之一。

  1. 您可以在虚拟机(如虚拟盒)中运行新的发行版。

    askUbunt 上已经介绍了这个设置已经。

    这样做的缺点是在虚拟机中运行发行版有很多缺点:内存更少、CPU 更少、与硬件组件的直接接口更少,然而它已经变得足够高效,在大型服务器环境中变得相当普遍。

  2. 您可以将实时 CD 映像直接写入硬盘驱动器并配置引导加载程序以从中引导。

    最简单的方法是通过 UnNetBootin。此 [Sofpedia 上的操作方法] 提供了如何使用 UnNetBootin 实现此目的的一个很好的示例。(http://news.softpedia.com/news/How-to-Boot-ISO-Images-from-Your-Hard-Drive-190443.shtml)用于存档目的)然而,这也可以在窗口内部完成如这里所述在同一篇文章中,他们声称将 iso 安装到文件夹中非常简单:

    • 输入以下命令:

      sudo mkdir /distro

      sudo chown `whoami`:`whoami`

      cp <YOUR-DOWNLOADED>.iso /distro/distro.iso

    • 从 iso 和 Ram_disk 中提取 Linux_kernel 到 /distro

    • 打开/boot/grub/menu.lst并添加以下内容:

      #``ADD NEW ENTRY``#

      title Install Linux

      root (hdX,X)

      kernel /distro/<YourDownloadedLinuxKernel>

      initrd /distro/<YourDownloadedRamDisk>

  3. 您可能需要创建并扩展虚拟磁盘

    我认为选项 #2 会将您限制在 iso 中的空间,因此安装更多应用程序会变得困难(我认为您始终可以将一些挂载点迁移到非虚拟化空间)。我不太清楚如何在 linux 中执行此操作,尽管我知道这在虚拟化系统中非常常见(选项 #1),但我相信这是默认行为使用 Wubi 在 Windows 中安装 Ubuntu

跨发行版共享交换

如果安装程序可以看到分区并相应地标记,则通常在安装过程中默认执行此操作。如果您正在虚拟化,则需要使物理驱动器对系统透明才能利用此功能。对于 VirtualBox,这是通过安装来宾附加组件

相关内容