ramdisk和initramfs文件系统制作V1.1
- 格式:pdf
- 大小:399.50 KB
- 文档页数:8
制作ramdisk文件系统制作一个最基本的文件系统(这里采用busybox1.1.0:准备:Busybox1.1.0源码;交叉编译工具链gcc-3.4.6;Linux2.6源码包;下面开始制作:一:建立交叉编译环境,将gcc-3.4.6解压到/opt下二:解压busybox-1.1.0.tar.bz2:busybox-1.1.0.tar.bz2jxf#tar三:进入解压后的目录busybox-1.1.0,开始进行busybox的编译配置:1.运行#make menuconfig后,选择Build Options2.选上选项:”Do you want to build BusyBox with a cross compiler?”(让它采用交叉编译工具链进行编译)选择要使用的工具链的路径:(./_install)BusyBox installation prefix:指定生成的文件的路径.4.再在其它的选项里选择好你要编译入文件系统的命令,保存退出!5.编译:#make clean allinstall#make这样,就在/busybox-1.1.0/_install下生成了bin,sbin,linuxrc四.开始制作文件系统:建立文件夹:mkdir bin dev home proc sbin tmp var boot etc lib mnt root sys usr etc/init.d u sr/etc___________________________________________________________mknod -m 600 dev/console c 5 1mknod -m 666 dev/null c 1 3___________________________________________________________vi etc/profile#!/bin/sh#/etc/profile:system-wide .profile file for the Bourne shellsechoecho -n "Processing /etc/profile......"# Set search library pathexport LD_LIBRARY_PATH=/lib:/usr/lib# set user pathexport PATH=/bin:/sbin:/usr/bin:/usr/sbin#Set PS1USER = "`id -un`"LOGNAME=$USERPS1='[\u@\h\W]\$'PATH=$PATHecho "Done!"___________________________________________________vi etc/init.d/rcS#!/bin/sh# set hostname, needed host file in /etc directory#./etc/hosthostname `cat /etc/host`# mount all filesystem defined in "fstab"echo "#mount all......."/bin/mount -a#+yangdk/bin/chmod 0666 /dev/nullecho "# starting mdev...."/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s/usr/etc/initecho "******************************************" echo " Guoguifu linux-2.6.24.4 boot " echo " 2008-12-15 "echo " grandchips "echo "******************************************" ______________________________________________vi etc/fstabproc /proc proc defaults 0 0none /tmp ramfs defaults 0 0none /var ramfs defaults 0 0mdev /dev ramfs defaults 0 0sysfs /sys sysfs defaults 0 0________________________________________________vi etc/inittab::sysinit:/etc/init.d/rcS::respawn:-/bin/shtty2::askfirst:-/bin/sh::ctrlaltdel:/bin/umount -a -r::shutdown:/bin umount -a -r::shutdown:/sbin/swapoff -a_________________________________________________ vi usr/etc/init#!/bin/shifconfig eth0 192.168.3.111 upifconfig lo 127.0.0.1_________________________________________________ vi mdev.conf (空的)_________________________________________________将下列几个必须库从工具链gcc-3.4.6的目录:gcc-3.4.6/mipsel-linux/lib拷贝到lib目录.ld.so.1, ld.-2.3.6.so, libcrypt.so.1, libc.so.6, libdl.so.2, libgcc_s.so.1, , libm.so.6, libpthread.so.o, libstdc++.so.6cp /opt/gcc-3.4.6/mipsel-linux/lib/库 lib/至此,文件系统制作完成!!五.将制作好的文件系统ramdisk放到linux2.6源码包的目录:linux26_3210/arch/mips/下,再回到linux26_3210根目录下进行内核配置,让内核采用ramdisk文件系统:1.进入:Device Driver->Block devices,选上”RAM disk support”选项,并在下面的三个ramdisk大小等参数进行配置,如下图所示:2.进入General setup,在”initramfs source file” 里输入ramdisk的路径:arch/mips/ramdisk,如下图所示:保存退出,完成内核配置!编译linux后,这个linux内核就选择ramdisk文件系统启动了,启动后可以看到刚做的简单文件系统在板上跑☺。
initramfs文件系统initramfs文件系统Linux内核加载根文件系统执行/sbin/init程序前,需要找到根设备位置,如果根设备需要驱动的支持,内核有可能无能为力,通过提供一个过渡的临时根文件系统可以使得内核的设计更灵活简单.通常过渡的临时根文件系统基本上是内存文件系统.常见的内存文件系统有:rootfs,ramfs,ramdisk,tmpfs1. rootfs:内核启动的初始始根文件系统,大部分linux系统正常运行后都会安装另外的文件系统,然后忽略rootfs2. ramfs:基于内存的文件系统.ramfs文件系统没有容量大小的限制,它可以根据需要动态增加容量.直接利用了内核的磁盘高速缓存3. ramdisk:基于ram的块设备,占据一块固定的内存,事先要使用特定的工具比如mke2fs格式化,还需要一个文件系统驱动来读写其上的文件空间固定导致容量有限,要想装入更多的文件需要重新格式化.Linux的块设备缓冲特性, ram disk上的数据被拷贝到page cache(对于文件数据)和dentry cache(对于目录项),导致内存浪费,它可能不停的动态增长直到耗尽系统的全部内存,所以只有root或授权用户允许使用ramfs4. tmpfs:增加了容量大小的限制 + 允许把数据写入交换分区.由于增加了这两个特性,tmpfs允许普通用户使用过渡根文件系统机制:将加载真正的根文件系统需要的设备驱动、工具以及初始化程序先加载到内存运行.1. initrd: initial Ramdisk/linuxrc文件,基于ramdisk技术,文件系统(ext2等)镜像文件————> cpio格式镜像文件在内核启动完成后把它复制到/dev/ram块设备中, 作为内核加载真正根文件系统的过渡根文件系统2. initramfs: initial RAM file systeminit文件,cpio格式镜像文件在内核启动完成后把它复制到rootfs中,作为内核初始的根文件系统,完成挂载系统真正的根文件系统initramfs制作与使用:我们学习都是从输出一个hello world开始的,所以这里就用过渡根文件系统输出hello world来说明.1.编写程序#include <stdio.h>int main(int argc, char *argv[]){printf("Hello world Initramfs!\n");sleep(999999999);}交叉编译:arm-linux-gcc -static hello.c -o init2. 打包initramfs镜像find .|cpio -o -H newc|gzip > ~/myinitramfs.cpio.gz在内核中选择使用: 注意选择initramfs的压缩格式3. 解包initramfs镜像cpio -i -F myinitramfs.cpio --no-absolute-filenameszcat myinitramfs.cpio.gz | cpio -i -d -H newc --no-absolute-filenames4. 内核initramfs的构建General setup --->[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support(/rootfs_dir) Initramfs source file(s)Built-in initramfs compression mode (None) ---> [] None [] GZIP然后烧录的时候将文件系统烧录即可分类: 系统移植之文件系统。
1、拷贝s3c2440_recover.tar.bz2到我们的目标文件夹下解压cp /mnt/hgfs/share/s3c2440_recover.tar.bz2 /home/opt/cd /home/opttar jxvf s3c2440_recover.tar.bz2cd s3c2440_recover2、裁剪rm *.tar.gz –rfcd librm *.a –rf 删除静态库rm debug/ -rf 可以不用debugcd ../bin/rm udev* -rf sbin 中有了3、mkdir /home/opt/rootfscd /home/opt/rootfsdd if=/dev/zero of=/home/opt/rootfs/ramdisk.img bs=1024 count=12000mke2fs -F -m 0 -b 1024 ramdisk.img 格式化mount -t ext2 -o loop ./ramdisk.img ./root/cp /home/opt/s3c2440_recover/* ./root/ -rfumount ./rootgzip -vf9 ramdisk.imgcp ramdisk.img.gz /tftpcd /home/opt/ utu-linux_for_s3c2440_V1.5.3/make cleanmake menuconfig选device drivers ——>block drivers 选中,以下选项如下设置<*> Loopback device support<*> RAM disk support(2)Default number of RAM disks(可改)(16368) Default RAM disk size (kbytes) (大于12M即可)[*] Initial RAM disk (initrd) support启动开发板,开启超级终端进入bootloader敲printenvutu-bootloader=>>>printenvinstall-bootloader=tftp 30000000 u-boot.bin;nand erase 0 40000;nand write 30000000 0 0install-kernel=tftp 30000000 uImage;nand erase 60000 200000;nand write.i 30000000 60000 0install-filesystem=tftp 30000000 filesystem.yaffs;nand erase 260000 3d9c000;nandwrite.yaffs1 30000000 260000 0erase-env=nand erase 40000 20000bootargs=root=/dev/mtdblock2 rw console=ttySAC0,115200 bootcmd=nand read.i 0x32000000 0x60000 0x200000; bootm bootdelay=1baudrate=115200ethaddr=00:0c:20:02:0a:5bipaddr=192.168.1.168netmask=255.255.255.0serverip=192.168.1.3stdin=serialstdout=serialstderr=serialEnvironment size: 591/131068 bytes保存下,下次还会用到的接着set bootargs 'root=/dev/ram rw initrd=0x30800000,6M ramdisk_size=12288 console=ttySAC0,115200't 32000000 uImaget 30800000 ramdisk.img.gzbootm 32000000结果如下:[root@bit /]# lsbin home lost+found root usrdev lib mnt sbin varetc linuxrc proc sys成功。
制作ramfs文件系统
1)准备
要有一个已经可以使用的文件系统,假设目录为/rootfs
Linux内核需要支持ext2文件系统及ramdisk支持(fs相应的选项要勾上)
2)在pc上制作ramdisk镜像
(1)dd if=/dev/zero of=ramdisk.img bs=1k count=4096 这样制作的镜像有4MB,可以根据自己的需要修改
(2)mkfs.ext2 -m0 ramdisk.img
将ramdisk.img格式化为ext2格式
(3)mount -o loop ramdisk.img /mnt/ramdisk/
将ramdisk.img挂载到/mnt/ramdisk目录
(4)cp -a /rootfs /mnt/ramdisk
将自己的文件系统全部拷贝到/mnt/ramdisk目录去
(5)umount /mnt/ramdisk
卸载ramdisk挂载
此时生成可用的ramdisk.img镜像
(6)gzip -v9 ramdisk.img
压缩镜像,我没试过加载压缩的镜像,应该也可以
3)修改开发板bootargs,添加 initrd=0x31000000,4096000 这里0x3100000是ramfs文件系统的加载地址,4096000是大小
重启开发板,应该正常加载ramfs文件系统。
制作根文件系统有两种方法1、利用开发板提供的映像文件制作ramdisk2、利用busybox制作根文件系统(制作过程复杂)采用第一种方法制作需要的ramdisk1、拷贝已有的uramdisk.image.gz 到新建的tmp/下,cp uramdisk.image.gz tmp/2、去掉mkimage生成的64 bytes 的文件头,生成新的ramdisk.image.gz$ dd if=uramdisk.image.gz of=ramdisk.image.gz bs=64 skip=13、 gunzip解压ramdisk.image.gz 生成ramdisk.image$ gunzip ramdisk.image.gz4、新建挂载目录“ramdisk”,并将ramdisk.image挂载$ sudo mount -o loop,rwramdisk.imageramdisk5、接下来,只需要将ramdisk目录下的内容全部拷贝到rootfs下即可cp -R ramdisk /* rootfs这样就有了自己的rootfs,省去利用busybox制作的麻烦了有了制作好的rootfs,下面就开始制作映像文件了1、创建镜像文件ramdisk8M.image,并设置大小为8M,文件系统格式为ext2$dd if=/dev/zero of=ramdisk8M.image bs=1024 count=8192$mke2fs -F ramdisk8M.image -L "ramdisk" -b 1024 -m 0$tune2fs ramdisk8M.image -i 0$chmod 777 ramdisk8M.image大小可以按照需要自己调整,但是最好不要超过32M,创建ramdisk目录,将ramdisk8M.image 挂载到该目录下$mkdirramdisk$mount -o loop ramdisk8M.image ramdisk/接下来,只需要将rootfs目录下的内容全部拷贝到ramdisk下即可$cp -R rootfs/* ramdisk注意,这里cp的参数一定是R而非r。
制作ramdisk类型文件系统ramdisk也就是内存盘的意思。
所谓的RAM驱动器,实际上是把系统内存划出頒分当做硬盘使用。
对于操作系统来讲内存的存取速度远远大于机械磁盘,所以RAM驱动器肯定要比机械的硬盘快得多。
你可以把整个应用程序都安装在ramdisk的驱动器中,然后用内存的速度运行它。
使用RAM驱动器技术对于延长笔记本电脑电池使用时间也是十分有利的,因为这样做可以减少访问〃耗电大户”的次飢Ram:内存,Disk :磁盘,在Linux中可以将一部份内存当做分区来使用,称之为Ramdisk。
对于一些时常被访问、并且不会被更改的文件,可以将它们通过Ramdisk 放在内存中,能够明显地提高系统性能。
Ramdisk工作于虚拟文件系统(VFS )层,不能格式化,但可以创建多个Ramdisk。
虽然现在硬盘价钱越来越便宜,但对于一些我们想让其访问速度很高的情况下,Ramdisk还是很好用的。
如果对计算速度要求很高,可以通过增加内存来实现,使用ramdisk技术。
一个A Ramdisk 就是把内存假设为一个硬盘驱动器,并且在它的上面存储文件,假设有几个文件要频繁的使用,如果将它们加到内存之中,程序运行速度会大幅度提高,因为内存的读写速度远高于硬盘。
划出部份内存提高整体性能,不亚于更换新的CPU。
像Web服务器这样的计算机,需要大量读取和交换特定的文件。
因此,在Web服务器上建立Ramdisk会大大提高网络读取速度。
从制作Ramdisk根文件系统的方法上来说,是很简单的。
1 .配置Linux内核支拮Ramdisk类型的文件系统。
2.制作好根文件系统,使用之前实验案例制作好的根文件系统。
3.将制作好的根文件系统制作成Ramdisk类型文件系统。
4.下载到TPAD上使用测试。
实现1 .对内核进行配置,使得内核能够支持Ramdisk类型的文件系统,如图・9 ,图・10 ,图•11。
$ cd /home/tarena/workdir/tools/linux-2.6.35.7$ make menuconfig$ make zlmage$ cp arch/arm/boot/zlmage /tftpboot图・9S-10config • Linux Kernel V2.6.35.7 ConfigurationArrow keys navigate the nenu. <Enter> selects submenus Highlighted letters are hotkeys. Pressing <Y> includes9 <N> excludes, <M> nodulartzes features. Press <Esc><Esc> to exit, <?> for Help.</> for Search. Legend: [w] built-in [ ] excluded <M> module < ><w> M nory Technology Device <HTD) support <xarelLeL uoiLt s|[w] BLock devicesI■j HI>c uevxce><> ATA/ATAPI/MFM/RLL support (DEPRECATED)CSI device support -•<> serial ATA and Parallel ,] M IttpXe devices driver ♦] N twork device support]ISDN support > ATA drivers —> support (RAID and LVM)Select Exit > < Help >图・11config - Ltn ConArrow keys navigate the nenu. <Enter> selects subnenus --->• Highlighted letters are hotkeys.Pressing <Y> includes f <N> excludes, <M> nodulartzes features. Press <Esc><Esc> to exit. <?> for Help. <f> for Search. Legend: [*] built-in [ ] excluded <M> module < >•・・ DRBD disabled because PROOFS f INET or CONNECTOR not se < > N twork block device support<*^^^A^DiocKaevlcesup^rt (16) default number of RAM disks2.制作Ramdisk文件系统的过程,如图・12 ,图・13 ,图・14 ,图・15 ,图・16所$ cd /home/tarena/workdir/tools/busybox-1.19.4/_lnstall/dev$ sudo mknod console c 5 1$ sudo mknod null c 1 3$ cd /home/tarena/workdir/tools/busybox-1.19.4$ dd if=/dev/zero of=initrd.img bs=lk count=8192$ sudo mkfs.ext2 -F initrd.img$ sudo mkdir /mnt/initrd$ sudo mount -t ext2 -o loop initrd.img /mnt/initrd$ sudo cp Jnstall/* /mnt/initrd -a$ sudo amount /mnt/initrd$ gzip -best -c initrd.img > ramdisk.img$ sudo chmod 777 ramdisk.img$ cp ramdisk.img /tftpboot图・12consoke^tQQls libbb ______ util^ltnux记県丫8192♦。
initramfs 生成过程initramfs 是一个用于引导 Linux 系统的初始内存文件系统。
它包含了用于引导过程中所需的关键文件和工具,例如驱动程序、文件系统工具等。
initramfs 的生成过程可以分为几个关键步骤。
首先,生成 initramfs 的过程通常是由操作系统安装程序或者更新程序自动完成的。
在安装或更新 Linux 内核时,系统会自动构建 initramfs。
但是,如果需要手动生成 initramfs,可以通过以下步骤完成:1. 收集必要的文件和工具,生成 initramfs 首先需要收集引导过程中所需的文件和工具,包括设备驱动程序、文件系统工具、初始化脚本等。
这些文件通常位于系统的 /lib 目录下。
2. 创建临时目录,在生成 initramfs 的过程中,需要创建一个临时目录来存放生成的文件系统内容。
3. 打包文件系统,将收集到的文件和工具打包成一个 cpio 归档文件。
这个归档文件将会成为 initramfs 的内容。
4. 压缩归档文件,对生成的 cpio 归档文件进行压缩,通常使用 gzip 或者 xz 等压缩工具进行压缩,以减小 initramfs 的体积。
5. 将压缩后的归档文件重命名为 initramfs 文件,生成的压缩归档文件需要被重命名为 initramfs 文件,并放置在系统的/boot 目录下。
需要注意的是,生成 initramfs 的具体步骤可能会因不同的Linux 发行版而有所差异,例如使用不同的打包工具或压缩工具。
因此,在手动生成 initramfs 时,最好参考所使用 Linux 发行版的官方文档或者社区指南,以确保按照正确的步骤进行操作。
总的来说,生成 initramfs 的过程涉及到文件收集、打包、压缩和命名等步骤,最终生成的 initramfs 文件将会包含引导 Linux 系统所需的关键文件和工具,以确保系统能够成功引导到正常运行状态。
1dd命令的解释dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
参数注释:if=文件名:输入文件名,缺省为标准输入。
即指定源文件。
of=文件名:输出文件名,缺省为标准输出。
即指定目的文件。
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
conv=conversion:用指定的参数转换文件。
ascii:转换ebcdic为asciiebcdic:转换ascii为ebcdicibm:转换ascii为alternateebcdicblock:把每一行转换为长度为cbs,不足部分用空格填充unblock:使每一行的长度都为cbs,不足部分用空格填充lcase:把大写字符转换为小写字符ucase:把小写字符转换为大写字符swab:交换输入的每对字节noerror:出错时不停止notrunc:不截短输出文件sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
2制作文件系统2.1步骤一在磁盘中分配固定大小的空文件ramdiskdd if=/dev/zero of=ramdiskbs=1M count=20格式化为某一文件系统sudo mkfs.ext3 -m 0 -F -N 5000 -b 4096 ./ramdisk将该文件挂载至某一目录下sudo mount -t ext3 -o loop ./ramdisk./tmp将所需文件复制到该目录下,即将所需文件打包成一个文件ramdisksudocp -dpR $(ROOTFS_DIR)/* ./tmp(此处ROOTFS_DIR一般是busybox和一些ubi必要的文件系统的工具)sudoumount./tmp2.2步骤二ramdisk.gz与ramdisk相互转换ramdisk压缩成ramdisk.gzgzip -f9 ramdiskramdisk.gz解压出ramdiskgzip -d ramdisk.gz2.3步骤三uRamdisk.gz与ramdisk.gz相互转换ramdisk.gz生成uRamdisk.gzmkimage -A ppc -O linux -T ramdisk -C gzip -n "Linux ramdisk" -d ramdisk.gz uRamdisk.gzuRamdisk.gz生成ramdisk.gzsudodd if=./uRamdisk.gz of=./ramdisk.gz bs=64 skip=12.4补充最后生成的uRamdisk.gz即为edd_uRamdisk文件,复制过程中重命名即可cp uRamdisk.gz $(TARGET_DIR)/edd_uRamdisk。
教你如何用U盘或手机存储卡制作启动盘再重装系统制作启动盘是一项非常有用的技能,它可以帮助你在需要时重新安装操作系统。
使用U盘或手机存储卡制作启动盘非常方便,只需几个简单的步骤即可完成。
在本篇文章中,我将向你介绍如何使用U盘或手机存储卡制作启动盘。
1. 使用Windows制作启动盘:-插入U盘到电脑上。
-选择U盘,并点击“开始”按钮开始制作启动盘。
2. 使用Mac制作启动盘:- 插入U盘到Mac电脑上。
-打开“磁盘工具”应用程序。
-在左侧导航栏中找到你的U盘,并点击它。
- 选择“擦除”选项,并选择“Mac OS Extended (Journaled)”格式。
-完成擦除后,点击“恢复”选项。
3. 使用Linux制作启动盘:-插入U盘到电脑上。
-打开终端应用程序。
- 输入以下命令以查找你的U盘设备名称:sudo fdisk -l- 找到你的U盘,通常以/dev/sdx的形式显示(x为设备号,可能是a、b、c等)。
- 输入以下命令将操作系统镜像写入U盘:sudo ddif=/path/to/iso/file of=/dev/sdx bs=4M一旦你完成了这些步骤,启动盘制作过程就完成了。
你现在可以将U盘或手机存储卡插入要重新安装操作系统的计算机中,然后在计算机启动时选择从U盘或存储卡启动。
需要注意的是,在重新安装操作系统之前,请确保备份你的重要文件,因为重新安装操作系统将清除计算机上的所有数据。
总结:制作启动盘是一项非常有用的技能,可以帮助你重新安装操作系统。
使用U盘或手机存储卡制作启动盘非常简单,只需几个简单的步骤即可完成。
选择正确的操作系统镜像文件,然后按照不同操作系统的步骤进行制作。
完成后,将U盘或手机存储卡插入计算机,选择从启动盘启动,然后按照屏幕上的提示重新安装操作系统。
记得在重新安装前备份你的重要文件。
祝你成功!。
在Linux系统下制作RamDisk简介RamDisk就是将内存(Ram)的一部分当做硬盘(Disk)来使用。
RamDisk有固定的大小,可以像正常硬盘分区那样去使用。
就操作时间来讲,RamDisk比真实的物理硬盘快很多,当系统关闭或断电时,保存在RamDisk中的数据会全部丢失。
RamDisk可以成为一个存放临时数据的好地方。
1. 查看系统已创建RamDiskRedHat默认创建16个RamDisk,虽然它们没有激活或使用任何Ram。
系统列出的设备是ram0~ram15。
使用下面的命令可用检出这些块设备:现在,用grep在dmesg的输出中找出RamDisk的大小你可以看到,RamDisk默认只有16MB。
我想要一个16MB的RamDisk,所以,下一步要配置Linux,使得在启动过程中使用一个更大的RamDisk。
2. 修改RamDisk的大小RamDisk的大小是被一个命令行选项控制的,这个选项会在系统启动时传给内核。
由于RedHat9的默认bootloader是GRUB,我将用新的选项修改/etc/grub.conf,RamDisk大小的内核选项是:ramdisk_size=xxxxx ,xxxxx是指大小为1024-Byte的块的个数。
下面是我要添加到/etc/grub.conf的内容,它将RamDisk配置为1GB:将文件保存后,你需要重启系统。
重启后,通过查看dmesg的输出来确认修改已经生效:3. 格式化RamDisk无需将RamDisk格式化为日志文件系统,我们将使用EXT2文件系统。
我只想使用一个RamDisk,所以我只格式化ram0。
4. 新建一个挂载点并挂载RamDisk你已经格式化了RamDisk,现在要为它新建一个挂载点。
然后就可以挂载你的RamDisk并使用它。
我们将会使用/mnt/rd文件夹。
检测新挂载的RamDisk5. 使用RamDiskRamDisk已经创建成功,现在,你可以像在物理硬盘分区那样,在RamDisk上复制、移动、删除、编辑或列出文件。
Ramdisk和initramfs文件系统制作一、实验环境操作系统:Ubuntu Linux2.6.38-8内核源代码:Linux2.6.32实验前准备:用Busybox制作好的rootfs文件夹(包含文件系统中的基本文件etc,lib,dev等,可以使用NFS挂载文件系统测试制作的rootfs是否能用)二、ramdisk文件系统制作1.重新为NAND Flash分区在内核源码\linux-03.00.00.04\arch\arm\mach-omap2\board-am3517evm.c 中修改:static struct mtd_partition am3517evm_nand_partitions[]={/*All the partition sizes are listed in terms of NAND block size*/{.name="xloader-nand",.offset=0,.size=4*(SZ_128K),.mask_flags=MTD_WRITEABLE},{.name="uboot-nand",.offset=MTDPART_OFS_APPEND,.size=15*(SZ_128K),.mask_flags=MTD_WRITEABLE},{.name="params-nand",.offset=MTDPART_OFS_APPEND,.size=1*(SZ_128K)},{.name="linux-nand",//存放内核.offset=MTDPART_OFS_APPEND,.size=32*(SZ_128K)},#if0{.name="ubifs-nand",.size=MTDPART_SIZ_FULL,.offset=MTDPART_OFS_APPEND,},#else//ramdisk+jffs2{.name="ramdisk-nand",//存放制作好的ramdisk文件系统.size=64*(SZ_128K),//8M.offset=MTDPART_OFS_APPEND,},{.name="data-nand",//数据区,用于保存数据.size=128*(SZ_128K),//16M.offset=MTDPART_OFS_APPEND,},#endif{.name="other-nand",.size=MTDPART_SIZ_FULL,.offset=MTDPART_OFS_APPEND,},};分区后Nand Flash地址范围:0x00000000-0x00080000xloader-nand0x00080000-0x00260000uboot-nand0x00260000-0x00280000params-nand0x00280000-0x00680000linux-nand0x00680000-0x00E80000ramdisk-nand0x00E80000-0x1E800000data-nand0x1E800000-others-nand2.配置内核(1)拷贝配置文件cp arch/arm/configs/omap3_soc8200_defconfig.config (2)make menuconfig1)在General setup--->选中2)在Device Drivers--->Block devices选中配置完成,选择保存退出(3)编译内核makemake uImage在arch/arm/boot生成uImage系统镜像3.制作ramdisk文件系统(1).建立loop设备的临时挂载点#mkdir/mnt/loop(2).建立文件系统映象#dd if=/dev/zero of=/tmp/ramdisk bs=1k count=12300(3).mke2fs–F–v–m0/tmp/ramdisk此处-F选项将可迫使mke2fs在文件上运行。
否则mke2fs会抱怨/tmp/ramdisk 不是个块设备(/tmp/ramdisk文件映象必须是块设备文件)。
-v选项指出mke2fs 应该以verbose模式执行,-m0指出不必在文件系统上为“超级用户”保留任何区块,因为在嵌入式系统中通常是单用户系统,为“超级用户”保留区块没有意义。
(4).挂载映象文件#munt–o loop/tmp/ramdisk/mnt/loop挂载后,在/mnt/loop下就可以对文件系统的内容进行操作。
(5).cp操作将需要的文件等复制到目录下。
(6).卸载映象文件#umount/mnt/loop(7).压缩映象文件#gzip–v9/tmp/ramdisk生成ramdisk.img.gz注:可以使用ramdisk制作工具genext2fs,自动生成ramdisk.img,然后再压缩映像文件。
4.制作jffs2格式的文件内核启动后将Nand的数据分区(0x00E80000-0x1E800000 data-nand)挂载到系统某一目录,为了使该分区可以读写,需要烧写一个jffs2或者yaff2格式的文件,在这里选择jffs2格式。
用到的工具是mkfs.jffs2,操作过程如下:将mkfs.jffs2(可在网上下载)放到/usr/sbin目录下,这样就可以使用它了。
执行下面的命令:mkfs.jffs2-s0x800-e0x20000-p1000000-d data/-o data.jffs2–n参数说明:-s,--pagesize=SIZE节点页大小(默认:4KiB)要根据使用的Nand Flash的型号来确定,在这里是0x800,是因为使用的nand的页大小是2k.-e,--eraseblock=SIZE设定擦除块的大小为(默认:64KiB).使用的nand的块大小是128K(0x20000)-p,jffs2分区的总大小,16M-d,要制作成jffs2文件格式的源文件路径。
-o,指定生成的镜像文件的路径名。
-n,--no-cleanmarkers指明不添加清楚标记(nand flash有自己的校检块,存放相关的信息。
)如果挂载后会出现类似:CLEANMARKER node found at0x0042c000has totlen0xc!=normal0x0的警告,则加上-n就会消失。
最后生成data.jffs2的镜像文件5.烧写镜像文件到Nand Flash在U-boot调试模式下,使用tftp方式来烧写镜像。
(1)烧写kerneltftp80300000uImagenand erase280000400000nand write.i80300000280000(uImage的大小)(2)烧写ramdisktftp81000000ramdisk.img.gznand erase680000800000nand write.i81000000680000(ramdisk.img.gz的大小)(3)烧写jffs2文件tftp82000000data.jffs2nand erase e80000nand write.i82000000e80000(data.jffs2的大小)6.设置启动参数setenv bootargs"console=ttyS2,115200n8root=/dev/ram0rwinitrd=0x81000000,30M"其中initrd=0x81000000表明内核会在该地址加载文件系统,所以系统启动时要从nand把ramdisk.img.gz读取到0x81000000开始的内存setenv bootcmd"nand read.i80300000280000300000;nand read.i81000000680000 1000000;bootm80300000"这样制作ramdisk文件系统的就已经完成,重启开发板就可启动。
三、initramfs文件系统制作1.重新修改Nand Flash分区static struct mtd_partition am3517evm_nand_partitions[]={/*All the partition sizes are listed in terms of NAND block size*/{.name="xloader-nand",.offset=0,.size=4*(SZ_128K),.mask_flags=MTD_WRITEABLE},{.name="uboot-nand",.offset=MTDPART_OFS_APPEND,.size=15*(SZ_128K),.mask_flags=MTD_WRITEABLE},{.name="params-nand",.offset=MTDPART_OFS_APPEND,.size=1*(SZ_128K)},{.name="kernel-ramdisk-nand",//12M.offset=MTDPART_OFS_APPEND,.size=96*(SZ_128K)},#if0{.name="ubifs-nand",.size=MTDPART_SIZ_FULL,.offset=MTDPART_OFS_APPEND,},#endif//delete by xiaoqi2013.12.16{.name="data-nand",//add for store data50M.offset=MTDPART_OFS_APPEND,.size=400*(SZ_128K)},{.name="others-nand",.size=MTDPART_SIZ_FULL,.offset=MTDPART_OFS_APPEND,},};分区后nand的地址范围为:0x000000000000-0x000000080000:"xloader-nand"0x000000080000-0x000000260000:"uboot-nand"0x000000260000-0x000000280000:"params-nand"0x000000280000-0x000000e80000:"kernel-ramdisk-nand"0x000000e80000-0x000004080000:"data-nand"0x000004080000-0x000010000000:"others-nand"因为内核和文件系统编译在一起会比较大,所以加大了kernel-ramdisk-nand 的大小。