Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304082
  • 博文数量: 111
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 672
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-05 23:41
文章分类

全部博文(111)

文章存档

2017年(111)

我的朋友

分类: LINUX

2017-06-23 19:18:34

这一篇我们来学习制作一个ramdisk文件系统镜像,并根据uboot的启动命令来简单说一下initrd的启动原理

这里使用genext2fs工具来制作ramdisk文件系统镜像,制作的镜像是属于image-initrd格式的镜像

步骤如下:

1.下载genext2fs-1.4.1.tar.gz并解压

2. 进入到上面解压的根目录下
# ./configure  //生成Makefile
# make
# make install  //安装

执行完上面的指令后,在终端输入genext2fs,如果没有提示命令找不到,就可以使用

3.进入到文件系统所在的目录执行下面的命令:
# genext2fs -b 10080 -d mini-rootfs -N 5024 ramdisk   // mini-rootfs就是文件系统代表的文件夹
# gzip -9 -f ramdisk

genext2fs制作镜像的原理可参照上一节“image-initrd格式镜像制作”步骤:
首先,会制作镜像;
然后,把制作的镜像格式化成我们需要的文件系统(genext2fs会把我们的文件系统格式化成ext2)
接着,把镜像和我们需要的文件系统关联起来
最后,压缩镜像(这里是我们手动用gzip命令实现的)

对于genext2fs命令中的“-b 10080”是用来指定制作的镜像大小是10080KB。怎么确定这个大小?
可进入到文件系统的根目录,执行:
# du -sh
查看文件系统的大小

关于genext2fs命令的具体用法,请百度


制作好了ramdisk镜像之后,来看一下uboot的设置:
setenv bootcmd 'nand read.e 0xc0700000 0x120000 0x400000;nand read.e 0xc1800000 0x520000 0x800000;bootm 0xc0700000'
setenv bootargs initrd=0xc1800000,0x800000 console=ttyS2,115200n8 root=/dev/ram rw rootfstype=ext2 mem=128M

回忆一下上一节讲的initrd原理,会先拷贝一个文件系统到内存中,在挂载实际的文件系统之前会先去执行这个文件系统里的文件
nand read.e 0xc1800000 0x520000 0x800000
干的就是拷贝文件系统的工作,我们的文件系统镜像,放在0x520000这个位置,拷贝到0xc1800000这个地址,这个地址属于内存里的地址,
拷贝大小是0x800000字节

然后还要告诉内核有没有采用initrd机制啊,还要告诉内核你把文件系统拷到哪里去了,内核好去那里去执行文件啊?
这个工作是通过环境变量
initrd=0xc1800000,0x800000
做的,它告诉内核在挂载实际的文件系统之前,先去执行这个文件系统,好通过它确定下一步工作

root=/dev/ram
是告诉内核我们最终要挂载的文见系统实际就是被拷贝的内存里的这个文件系统,不要让内核再去费力去挂载其他的文件系统了,
参考一下上一节的“image-initrd的处理流程”的第6步,如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动

阅读(1695) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~