zoukankan      html  css  js  c++  java
  • 制作ramdisk-u.img根文件系统

    具体步骤如下:
    1.解压内核源码树
    解压linux-2.6.29-mini2440-20090708.tgz到自己的工作目录,会生成一个友善之臂修改过的并且有几个mini2440默认配置文件的内核源码目录linux-2.6.29。具体步骤参照友善之臂mini2440开发板用户手册,具体不详述了。

    2.修改内核配置选项
    进入内核源码目录linux-2.6.29目录
    #cp config_mini2440_t35 .config
    #make menuconfig ARCH=arm
    打开配置菜单,修改两个配置项,分别是:
    a):General setup-->选择 Initial RAM filesystem and RAM disk...... 项
    b):Device Drivers-->Block devices-->选择 RAM block device support 项

    并检查Optimize for size是否被选中,如果没有则选中,此项优化内核大小,根据需要进行配置。
    修改(8192)Default RAM disk size kbytes选项为(4096)Default RAM disk size kbytes,之所以修改是因为我之后制作的ramdisk是4096KB大小的。当然如果你想制作8192KB大小的ramdisk,这里就要对应为8192了,以此类推。但是最小系统嘛,是不用那么大的ramdisk的。此项的默认配置就是(4096),以前我改过这个配置,所以是(8192)了。如果这个大小和你做的ramdisk不匹配,则启动时仍然会出现kernel panic内核恐慌,提示ramdisk格式不正确,挂载不上ramdisk。
    然后特别要注意的一点是,ramdisk是一种内存虚拟磁盘技术,实质上并不是一种文件系统,它使用的文件系统时ext2文件系统。所以一定要在make menuconfig ARCH=arm的时候进入File systems菜单,选上<*> Second extended fs support。以提供内核对ext2文件系统的支持。我以前添加过了ext2文件系统了,所以开始的时候在此没有说明,在此为了说明为什么有的人照着我的方法做了,但是仍然kernel panic,特别把这一步也加上。
    然后保存配置退出。
    这样就为内核添加好了ramdisk启动功能和ramdisk的驱动支持了。

    3.修改内核启动参数
    方法有二:
    a):修改.config的第310行,修改CONFIG_CMDLINE=""的定义
    修改为CONFIG_CMDLINE="initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M"
    保存。
    意思为从ramdisk启动,ramdisk压缩文件起始地址在内存地址0x31000000处,文件大小为0x200000。
    此参数也可以在make menuconfig ARCH=arm时进入Boot options菜单,然后在Default kernel command string里修改。效果是一样的。
    b):或者不修改.config的的第310行CMDLINE定义,而是用u-boot的bootargs环境变量来传递启动参数。
    同样也是修改该环境变量为bootargs=initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M
    并saveenv保存u-boot环境变量
    以上a),b)的效果是一样的。

    4.编译内核
    #make zImage ARCH=arm CROSS_COMPILE=arm-linux-
    然后是二十分钟左右的等待。
    编译完成后在当前目录下就出现了zImage内核映像了。
    好像友善之臂把内核源码目录里的uImage目标给注释了,以前在论坛里看到过有人说,直接make uImage好像提示没有uImage的目标。所以我就先制作zImage,然后再用u-boot的mkimage工具转化为uImage。其实uImage就是在zImage的开头部分增加了一个64字节的内核映像说明。

    5.制作uImage内核映像
    由于我使用的Bootloader是u-boot,所以要将zImage转化为uImage,方法如下:
    #mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n "Linux kernel Image" -d zImage uImage-ramdisk
    说明:mkimage工具是u-boot格式uImage内核映像制作工具。如果成功编译u-boot之后,它会在u-boot源码树下的tools目录之下。建议将其拷贝到宿主机的/sbin/目录下,以方便使用。mkimage使用时的具体参数不再详述,不清楚的请自己查阅。

    6.制作ramdisk根文件系统
    该过程是制作ramdisk根文件系统的核心步骤,方法如下:
    a)创建根文件系统目录:
    #cd转入到你的工作目录。
    #mkdir rootfs
    #cd rootfs
    #mkdir bin dev etc lib proc sbin sys usr mnt tmp var
    #mkdir usr/bin usr/lib usr/sbin lib/modules

    b)创建最基本的设备文件:
    #cd dev
    #mknod -m 666 console c 5 1
    #mknod -m 666 null c 1 3
    #cd ..

    c)安装/etc配置文件:
    这里可以直接把友善之臂的root_qtopia里的几个基本的配置文件拷贝过来,只拷贝必要的即可,并对其内容进行删减,因为我做的ramdisk并不包含Qtopia等,全拷贝过来也没有用。
    我是从网上找的最小系统的etc配置文件直接解压到我制作的根文件系统里了,并做参照友善之臂的root_qtopia添加了一些内容,见最后的说明。
    操作如下:
    #tar etc.tar.gz -C /xxx/rootfs
    xxx表示你要制作的rootfs所在的目录。

    d)编译内核模块:
    方法是如下:
    进入Linux内核源码目录(linux-2.6.29)
    #make modules ARCH=arm CROSS_COMPILE=arm-linux-

    e)安装内核模块:
    #make modules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootfs
    xxx表示你要制作的rootfs所在的目录。

    f)配置busybox
    进入busybox目录执行#make menuconfig
      进入Busybox Settings -> build Options ->选中"Build busybox as a static binary“,即静态链接,免去拷贝大量的库文件。
      Installation Options -> 选中"Don't use /usr",以免busybox不慎被安装到宿主机系统的相应目录下,破坏宿主机系统。
      Busybox Installation Prefix (/xxx/rootfs),修改该选项表明编译后的busybox将安装到该位置。

    g)编译、安装busybox
    #make ARCH=arm CROSS_COMPILE=arm-linux-
    几分钟编译完成后
    #make install
    安装到Busybox Installation Prefix (/xxx/rootfs)设定的目录里。当前为我要制作的根文件系统目录(/xxx/rootfs)。

    h)制作ramdisk根文件系统镜像
    方法如下:
    http://genext2fs.sourceforge.net/下载可以简单方便的制作ramdisk文件系统的工具genext2fs,这样就不用像网上大多数说的那样繁琐的制作ramdisk映像了,当前最新版本为genext2fs-1.4.1.tar.gz 。
    编译生成该工具genext2fs,并将其放入宿主机的/sbin/目录下以方便使用。
    跳转到要制作的rootfs的上一级目录
    #genext2fs -b 4096 -d rootfs ramdisk
    -b是指制作的ramdisk大小为4096K字节
    -d是指要制作成ramdisk的根文件系统目录
    最后的ramdisk是制作出来的ramdisk的名字,当然可以改名了。
    #gzip -9 -f ramdisk
    将该ramdisk以最优方式压缩为ramdisk.gz

    7)使用ramdisk根文件系统启动内核
    在u-boot命令行下键入如下命令启动系统:
    bootm 0x32000000
    ## Booting kernel from Legacy Image at 32000000 ...
       Image Name:   Linux-2.6.29.4-FriendlyARM
       Created:      2010-04-09  15:13:52 UTC
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    1917688 Bytes =  1.8 MB
       Load Address: 30008000
       Entry Point:  30008000
       Verifying Checksum ... OK
       Loading Kernel Image ... OK
    OK

    Starting kernel ...

    Uncompressing Linux.............................................................
    ................................................................ done, booting t
    he kernel.
    Linux version 2.6.29.4-FriendlyARM (root@localhost.localdomain) (gcc version 4.3
    .2 (Sourcery G++ Lite 2008q3-72) ) #3 Fri Apr 9 23:13:36 CST 2010
    CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
    CPU: VIVT data cache, VIVT instruction cache
    Machine: FriendlyARM Mini2440 development board
    Memory policy: ECC disabled, Data cache writeback
    ……中间过长的内容在此省略了……
    RAMDISK: Compressed image found at block 0
    VFS: Mounted root (ext2 filesystem) on device 1:0.
    Freeing init memory: 136K
    eth0: link down

    Processing /etc/profile... Done

    # eth0: link up, 100Mbps, full-duplex, lpa 0x45E1

    至此系统启动成功。

    ----------------------------------------------------------------------------------
    后记:由于友善之臂mini2440默认的配置文件是将驱动等直接编译到内核里去了,并没有使用内核模块。所以上述第6步制作根文件系统中的d)编译和e)安装内核模块的步骤可以不做。我就没有编译内核模块。因为参照友善之臂的root_qtopia根文件系统发现/lib/modules/`uname -r`里根本没有东西。而且以前用友善之臂的config_mini2440_t35默认配置编译内核模块的时候。发现友善只做了个hello_modules的内核模块示例。在此我们不需要使用这个hello_modules,所以这两步就略过去了。

    说明:由于最小系统里的etc配置文件没有写自动启动网卡的脚本,所以我做的ramdisk开始时并不能自动启动网卡。后来参照友善之臂的root_qtopia根文件系统里的脚本做如下修改,即可自动启动脚本。
    修改如下:
    修改要制作的ramdisk根文件系统的rootfs下的/etc/init.d/rcS文件
    在最下边添加如下两行命令即可自动启动网卡:
    /sbin/ifconfig lo 127.0.0.1
    /sbin/ifconfig eth0 192.168.31.230 netmask 255.255.255.0 up

    这个方法是通过分析友善之臂的root_qtopia根文件系统的启动流程时发现的

  • 相关阅读:
    解决maven托管项目中pom.xml存在坐标标红的问题
    Jquery取form表单中的所有参数
    解决IntelliJ IDEA控制台输出中文乱码问题
    Maven项目打包及jar包与war包的区别
    IDEA创建Maven web项目(项目结构组织、文件编译及运行明细)
    http学习笔记--报文构成
    http报文结构
    mount: unknown filesystem type 'vboxsf'
    使用shell做过时处理以及发送邮件的事例
    fuelphp 日志文件保存路径以及日志文件名变更中遇到的问题总结
  • 原文地址:https://www.cnblogs.com/zxouxuewei/p/5075883.html
Copyright © 2011-2022 走看看