ARM根文件系统制作

时间:2022-09-22 09:05:00

 
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 解析执行*/  

 #this is run first except when booting in single-user mode.
:: sysinit:/etc/init.d/rcS //指定系统初始化脚本是rcS 也可指定别的名字,但习惯用rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh //指定初始的控制台(启动后进入# 状态) 如果启动进不了#,可以看看是不是sh不存在,或改为指向别的
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot

  创建init.d目录,在init.d下创建rcS文件,为rcS添加可执行权限:# chmod   +x  init.d/rcS  rcS文件内容为:
    #!/bin/sh
    # This is the first script called by init process
    /bin/mount  -a                                 // mount all stuff from /etc/fstab 
    /etc/init.d/rc.local                           //扩展子脚本
    echo  /sbin/mdev  >  /proc/sys/kernel/hotplug  //设置系统的hotplug程序为mdev
    /sbin/mdev  -s                                 /* mdev 系统启动和热插拔 或动态加载驱动程序时,自动产生驱动程序所需的节点文件,
                                                    在文件系统中的/dev目录下的设备节点都是由mdev创建的 加-s 扫描/sys/信息自动生成
                                                     解决使用mdev时“cannot create /proc/sys/kernel/hotplug:nonexistent directory”错误
                                                     原因一: 内核应支持 CONFIG_HOTPLUG=y CONFIG_NET=y
                                                     原因二: BusyBox中要支持 Linux System Utilities  --->   [*] mdev  */  
    ./app.exe   //让脚本自动运行你的程序                                                                                 
   
                                                   
   在etc下添加文件fstab,文件内容如下: /* fstab 指定启动后自动挂载的文件系统 介质,挂载点等 ,如挂载失败会报错*/
    #device     mount-point     type      options         dump     fsck order
    proc          /proc         proc        defaults          0       0
    tmpfs        /tmp          tmpfs      defaults          0         0
    sysfs        /sys          sysfs      defaults         0         0
    tmpfs         /dev          tmpfs      defaults          0         0    //如果报挂载错误,可能是内核不支持, 选上 Pseudo filesystems -> Tmpfs

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

 #!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# " //终端前的提示符
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
#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