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 的大小。