ARM根文件系统制作

时间:2021-07-06 00:33:49

ARM根文件系统制作              

 1. 制作文件系统的内容
   #tar -xvf busybox-1.17.3.tar.bz2
   #cd  busybox-1.17.3
   #make menuconfig
   Busybox Settings ---> 
    Build Options --->
     [*] Build BusyBox as a static binary (no shared libs)
     [ ] Force NOMMU build
     [ ] Build with Large File Support (for accessing files > 2 GB)
     (arm-cortex_a8-linux-gnueabi-) Cross Compiler prefix   //注意 一定要指定交叉编译工具,此处使用的是arm-cortex_a8-linux-gnueabi-,根据自己情况指定
     () Additional CFLAGS
   #make
   #file busybox   //确认编译生成的是 ARM 平台的
             busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.35, stripped
   #make  install
   #cd _install
   # ls
     bin  linuxrc  sbin  usr
   #mkdir  dev  etc  mnt  proc  var  tmp  sys  root 
   #cp  arm-cortex_a8/arm-cortex_a8-linux-gnueabi/lib/   ./  -a     原来的lib   少了 /
   #rm  lib/*.a               
   #arm-cortex_a8-linux-gnueabi-strip  lib/*            裁剪掉库里的调试信息   
    arm-cortex_a8-linux-gnueabi-strip:lib/libgcc_s.so: File format not recognized    有些库是不能strip的 忽略
    arm-cortex_a8-linux-gnueabi-strip:lib/libsupc++.la: File format not recognized    */
  #rm  lib/libstdc++*   //删除不需要的库,确保所有库大小不超过4M
  #arm-cortex_a8-linux-gnueabi-strip lib/*.so  //去掉库中的调试信息,裁剪库大小
  #du -mh lib
       2.5M lib
   #添加启动文件
     在etc下添加文件inittab,内容如下:  /*内核/init/main.c 中执行系统的启动进程  if (execute_command) {
                                           run_init_process(execute_command);( 它是有u-boot参数传入的 linuxrc
                                            它由busybox源码的/init/init.c 生成, 它会对 /etc/inittab 解析执行*/  

[cpp] view plaincopyprint?ARM根文件系统制作ARM根文件系统制作
  1. #this is run first except when booting in single-user mode.  
  2.    :: sysinit:/etc/init.d/rcS                      //指定系统初始化脚本是rcS 也可指定别的名字,但习惯用rcS  
  3.    # /bin/sh invocations on selected ttys  
  4.    # start an "askfirst" shell on the console (whatever that may be)  
  5.    ::askfirst:-/bin/sh                            //指定初始的控制台(启动后进入# 状态)  如果启动进不了#,可以看看是不是sh不存在,或改为指向别的      
  6.    # stuff to do when restarting the init process  
  7.    ::restart:/sbin/init  
  8.    # stuff to do before rebooting  
  9.    ::ctrlaltdel:/sbin/reboot  
[cpp] view plaincopyprint?ARM根文件系统制作ARM根文件系统制作
  1. <br abp="783">  <span abp="784"><strong>创建init.d目录,在init.d下创建rcS文件,为rcS添加可执行权限:# chmod   +x  init.d/rcS  rcS文件内容为:<br abp="785"></strong></span>    #!/bin/sh<br abp="786">    # This is the first script called by init process<br abp="787">    /bin/mount  -a                                 // mount all stuff from /etc/fstab  <br abp="788">    /etc/init.d/rc.local                           //扩展子脚本<br abp="789">    echo  /sbin/mdev  >  /proc/sys/kernel/hotplug  //设置系统的hotplug程序为mdev<br abp="790">    /sbin/mdev  -s                                 /* mdev 系统启动和热插拔 或动态加载驱动程序时,自动产生驱动程序所需的节点文件,<br abp="791">                                                    在文件系统中的/dev目录下的设备节点都是由mdev创建的 加-s 扫描/sys/信息自动生成 <br abp="792">                                                     解决使用mdev时“cannot create /proc/sys/kernel/hotplug:nonexistent directory”错误<br abp="793">                                                     原因一: 内核应支持 CONFIG_HOTPLUG=y CONFIG_NET=y<br abp="794">                                                     原因二: BusyBox中要支持 Linux System Utilities  --->   [*] mdev  */   <br abp="795">    ./app.exe   //让脚本自动运行你的程序                                                                                  <br abp="796">      
[cpp] view plaincopyprint?ARM根文件系统制作ARM根文件系统制作
  1.                                                    <br abp="798">   在etc下添加文件fstab,文件内容如下: /* fstab 指定启动后自动挂载的文件系统 介质,挂载点等 ,如挂载失败会报错*/<br abp="799">    #device     mount-point     type      options         dump     fsck order<br abp="800">    proc          /proc         proc        defaults          0       0<br abp="801">    tmpfs        /tmp          tmpfs      defaults          0         0<br abp="802">    sysfs        /sys          sysfs      defaults         0         0<br abp="803">    tmpfs         /dev          tmpfs      defaults          0         0    //如果报挂载错误,可能是内核不支持, 选上 Pseudo filesystems -> Tmpfs   

  在etc下添加profile文件,文件内容为:  /*linux中环境变量的设置 */
  

[cpp] view plaincopyprint?ARM根文件系统制作ARM根文件系统制作
  1. #!/bin/sh  
  2.   export HOSTNAME=farsight  
  3.   export USER=root  
  4.   export HOME=root  
  5.   export PS1="[$USER@$HOSTNAME \W]\# "   //终端前的提示符  
  6.   PATH=/bin:/sbin:/usr/bin:/usr/sbin  
  7.   LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH  
  8.   export PATH  LD_LIBRARY_PATH       
  9.   #sudo mknod   dev/console  c  5  1                  /*根文件系统中有一个设备节点是必须的,在dev下创建console节点  c表字符设备  5 主设备号(见include/linux/major.h)  子设备好1*/  

2. 测试文件系统内容正确性
   #cd /nfs
  #mkdir rootfs
  #cp  _install/*   rootfs   –a                        */  
  #chmod 777 /nfs/rootfs/                        //挂载后不能在里面创建文件。  原因是权限问题

   NFS测试通过后表示文件系统 在内容上问题不大 


3. 制作需要的文件系统格式
   //--------------RAMDISK     占较少的flash    适用较大RAM资源的
   #cd ~
   #dd if=/dev/zero of=initrd.img bs=1k count=8192
   #mkfs.ext2 -F initrd.img
   #mount  -t  ext2   -o  loop  initrd.img  /mnt/initrd
   #cp /nfs/rootfs/* /mnt/initrd/ -a                     */
   #umount /mnt/initrd
   #gzip  --best  -c  initrd.img  >  initrd.img.gz
   #cp  initrd.img.gz  /tftpboot

   //注意验证根文件系统时,使用的是第一天共享的完全OK的内核
   #setenv  bootcmd  tftp  20008000  zImage \; tftp  20800000  initrd.img.gz \; go  20008000
   #setenv  bootargs  root=/dev/ram  rw  init=/linuxrc  initrd=0x20800000,8M console=ttySAC0,115200
   #saveenv
   #reset

   //---------------CRAMFS     只读, 占较少的RAM,当希望系统稳定,文件系统内容不被修改时候,用到        
   #mkfs.cramfs  /nfs/rootfs  rootfs.cramfs 
   #cp  rootfs.cramfs  /tftpboot
   #tftp  20008000  rootfs.cramfs
   #nand  erase  400000  400000
   #nand  write  20008000  400000  400000
   #setenv  bootcmd  tftp  20008000  zImage \; go  20008000
   #setenv  bootargs  root=/dev/mtdblock2   init=/linuxrc   console=ttySAC0,115200
   #saveenv
   #reset  //重启如果报错,可能是mkfs.cramfs  rootfs  rootfs.cramfs 时出了问题, 重新制作一次就可以了

  //------------------JFFS2      垃圾回收,掉电保护功能
  #cp ~/e/pkg/zlib-1.2.3.tar.bz2 .
  #tar -xvf  zlib-1.2.3.tar.bz2
  #cd  zlib-1.2.3
  #./configure
  #make
  #make install
  #tar -xvf  mtd-snapshot-20050519.tar.bz2
  #cd  mtd/util
  #make
  #make  install  //这样我们的系统里就有了mkfs.jffs2这个工具了
  #mkfs.jffs2   -r  /nfs/rootfs  -o  rootfs.jffs2  -e  0x20000  --pad=0x400000  -n
  #cp  rootfs.jffs2  /tftpboot
  # tftp  20008000  rootfs.jffs2
  # nand  erase  400000  400000
  # nand  write  20008000  400000  400000
  #setenv  bootcmd  tftp  20008000  zImage\; go  20008000
  #setenv  bootargs  root=/dev/mtdblock2   rootfstype=jffs2  rw  init=/linuxrc console=ttySAC0,115200
  #saveenv
  #reset


转载自:http://blog.csdn.net/huangbo_embed/article/details/23296303