Chinaunix首页 | 论坛 | 博客
  • 博客访问: 612516
  • 博文数量: 144
  • 博客积分: 5037
  • 博客等级: 大校
  • 技术积分: 1581
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-30 21:49
文章存档

2010年(16)

2009年(128)

分类: LINUX

2009-06-18 16:58:05

     构建基本的嵌入式Linux根文件系统
--------------------------------------------------------------------
移植环境:
主机:Radhat 9
交叉编译器:arm-linux-gcc-3.3.2
开发板平台:s3c2410(arm920t)开发板
--------------------------------------------------------------------

选定 busybox-1.9.2.tar.bz2 这个版本, 以静态方式编译, 即生成的 busybox 不需要共享库的支持就能运行。这样做我们就不需要布署程序库了。缺点是自己写的 arm-linux 程序在这个根文件系统中是不能运行的,因为缺少共享程序库的支持。不过不用担心,通过在目标机里以挂接 NFS 的方式, 将宿主机的 arm-linux-gcc 编译器的库文件挂到 arm-linux /lib , 就可完美的运行我们自己的程序了。

现在开始制作静态链接库的根文件系统。

 

1、下载最新的busybox1.9.2,并解压缩。
下载busybox源代码:
交叉编译工具:同内核
解压源码:tar -jxvf busybox-1.9.2.tar.bz2
2、准备建立文件系统

#mkdir rootfs

//在rootfs中建立linux系统中典型的文件夹

#cd rootfs

#mkdir root home bin sbin etc dev usr lib tmp mnt sys proc var

#mkdir usr/lib usr/bin

#pwd

/home/skyily/rootfs

3修改 Makefile,

174行处

CROSS_COMPILE ?=
   
改为
    CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux-

:这个版本的 busybox 3.4.1 arm-linux-gcc 编译有些问题, 3.3.2 版则可顺利编译

4、make menuconfig. 修改编译配置选项。
Busybox Setting----->
       build option-->
    [*] Build BusyBox as a static binary (no shared libs)                     
    [ ] Build shared libbusybox  

如果选中动态链接编译,就没不会出现编译错误,不过交叉编译器arm-linux-gcc 3.3.2的动态链接库特别大,c库好像是20M多,这个地方挺郁闷的,要不就在使用的用nfs挂上去用,                                             
    [*]   Produce a binary for each applet, linked against libbusybox         
    [*]   Produce additional busybox binary linked against libbusybox          
    [ ] Build with Large File Support (for accessing files > 2 GB)  
      
installation option-->
    [*] Don't use /usr                                                    
        Applets links (as soft-links) --->                                   
     (./_install) BusyBox installation prefix  

这个地方选中,把安装路径选择刚刚建立的目录 /home/skyily/rootfs
Busybox Library Tuning ---> 

                     
MD5: Trade Bytes for Speed                                      
[*] Faster /proc scanning code (+100 bytes)                            
[*] Support for /etc/networks                                    
 
[*] Support for /etc/networks
[*]   Additional editing keys
[*]   vi-style line editing commands
[*]   History saving
[*]   Tab completion
[*]   Username completion
[*]   Fancy shell prompts
 
Linux Module Utilities --->
[*] Support version 2.6.x Linux kernels
 
    [*] insmod  
    [*]   Enable load map (-m) option  
    [*]     Symbols in load map
    [*] rmmod  
    [*] lsmod
    [*]   lsmod pretty output for 2.6.x Linux kernels  
    [*] modprobe
    [ ]   Multiple options parsing
    [ ]   Fancy alias parsing
    ---   Options common to multiple modutils
    [ ] Support tainted module checking with new kernels
    [ ] Support version 2.2.x to 2.4.x Linux kernels
 
    [*] Support version 2.6.x Linux kernels
 
其他的用默认值

5、make (编译会出错)(当然若是选的动态链接这一步就没了

applets/applets.c:15:2: warning: #warning Static linking against glibc produces buggy executables
   
applets/applets.c:16:2: warning: #warning (glibc does not cope well with ld --gc-sections).
    applets/applets.c:17:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
 
   applets/applets.c:18:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
    applets/applets.c:19:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
    applets/applets.c:20:2: warning: #warning from scripts/trylink and remove this warning.

    applets/applets.c:21:2: error: #error Aborting compilation.
    make[1]: *** [applets/applets.o] Error 1

按照提示,修改文件 applets/applets.c 21 ,
    //#error Aborting compilation.
   
注释掉:

    #make

编译通过,就生成了busybox。

    #make install

busybox就被安装到指定的路径下了/home/skyily/rootfs,这个时侯可以看到下多了个liunxrc的文件,binsbin下也多了很多文件。用ls –l命令查看其中的一个文件,可发现其是链接到busybox的一个连接符,所以我们之后在目标机上运行的命令大多都会调用busybox这个文件的。

    若之前忘了指定路径,默认生成到临时目录busybox-1.9.2/_install 下了。

    下面就是整理rootfs目录下的文件

6、以root身份建立节点文件/dev/console, /dev/null
 # mknod -m 600 dev/console c 5 1

 # mknod -m 666 dev/console c 3 1

7、建立配置文件如下:etc下

   可先把busybox-1.9.2/example/bootflopy/etc下的文件拷贝到rootfs下的etc下#cp -r ..../busybox-1.9.2/examples/bootfloppy/etc/* ./

  下面再做修改:

 1>修改profile文件: 

 

#!/bin/sh
#/etc/profile:system-wide .profile file for the Bourne shells
echo
echo -n "Processing /etc/profile......"
 
# Set search library path
export LD_LIBRARY_PATH=/lib:/usr/lib
 
# set user path
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
 
#Set PS1

echo "Set PS1 in /etc/profile"
export PS1="[\u@\h\W]\$"


echo "Done!"

 2>修改inittab文件:

::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init

::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

 3>修改fstab文件:

proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0

none /var ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0

 4>修改初始化脚本init.d/rcS

#! /bin/sh
echo "----------mount all"
/bin/mount -a

echo "----------Starting mdev......"
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

echo "*********************************************************"
echo " GG skyily 2410 Rootfs 2009.6 "
echo " Love Linux ! ! @@ Love GG ! ! "
echo "********************************************************"

 5>为mdev创建配置文件:(etc下)

[root@ etc]# touch mdev.conf

创建一个mdev.conf文件,内容可为空!!!!

 6>创建登陆账户

 把自己pc上的/etc下的group shadow passwd 文件拷贝到制作的..../etc下

 #cp /etc/group ./

 #cp /etc/passwd ./

 #cp /etc/shadow ./

8、动态编译时所要查的(所需动态链接库)

  # arm-linux-readelf busybox

Dynamic section at offset 0xb8014 contains 22 entries:
 Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library:[libcrypt.so.1]
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0xc04c
 0x0000000d (FINI)                       0xa26f0
 0x00000004 (HASH)                       0x80e8
 0x00000005 (STRTAB)                     0xa384
 0x00000006 (SYMTAB)                     0x8b24
.....
.....

复制lib 文件到lib目录下:
[root@centos lib]cp -d /usr/local/arm/3.4.1/arm-linux/lib/ld* .
[root@centos lib]cp -d /usr/local/arm/3.4.1/arm-linux/lib/libc-2.3.2.so .
[root@centos lib]cp -d /usr/local/arm/3.4.1/arm-linux/lib/libc.so.6 .
[root@centos lib]cp -d /usr/local/arm/3.4.1/arm-linux/lib/libm * .
[root@centos lib]cp -d /usr/local/arm/3.4.1/arm-linux/lib/libcrypt* .

注:这样的话制作的.cramfs文件挺大的10M多。

9、使用工具mkcramfs将整个s3c2440文件夹制作成文件系统

# mkcramfs rootfs rootfs.cramfs

烧入nand flash 启动

注:还有一些脚本需要添加和修改,使得其他功能得以实现,正在实验中,以后添加

注意:

使用busybox制作文件系统时,运行make时,系统会马上提示:

没有/dev/null这个文件。(这里没有什么问题)

最终编译出根文件系统没有问题,问题出在重启自己pclinux系统时,机器进不去了。提示出错,信息如下:

 /etc/rc.d/rc.sysinit: line 173:/dev/null: read-only file system

 /etc/rc.d/rc.sysinit: line 173:/dev/null: read-only file system

 /etc/rc.d/rc.sysinit: line 184:/dev/null: read-only file system

 /etc/rc.d/rc.sysinit: line 184:/dev/null: read-only file system

 /etc/rc.d/rc.sysinit: line 200:/dev/null: read-only file system

  .

  .

  .

 ***An error occured during the file system check.

 ***Dropping you to a shell;the system will reboot

 ***when you leave the shell

 Give root password for maintenance

 (or type Control-D to continue):

解决办法:

按照提示输入root用户的密码,回车就可以看到提示修复信息:

依次输入命令:

Repair filesystem1# mount -n -o remount, rw /

Repair filesystem)2# rm -f /dev/null

Repair filesystem)3# mknod -m 0666 /dev/null c 1 3

Repair filesystem)4# reboot

问题解决。

 

  TAG: busybox-1.9.2    根文件系统制作
阅读(1049) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~