在 Linux 内核中,将文件系统加载到 内部 RAM 中运行(即使用 RAM 作为根文件系统的存储介质)通常有两种方法:initramfs 和 RAM Disk(ramdisk)。以下是详细的实现步骤和对比:


方法 1: 使用 initramfs(推荐)
initramfs 是一个基于内存的初始根文件系统,内核启动时将其解压到 tmpfs 中,作为临时根文件系统。它比传统 ramdisk 更轻量,无需预先分配固定大小的块设备。

步骤 1: 创建 initramfs 文件系统

  1. 构建根文件系统目录
    创建一个包含必要文件和工具的目录结构,例如:
    bash
    mkdir rootfs
    cd rootfs
    mkdir -p bin dev etc lib proc sys tmp
    复制必要的程序(如 BusyBox)
    cp /path/to/busybox bin/
    创建 init 脚本(必须是可执行文件)
    cat > init <<EOF
    !/bin/sh
    mount -t proc none /proc
    mount -t sysfs none /sys
    exec /bin/sh
    EOF
    chmod +x init

  2. 打包为 CPIO 格式
    使用 cpio 工具将目录打包为 initramfs.cpio
    bash
    find . | cpio -H newc -ov --owner root:root > …/initramfs.cpio

步骤 2: 配置内核支持 initramfs

  1. 启用内核选项
    在内核配置中启用以下选项:
    bash
    make menuconfig

    • 确保启用:
      General setup —>
      • Initial RAM filesystem and RAM disk (initramfs/initrd) support
  2. 指定 initramfs 文件路径
    .config 文件中直接指定 initramfs.cpio 的路径:
    bash
    CONFIG_INITRAMFS_SOURCE=“path/to/initramfs.cpio”
    或在内核配置菜单中设置:
    General setup —>
    () Initramfs source file(s)

  3. 编译内核
    重新编译内核,此时 initramfs 会被直接嵌入内核镜像中:
    bash
    make

步骤 3: 启动内核

  • 无需额外参数,内核会自动加载嵌入的 initramfs 作为根文件系统。

方法 2: 使用 RAM Disk(传统方法)
RAM Disk 将文件系统镜像加载到内存中的块设备(如 /dev/ram0),需要预先分配固定大小的内存空间。

步骤 1: 创建 RAM Disk 文件系统镜像

  1. 创建空镜像文件
    bash
    dd if=/dev/zero of=ramdisk.img bs=1M count=32 创建 32MB 镜像
    mkfs.ext2 ramdisk.img 格式化为 ext2

  2. 挂载并填充内容
    bash
    mkdir mnt
    sudo mount -o loop ramdisk.img mnt
    复制文件到 mnt/ 中(类似 initramfs 的 rootfs)
    sudo umount mnt

步骤 2: 配置内核支持 RAM Disk

  1. 启用内核选项
    bash
    make menuconfig

    • 启用以下选项:
      Device Drivers —>
      • Block devices —>
        <*> RAM block device support
        (16) Default number of RAM disks
        (65536) Default RAM disk size (kbytes)
  2. 编译内核
    bash
    make

步骤 3: 启动内核并加载 RAM Disk

  1. 将镜像加载到内存
    使用 Bootloader(如 U-Boot)将 ramdisk.img 加载到内存地址 0x81000000
    bash
    load mmc 0:1 0x81000000 ramdisk.img

  2. 设置内核启动参数
    在 Bootloader 中传递参数:
    bash
    setenv bootargs root=/dev/ram0 rw init=/init console=ttyS0,115200
    bootz 0x80000000 0x81000000 内核地址 + ramdisk 地址


对比两种方法
特性 initramfs RAM Disk

存储方式 直接解压到 tmpfs,动态分配内存 预先分配固定大小的块设备内存
灵活性 支持动态调整大小 大小固定,需预先定义
性能 更高(无块设备开销) 较低(需要块设备驱动)
兼容性 现代内核默认支持 传统方法,兼容性较差
适用场景 临时根文件系统、嵌入式快速启动 需要块设备特性的场景


调试与验证

  1. 检查根文件系统
    启动后执行 mount | grep root,确认根文件系统类型为 tmpfs(initramfs)或 /dev/ram0(RAM Disk)。

  2. 查看内存占用
    使用 free -mcat /proc/meminfo 观察内存使用情况。

  3. 日志分析
    通过 dmesg grep i "initramfs\ramdisk" 查看内核加载日志。


常见问题
Q1: 内核启动后卡在 “Kernel panic - not syncing: No working init found”

  • 原因:未正确设置 init 程序或文件系统缺失关键文件。
  • 解决:确保 init 文件在根文件系统中,且具有可执行权限。

Q2: RAM Disk 加载失败,提示 “Cannot open root device”

  • 原因:内核未启用 RAM Disk 支持或启动参数错误。
  • 解决:检查内核配置中的 CONFIG_BLK_DEV_RAM 是否启用,并确认 root=/dev/ram0 参数正确。

通过上述方法,可以在 Linux 内核中轻松实现将文件系统加载到内部 RAM 中运行,适用于嵌入式系统快速启动或临时调试环境。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐