AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1421730
Accepted
Ben W
Ben W
Asked: 2019-04-05 23:00:57 +0800 CST2019-04-05 23:00:57 +0800 CST 2019-04-05 23:00:57 +0800 CST

可以读取硬盘驱动器并专门写入 RAM 的系统?

  • 772

我希望在正确的地方。我在“网络”上找不到关于我的问题的任何建议。一个操作系统,比方说 linux 的一个发行版,如何从硬盘驱动器加载并执行所有修改(所有应用程序)到 RAM 中?换句话说,我们如何使用操作系统从硬盘读取它需要的数据,然后只将它需要的数据写入 RAM。

目的是确保操作系统(及其执行的所有应用程序)发出的所有“指令”(这可能是错误的词)都专门写入 RAM(不写入硬盘)。

我知道一些 linux 发行版可以完全加载到 RAM 中,但不便的是我们得到的系统的大小:我们不能在 RAM 中为应用程序提供太多可用空间,而普通系统会从驱动器中找到所需的应用程序并加载它进入内存。这可以通过为系统使用额外的 RAM 来完成,但与使用硬盘驱动器保存我们需要的应用程序相比,这不是一个很好的解决方案(因为 RAM 的实际价格)

我还考虑过一个虚拟机,在大多数情况下,它可以读取驱动器以使用应用程序并且只写入 RAM。但它需要从现有的、已加载的操作系统加载虚拟机,所以有没有办法跳过现有的操作系​​统部分?

如果您有任何建议或我必须使用自己搜索的技术术语,谢谢。

hard-drive memory operating-systems
  • 2 2 个回答
  • 750 Views

2 个回答

  • Voted
  1. gronostaj
    2019-04-06T00:22:01+08:002019-04-06T00:22:01+08:00

    这是可能的,但并非微不足道。我会给你一些指示,但我不能真正提供详细的步骤,因为我自己从未尝试过。

    • OverlayFS - 它允许您创建一个“分层”文件系统,其中下层是只读的,上层是可写的。也就是说,下层仍然是完全可变的(您可以编辑、删除文件等,但它们并没有真正改变——更改完全存储在上层)并且像一个完整的文件系统一样工作。

    • tmpfs - 这是另一个完全驻留在内存中的成熟文件系统。您可以将容量设置为低于 RAM 的数量,以防止意外阻塞操作系统。此外,未使用的容量可用作常规 RAM,这很好。

    • pivot_root/ - 移动到不同目录的系统调用。

    通常在引导过程的早期调用pivot_root以从早期用户空间切换到磁盘文件系统。您可以更改此设置:创建 OverlayFS,在下层使用磁盘文件系统,在上层使用 tmpfs,然后将 pivot_root 添加到 OverlayFS。

    请注意,上层可以增长得相当快,消耗大量可用 RAM。zram 可用于以 CPU 使用为代价减少 RAM 使用,但这不是最终解决方案。永久更新磁盘操作系统也很棘手。

    • 1
  2. Best Answer
    Ben W
    2019-06-07T22:40:30+08:002019-06-07T22:40:30+08:00

    我将对这个主题进行一些扩展,以帮助我开始时的初学者。

    引导过程

    第一个硬盘驱动器通常分为 2 个部分:

    1. 一个用于启动过程(启动时计算机读取的部分)/dev/sda1在大多数 Linux 发行版下通常称为
    2. 一个用于所有其他的东西(比如系统和用户文件) named /dev/sdb1。(系统和用户文件可以在不同的部分)

    在引导扇区上有一个内核映像,它实际上是一个initramfs映像。intramfs 是加载到 RAM 中的“最小”功能系统。它可以被看作是你的 linux 系统的一个小版本:你会发现模块,一些你在你习惯的系统上看到但内容不同的目录。那个小型 linux 系统用于查看您的计算机配置(您使用什么类型的存储设备,您的组件是什么,等等)以加载将由您的真实系统使用的正确模块,并找出您的存储设备上的哪个位置是您的真实的系统文件,以便以后可以访问。换句话说,当您启动计算机时,它会读取/dev/sda1分区并尝试找到分区/dev/sdb1以备后用。但是要了解如何访问您的文件,您需要了解挂载点

    挂载点

    在 linux 下,所有目录都可以在一个名为root的目录下访问,即/. 不要将根用户存储/root与文件系统的根混合/。当您插入外部存储设备(如 USB 驱动器)时,您的系统将创建一个新目录并将其用作该设备的根目录。换句话说,在该目录下,您可以访问存储在其中的所有文件。该目录称为挂载点。要创建挂载点,您需要有一个设备(例如 USB)、一个目录和一个文件系统(用作用户空间程序和设备物理内存之间接口的程序),然后使用以下命令:

    mount -t name_filesystem name_device name_directory
    

    从技术上讲,当您插入某些东西时,您需要手动安装设备。但是当你插入一个普通设备(比如 USB)时,linux 会自动执行它。由于文件 file/etc/fstab包含安装它们所需的所有信息(例如硬盘驱动器的分区,CD-ROM 阅读器,......),因此在启动期间会自动安装计算机的所有内部设备 查看所有其他安装点你可以看到当前被系统使用/proc/mounts

    在启动时挂载根文件系统

    回到启动过程,当 initramfs 映像加载到内存中时,它会检查硬盘驱动器的哪个分区用于存储文件(如/dev/sdb1)并将其挂载在通常称为/root. 这/root与/root您的用户空间下的不同(当您的系统完全加载时)。在此之下,/root您将可以访问所有文件,并且/root您知道:

    /root <--- initramfs
       /home
          /myName
            ... all my files
       /root <--- super user
    

    根文件系统在引导期间以只读方式挂载,然后通过虚拟文件系统以读写方式重新挂载(这只是处理不同设备的一种方式,因此与每个设备相关的不同文件系统,对用户空间中的程序使用相同的命令)

    Initrd 与 Initramfs

    initramfs 是 initrd 的后继者,它使用所有需要的工具加载到内存中,然后挂载真正的文件系统,最后从内存中卸载自己。但是initramfs 保留在内存中,所有系统都基于 initramfs 挂载的根文件系统。这种差异也意味着不同的命令(例如 pivot_root成为switch_root)

    编辑 initramfs

    可以在系统内编辑用于引导过程的内核映像。该图像存储在/boot. 您可以通过解压缩来编辑它。您要编辑的过程是init图像的过程(这是执行的第一个脚本),并且恰好是挂载真实文件系统时的部分/root,如下所示:

    log_begin_msg "Mounting root file system"
    # Always load local and nfs (since these might be needed for /etc or
    # /usr, irrespective of the boot script used to mount the rootfs).
    . /scripts/local
    . /scripts/nfs
    . /scripts/${BOOT}
    parse_numeric ${ROOT}
    maybe_break mountroot
    mount_top
    mount_premount
    mountroot
    

    请注意,${ROOT}其中包含用于您的系统文件的设备名称(例如/dev/sdb1,但可以不同)

    但这是一个混乱的解决方案,因为当您的系统更新图像时(出于某些原因)您的修改将会丢失。但是 linux 有一个解决方案可以将您的修改保留在所有内核映像中,即使在更新之后也是如此:initramfs-tools。您必须进行的所有修改都将在下面完成/etc/initramfs-tools 然后在您编辑图像后使用以下命令更新内核图像:

    update-initramfs -u
    

    该图像将在下次重新启动后使用。因此,为避免系统崩溃,请使用虚拟机作为virtualBox或

    构建完成后,您需要将新内核与旧内核一起安装,并配置引导加载程序以使内核在启动时可选择。这样即使出现严重错误,您仍然可以使用现有内核启动系统。

    覆盖

    要覆盖现有目录,请使用:

    mount -t overlay -o lowerdir=/overlay/lower,upperdir=/overlay/upper,workdir=/overlay/work overlay /myDir
    

    请注意,两者之间绝对没有空格lowerdir=..,upperdir=...,workdir=... ,最后一个overlay可以替换为none(因为您什么都不安装,没有设备/myDir;您只需安装overlay)。当你做坏事时(如果目录不存在或者你在安装选项中放置空格,-o ...结果将是“下面没有这样的设备/etc/fstab”(覆盖在安装过程中管理非常错误)。你可以看看那个链接和那个寻求更多帮助的人。

    在/myDir下面你会看到所有文件/overlay/lower和你所做的所有修改(存储在/overlay/upper):

    /overlay/lower      /overlay/upper          /myDir (mountpoint)
       /file1  ---------->  /file1   --------->   /file1
          'abcdef'            'abOdef'               'abOdef'
       /file2 -------------------------------->   /file2
    

    tmpfs

    tmpfs 是一个文件系统,可以将 RAM 作为标准内存进行操作。要创建一个 ram-disk(一块 RAM,就像一块硬盘驱动器)使用:

    mount -t tmpfs none /myDir
               or
    mount -t tmpfs tmpfs /myDir
    

    然后所做的所有操作/myDir将被保存到RAM中。

    解决方案

    模块

    将 overlay 模块添加到内核映像(以便在引导过程中可以使用该模块)。添加overlay到文件中/etc/initramfs-tools/modules

    挂钩

    将以下脚本添加到/etc/initramfs-tools/hooks(作为可执行文件)

    #!/bin/sh
    
    #set kernel functions file as sources (so these functions can be used)
    . /usr/share/initramfs-tools/scripts/functions
    . /usr/share/initramfs-tools/hook-functions
    
    #If you want to use a custom package into the initramfs use 
    #copy_exec path_to_package
    #For example if you want to use whiptail add : copy_exec /usr/bin/whiptail
    

    脚本

    将以下脚本添加到/etc/initramfs-tools/scripts/init-bottom(作为可执行文件)

    #!/bin/sh
    
    PREREQ=""
    prereqs()
    {
       echo "$PREREQ"
    }
    
    case $1 in
    prereqs)
       prereqs
       exit 0
       ;;
    esac
    
    DIR=/overlay
    UPPER_DIR=$DIR/upper
    LOWER_DIR=$DIR/lower
    WORK_DIR=$DIR/work
    
    mkdir $DIR
    #create temporary filesystem in RAM
    mount -t tmpfs tmpfs $DIR
    if [ $? -ne 0 ]; then
        fail_err "Fail to mount tmpfs on $DIR"
        exit 1
    fi
    
    #create lower, upper and workdir for overlay
    mkdir $UPPER_DIR $LOWER_DIR $WORK_DIR
    
    # move root mountpoint to the lower layer
    mount -n -o move ${rootmnt} $LOWER_DIR
    if [ $? -ne 0 ]; then
        fail_err "Cannot move ${rootmnt} to $LOWER_DIR"
        exit 1
    fi
    
    #mount overlay on to the root
    mount -t overlay -o lowerdir=$LOWER_DIR,upperdir=$UPPER_DIR,workdir=$WORK_DIR overlay ${rootmnt}
    if [ $? -ne 0 ]; then
        fail_err "Cannot mount overlay on ${rootmnt} [lowerdir=$LOWER_DIR, upperdir=$UPPER_DIR, workdir=$WORK_DIR]"
        exit 1
    fi
    
    #mount virtual filesystem over the lower dir (as it's donne for the root with /proc and /sysfs which are mounted on to the root at the end of the init)
    
    #uncomment that section if you want to access the layers of overlay whithin userspace
    #mkdir -p ${rootmnt}$DIR
    #mount -n -o rbind $DIR ${rootmnt}$DIR
    #if [ $? -ne 0 ]; then
    #    fail_err "Cannot remount ${rootmnt} and its sub mountpoints on ${rootmnt}$DIR"
    #    exit 1
    #fi
    
    # edit fstab to match the actual modifications
    
    #get the device that is mounted on the rootfilesystem
    root_device="$(awk '$2 == "/" {print $0}' ${rootmnt}/etc/fstab)"
    #check if that device exists
    blkid $root_device
    if [ ! $? -gt 0 ]; then
        target=${rootmnt}/etc/fstab
        target_c=$target.orig
        #create a copy of the file (that will be accessible later)
        cp $target $target_c
        #remove the root device from the file
        grep -v "$root_device" $target_c > $target
    
        #add overlay on root as a device in the file
        awk '$2 == "'${rootmnt}'" { $2 = "/" ; print $0}' /etc/mtab >> $target
    fi
    

    更新

    使用以下命令更新内核映像:update-initramfs -u

    在根文件系统上挂载覆盖的链接

    使用只读挂载的根分区解决 raspbian SD 卡损坏问题

    自定义初始化文件

    在 pivot_root 之后无法卸载

    将 root 挂载为 overlayfs

    无法在 initrd 内挂载 overlayfs

    如何使用 OverlayFS 保护根文件系统?

    • 1

相关问题

  • RAM 安装顺序。8GB 和 16GB。哪个应该在插槽 0 中?

  • CPU、内存还是主板?(PEBCAK!)

  • 我应该对用于存储的辅助(非操作系统)SSD 进行分区吗?[关闭]

  • 在 Windows 10 中运行 CrystalDiskMark 会导致 BSOD

  • “写悬崖”现象是否只发生在SSD盘上?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    Windows 10 服务称为 AarSvc_70f961。它是什么,我该如何禁用它?

    • 2 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Marko Smith

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)

    • 4 个回答
  • Marko Smith

    我如何知道 Windows 安装在哪个驱动器上?

    • 6 个回答
  • Martin Hope
    Albin 支持结束后如何激活 WindowsXP? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch Windows 10 删除大量小文件的速度非常慢。有什么办法可以加快速度吗? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Ctrl+C 和 Ctrl+V 是如何工作的? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve