免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9077 | 回复: 11
打印 上一主题 下一主题

[应用] 构建U盘启动的嵌入式linux [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-17 14:50 |只看该作者 |倒序浏览
1 构建U盘启动的嵌入式linux(一)

前言:在参考了<<构建嵌入式linux系统>>一书和独孤九贱的<<怎样一步一步制作嵌入式Linux系统>>后,他们都是用CF卡来制作,对于大多数人估计和我一样,手上并没有板子和CF卡,而只有x86的电脑和USB盘,这里详细的描述一下我是如何制作的U盘启动,过程虽然破费很多时间,还是可以享受一下成功的喜悦,重要的是我们学习如何的编译kernel,如何建立自己的根文件系统,以及内核的引导启动过程,虽然这个还有许多不完善的地方,我们在学习中逐步完善,为了使初学者能更好全步完成usb启动自己的内核,我把过程全步详细的贴在这儿,很感谢有这些前辈的文档的帮助使我也能够进入自己的linux, 接下让我们一起来分享吧:

先介绍我编译的环境:

Vmware6.0+rehat9.0(2.4.20) gcc 3.2.2

Vmware下编译内核有一些特殊之处,以及gcc的版本对编译也会有影响,下面我要讲到:



第一步:制作交叉编译环境

首先,我们要搞明白两个概念:一般我们工作的机器,称为开发机、主机;我们制作好的系统将要放到某台机器,如手机或另一台PC机,这台机我们称为目标主机。

  

  我们一般开发机上已经有一套开发工具,我们称之为原生开发套件,我们一般就是用它们来写程序,那么,那什么又是交叉编译环境呢?其实一点也不神秘,也就是在开发机上再安装一套开发工具,这套开发工具编译出来的程序,如内核、系统工作或者我们自己的程序,是放在目标主机上运行的。



  那么或许有初学者会问,直接用原生开发工具为目标主机编译程序不就完了?至少我当初是这么想的。一般来说,我们的开发机都是X86平台,原生开发套件开发的工具,也针对X86平台,而我们的目标主机可能是PowerPC、IXP、MIPS……所以,我们的交叉编译环境是针对某一类具体平台的。 



  一般来讲,交叉开发环境需要二进制工具程序、编译器、C链接库,嵌入式开发常用的这三类软件是:

  Binutils

  Gcc

  uClibc

当然,GNU包含的工具套件不仅于此,你还要以根据实际需要,进行选择

我们这里用的386的系统,所以建立的文件只接用i386-linux-即可,如果是arm,就用arm-linux-大家一目了然,其它的类推。

建立起交叉环境来之后,你就可以继续进行第二步,编译内核:
第二步、编译内核

开发工具是针对某一类硬件平台,内核同样也是。这一步,我们需要用第一步中建立的工具,对内核进行编译,对于有内核编译经验的人来说,这是非常简单的;这里主要是要注意到一是在vmware编译环境,而是要用到U盘启动:
第三步、建立根文件系统

这个根文件系统,如果你的U盘足够大,可以直接cp主机上的,因为都386系统列,不过为了学习嵌入式系统,建议还是用“瑞士军刀”busybox吧。

所谓的根文件系统,也就是建立我们平常看到的bin、dev、proc……这一大堆目录,以及一些必备的文件;

这是我建好后的根文件系统架构:

drwxrwxr-x    2 afa      afa          4096 May 14 17:13 bin

drwxrwxr-x    2 afa      afa          4096 May 14 16:44 dev

drwxrwxr-x    3 afa      afa          4096 May 14 06:21 etc

drwxrwxr-x    2 afa      afa          4096 May 14 16:12 lib

lrwxrwxrwx    1 root     root           11 May 14 17:13 linuxrc -> bin/busybox

dr-xr-xr-x    2 afa      afa          4096 May 14 16:04 proc

drwxrwxr-x    2 afa      afa          4096 May 14 17:13 sbin

drwxrwxrwt    2 afa      afa          4096 May 14 16:04 tmp

drwxrwxr-x    4 afa      afa          4096 May 14 17:13 usr

drwxrwxr-x    2 afa      afa          4096 May 14 16:04 var

另外,我们还需要为我们的目标系统安装一些常用的工具软件,如ls、ifconfig……当然,一个办法是找到这些工具的源代码,用第一步建立的交叉编译工具来编译,但是这些软件一是数量多,二是某些体积较大,不适合嵌入式系统,这一步,我们一般都是用busybox来完成的,包括系统引导软件init;最后,我们为系统还需要建立初始化的引导文件,如inittab……
第四步、启动系统

 在这一步,我们把建立好的目标、文件、程序、内核及模块全部拷贝到目标机存储器上,如硬盘。然后为系统安装bootloader,对于嵌入式系统,有许多引导程序可供我们使用。

例如syslinux,lilo,grub,uboot等。

       关于bootloader的介绍,这里有两篇文章可以供大家学习参考:分别来自大陆和台湾的两们朋友的精彩分析:

嵌入式系统 Boot Loader 技术内幕 詹荣开 (zhanrk@sohu.com), Linux爱好者
Jserv's blog: 探索Linux bootloader 的佳作 

不过它们许多都有硬件平台的限制。当然,如果你是工作在X86,可以直接用grub来引导,这里采用的grub的引导,试过lilo的引导,不是很成功,需要lilo22.3以后的版本,下载试过也没有搞成功,留待以后研究,本文主要是用grub,相信很多和我一样的朋友希望学习用它来引导自己的U盘。

做到这一步,将目标存储设备挂上目标机,如果顺利,就可以启动系统了。
当然,针对某些特别的平台,不能像硬盘这样拷贝了,需要读卡器、烧录……但是基本的方法是相通的!
第五步、优化和定制自己的个性化系统

  通过前四步,我们已经得到了一个可以正常工作的系统。在这一步里,就是发挥你想像的时候了……

  

子目录及说明

目录             内容

boot               目标板的引导加载程序, 这里我放的是我的boot目录以及其中的内容

build-tools      建立交叉编译平台的工具源码

debug            调试工具及所有相关包

doc                      项目中用到的所有文档

images           编译好的内核映像,以及根文件系统

kernel            各个版本的Linux内核源码

rootfs            制作好的根文件系统

sysapps         目标板将要用到的系统应用系统,比如busybox,thttpd,udhcpd等

tmp               存放临时文件

tools              编译好的跨平台开发工具链以及C链接库

我的启动脚本文件:myembed.sh

#!/bin/bash

export PROJECT=embeded

export PRJROOT=/home/afa/${PROJECT}

export TARGET=i386-1inux

export PREFIX=${PRJROOT}/tools

export TARGET_PREFIX=${PREFIX}/${TARGET}

export PATH=${PREFIX}/bin:/bin:/sbin:/usr/bin:/usr/sbin



cd ${PRJROOT}

大家在redhat可以用

#>. ./myembed.sh 就可以执行了,这个好象困惑我一下,记住在./myembed.sh前要加一个点



好了回到正题建立我们的嵌入式开发环境:
第二章 建立交叉编译环境

我没有采用手工建立的方式,而采用buildroot工具建立,当然如果开发你的商业硬件平台,厂家都会为你提供一个开发包,这里不去讨论。

建立交叉开发工具链

  准备工具:

    buildroot-0.9.27.tar.tar

只需要一个软件?对,其它的不用准备了,buildroot事实上是一个脚本与补丁的集合,其它需要用到的软件,如gcc、uClibc,你只需在buildroot中指明相应的版本,它会自动去给你下载。

  事实上,buildroot到网上去下载所需的所有工作是需要时间的,除非你的带宽足够,否则下载软件时间或许会占去80%,而我在做这项工作之间, 所需的工作链全部都在我本地硬盘上,我解压开buildroot后,新建dl文件夹,将所有工具源码的压缩包拷贝进去,呵呵,buildroot就不用去 网上下载了。

  我的软件清单:

  Linux-libc-headers-2.4.27.tar.bz2

  Gcc-3.3.4.tar.bz2

  binutils 2.15.91.0.2.tar.bz2

  uClibc 0.9.27.tar.bz2

  genext2fs_1.3.orig.tar.gz

  ccache-2.3.tar.gz

以下是详细的步骤:

       [root@localhost afa]# . ./myembed.sh

       [root@localhost embeded]# cd build-tools/

       [root@localhost build-tools]# tar zxvf buildroot-0.9.27.tar.gz

       [root@localhost build-tools]# cd buildroot;mkdir dl

[root@localhost buildroot]# ls ../dl

binutils-2.15.91.0.2.tar.bz2  genext2fs_1.3.orig.tar.gz

ccache-2.3.tar.gz             linux-libc-headers-2.4.27.tar.bz2

gcc-3.3.4.tar.bz2             uClibc-0.9.27.tar.bz2

[root@localhost buildroot]# mv ../dl/* dl/

[root@localhost buildroot]# make menuconfig(如果用gcc4.0这里会有问题,自己修改一下即可,记得是有一句static语句,你可以去掉static就可以了)

Target Architecture (i386)  --->     选择i386即可

Build options  --->

(${PRJROOT}/tools) Toolchain and header file location?

这个是问你编译好的东西存放在什么地方

Toolchain Options  --->

x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x  

  x x        --- Kernel Header Options                                                                         x x  

  x x            Kernel Headers (Linux 2.4.27 kernel headers)  --->                              x x  

       头文件它会自动去下载,不过应该保证与你将要用的内核是同一个版本

  x x        --- uClibc Options                                                                                       x x  

  x x        [ ] Use the daily snapshot of uClibc?                                                           x x

              使用最近的uClibc的snapshot

  x x        [ ] Enable locale/gettext/i18n support?                                                         x x  

  x x        --- Binutils Options                                                                                        x x  

  x x            Binutils Version (binutils 2.15.91.0.2)  --->                                                 x x

              Binutils的版本  

  x x        --- Gcc Options                                                                                              x x  

  x x            GCC compiler Version (gcc 3.3.4)  --->                                                       x x

              gcc的版本

  x x        ()  Additional gcc options                                                                                   x x  

  x x        
  • Build/install c++ compiler and libstdc++?                                                        x x

                  支持的语言

      x x        [ ]   Build/install java compiler and libgcj? (NEW)                                              x x  

      x x        --- Ccache Options                                                                                             x x  

      x x        
  • Enable ccache support? (NEW)                                                                     x x

           启用ccache的支持,它用于编译时头文件的缓存处理,用它来编译程序,第一次会有点慢,但是以后的速度可就很理想了,呵呵……

      x x        --- Gdb Options                                                                                                  x x  

      x x        [ ] Build gdb debugger for the Target                                                                    x x  

      x x        [ ] Build gdb server for the Target                                                                      x x  

      x x        --- Common Toolchain Options                                                                             x x  

      x mqqqqqqqqv(+)qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x  

      tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

    Package Selection for the target  --->

    这个什么都不用选,留待以后用busybox来搞定好了。

    Target Options  --->
  • ext2 root filesystem for the target device

    选择ext2作为根文件系统



    配置ok后:

    [root@localhost buildroot]# make

    等一会儿………..

    会让你选择平台:

    Target x86 Processor Family

    &216;       1. Generic 386 (CONFIG_GENERIC_386) (NEW)

    &216;       选这个好了

    输入1,等待………



    当出现下列:

    .comment --remove-section=.note --strip-unneeded 2>/dev/null || true;

    /home/afa/embeded/build-tools/buildroot/build_i386/genext2fs-1.3/genext2fs -i 503 -b 1068 \

            -d /home/afa/embeded/build-tools/buildroot/build_i386/root -q -D target/default/device_table.txt /home/afa/embeded/build-tools/buildroot/root_fs_i386.ext2

    [root@localhost buildroot]#

    表示你编译成功:

    回头看一下自己的战利品:

    [root@localhost buildroot]# cd ../../tools/

    [root@localhost tools]# ls

    bin  bin-ccache  i386-linux  i386-linux-uclibc  include  info  lib  man  usr

    bin:所有的编译工具,如gcc,都在这儿了,只是加了些指定的前缀;  

    bin-ccache:如果在Toolchain optaion中没有选择对ccache的支持,就没有这一项了;

    i386-linux:链接文件;实际指向include

    i386-linux-uclibc:uclibc的相关工具;

    include:供交叉开发工具使用的头文件;

    info:gcc 的info文件;

    lib:供交叉开发工具使用的链接库文件;



    第三章 编译内核:

    这里基本上没有什么难的,记住两点好了,一是在vmware下编译,二是要支持usb启动:

    再者要以下原则为基础:

    1、功能上的选择,应该能够满足需要的情况下,尽量地小;  

    2、小不是最终目的,稳定才是;



    所以,最好编译内核前有一份目标机硬件平台清单以及所需功能清单,这样,才能更合理地裁减内核。

    准备工具

    Linux内核源码,我选用的是Linux-2.4.27.tar.bz2

    编译内核

    将Linux-2.4.27.tar.bz2拷贝至${PRJROOT}/kernel,解压

    #cd linux-2.4.27

    配置

    # make ARCH=i386 CROSS_COMPILE=i386-linux- menuconfig 



    //建立源码的依存关系

    # make ARCH=i386 CROSS_COMPILE=i386-linux- clean dep

      

    //建立内核映像

    # make ARCH=i386 CROSS_COMPILE=i386-linux- bzImage

    ARCH指明了硬件平台,CROSS_COMPILE指明了这是交叉编译,且编译器的名称为i386-linux-XXX,这里没有为编译器指明路径,是因为我前面已将其加入至环境变量PATH。



    编译完成后我的内核是1MB,usb盘够装,不过这个可以再缩小一些,对我们的实验无关紧要

    继续下一步:

    安装内核

      

      内核编译好后,将内核及配置文件拷贝至${PRJROOT}/images下。

      

      # cp arch/i386/boot/bzImage ${PRJROOT}/images/bzImage-2.4.27-rmk5

      # cp vmlinux ${PRJROOT}/images/vmlinux-2.4.27-rmk5

      # cp System.map ${PRJROOT}/images/System.map-2.4.27-rmk5

      # cp .config ${PRJROOT}/images/2.4.27-rmk5.config

    这里呢,因为我时用不到modules所以下列步骤暂时不需要:

    ---------------------------------------

    //建立模块

     #make ARCH=i386 CROSS_COMPILE=i386-linux- modules

     //安装内核模块至${PRJROOT}/images

     #make ARCH=i386 CROSS_COMPILE= i386-linux-

      >INSTALL_MOD_PATH=${PRJROOT}/images/modules-2.4.18-rmk5

      >modules_install

    --------------------------------

    附,内核选择:

      

      内核编译记录:

      ----------------------------

    注意,如果用vmware进行编译,那么需要注意一些地方:
    如果你在vmware下重新编译内核,硬盘用的是scsi的,以下选项必选:
    Device Drivers  --->SCSI device support  ---><*>   SCSI disk support
    Device Drivers  --->SCSI device support  --->SCSI low-level drivers  ---> <*> BusLogic SCSI support
    可以

    如果不选上这个当用grub启动时会出现:

    VFS:   Cannot   open   root   device   "sda1 "   or   unknown-block(0,0)
    Please   append   a   correct   "root= "   boot   option
    Kernel   panic   -   not   syncing:   VFS:   Unable   to   mount   root   fs   on   unknown-block(0,0)

    * 关于USB, 能选的都选上吧

    -----------------------------------------------------------------------------

      Code maturity level options 不选

      

      Loadable module support 不选(这个以后再研究,进一步学习,毕竟这个还是要用的)

      

      Processor type and features 根据实际,选择处理器类型(我选默认的)

      

      General setup --->

      
  •   Networking support
  •   PCI support

      (Any)  PCI access mode
  •   PCI device name database
  •   System V IPC
  •   Sysctl support

      (ELF) Kernel core (/proc/kcore) format
  •   Kernel support for ELF binaries
  •   Power Management support

      

      Memory Technology Devices (MTD) ---> MTD设备,我用USB盘,不选

      

      Parallel port support ---> 不选

      

      Plug and Play configuration ---> 我的系统用不着即插即用,不选

      

      Block devices --->

      
  •   Loopback device support
  •   RAM disk support

      (4096)  Default RAM disk size (NEW)
  •     Initial RAM disk (initrd) support

      上面三个一定要选上

      Multi-device support (RAID and LVM) ---> 不选

      Networking options ---> 基本上都选了

      ATA/IDE/MFM/RLL support --->  用了默认的

      Telephony Support ---> 不选

      SCSI support --->
  •   SCSI disk support
  •   Enable extra checks in new queueing code
  •   Probe all LUNs on each SCSI device
  •   Verbose SCSI error reporting (kernel size +=12K)
  •   SCSI low-level drivers  --->

          
  • Serial ATA (SATA) support(这个应该串口硬盘的支持,选不选无所谓)
  • BusLogic SCSI support(这个一定要选)

      Fusion MPT device support ---> 不选

      I2O device support --->  不选

      Network device support --->  根据实际情况选择(选默认)   

      

      Amateur Radio support ---> 不选

      

      IrDA (infrared) support ---> 不选

      

      ISDN subsystem ---> 不选

      

      Old CD-ROM drivers (not SCSI, not IDE) ---> 不选

      

      Input core support ---> 不选

      

      Character devices --->

      
  •   Virtual terminal
  •     Support for console on virtual terminal
  •   Standard/generic (8250/16550 and compatible UARTs) serial support
  •   Support for console on serial port

      

      Multimedia devices ---> 不选

      

      File systems --->

      
  •   Kernel automounter version 4 support (also supports v3)

      
  •   Virtual memory file system support (former shm fs)

      
  • /proc file system support

      
  •   Second extended fs support

      

      Console drivers --->

      

     &8226;  VGA text console  调试时接显示器用

       

      Sound --->不选

      USB support --->

                  
  •    UHCI Alternate Driver (JE) support

                  
  •    USB Mass Storage support

      Kernel hacking --->不选

    Cryptographic options  --->不选

    Library routines  --->不选



    第四章     建立根文件系统

    构建工作空间时,rootfs文件夹用来存放根文件系统,

      #cd ${PRJROOT}/rootfs

      

      根据根文件系统的基本结构,建立各个对应的目录:

      # mkdir bin dev etc lib proc sbin tmp usr var

      # chmod 1777 tmp

      # mkdir usr/bin usr/lib usr/sbin

      # ls

      dev etc lib proc sbin tmp usr var

      # mkdir var/lib var/lock var/log var/run var/tmp

      # chmod 1777 var/tmp

    准备好根文件系统的骨架后,把前面建立的文件安装到对应的目录中去。

      2、拷贝链接库

      

      把uclibc的库文件拷贝到刚才建立的lib文件夹中:

      

      # cd ${PREFIX}/lib

      [root@localhost lib]# cp *-*.so ${PRJROOT}/rootfs/lib

      [root@localhost lib]# cp -d *.so.[*0-9] ${PRJROOT}/rootfs/lib

    3、 拷贝内核映像和内核模块

    我们这里没有模块,暂时省下这一步

    [root@localhost boot]# cd ${PRJROOT}/boot

    [root@localhost boot]# cp ../images/bzImage-2.4.27-rmk5 .

    [root@localhost boot]# mkdir grub(建立grub目录,为grub启动文件做准备)

    [root@localhost boot]# cp /boot/grub/stage* grub/

    4、 建立/dev下边的设备文件

      在linux中,所有的的设备文件都存放在/dev中,使用mknod命令创建基本的设备文件。

      mknod命令需要root权限

    用我这个脚本好了,比较简单:dev.sh

    重要的是要建上sda,sda1这两个,usb启动用的

    #!/bin/bash

    mknod -m 600 mem c 1 1

    mknod -m 666 null c 1 3

    mknod -m 666 zero c 1 5

    mknod -m 644 random c 1 8

    mknod -m 600 tty0 c 4 0

    mknod -m 600 tty1 c 4 1

    mknod -m 600 ttyS0 c 4 64

    mknod -m 666 tty c 5 0

    mknod -m 600 console c 5 1

    mknod -m 660 hda b 3 0

    mknod -m 660 hda1 b 3 1

    mknod -m 660 hdb b 3 0

    mknod -m 660 hdb1 b 3 1

    mknod -m 660 sda b 3 0

    mknod -m 660 sda1 b 3 1

    mknod -m 660 sdb b 3 0

    mknod -m 660 sdb1 b 3 1

    ln -s /proc/self/fd fd

    ln -s fd/0 stdin

    ln -s fd/1 stdout

    ln -s fd/2 stderr

    [ 本帖最后由 bitmilong 于 2008-6-18 23:05 编辑 ]
  • 论坛徽章:
    0
    2 [报告]
    发表于 2008-05-17 14:54 |只看该作者

    2构建U盘启动的嵌入式linux(二)

    5、添加基本的应用程序

    未来系统的应用程序,基本上可以分为三类:

    基本系统工具,如ls、ifconfig这些……

    一些服务程序,管理工具,如WEB、Telnet……

    自己开发的应用程序

    这里先添加基本的系统工具,有想过把这些工具的代码下载下来交叉编译,不过实在是麻烦,用BusyBox,又精简又好用……

    将busybox-1.00.tar.gz下载至sysapps目录下,解压:

    #tar zxvf busybox-1.00.tar.gz

      #cd busybox-1.00

      

      //进入配置菜单

      

      #make TARGET_ARCH=i386 CROSS=i386-linux- PREFIX=${PRJROOT}/rootfs menuconfig

      

      //建立依存关系

      

      #make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs dep

      

      //编译

      

      #make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs

      

      //安装

      

      #make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs install



    配置busybox的说明:

      

      A、如果编译时选择了:

        Runtime SUID/SGID configuration via /etc/busybox.conf

    系统每次运行命令时,都会出现“Using fallback suid method ”

    可以将它去掉,不过我还是在/etc为其建了一个文件busybox.conf搞定;

      

     B、Do you want to build BusyBox with a Cross Compiler?                   (i386-linux-gcc) Cross Compiler prefix

      

      这个指明交叉编译器名称(其实在编译时的命令行已指定过了……)

      

      C、安装选项下的(${PRJROOT}/rootfs) BusyBox installation prefix,这个指明了编译好后的工具的安装目录。

      

      D、静态编译好还是动态编译好?即是否选择

      

      [ ] Build BusyBox as a static binary (no shared libs)

      

      动态编译的最大好处是节省了宝贵空间,一般来说都是用动态编译,不过我以前动态编译出过问题(其实是库的问题,不关busybox的事),出于惯性,我选择了静态编译,为此多付出了107KB的空间。

      

      E、其它命令,根据需要,自行权衡。
    6、系统初始化文件

      内核启动时,最后一个初始化动作就是启动init程序,当然,大多数发行套件的Linux都使用了与System V init相仿的init,可以在网上下载System V init套件,下载下来交叉编译。另外,我也找到一篇写得非常不错的讲解如何编写初始化文件的文件,bsd-init,回头附在后面。不过,对于嵌入式系 统来讲,BusyBox init可能更为合适,在第6步中选择命令的时候,应该把init编译进去。

    [root@localhost etc]# vi inittab

    ::sysinit:/etc/init.d/rcS

    ::respawn:/bin/sh

    [root@localhost etc]# mkdir init.d

    [root@localhost etc]# vi init.d/rcS

    #!/bin/sh

    #Set Path

    PATH=/sbin:/bin

    export PATH

    #install /proc

    mount -n -t proc none /proc



    #reinstall root file system by read/write mode(need:/etc/fstab)

    mount -n -o remount,rw /



    #reinstall /proc

    mount -n -o remount,rw -t proc none /proc



    #set lo ip address

    ifconfig lo 127.0.0.1



    #set hostname

    hostname afaLinux



    [root@localhost etc]# chmod u+x init.d/rcS(修改为可执行文件)

    [root@localhost etc]# vi fstab

    proc /proc proc defaults 0 0

    第五章 建立自启动initrd.img文件

    九贱兄,以及《构建嵌入式linux系统》中都描述了用lilo来启动的过程,我没有成功,所以我选择用Grub。建立好自己的根文件系统之后,要用grub启动的话,需要建立自启动的initrd.img文件,以下是我制作自启的过程:

    这里有一篇这方面的介绍:有兴趣的可以看一下:

    Linux中的Ramdisk与Initrd (http://dev.csdn.net/article/82332.shtm)

    制作Ramdisk的镜像文件

    # dd if=/dev/zero of=/dev/ram1

    dd: 正在写入 ‘/dev/ram1’: 设备上没有空间

    读入了 8193+0 个块

    输出了 8192+0 个块

    #mke2fs -m0 /dev/ram1

    #mkdir /mnt/ram

    #mount /dev/ram1 /mnt/ram

    将先前做好的rootfs根文件系统拷贝到ram1上.

    #>cp –rf * /mnt/ram

    #umount /dev/ram1

    # dd if=/dev/ram1 of=${PRJROOT}/rootfs/initrd.img

    # file initrd.img

    initrd.img: Linux rev 1.0 ext2 filesystem data

    用loop设备来把他重新挂装到文件系统里:

    # mount -o loop initrd.img /mnt/ram/

    查看/mnt/ram下的内容,和${PRJROOT}/rootfs/下的一模一样

    [root@localhost rootfs]]# ls /mnt/ram

    bin  dev  etc  lib  linuxrc  lost+found  proc  sbin  tmp  usr  var

    [root@localhost rootfs]]#umount /mnt/ram

    压缩initrd.img印象文件

    [root@localhost rootfs]# gzip -v9 initrd.img                                          

    initrd.img:      90.8% -- replaced with initrd.img.gz

    [root@localhost rootfs]# cp initrd.img.gz ../boot/(copy到boot目录中备用)



    第七章 Grub来启动usb盘

    关于在vmware下如何mount上优盘以及如何格式化成ext2格式,和所遇到的问题的解决请看我的这篇blog:

    grub引导usb盘:

    这里不再详细描述:

    主要是建立grub.conf:

    [root@localhost rootfs]# cd ../boot/grub/

    [root@localhost grub]# vi grub.conf

       1 # grub.conf generated by anaconda

          2 #

          3 # Note that you do not have to rerun grub after making changes to this file

          4 # NOTICE:  You do not have a /boot partition.  This means that

          5 #          all kernel and initrd paths are relative to /, eg.

          6 #          root (hd0,0)

          7 #          kernel /boot/vmlinuz-version ro root=/dev/sda1

          8 #          initrd /boot/initrd-version.img

          9 #boot=/dev/sda

         10 default=0

         11 timeout=10

         12 title my usb Red Hat Linux (2.4.27-

         13     root (hd0,0)

         14     kernel /boot/bzImage-2.4.27-rmk5 ro root=/dev/sda1(这个一定是sda1,因为用U盘启动后,它认的是第一个SCSI盘,这里可以用df看一下,就是那个带/的盘)

         15     initrd /boot/initrd.img.gz

    [root@localhost grub]# ln -s grub.conf menu.lst

    附:我的df命令显示

    [root@localhost grub]# df

    Filesystem           1K-blocks      Used Available Use% Mounted on

    /dev/sda1              8254240   3085424   4749524  40% /

    none                    127632         0    127632   0% /dev/shm

    /dev/sdb1                63117      1638     61479   3% /mnt/usb

    /home/afa/embeded/rootfs/initrd.img

                              3963       780      3183  20% /mnt/ram

    建立usb目录:

    [root@localhost grub]# mkdir /mnt/usb

    [root@localhost grub]# mount /dev/sdb1 /mnt/usb

    Cp /boot文件到usb盘上:

    [root@localhost afa]# cd /mnt/usb

    [root@localhost usb]# mkdir boot

    [root@localhost usb]# cp -a ${PRJROOT}/boot/* boot/

    [root@localhost root]# umount /dev/sdb1

    [root@localhost root]# grub

    grub> root (hd1,0)

    Filesystem type is ext2fs, partition type 0x83

    grub> setup (hd1)

    grub> quit

    来看一下我的目录结构:

    [root@localhost embeded]# ls -Rl boot

    boot:

    total 1532

    -rw-r--r--    1 root     root      1168816 May 15 02:52 bzImage-2.4.27-rmk5

    drwxr-xr-x    2 root     root         4096 May 15 03:00 grub

    -rw-r--r--    1 root     root       384523 May 15 02:52 initrd.img.gz



    boot/grub:

    total 116

    -rw-r--r--    1 root     root          530 May 15 03:00 grub.conf

    lrwxrwxrwx    1 root     root            9 May 15 02:52 menu.lst -> grub.conf

    -rw-r--r--    1 root     root          512 May 15 02:52 stage1

    -rw-r--r--    1 root     root       106364 May 15 02:52 stage2

    附:用syslinux来启动优盘

            有的人可能比较喜欢这个,我来说一下如何用这个来启动,这个应该比grub还要简单一些,在redhat中已经带了syslinux包,如果没有你自己下载装一下好了.syslinux好处就是用windows FAT来启动,这样我们可以在windows和linux都能看到其中的文件。

    你的盘可以用uboot格式化一下首先。试一下能否启动。

    #>

    我的syslinux.cfgTIMEOUT=5
    DEFAULT usb_boot
    LABEL usb_boot
    kernel bzImage
    append initrd=init.img

    接下来制作MBR

    [root@afa-red root]# umount /dev/sdb1(这一步一定要执行卸载它)

    [root@afa-red root]# syslinux /dev/sdb1(生成LDLINUX.SYS文件)

    ok制作成功.


    比较简单,你可以按照syslinux的标准文档来写的更复杂一些,这不是我要说的,自己参考文档好了.

    http://gnawux.googlepages.com/syslinux这篇写的比较详细

    从这里我们看到不管你选什么bootloader,最重要的是要制作成自我解压的initrd.img文件,当然对于明白会做的人

    觉得这不难,但对于大多数初学者来说这个还是比较难的一次成功。希望有所帮助对爱好这个朋友。



    第八章 启动usb盘

    这里就是修改BIOS设置成USB盘启动即可,无它,可能中间会报一下error,但无关紧要,最终进入到

    #>

    Shell界面.

    oK,大功告成.

    接下将要学习的如何整合新的应用程序如httpd,udhcp,….等。学习路的很长,不过总算有一个良好的开端了。

    最好的就是把这个过程写成一个Makefile文件一次搞定,这个梦想不错,看能否实现。



    参考资料:
    1.[原创] 我也来学做嵌入式Linux系统V0.1(完整版) - ChinaUnix.net
    2.<<构建嵌入式linux系统>>

    论坛徽章:
    0
    3 [报告]
    发表于 2008-05-17 18:35 |只看该作者

    疑问???

    不错,有空可以试一试。

    不过有些疑问:

    既然你的HOST是下x86平台,而且你的你在U盘建立的嵌入式linux也是针对x86平台的,那为什么还要建立交叉编译工具呢,直接用(原生开发工具)HOST中的gcc不可以么?

    [ 本帖最后由 kingreat 于 2008-5-18 09:53 编辑 ]

    论坛徽章:
    0
    4 [报告]
    发表于 2008-05-18 18:06 |只看该作者

    楼主呢?

    请问楼主怎么不出来了,我等着回答我的问题呢。。。。

    论坛徽章:
    0
    5 [报告]
    发表于 2008-06-18 23:07 |只看该作者
    樓主辛苦,為方便查閱,現將兩主題合並為一個並設置為原創精華

    希望樓主再接再勵

    [ 本帖最后由 bitmilong 于 2008-6-19 13:24 编辑 ]

    论坛徽章:
    3
    CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52
    6 [报告]
    发表于 2008-06-23 23:18 |只看该作者
    风吹得路好长…………

    论坛徽章:
    0
    7 [报告]
    发表于 2010-09-10 16:15 |只看该作者
    回复 4# kingreat


        你说得没错真是不好意思一直没登录了,我的那个只是试验这种交叉编译的过程和方法,事实如果只在x86上你可以不用交叉编译的。

    论坛徽章:
    0
    8 [报告]
    发表于 2010-09-21 11:26 |只看该作者
    老实说,没意思

    论坛徽章:
    0
    9 [报告]
    发表于 2010-09-22 22:14 |只看该作者
    还是有点意思,嘿嘿

    论坛徽章:
    0
    10 [报告]
    发表于 2010-10-18 11:44 |只看该作者
    太高深了~~~{:3_179:}
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP