Chinaunix首页 | 论坛 | 博客
  • 博客访问: 819622
  • 博文数量: 264
  • 博客积分: 592
  • 博客等级: 中士
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 22:02
文章分类

全部博文(264)

文章存档

2019年(2)

2018年(1)

2017年(1)

2016年(4)

2015年(14)

2014年(57)

2013年(88)

2012年(97)

分类:

2012-09-27 00:53:19

原文地址:制作rootfs文件 ramdisk 作者:leonwang202

    ramdisk是一个最小的linux rootfs系统,它包含了除内核以外的所有linux系统在引导和管理时需要的工具(一般使用busybox)。ramdisk文件有点像我们玩游戏的时候用的光盘镜像,制作过程有点复杂,涉及到的命令挺多,整理一下。


第一步、建立filesystem文件
这里的filesystem文件相当于“空光盘”了,有容量,但里面什么内容都没有
dd命令建立文件/tmp/my_fs
# dd if=/dev/zero of=/tmp/my_fs bs=1M count=250
# ll my_fs
-rw-r--r--  1 root root 262144000 Jan  6 15:19 my_fs


if=/dev/zero    指定输入文件(in file)为/dev/zero。
                用这种方式,稍后我们使用gzip命令压缩整个映象时,
                将让文件系统中未使用的部分获得最大压缩比。

of=/tmp/my_fs   指定输出文件(out file)为/tmp/my_fs

bs=1K           输出文件的大小为 250M 
count=250       也就是ramdisk文件系统的大小,即“光盘”的容量    

注意:
filesystem文件不能直接读取,需要把它和设备文件相关联。
然后再把设备文件mount到挂载点目录。
对挂载点目录的操作,最终落实到filesystem文件


第二步、绑定设备文件与filesystem文件

# losetup /dev/loop0 /tmp/my_fs
# losetup /dev/loop0
/dev/loop0: [fd00]:21151794 (/tmp/my_fs)


绑定后,对/dev/loop0的操作就间接作用在 /tmp/my_fs上。

如果出现“ioctl:LOOP_SET_FD:设备或资源忙”,说明/dev/loop0设备还和另外的文件绑定着。
可用losetup /dev/loop0查看,并可用-d 解除绑定。

# losetup /dev/loop0
/dev/loop0: [fd00]:21151794 (/tmp/loop_tmp)      #文件/tmp/loop_tmp与/dev/loop0绑定着
# losetup -d /dev/loop0
# losetup /dev/loop0
loop: can't get info on device /dev/loop0: No such device or address


第三步、格式化filesystem文件

# mke2fs -m 0 /dev/loop0
将filesystem文件格式化为ext2
-m 0  指出不必在文件系统上为“超级用户”保留任何区块。

记住对/dev/loop0的操作都应用到filesystem文件/tmp/loop_tmp上

Linux内核识别两种可以直接考贝的到ramdisk的文件系统,它们是minix和ext2。
minix是linux早期版本用的文件系统,但ext2性能更好。

第四步、挂载设备文件

# mkdir /mnt/loop
# mount -t ext2 /dev/loop0 /mnt/loop



第五步、拷贝文件至filesystem文件

这一步就相当于“刻盘”了。
用cp命令将所需要文件拷贝到/mnt/loop下就OK了,记住对/mnt/loop的操作相当于对/tmp/loop_tmp的操作

/bin /dev /etc /lib /proc /sbin /usr都是必需目录,建议保留/tmp /var,可以为空。
而为多用户提供可扩展环境的所有目录(例如/home、/mnt、/opt、/root)都应该省略。

用cp复制文件时,建议把已建立好的文件系统中的内容全部拷贝过来.
这样比较简单,不需要再去编译安装busybox等。当然自己也可以那样去做。

第六步、收尾工作

先卸载挂载点
# cd /mnt/loop以外的目录 (否则会提示无法卸载,设备busy)
# umount /mnt/loop


压缩filesystem文件,在/tmp下生成了my_fs.gz,同时my_fs被删掉
# gzip -v9 /tmp/my_fs
生成的my_fs.gz以后有用,别删

给文件加头使其可引导,即成为ramdisk
# mkimage -A ppc -O linux -T ramdisk -C gzip -d my_fs.gz my_ramdisk



第七步、板子启动,tftp加载my_ramdisk



第八步、更新ramdisk内部的文件

# cp my_fs.gz my_fs.gz.bak
# gunzip -v9 my_fs.gz  
            
// 得到my_fs,同时my_fs.gz被删掉

# mount -o loop=/dev/loop3 my_fs /mnt/loop    
// -o loop=/dev/loop3 将my_fs 与 /dev/loop3 绑定

//                   将/dev/loop3 挂载到/mnt/loop下

# cd /mnt/loop
修改ramdisk上的文件。。。
# sync
# cd -
# umount /mnt/loop
# gzip -v9 my_fs 
                  
//得到my_fs.gz,同时my_fs被删掉
# mkimage -A ppc -O linux -T ramdisk -C gzip -d my_fs.gz my_ramdisk

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