我希望在正确的地方。我在“网络”上找不到关于我的问题的任何建议。一个操作系统,比方说 linux 的一个发行版,如何从硬盘驱动器加载并执行所有修改(所有应用程序)到 RAM 中?换句话说,我们如何使用操作系统从硬盘读取它需要的数据,然后只将它需要的数据写入 RAM。
目的是确保操作系统(及其执行的所有应用程序)发出的所有“指令”(这可能是错误的词)都专门写入 RAM(不写入硬盘)。
我知道一些 linux 发行版可以完全加载到 RAM 中,但不便的是我们得到的系统的大小:我们不能在 RAM 中为应用程序提供太多可用空间,而普通系统会从驱动器中找到所需的应用程序并加载它进入内存。这可以通过为系统使用额外的 RAM 来完成,但与使用硬盘驱动器保存我们需要的应用程序相比,这不是一个很好的解决方案(因为 RAM 的实际价格)
我还考虑过一个虚拟机,在大多数情况下,它可以读取驱动器以使用应用程序并且只写入 RAM。但它需要从现有的、已加载的操作系统加载虚拟机,所以有没有办法跳过现有的操作系统部分?
如果您有任何建议或我必须使用自己搜索的技术术语,谢谢。
这是可能的,但并非微不足道。我会给你一些指示,但我不能真正提供详细的步骤,因为我自己从未尝试过。
OverlayFS - 它允许您创建一个“分层”文件系统,其中下层是只读的,上层是可写的。也就是说,下层仍然是完全可变的(您可以编辑、删除文件等,但它们并没有真正改变——更改完全存储在上层)并且像一个完整的文件系统一样工作。
tmpfs - 这是另一个完全驻留在内存中的成熟文件系统。您可以将容量设置为低于 RAM 的数量,以防止意外阻塞操作系统。此外,未使用的容量可用作常规 RAM,这很好。
pivot_root
/
- 移动到不同目录的系统调用。通常在引导过程的早期调用pivot_root以从早期用户空间切换到磁盘文件系统。您可以更改此设置:创建 OverlayFS,在下层使用磁盘文件系统,在上层使用 tmpfs,然后将 pivot_root 添加到 OverlayFS。
请注意,上层可以增长得相当快,消耗大量可用 RAM。zram 可用于以 CPU 使用为代价减少 RAM 使用,但这不是最终解决方案。永久更新磁盘操作系统也很棘手。
我将对这个主题进行一些扩展,以帮助我开始时的初学者。
引导过程
第一个硬盘驱动器通常分为 2 个部分:
/dev/sda1
在大多数 Linux 发行版下通常称为/dev/sdb1
。(系统和用户文件可以在不同的部分)在引导扇区上有一个内核映像,它实际上是一个initramfs映像。intramfs 是加载到 RAM 中的“最小”功能系统。它可以被看作是你的 linux 系统的一个小版本:你会发现模块,一些你在你习惯的系统上看到但内容不同的目录。那个小型 linux 系统用于查看您的计算机配置(您使用什么类型的存储设备,您的组件是什么,等等)以加载将由您的真实系统使用的正确模块,并找出您的存储设备上的哪个位置是您的真实的系统文件,以便以后可以访问。换句话说,当您启动计算机时,它会读取
/dev/sda1
分区并尝试找到分区/dev/sdb1
以备后用。但是要了解如何访问您的文件,您需要了解挂载点挂载点
在 linux 下,所有目录都可以在一个名为root的目录下访问,即
/
. 不要将根用户存储/root
与文件系统的根混合/
。当您插入外部存储设备(如 USB 驱动器)时,您的系统将创建一个新目录并将其用作该设备的根目录。换句话说,在该目录下,您可以访问存储在其中的所有文件。该目录称为挂载点。要创建挂载点,您需要有一个设备(例如 USB)、一个目录和一个文件系统(用作用户空间程序和设备物理内存之间接口的程序),然后使用以下命令:从技术上讲,当您插入某些东西时,您需要手动安装设备。但是当你插入一个普通设备(比如 USB)时,linux 会自动执行它。由于文件 file
/etc/fstab
包含安装它们所需的所有信息(例如硬盘驱动器的分区,CD-ROM 阅读器,......),因此在启动期间会自动安装计算机的所有内部设备 查看所有其他安装点你可以看到当前被系统使用/proc/mounts
在启动时挂载根文件系统
回到启动过程,当 initramfs 映像加载到内存中时,它会检查硬盘驱动器的哪个分区用于存储文件(如
/dev/sdb1
)并将其挂载在通常称为/root
. 这/root
与/root
您的用户空间下的不同(当您的系统完全加载时)。在此之下,/root
您将可以访问所有文件,并且/root
您知道:根文件系统在引导期间以只读方式挂载,然后通过虚拟文件系统以读写方式重新挂载(这只是处理不同设备的一种方式,因此与每个设备相关的不同文件系统,对用户空间中的程序使用相同的命令)
Initrd 与 Initramfs
initramfs 是 initrd 的后继者,它使用所有需要的工具加载到内存中,然后挂载真正的文件系统,最后从内存中卸载自己。但是initramfs 保留在内存中,所有系统都基于 initramfs 挂载的根文件系统。这种差异也意味着不同的命令(例如
pivot_root
成为switch_root
)编辑 initramfs
可以在系统内编辑用于引导过程的内核映像。该图像存储在
/boot
. 您可以通过解压缩来编辑它。您要编辑的过程是init
图像的过程(这是执行的第一个脚本),并且恰好是挂载真实文件系统时的部分/root
,如下所示:请注意,
${ROOT}
其中包含用于您的系统文件的设备名称(例如/dev/sdb1
,但可以不同)但这是一个混乱的解决方案,因为当您的系统更新图像时(出于某些原因)您的修改将会丢失。但是 linux 有一个解决方案可以将您的修改保留在所有内核映像中,即使在更新之后也是如此:initramfs-tools。您必须进行的所有修改都将在下面完成
/etc/initramfs-tools
然后在您编辑图像后使用以下命令更新内核图像:该图像将在下次重新启动后使用。因此,为避免系统崩溃,请使用虚拟机作为virtualBox或
覆盖
要覆盖现有目录,请使用:
请注意,两者之间绝对没有空格
lowerdir=..,upperdir=...,workdir=...
,最后一个overlay
可以替换为none
(因为您什么都不安装,没有设备/myDir
;您只需安装overlay
)。当你做坏事时(如果目录不存在或者你在安装选项中放置空格,-o ...
结果将是“下面没有这样的设备/etc/fstab
”(覆盖在安装过程中管理非常错误)。你可以看看那个链接和那个寻求更多帮助的人。在
/myDir
下面你会看到所有文件/overlay/lower
和你所做的所有修改(存储在/overlay/upper
):tmpfs
tmpfs 是一个文件系统,可以将 RAM 作为标准内存进行操作。要创建一个 ram-disk(一块 RAM,就像一块硬盘驱动器)使用:
然后所做的所有操作
/myDir
将被保存到RAM中。解决方案
模块
将 overlay 模块添加到内核映像(以便在引导过程中可以使用该模块)。添加
overlay
到文件中/etc/initramfs-tools/modules
挂钩
将以下脚本添加到
/etc/initramfs-tools/hooks
(作为可执行文件)脚本
将以下脚本添加到
/etc/initramfs-tools/scripts/init-bottom
(作为可执行文件)更新
使用以下命令更新内核映像:
update-initramfs -u
在根文件系统上挂载覆盖的链接
使用只读挂载的根分区解决 raspbian SD 卡损坏问题
自定义初始化文件
在 pivot_root 之后无法卸载
将 root 挂载为 overlayfs
无法在 initrd 内挂载 overlayfs
如何使用 OverlayFS 保护根文件系统?