在嵌入式Linux开发中, 往往需要为目标系统设置根文件系统, 这包括: 准备好根文件系统所需的内容, 选择目标系统的文件系统类型, 将根文件系统的内容转换为所用文件系统的格式, 将根文件系统安装到目标系统上. (这里假设目标系统的存储设备已经配置好了)
Ubuntu/Debian上默认未安装MTD工具, 首先安装它们: $ sudo apt-get install mtd-tools
|
Ramdisk
The RAM disk driver is a way to use main system memory as a block device.
我们可以将Ramdisk和一般的块设备一样使用. 查看ramdisk信息:
$
ls -l /dev/ram*brw-rw---- 1 root disk 1, 0 2006-09-18 17:45 /dev/ram0brw-rw---- 1 root disk 1, 1 2006-09-18 17:45 /dev/ram1...Ramdisk的优点: 读写速度非常快, 适合用来制作initrd.
Ramdisk的缺点: 不具有永久性, 断电后无法保存. 且ramdisk大小不可更改, 浪费ram.
Ramdisk制作方法可以利用空闲的块设备(比如软盘或未用的分区), 主机系统的RAM disk(/dev/ram0), loop设备来制作Ramdisk. /Documentation/ramdisk.txt中介绍的是使用/dev/ram0来制作ramdisk.
使用loop设备来制作Ramdisk最为简单:
#
dd if=/dev/zero of=ramdisk.image bs=1k count=8192使用dd命令建立一个8192KB的文件系统映像. 以/dev/zero对其初始化.
| 如果要向板子的文件系统中添加内容, 不要修改既有的ramdisk, 而是重新创建一个ramdisk. 这样做是为了让映像获得更大的压缩比. |
ramdisk只是个块设备, 需要将它格式化为特定的文件系统后才能使用:
#
mke2fs -F -v -m0 ramdisk.image-F : 迫使mke2fs在ramdisk.image上运行, 否则, mke2fs会抱怨ramdisk.image不是块设备.
-v : 以verbose模式运行
-m0 : 指定不必在文件系统上为"超级用户"保留任何block.(一般嵌入式Linux都是单用户系统).
也可以将ramdisk.image格式化为minix文件系统:
#
mkfs.minix ramdisk.image完成之后, 可以用file命令看到:
ramdisk.image: Linux rev 1.0 ext2 filesystem data将ramdisk格式化后, 就可以挂在它(假设挂在到当前目录中的ramdisk目录)
#
mount -o loop ramdisk.image ramdisk
initrd
从字面意思就可以看出来, initrd = initial RamDisk. initrd被用来在flash中储存压缩过的文件系统.
在桌面或服务器版的Linux中, 在实际的根文件系统可用之前, initrd先被内核挂载为临时的根文件系统. 当完成了加载, 启动之后, initrd可能被卸载. 但在嵌入式Linux系统中, initrd往往被用来做为真正的根文件系统.
initrd和上面介绍的ramdisk有着不可分割的联系, 在/Documentation/ramdisk.txt中, 就有这样一句话:
It is required for initrd, an initial filesystem used if you need to load modules in order to access the root filesystem.据我理解, initrd就是在已经被格式化后的ramdisk中加入文件, 然后将其压缩的产物. 当然, ramdisk中的文件系统中要包含用于初始化的文件(可执行文件, 脚本或链接).
上接ramdisk的例子, 把ramdisk.image挂载之后, 向里面添加必须的文件. 然后将其卸载, 压缩:
#
umount ramdisk#
gzip -9 ramdisk -9 : 获得最大压缩比
tmpfs
与ramdisk, initrd不同, tmpfs是基于VM的, 具体可参考本blog的
开发板实务(4)——分析板子的文件系统未完, 待续....
Reference
1, LinuxDevice.com上面的“
Flash Filesystems for Embedded Linux Systems", 介绍了用于Nor Flash中的文件系统.
2, 内核源码数的/Documentation/ramdisk.txt介绍了ramdisk, Documentation/initrd.txt中介绍了initrd. 必看!
3, IBM dw上的
Linux初始RAM磁盘initrd)概述4,
Linux中的Ramdisk与Initrd5, <构建嵌入式Linux系统>, 第8章.