是否可以从某种文件启动操作系统?

deg*_*egD 8 linux boot bootloader filesystems grub

首先我想说这个问题纯粹是理论上的。但如果可能的话,我真的很高兴了解它可能的用例和总体缺点。

是否可以从文件而不是驱动器启动操作系统(比如说 Linux) ?就像在 micro-USB 上具有读/写访问权限的文件一样。想象一下您插入了 USB。并选择让您从中启动的选项。现在,这个 USB 上有一个类似微型操作系统的软件来控制启动,例如 grub。有两个主分区。第一个分区用于这个微型操作系统,第二个分区类似于FAT,用于数据存储。而且,后者作为操作系统有多个文件。

当系统启动时,这个微型启动操作系统会读取这些文件之一的内容,将内核加载到内存中,然后内核访问该文件,就像访问驱动器一样。该文件具有不同的,如目录和文件等。

在实践中,我想我正在考虑类似基于文件的文件系统之类的东西。这样的事情存在吗?如果是这样,我认为这要么是一项古老的技术,要么是一项非常不实用的技术。或者可能不是?想要了解更多相关信息。

use*_*686 26

是的,这或多或少是每个 Linux“live USB”系统的工作原理。它们都从只读文件系统映像(通常是.squashfs文件)启动。

\n

引导加载程序并不真正参与其中(它会尽快摆脱干扰);操作系统内核处理一切。

\n

(这也是 Windows 安装 USB 的工作原理 \xe2\x80\x93 迷你操作系统实际上是从Boot.wim存档启动的。)

\n
\n

在实践中,我想我正在考虑类似基于文件的文件系统。这样的事情存在吗?

\n
\n

只要操作系统通常知道如何附加存储在文件中的文件系统,任何文件系统都可以放入文件中。例如,您可能已经看到过使用 .iso 文件(或 macOS 上的 .dmg)完成此操作。反之亦然,只要操作系统知道如何将其内容呈现为文件,任何文件格式都可以称为“基于文件的文件系统”。(您几乎可以说 .zip 存档是基于文件的文件系统......)

\n
\n

当系统启动时,这个微型启动操作系统会读取这些文件之一的内容,将内核加载到内存中,然后内核访问该文件,就像访问驱动器一样。该文件具有不同的段,如目录和文件等。

\n
\n

是的,许多操作系统都有一个功能,可以像虚拟磁盘一样附加文件,就文件系统而言,其行为与真实磁盘相同,以便您可以对它们进行分区和/或在其中放置任何常规文件系统。虽然这并不总是可用于引导操作系统,但就在文件中存储整个文件系统的能力而言,它相当常见。

\n
    \n
  • Linux 允许将“循环”设备设置为与文件对应的虚拟磁盘。然后可以对设备进行分区或直接格式化。

    \n
  • \n
  • OpenBSD 和 NetBSD 在“vnd”(vnode 磁盘)设备中具有相同的功能;FreeBSD 有“md”设备;Illumos (Solaris) 有“lofi”设备;OpenVMS 有“LD”设备...

    \n
  • \n
  • 我不确定 macOS 到底有什么,但这就是 .dmg 文件的工作原理 \xe2\x80\x93 它们不是档案;它们是文件。它们是 macOS 作为虚拟磁盘附加的压缩文件系统映像。

    \n
  • \n
  • Windows 似乎没有完全通用的功能,但从 Win10 开始,它确实允许附加 .iso 和 .vhd 文件。双击 .iso 文件(通常是 ISO-9660 文件系统,因此得名),它将作为 CD-ROM 附加到其中。如果打开DiskMgmt,您可以创建一个.vhd 文件,该文件可以分区、格式化为NTFS 等。

    \n

    (在 Windows 10 之前,存在大量第三方工具可以做同样的事情\xe2\x80\xa6 主要用于 CD,尽管 \xe2\x80\x93 即使在 Win98 时代,你也会有像 Daemon Tools 或酒精 120 这样的软件% 为您的合法获得的游戏创建虚拟 CD 驱动器 \xe2\x80\x93 但虚拟 HDD 肯定也是一件事。)

    \n
  • \n
\n

当然,并非所有这些都可以用于启动整个操作系统 \xe2\x80\x93 在大多数情况下,您需要已经运行内核并加载一些驱动程序才能访问包含映像的文件系统。

\n

特别是对于 Linux,可以使用initramfs来解决这个问题;它是一个很小的文件系统存档,是内核(包含初始驱动程序)之后启动的第一件事,并且包含挂载真实/文件系统所需的任何工具。实际的内核和 initramfs \xe2\x80\x93 总共两个文件 \xe2\x80\x93 必须仍然位于引导加载程序可以访问的位置(尽管某些引导加载程序(例如 GRUB 文件系统映像中加载它们,如下所示好吧),但是一旦这些被加载到内存中,initramfs 就可以设置它需要的任何类型的环境。

\n

即使对于基本的磁盘和文件系统驱动程序,大多数 Linux 发行版也选择使用 initramfs,但作为额外步骤设置循环设备(或任何其他设备)只是一个相当小的更改。例如:

\n
    \n
  • 几乎所有 Linux CD/USB 主要由包含特殊 SquashFS 文件系统的文件组成。(这实际上相当接近于“基于文件的文件系统”;它专门用于这种只读用途,其内部布局旨在将所有内容紧密地打包在一起,而不像传统的文件系统那样做相反的事情。)

    \n

    您可以轻松地将其扩展为具有多个启动菜单项,每个菜单项都会根据需要加载不同的 initramfs 和/或指定不同的 rootfs 映像。

    \n
  • \n
  • 一些“live CD”版本具有“持久”模式,其中第二个文件系统映像,其中包含更传统的可写文件系统(例如 Ext4),作为覆盖层来存储对实时环境所做的所有更改。

    \n
  • \n
  • 当然,也可以直接使用常规的 Ext4 镜像。几年前,Ubuntu 曾经有一个“Wubi”项目,该项目可以将完整的 Ubuntu 系统一键安装到存储在 Windows NTFS 分区上的 Ext4 映像中。

    \n

    引导加载程序 (Grub4dos) 具有足够的 NTFS 知识来查找内核和 initramfs,然后 initramfs 加载 ntfs-3g 驱动程序并设置“循环”磁盘设备。

    \n
  • \n
  • 确实存在可以构建“多 Linux”USB 棒的程序,至少其中一些可以启动 .iso 映像,从而使整个“initramfs/loop”过程连续发生两次。

    \n
  • \n
\n
\n

作为一个完全不同的例子,MS-DOS 曾经有一个“DriveSpace”组件,可以压缩磁盘内容;这也是通过一个驱动程序实现的,该驱动程序将 FAT 文件系统存储在一个特殊的映像文件中,并且在启动过程中将用存储在虚拟磁盘中的文件系统替换真正的 C:\\。

\n


har*_*ymc 7

是的,这是完全可能的,以下是一种实现方法。

在 Windows 中,您可以拥有整个磁盘,其文件系统存储在一个.vhdx或一个.vhd文件中。

然后,您可以diskpart将此文件附加为虚拟磁盘并为其分配驱动器号。

最后,您可以bcdboot将此虚拟磁盘指定为启动磁盘。

有关准确说明,请参阅 Microsoft 文章
引导到虚拟硬盘:将 VHDX 或 VHD 添加到引导菜单


小智 5

您可能会发现BeOS 个人版很有趣。这是 BeOS 操作系统的免费版本,于 2000 年发布,安装在 Windows 95/98 系统上。操作系统映像本身只是一个“image.be”文件。您所要做的就是双击一个图标,系统就会重新启动到 BeOS。无需创建分区或修改引导加载程序。Windows 甚至不知道另一个操作系统的存在。完成后,删除该文件,它的所有痕迹都会消失。

关于它在幕后如何工作的具体数据并不多,但从我收集到的信息来看,该文件被视为一个分区。启动程序计算出映像文件在硬盘驱动器上的块地址,然后告诉 BIOS 启动到该地址,就像它是硬盘驱动器分区的开头一样。文件内容的格式类似于分区,因此 BIOS 无法辨别出任何不同。

请记住,这已经是近四分之一世纪前的事了。现代操作系统、硬件和 EFI 子系统具有更高安全性,这可能会使 Be 的精确技术变得不可行。不过,基本概念仍然正确。启动所需的只是(连续)分区的起始块地址。低级引导加载程序不会详细检查磁盘的其余部分,因此它不会注意到或关心它实际上位于另一个分区内。