Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30953
  • 博文数量: 7
  • 博客积分: 252
  • 博客等级: 二等列兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 15:34
文章分类
文章存档

2011年(6)

2010年(1)

我的朋友

分类: LINUX

2011-01-06 13:39:45

环  境
  1. Ubuntu8.10 发行版
  2. FS2410平台以及开发板中移植好的u-boot-1.3.1,编译好的 Linux-2.6.22.6 内核
  3. 交叉编译器 arm-linux-gcc-3.4.1
步  骤
  • 下载并配置 busybox 源码
       从 下载 busybox-1.15.3.tar.bz2 。进入 busybox-1.15.3 目录,运行 make menuconfig,进入配置接口,并作出如下配置:
       #tar -zxvf busybox-1.15.3.tar.gz
       #cd busybox-1.15.3
       #make menuconfig
       配置如下
       ·Busybox Setting   --->
          Build Options  --->
           [*] Build BusyBox as a static binary(no shared libs)   //静态编译
           []  Force NOMMU build
           []  Build with Large File Support(for accessing files > 2GB//大文件支持             (arm-linux-)Cross Compiler prefix
           ()  Additional CFLAGS
       退出配置界面,并保存配置。
  • 编译 busybox
       运行 make 命令,编译 busybox
       #make
       过程中会出现错误,意思是说在coreutils/fsync.c文件里O_NOATIME没有找到。
我们在/usr/include/bits的源码中找一下O_NOATIME哪里定义的(输入 grep -rn O_NOATIME ./* .可以找到在哪个.h文件中定义了),在fcntl.h里,拷贝/usr/include/bits/fcntl.h里#define O_NOATIME 01000000行到coreutils/fsync.c的头文件定义之后。其他的错误同理。最后会出现里不能将 __user 定义为空的错误,解决方法是将编译器里的 fd.h 文件拷贝到 busybox的 include目录,最后在包含 的头文件改为 “fd.h” 再 make 即可成功。
  • 安装建立 busybox 文件系统
      运行 make install,将在 busybox 目录下生成 _install 的目录,里面就是 busybox 生成的工具。
      #make install
  • 配置文件系统
  1. 创建目录结构      
      进入 _install 目录,建立目录:
      #cd _install/
      #mkdir dev etc lib mnt proc var tmp sys root
  
   2· 建立初始化启动所需文件  
      ··创建 inittab 文件
        进入 _install/etc 目录,建立 inittab 文件,文件内容:
        #this is first except when booting in single-user mode.
        ::sysinit:/etc/init.d/rcS
        #/bin/sh invocations on selected ttys
        #Start an "askfirst" shell on the console(whatever that may be)
        ::askfirst:-/bin/sh
        #Stuff to do when restarting the init process
        ::restart:/sbin/init
        #Stuff to do before rebooting
        ::ctrlaltdel:/sbin/reboot  
     注:Busybox的init实现了 init 的大部分程序,Runlevel 是不支持的
   Busybox init 执行的几个阶段:设置init信号句柄
                              初始化 console(s)
                              解析 inittab 文件,/etc/inittab
                  (如果 /etc/inittab不存在,Busybox使用缺省值) 
                              运行系统初始化脚本(Busybox use /etc/init.d/rcS为缺省)
                              运行 inittab 中所有 action 为 wait 的命令
                              运行 inittab 中所有 action 为once的命令
                              循环运行:运行inittab中所有action为 respawned 的命令
                                       运行inittab中所有action为 askfirst 的命令
action定义:
       上面内容中 sysinit 为 provide init with the path to the initialization script
                askfirst 为 程序执行前询问,要求按 ENTER 键
                restart 为 系统重新启动时执行的程序,通常是 init 程序
                ctrlaltdel 为 当按下 Ctrl-Alt-Delete组合键时执行的程序
        其中还有 sespawn 为 程序终止后重新执行
                wait 为 init等待执行的程序结束后再继续执行
                once 为 只运行程序一次,并且不等待程序运行完就继续执行
                shutdown 为 系统关机时执行的程序
        
      ··创建 fstab 文件
       进入 _install/etc 下面,创建 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      /tmp           tmpfs   defaults   0      0
       主意:这里挂载了tmpfs,所以我们在内核中必须把tmpfs配置上
       修改内核配置:
          File systems --->
            Pseudo filesystems  --->
              [*]  Virtual memory file system support(former shm fs)
              [*]  Tmpfs POSIX Access Control Lists
        重新编译内核
   
      ··创建 init.d/rcS
       进入 _install/etc 下创建 init.d/rcS文件,添加如下内容
         #!/bin/sh
         #This is the first script called by init process
         /bin/mount -a
    
      ··创建 profile 文件
       进入 _install/etc 下创建 profile 文件,添加如下内容:
         #!/bin/sh
         export HOSTNAME=farsight
         export USER=root
         export HOME=root
         #export PS1="\[\u@\h\W\]\$"
         cd 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
 

      ··在 dev 下创建终端设备节点 console
       进入 _install/dev 创建设备节点 console
        #mknod console c 5 1
 
      ··建立嵌入式系统库
        #cp /usr/local/arm/3.4.1/arm-linux/lib/* _install/lib -a
        #cd _install/lib
        删除所有无用的目录和静态库(所有的目录和 .a 文件)
        然后减小库的体积,运行:
        #arm-linux-strip *.so
  • NFS测试
        1·进入 /source 目录
          #cd /source
        2·将系统中的原有的rootfs改名,备份。
          #mv rootfs rootfs_default  
        3·拷贝我们制作好的文件系统到 /source 下,并改名为 rootfs
          #cp -a _install /source/rootfs
        4·设置 uboot 环境变量
          在uboot下输入 #tftp 30008000 zImage\;go 30008000
                       #setenv bootargs root=nfs nfsroot=192.168.2.5:/source/rootfs
          init=/linuxrc console=ttySAC0,115200 ip=192.168.2.100
       注:192.168.2.5为Ubuntu的ip,192.168.2.100为uboot下载到的板子的ip
        重新启动 NFS 服务,然后启动目标平台,挂载 NFS 文件系统;直到文件系统测试通过。
           #/etc/init.d/nfs-kernel-server restart   //重启nfs

  • 制作 ramdisk 文件系统
       通过 NFS 测试以后,就可以制作 ramdisk 文件系统了,具体如下:
         1·制作一个大小为10M的虚拟磁盘,在Ubuntu的目录下输入
             #dd if=/dev/zero of=initrd.img bs=1k count=8192   // initrd.img为8M
       注:以dd命令建立一个了一个8192KB文件系统映象,存于initrd.img中,并以/dev/zero对它进行初始化。用这种方式对文件系统进行初始化,稍后当我们使用gzip命令压缩整个映象时,将让文件系统中未使用的部分获得最大压缩比。
         2·格式化这个虚拟磁盘为 ext2
             #mkfs.ext2 -F initrd.img
       注:此处-F选项将可迫使mkfs.ext2在文件上运行
         3·在 mount 下面创建 initrd 目录作为挂载点
             #mkdir /mnt/initrd
         4·将这个虚拟磁盘挂载到 /mnt/initrd 下
             #mount -t ext2 -o loop initrd.img /mnt/initrd
       注:initrd.img 不要和 Ubuntu 根目录下的 initrd.img 弄混了,同时 initrd.img不能存放rootfs目录中。
loop 挂载“回旋设备”以及“ISO镜像文件”。
         5·将我们的文件系统写入 initrd.img中,将测试好的文件系统里的内容全部拷贝到 /mnt/initrd目录下面
             #cp /source/rootfs/* /mnt/initrd -a
         6·卸载 initrd
             #umount /mnt/initrd
         7·压缩 initrd.img 为 initrd.img.gz
             #gzip --best -c initrd.img > initrd.img.gz
         8·配置内核支持 RAMDISK
           制作完 initrd.img.gz 后,需要配置内核支持 RAMDISK 作为启动文件系统
           Device Drivers
              SCSI device support  --->
                  <*>  SCSI disk support
              Block devices   --->
                  <*>  RAM disk support
                  (1)Default number of RAM disks
                  (8192)Default RAM disk size(kbytes)   //修改为8M 
              General setup   --->
                  [*]  Initial RAM filesystem and RAM disk()support
          9·在 U-BOOT 命令行重新设置启动参数:
             #setenv bootcmd tftp 30008000 zImage\;tftp 30800000 initrd.img.gz\;go 30008000
             #setenv bootargs root=/dev/ram  rw init=/linuxrc initrd=0x30800000,8M
console=ttySAC0,115200  display=sam240
             #saveenv
  • 制作 cramfs 文件系统和部署
      因系统提供制作 cramfs 文件系统的工具,则可以利用,具体操作如下:
       /source#mkfs.cramfs rootfs rootfs.cramfs
       将 NFS测试好的文件系统 rootfs 通过上述命令制作成为只读的 cramfs 文件系统 rootfs.cramfs.将其下载到 flash 的第一块分区上(视开发板分区情况来指定)。
      在 U-BOOT 终端:
        #tftp 30008000 rootfs.cramfs
        #nand erase 200000 300000
        #nand write 30008000 200000 300000
      这样指定启动参数:
        #setenv bootargs root=/dev/mtdblock/2 init=/linuxrc console=ttySAC0,115200
devfs=mount display=sam240
      启动开发板测试
        #mkdir test
        mkdir:Cannot create directory 'test':Read-only file system
      这是由 cramfs 文件系统决定的,cramfs 格式的文件系统是只读文件系统。
  • 制作jffs2文件系统镜像和部署
       待续···










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

chinaunix网友2011-01-07 16:58:31

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com