首先,我想说这个问题纯粹是理论上的。但如果有可能的话,我会非常高兴了解它的可能用例和总体缺点。
是否可以从文件,而不是驾驶? 就像在微型 USB 上具有读/写访问权限的文件。想象一下,您插入 USB。并选择让您从它启动的选项。现在,有一个微型操作系统类软件在这个 USB 上有一个控制启动的程序,比如 grub。有两个主分区。第一个分区用于这个微操作系统,第二个分区像 FAT 一样,用于数据存储。而且,后者有多个文件,如操作系统。
当系统启动时,这微型启动操作系统读取其中一个文件的内容,将内核加载到内存中,然后内核访问该文件,就像访问驱动器一样。该文件具有不同的段作为目录、文件等等。
实际上,我想我正在考虑类似基于文件的文件系统。有这种东西吗?如果存在,我认为它要么是古老的技术,要么是真的不实用。或者可能不是?想了解更多。
答案1
是的,每个 Linux“live USB”系统或多或少都是这样工作的。它们都从只读文件系统映像(通常是一个.squashfs
文件)启动。
引导加载程序实际上并不参与(它会尽快退出);操作系统内核处理一切。
(这也是 Windows 安装 USB 的工作方式——迷你操作系统实际上是从档案中启动的Boot.wim
。)
实际上,我想我正在考虑类似基于文件的文件系统的东西。这样的东西存在吗?
任何文件系统都可以放入文件中,只要操作系统知道如何附加存储在文件中的文件系统即可。例如,您可能已经看到使用 .iso 文件(或 macOS 上的 .dmg)完成此操作。反之亦然,任何文件格式都可以称为“基于文件的文件系统”,只要操作系统知道如何将其内容呈现为文件即可。(您几乎可以说 .zip 存档是基于文件的文件系统...)
当系统启动时,这个微型启动操作系统会读取其中一个文件的内容,将内核加载到内存中,然后内核会访问该文件,就像访问驱动器一样。该文件有不同的段,如目录、文件等。
是的,许多操作系统都有可以附加文件的功能,就像虚拟磁盘就文件系统而言,其行为与真实磁盘相同,因此您可以对其进行分区和/或在其中放置任何常规文件系统。虽然这并不总是适用于启动操作系统,但就将整个文件系统存储在文件中的能力而言,这是相当常见的。
Linux 允许将“loop”设备设置为与文件对应的虚拟磁盘。然后可以对该设备进行分区或直接格式化。
OpenBSD 和 NetBSD 在“vnd”(vnode 磁盘)设备中具有相同的功能;FreeBSD 有“md”设备;Illumos(Solaris)有“lofi”设备;OpenVMS 有“LD”设备......
我不确定 macOS 到底有什么,但 .dmg 文件的工作方式是这样的 - 它们不是档案;它们是 macOS 作为虚拟磁盘附加的压缩文件系统映像。
Windows 似乎没有完全通用的功能,但从 Win10 开始,它允许附加 .iso 和 .vhd 文件。双击 .iso 文件(通常是 ISO-9660 文件系统,因此得名),它将作为 CD-ROM 附加。如果打开 DiskMgmt,您可以创建一个可以分区、使用 NTFS 格式化等的 .vhd 文件。
(在 Windows 10 之前,有大量第三方工具可以做同样的事情......主要用于 CD - 即使在 Win98 时代,你也可以使用 Daemon Tools 或 Alcohol 120% 之类的软件为你的合法获得的游戏创建虚拟 CD 驱动器 - 但虚拟硬盘当然也是一种东西。)
当然,并不是所有这些都可以用于启动整个操作系统——在大多数情况下,您需要让内核运行并且加载一些驱动程序才能访问包含映像的文件系统。
对于 Linux 来说,初始化内存文件系统用于解决该问题;它是一个小型文件系统存档,是内核之后启动的第一个东西(包含初始驱动程序),并包含挂载真实/
文件系统所需的所有工具。实际内核和 initramfs(总共两个文件)仍必须位于引导加载程序可以访问的位置(尽管某些引导加载程序(如 GRUB)做它也支持从文件系统映像中加载它们,但是一旦将它们加载到内存中,initramfs 就可以设置它所需的任何类型的环境。
大多数 Linux 发行版甚至选择使用 initramfs 来处理基本的磁盘和文件系统驱动程序,但将其设置为循环设备(或任何其他设备)作为附加步骤是一个相当小的改变。例如:
几乎所有 Linux CD/USB 都主要由一个包含特殊 SquashFS 文件系统的文件组成。(这实际上非常接近于“基于文件的文件系统”;它专门用于这种只读用途,其内部布局旨在将所有内容紧密地打包在一起,而传统文件系统则相反。)
您可以轻松地扩展它以拥有多个启动菜单项,每个菜单项都可以根据需要加载不同的 initramfs 和/或指定不同的 rootfs 映像。
一些“live CD”版本有一个“持久”模式,其中第二附加了文件系统映像,包含更传统的可写文件系统,例如 Ext4,作为存储对实时环境所做的所有更改的覆盖。
当然,也可以直接使用常规的 Ext4 映像。几年前,Ubuntu 曾有一个“Wubi”项目,该项目可以一键将完整的 Ubuntu 系统安装到存储在 Windows NTFS 分区上的 Ext4 映像中。
引导加载程序(Grub4dos)对 NTFS 有足够的了解,可以找到内核和 initramfs,而 initramfs 随后加载 ntfs-3g 驱动程序并设置“循环”磁盘设备。
确实存在可以为你构建“多 Linux” USB 棒的程序,至少其中一些可以启动 .iso 映像放入 USB 记忆棒的常规文件系统,使整个“initramfs/loop”过程连续发生两次。
举一个完全不同的例子,MS-DOS 曾经有一个“DriveSpace”组件,它可以压缩你的磁盘内容;这也是通过一个驱动程序实现的,该驱动程序将你的 FAT 文件系统存储在一个特殊的映像文件中,并且在启动期间会用存储在虚拟磁盘中的 C:\ 替换真实的 C:\。
答案2
是的,这是完全可能的,以下是实现此目的的一种方法。
在 Windows 中,您可以拥有一个整个磁盘,其文件系统存储在一个.vhdx
或一个.vhd
文件中。
然后,您可以diskpart
将该文件附加为虚拟磁盘并为其分配驱动器号。
最后,您可以bcdboot
将此虚拟磁盘指定为启动磁盘。
有关详细说明,请参阅 Microsoft 文章
启动到虚拟硬盘:将 VHDX 或 VHD 添加到启动菜单。
答案3
你可能会发现BeOS个人版很有趣。2000 年发布,这是 BeOS 操作系统的免费版本,安装在 Windows 95/98 系统上。操作系统映像本身只是一个“image.be”文件。您只需双击图标,系统就会重新启动进入 BeOS。无需创建分区或修改引导加载程序。Windows 甚至不知道存在另一个操作系统。完成后,删除该文件,它的所有痕迹都会消失。
没有太多数据确切地我不知道这在底层是如何工作的,但据我所知,该文件被视为一个分区。启动器找出了硬盘上映像文件的块地址,然后告诉 BIOS 启动到该地址,就像它是硬盘分区的起始地址一样。文件的内容被格式化为分区,因此 BIOS 无法分辨出任何不同。
请记住,这已经是近四分之一世纪前的事了。现代操作系统、硬件和 EFI 子系统都很多更高的安全性可能会使 Be 的确切技术变得不可行。但基本概念仍然是正确的。启动所需的只是(连续)分区的起始块地址。低级引导加载程序不会详细检查磁盘的其余部分,因此它不会注意到或关心它实际上在另一个分区内。
答案4
其他答案描述了您可能想到的内容。这个答案故意以一种您很可能没有想到的方式描述了一些概念。
考虑不同的观点;考虑以下事实:
在 Linux 中,设备(例如称为的块设备
/dev/sda
)和分区(例如/dev/sda1
)也是文件. 它们是块特殊文件。包含分区和分区表的块设备实际上包含一个简单的文件系统。我们不称其为“文件系统”,但从概念上讲它就是文件系统。请这样看待它:
分区表本身是元数据,是描述其中文件的文件系统的结构。
分区就是文件。
分区表有很多种类型,就像“真实”文件系统有很多种类型一样。如今,GUID 分区表和 MBR 中的 dos 类型是常见的分区表类型。有些类型可以存储比其他类型更多的元数据,但一般来说……
… 就像在“真实”文件系统中一样,分区(即文件)有编号(有点像 inode 编号)、标签(像名称)、类型、标志(像属性)。所有这些都写在分区表中。
最重要的是,分区表包含足够的信息来判断哪些逻辑扇区属于哪个分区;哪些是“可用空间”(类似地,任何“真实”文件系统都会将块与文件关联或将其标记为可用)。存在限制和差异:
- 每个分区必须是连续的(在大多数现代的“真实”文件系统中文件可能会碎片化)。
- 分区的大小必须是设备逻辑扇区大小的倍数(在“真实”文件系统中,单位为一个字节)。
- 没有层次结构,没有目录。确实,在 dos 分区表中最多可以有一个包含逻辑分区的扩展分区,因此它看起来像一个包含文件的目录;但这只是一个扩展,允许我们创建超过四个分区(原始标准仅限于四个分区),您仍然无法自由创建“目录”。(在现代“真实”文件系统中,您可以创建目录和子目录,但早期的文件系统(例如 CP/M)不是分层的,目录尚未发明;没有目录的文件系统仍然是文件系统。)
软件(如 UEFI 或操作系统的内核)必须读取分区表(元数据)并对其进行解释,才能正确访问各个分区(文件)。如果它不支持某种类型的分区表(文件系统),那么它将无法将其分区(文件)视为单独的实体。如果它有支持,那么您可以单独读取或写入每个分区(文件)。但有一个区别:
- 与修改“真实”文件系统内文件的元数据相比,修改分区表本身相当麻烦且低级。有专门的工具,如
fdisk
或gdisk
。您无法使用 创建分区touch
,无法使用 调整分区大小truncate
,也无法使用 实际删除分区rm
(删除/dev/sda1
会删除特殊文件,但不会从分区表中删除实际条目)。
- 与修改“真实”文件系统内文件的元数据相比,修改分区表本身相当麻烦且低级。有专门的工具,如
尽管存在差异,但概念是相同的:大文件包含一个内部结构,该结构描述了文件的哪些其他部分构建了哪些文件。
包含分区和分区表的文件系统旨在将“真实”文件系统作为其文件保存,并且通常确实如此。
根据对文件和文件系统的广泛理解,几乎每个 Linux 或 Windows(或任何其他系统)的安装都使用“基于文件的文件系统”(或其中的几个)。这里的文件是一个分区,它包含一个内部文件系统,而它本身位于外部文件系统中,其元数据是分区表。
我知道这可能不是你真正想的。我的观点是,整个想法已经被广泛实施,我们只是很少以这种方式看待实施;你可能想的并不是不同或新的东西,它只是文件系统堆栈中的又一层。