制作initramfs根文件系统内核并用其启动最终文件系统

转载:http://blog.sina.com.cn/s/blog_80fd855d0100yt9z.html


一、initramfs 介绍

        最初的想法是Linus提出的: 把cache当作文件系统装载。   
他在一个叫ramfs的cache实现上加了一层很薄的封装,其他内核开发人员编写了一个改进版tmpfs,这个文件系统上的数据可以写出到交换分区,而且可以设定一个tmpfs装载点的最大尺寸以免耗尽内存。initramfs就是tmpfs的一个应用。  
优点:   
                        (1)tmpfs随着其中数据的增减自动增减容量.   
                        (2)在tmpfs和page cache/dentry cache之间没有重复数据.   
                        (3)tmpfs重复利用了Linux caching的代码, 因此几乎没有增加内核尺寸, 而caching的代码已经经过良好测试, 所以tmpfs的代码质量也有保证.   
                        (4)不需要额外的文件系统驱动.   
            另外, initrd机制被设计为旧的"root="机制的前端,而非其替代物,它假设真正的根设备是一个块设备,而且也假设了自己不是真正的根设备,这样不便将NFS等作为根文件系统。最后/linuxrc不是以PID=1执行的, 因为1这个进程ID是给/sbin/init保留的。 initrd机制找到真正的根设备后将其设备号写入/proc/sys/kernel/real-root-dev,然后控制转移到内核由其装载根文件系统并启动/sbin/init。   
              initramfs则去掉了上述假设, 而且/init以PID=1执行,由init装载根文件系统并用exec转到真正的/sbin/init, 这样也导致一个更为干净漂亮的设计。

生成initramfs镜像命令

  若镜像根目录为/initrd,执行下面命令在当前用户主文件夹中生成myinitramfs.gz镜像。   
cd /initrd   
find .|cpio -o -H newc|gzip>~/myinitramfs.gz   
生成的镜像文件是gzip压缩过的。

二、制作用于initramfs的文件系统
1.制作根文件目录

root@li-ace:/home/li/busybox-1.17.2# cd /home/li
root@li-ace:/home/li# mkdir initramfs
root@li-ace:/home/li# cd initramfs/

用shell脚本创建根文件系统的目录结构,并在想要建立根文件系统的地方运行此脚本。我是用root用户登陆的,直接创建了设备节点。
#!/bin/sh
  echo "makeing rootdir"
  cd /home/li/initramfs
  echo "makeing dir: bin dev etc lib proc sbin sys usr mnt tmp var home root ..."
  mkdir dev etc lib proc sys mnt tmp  #7 dirs
  mkdir lib/modules
#Copy bin sbin usr etc from /nfs/rootfs
  cd /nfs/rootfs
  cp -r bin sbin usr etc `cd -`;cd -
#Copy libs from /nfs/rootfs/lib to lib/
  cd /home/li/initramfs/lib
  ls
  cd /nfs/rootfs/lib
  cp libm.so.6 libc.so.6 ld-linux.so.3 `cd -`;cd -
#Don't use mknod, unless you run this Script as
  cd /home/li/initramfs/
  sudo mknod -m 777 dev/console c 5 1
  sudo mknod -m 777 dev/null c 1 3
  echo "done"

2.添加init程序
在initramfs根目录下新建init文档,加入一下内容:
#!bin/sh

mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s

sleep 1
choose=0
ipaddr=192.168.1.230
serverip=192.168.1.101

echo "##############################################################"
echo "run initramfs                          --please input \"0\"and Enter"
echo "mount rootfs on nfs              --please input \"1\"and Enter"
echo "\"0\" is default"
echo "##############################################################"
echo

read choose

case "$choose" in
"1")
      ifconfig eth0 ${ipadder}
      ifconfig eth0 up
      mount -t nfs ${serverip}:/nfs/rootfs /mnt -o nolock
      mount -t sysfs sysfs /mnt/sys;;
*)
      PS1="[InitRamFs@\W]#"
      export PS1
      /bin/sh
      exit 0;;
esac

exec switch_root /mnt /sbin/init
保存,并把权限设置为可执行的。

把制作好的initramfs文件系统复制到 /nfs 下
root@li-ace:/usr/src/linux-3.2.10# mv /home/li/initramfs /nfs
把nfs文件系统rootfs拷贝到 /nfs下

3.将initramfs编译进uImage,让它由内核启动后挂载。
PS:参考config_mini6410_n43 配置文件
root@li-ace:/usr/src/linux-3.2.10# make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-

  General setup  --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support 
        (/nfs/initramfs) Initramfs source file(s)   

root@li-ace:/usr/src/linux-3.2.10# make uImage ARCH=arm CROSS_COMPILE=arm-linux-

root@li-ace:/usr/src/linux-3.2.10# mv arch/arm/boot/uImage /tftp/initramfs.bin
    //将生成的uImage移动到/tftp下

三、下载启动initramfs内核
1.配置好环境变量

Uboot> setenv myboard AT91RM9200DK

Uboot> printenv

baudrate=115200

ipaddr=192.168.1.1

ethaddr=12:34:56:78:9A:BC

serverip=192.168.1.5

myboard=AT91RM9200DK

Environment size: 102/8188 bytes

2.下载启动

MINI6410 # tftp c0008000 initramfs.bin

MINI6410 # tftp c0008000 initramfs.bin                                         
dm9000 i/o: 0x18000300, id: 0x90000a46                                         
DM9000: running in 16 bit mode                                                 
MAC: 08:90:90:90:90:90                                                         
operating at 100M full duplex mode                                             
TFTP from server 192.168.1.101; our IP address is 192.168.1.230                
Filename 'initramfs.bin'.                                                      
Load address: 0xc0008000          

MINI6410 # bootm c0008000

IP-Config: Complete:                                                           
     device=eth0, addr=192.168.1.230, mask=255.255.255.0, gw=255.255.255.255,  
     host=192.168.1.230, domain=, nis-domain=(none)                            
dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0x4DE1                 
                                                                             
     bootserver=255.255.255.255, rootserver=192.168.1.101, rootpath=           
Freeing init memory: 4064K                                                     
##############################################################                 
run initramfs              --please input "0"and Enter                         
mount rootfs on nfs        --please input "1"and Enter                         
"0" is default                                                                 
##############################################################                 
                                                                               
                                           

[InitRamFs@/]#ls                                                               
bin         etc         lib         mnt         sbin        tmp                
dev         init        makedir.sh  proc        sys         usr                
[InitRamFs@/]#


PS:.config的配置一定要准确,多钻研下怎么配置
一些问题参考:http://blog.chinaunix.net/uid-20543672-id-129729.html

http://www.360doc.com/content/10/1203/21/1378815_74790077.shtml

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值