在构建期间生成 ramdisk 并填充内容

Posted

技术标签:

【中文标题】在构建期间生成 ramdisk 并填充内容【英文标题】:Generate ramdisk during build and fill with content 【发布时间】:2018-01-12 11:08:29 【问题描述】:

是否可以在不安装 ramdisk 的情况下以某种方式创建并用文件填充 ramdisk 映像?

我有一组为 linux 定制的文件(所以,只是一堆文件),它们应该在文件系统中。现在我想让它在生成 ramdisk 的构建过程中执行,用 mkfs 格式化它(不需要 root),然后以某种方式将文件复制到 ramdisk 中(但这种方式必须不需要 root 权限!)有没有办法这样做?

【问题讨论】:

可能使用dd? 我不知道。这就是我问的原因。如何使用 dd 将文件(或至少一个文件夹)放入 ramdisk? 什么是“ramdisk image”?是镜像还是内存盘?因为image是文件,所以不能是ramdisk... 最后它是一个图像文件,在我的平台启动过程中变成了一个虚拟磁盘 @alabamajack 如果你有内存盘的保存图像,我想你可以使用dd if=$PATH_TO_RAMDISKIMAGE of=$RAMDISKDEVICE 【参考方案1】:

它被称为环回设备。

要安装的包:libguestfs-tools

并且它需要 Linux 内核映像文件 (/boot/vmlinuz-*-generic) 可供用户读取。

# Create mountpoint.
mkdir space
# Create image.
dd if=/dev/zero of=space.img bs=1024 count=255
# Format image.
/sbin/mkfs.ext4 space.img

# Mount image.
#
# There is a bug with it at least on Ubuntu:
# "The kernel is no longer readable by non-root users"
# https://bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
#
# Fix: $ dpkg-statoverride --add --update root root 0644 /boot/vmlinuz-$(uname -r)
# Alternative fix is to chown the kernel image manually: chown a+r /boot/vmlinuz-*-generic
#
# Does uid/gid mapping, uses space.img as image, /dev/sda of the quest as partition, space/ as the mount point.
guestmount -o uid=$(id -u) -o gid=$(id -g) -o default_permissions -a space.img -m /dev/sda space

# do things

# Unmount.
guestunmount space

【讨论】:

【参考方案2】:

mount 用于共享文件系统供用户使用。这种“共享”(包含文件系统的文件/事物与用户可访问的目录和文件结构之间的连接)是由内核中的module(在内核中运行的程序)完成的。该“程序”将用户请求(例如创建文件)转换为文件系统上的操作。 我们需要的是一个在用户空间中运行并且不调用mount 的文件系统程序。用户空间文件系统实现称为fuse,我知道流行文件系统有熔丝实现。 无论如何,我不知道有任何流行的程序,例如,它将在文件系统中的文件上创建一个文件,而不会将其“挂载”到目录中。您可以在wiki 上浏览示例,也许您会找到这样的程序。 我会自己编写这样的程序。 您可以编写自己的文件系统或选择使用现有的文件系统并编写程序来修改文件(或 ramdisk 映像,在 linux 上是文件)的内容,然后使用该程序创建和修改该文件系统的内容,无需执行 linux mount 调用。 例如,您可以使用许多嵌入式系统中使用的fat_fs 库,实现 fat_fs 回调函数。 disc_read() disc_write() 从你的文件/ramdisc 中读取和写入,然后调用 fat_fs 函数来修改 ramdisc/file 的内容。此类嵌入式库不应调用 mount 或任何 linux 系统调用,因为嵌入式系统上缺少这些调用。 PS。在我的大学有这样的课程,学生必须编写一个简单的文件系统程序,打开一个文件,并支持在这个文件的文件系统中创建、修改和删除文件。

【讨论】:

以上是关于在构建期间生成 ramdisk 并填充内容的主要内容,如果未能解决你的问题,请参考以下文章

cmake build dir 存储在 ramdisk 中并符号链接到项目导致 make 失败

solaris 10,java 6,file.exists 看不到现有文件

如何在 Wix 主要升级期间防止数据库丢失

为啥内核支持一次调用注册不同主号的设备

winform生成word表格并自动填充

Busybox构建根文件系统和制作Ramdisk