1. 简介
Ramdisk是虚拟内存盘的意思,是通过软件将一部分的内存模拟成硬盘来使用的一种技术,相对于直接的硬盘文件访问来说,速度提升了,但缺点是你对ramdisk的文件系统中的所有操作,在重启后都是失效的。失效的这点不包括系统启动后将存储介质挂载到某个目录下的文件。
2. 问题描述
在跟进公司原有系统的时候,发现有的嵌入式系统的根文件目录采用了ramdisk,但是原来的目录源文件是没有的,只是有一个ramdisk的镜像文件,我们想把新的文件更新到ramdisk中的目录里边去。
3. 实现
在ramdisk镜像中添加文件的思路是 将ramdisk的镜像文件挂载到本地目录下,然后在目录中进行添加删除的操作,然后umount。但多数情况,系统使用的ramdisk镜像经过了gzip压缩,是一个压缩文件,因此,在操作之前需要解压缩的步骤。
3.1 首先查看文件是什么格式
> file xxx
比如,我电脑上的一个例子:
> file uramdisk_lip.image.gz
uramdisk_lip.image.gz: u-boot legacy uImage, , Linux/ARM, RAMDisk Image (gzip), 5310008 bytes, Thu Dec 19 11:03:49 2019, Load Address: 0x00000000, Entry Point: 0x00000000, Header CRC: 0xF876A786, Data CRC: 0xBF1F36F4
> file arm_ramdisk.image
arm_ramdisk.image: Linux rev 0.0 ext2 filesystem data (mounted or unclean), UUID=00000000-0000-0000-0000-000000000000
3.2 解压和压缩
解压 (arm_ramdisk.img.gz --> arm_ramdisk.img)
> gunzip arm_ramdisk.image.gz
压缩 (arm_ramdisk.img --> arm_ramdisk.img.gz)
> gzip [-v9] arm_ramdisk.image // 其中的v表示显示压缩情况,9表示按最大压缩比压缩,当然这个[]选项是可有可无的
但是,有时需要在压缩文件的开头添加些信息
> mkimage -A arm -T ramdisk -C gzip -d arm_ramdisk.image.gz uramdisk_lip.image.gz
$ mkimage --help
Usage: mkimage -l image
-A ==> set architecture to 'arch'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-d ==> use image data from 'datafile'
3.3 挂载和卸载
挂载后可进行文件操作
> sudo mount -o loop arm_ramdisk.image tmp_mnt/
卸载,卸载后才能进行压缩等操作
> umount tmp_mnt/
4. 小改进
对挂载卸载ramdisk,通常编写脚本以提供方便:
mount.sh 和 umount.sh 分别如下。
#!/bin/bash
gunzip arm_ramdisk.image.gz
sudo mount -o loop arm_ramdisk.image tmp_mnt/
#!/bin/bash
sudo umount tmp_mnt/
gzip arm_ramdisk.image
echo "Now arm_ramdisk.image can used!"
mkimage -A arm -T ramdisk -C gzip -d arm_ramdisk.image.gz uramdisk_lip.image.gz
echo "uramdisk_lip.image.gz generated!"