linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > 嵌入应用 >
栏目导栏
资料搜索
热门文章
·Symbian编程VC开发环境设置
·基于ARM的嵌入式Linux开发平台
·嵌入式Linux用Qt Designer快速
·S3C2410X开发总结及心得
·轻松控制uClinux嵌入式开发过程
·嵌入式操作系统uCLinux
·uC/OS和uClinux的比较
·uClinux系统分析
·Porting uClinux to Samsung S
·在Windows上应用uClinux
·sqlite嵌入式数据库在arm-linu
·嵌入式设备上的 Linux 系统开发
·七款嵌入式Linux操作系统简介
·e680i手机嵌入式Linux 研究
·嵌入式系统和嵌入式操作系统
最新文章
·在嵌入式Linux环境下制作QPF字
·ARM Linux开机后自动运行特定程
·构建基本的嵌入式Linux根文件系
·自己动手打造嵌入式Linux软硬件
·MP3播放器madplay在ARM的移植
·Linux 2.6.11 MTD驱动情景分析
·ARM中C和汇编混合编程及示例
·BusyBox 简化嵌入式 Linux 系统
·使用虚拟机嵌入式Linux开发前的
·用NFS服务开发ARM Linux程序的
·虚拟机Linux系统下连接ARM开发
·嵌入式Linux系统下的网页浏览器
·Linux移植PSP详细步骤
·浅析armlinux 2.4.19中断irq分
·Linux 的魅力: 开发 Nokia N80
Google
 
构建基本的嵌入式Linux根文件系统
[ 作者:  加入时间:2008-03-13 11:20:08  来自:Linux联盟收集整理 ]

其实在去年8月份我做系统移植时就构建好了一个可以用的根文件系统,但是那时是跟着别人的《Linux全线移植文档》做的。有些东西我也不清楚,只是跟着做,做出来能用就了事了,没有深究其中的规范,以及文件系统中哪些要,哪些不要。

趁着今年过年的几天假期,我移植重新移植了U-Boot1.3.1和Linux2.6.24到S3C2410及S3C2440后,我想好好的看看有关文件系统构建方法和规范,整理整理构建根文件系统的文档。之后,我用了近一周的时间,慢慢研究《构建嵌入式Linux系统》这本书有关根文件系统的部分,以及一些网上的参考资料,不断地实验。构建好了一个精简的根文件系统,下面我只介绍构建的过程和方法,至于原理我给出以下参考资料,自己看吧。


1、 《Linux系统移植》:一个经典的Linux移植文档,共有95页的PDF文档,内容十分详细,里面有根文件系统的创建,还多地方都有下载(有的网站称之为《Linux系统全线移植文档》等等),很值得参考。在这里感谢文档的作者们。

2、 《构建嵌入式Linux系统》必看!里面对文件系统的构建讲的挺细。

3、 《Filesystem Hierarchy Standard》Linux文件系统的标准规范。我只看到英文的。

其他再遇到不懂的就google,基本上都是Linux的相关知识,都是找得到的。


(1)创建根文件系统的基本目录结构。NXZLinux联盟
我把这个过程做成了shell脚本,很方便!

#! /bin/shNXZLinux联盟
    echo "creatint rootfs dir......"NXZLinux联盟
    mkdir rootfsNXZLinux联盟
    cd rootfsNXZLinux联盟
NXZLinux联盟
    echo "making dir : bin dev etc lib proc sbin sys usr"NXZLinux联盟
    mkdir bin dev etc lib proc sbin sys usr #必备的8个目录NXZLinux联盟
    mkdir usr/bin usr/lib usr/sbin lib/modules

NXZLinux联盟
# Don't use mknod ,unless you run this Script as root !NXZLinux联盟
# mknod -m 600 dev/console c 5 1NXZLinux联盟
# mknod -m 666 dev/null c 1 3

 

    echo "making dir : mnt tmp var"NXZLinux联盟
    mkdir mnt tmp varNXZLinux联盟
    chmod 1777 tmpNXZLinux联盟
    mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/tempNXZLinux联盟
    mkdir var/lib var/lock var/log var/run var/tmp NXZLinux联盟
    chmod 1777 var/tmp

 

    echo "making dir : home root boot"NXZLinux联盟
    mkdir home root boot

    echo "done"

 

在你想要建立根文件系统的地方,运行:

[tekkamanninja@Tekkaman-Ninja nfs]$ ./mkrootNXZLinux联盟
creatint rootfs dir......NXZLinux联盟
making dir : bin dev etc lib proc sbin sys usrNXZLinux联盟
making dir : mnt tmp varNXZLinux联盟
making dir : home root bootNXZLinux联盟
doneNXZLinux联盟
[tekkamanninja@Tekkaman-Ninja nfs]$ cd rootfs/dev/NXZLinux联盟
[tekkamanninja@Tekkaman-Ninja dev]$ suNXZLinux联盟
口令:NXZLinux联盟
[root@Tekkaman-Ninja dev]# mknod -m 600 console c 5 1;mknod -m 666 null c 1 3;exitNXZLinux联盟
exitNXZLinux联盟
[tekkamanninja@Tekkaman-Ninja dev]$


2)配置、编译和安装Busybox-1.9.1

[tekkamanninja@Tekkaman-Ninja source]$ tar -xjvf busybox-1.9.1.tar.bz2 NXZLinux联盟

修改Makefile文件:

[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ pwdNXZLinux联盟
/home/tekkamanninja/working/source/busybox-1.9.1NXZLinux联盟
[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ kwrite MakefileNXZLinux联盟
NXZLinux联盟
NXZLinux联盟
......(第151-154行)NXZLinux联盟
#SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \NXZLinux联盟
#                 -e s/arm.*/arm/ -e s/sa110/arm/ \NXZLinux联盟
#                 -e s/s390x/s390/ -e s/parisc64/parisc/ \NXZLinux联盟
#                 -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )NXZLinux联盟
......(第174行附近)NXZLinux联盟
#ARCH        ?= $(SUBARCH)NXZLinux联盟
#CROSS_COMPILE    ?=NXZLinux联盟
ARCH         = armNXZLinux联盟
CROSS_COMPILE = /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-
NXZLinux联盟
[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ make menuconfig

 

在原有的基础上修改如下:

 

Busybox Settings --->NXZLinux联盟
      Installation Options --->NXZLinux联盟
           [*] Don't use /usr

           (/home/tekkamanninja/working/nfs/rootfs) BusyBox installation prefix

        Busybox Library Tuning  --->

           [*] Support for /etc/networks

           [*]   Additional editing keys     

           [*]   vi-style line editing commands   

           (15)  History size  

           [*]   History saving  

           [*]   Tab completion 

           [*]     Username completion  

           [*]   Fancy shell prompts

Login/Password Management Utilities  --->选项全部N掉,后面单独使用TinyLogin。(因为集成的好像不是很好用,我自己的经验是这样)

Linux Module Utilities  ---> 

      [N] Support version 2.2.x to 2.4.x Linux kernels

Shells  --->

      ---   Ash Shell Options 下的选项全选

[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ makeNXZLinux联盟
......NXZLinux联盟
  LINK busybox_unstrippedNXZLinux联盟
Trying libraries: crypt mNXZLinux联盟
 Library crypt is neededNXZLinux联盟
 Library m is neededNXZLinux联盟
Final link with: crypt mNXZLinux联盟
[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ make install

我是动态编译所以查看一下需要的动态库

[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d busyboxNXZLinux联盟
NXZLinux联盟
Dynamic section at offset 0xac014 contains 22 entries:NXZLinux联盟
  Tag Type Name/ValueNXZLinux联盟
 0x00000001 (NEEDED) Shared library: [libcrypt.so.1]NXZLinux联盟
 0x00000001 (NEEDED) Shared library: [libm.so.6]NXZLinux联盟
 0x00000001 (NEEDED) Shared library: [libc.so.6]NXZLinux联盟
 0x0000000c (INIT) 0xc0f0NXZLinux联盟
 0x0000000d (FINI) 0x97608NXZLinux联盟
 0x00000004 (HASH) 0x80e8NXZLinux联盟
 0x00000005 (STRTAB) 0xa3c0NXZLinux联盟
 0x00000006 (SYMTAB) 0x8b30NXZLinux联盟
 0x0000000a (STRSZ) 3371 (bytes)NXZLinux联盟
 0x0000000b (SYMENT) 16 (bytes)NXZLinux联盟
 0x00000015 (DEBUG) 0x0NXZLinux联盟
 0x00000003 (PLTGOT) 0xbc0ecNXZLinux联盟
 0x00000002 (PLTRELSZ) 2976 (bytes)NXZLinux联盟
 0x00000014 (PLTREL) RELNXZLinux联盟
 0x00000017 (JMPREL) 0xb550NXZLinux联盟
 0x00000011 (REL) 0xb4e0NXZLinux联盟
 0x00000012 (RELSZ) 112 (bytes)NXZLinux联盟
 0x00000013 (RELENT) 8 (bytes)NXZLinux联盟
 0x6ffffffe (VERNEED) 0xb400NXZLinux联盟
 0x6fffffff (VERNEEDNUM) 3NXZLinux联盟
 0x6ffffff0 (VERSYM) 0xb0ecNXZLinux联盟
 0x00000000 (NULL) 0x0NXZLinux联盟


3)修改和创建必要的文件。

 

[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ cp -a examples/bootfloppy/etc/*NXZLinux联盟
/home/tekkamanninja/working/nfs/rootfs/etc/

[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ cd ../../nfs/rootfs/etc/

1、增加为SHELL导入全局变量的文件/etc/profile

[tekkamanninja@Tekkaman-Ninja etc]$ kwrite profile

 

# /etc/profile: system-wide .profile file for the Bourne shellsNXZLinux联盟
echo

echo "Processing /etc/profile... "NXZLinux联盟
# no-op

NXZLinux联盟
# Set search library pathNXZLinux联盟
echo "Set search library path in /etc/profile"NXZLinux联盟
export LD_LIBRARY_PATH=/lib:/usr/lib NXZLinux联盟
NXZLinux联盟
# Set user pathNXZLinux联盟
echo "Set user path in /etc/profile"NXZLinux联盟
PATH=/bin:/sbin:/usr/bin:/usr/sbinNXZLinux联盟
export PATH NXZLinux联盟
NXZLinux联盟
# Set PS1 NXZLinux联盟
#注意:ash 除了SHELL变量外,支持\u、\h、\W、\$、\!、\n、\w 、\nnn(ASCII字符对应的八进制数)NXZLinux联盟
#以及\e[xx;xxm (彩色特效)等等!NXZLinux联盟
#而且前面还要多加一个 '\'

echo "Set PS1 in /etc/profile"

export PS1="\\e[05;32m[$USER@\\w\\a]\\$\\e[00;34m"

 

echo "Done"

echo

 

2、增加初始化文件

[tekkamanninja@Tekkaman-Ninja etc]$ kwrite inittab

::sysinit:/etc/init.d/rcSNXZLinux联盟
::respawn:-/bin/loginNXZLinux联盟
::restart:/sbin/init NXZLinux联盟
NXZLinux联盟
::ctrlaltdel:/sbin/rebootNXZLinux联盟
::shutdown:/bin/umount -a -rNXZLinux联盟
::shutdown:/sbin/swapoff -a

 

[tekkamanninja@Tekkaman-Ninja etc]$ kwrite fstab

proc /proc proc defaults 0 0NXZLinux联盟
none /tmp ramfs defaults 0 0NXZLinux联盟
mdev /dev ramfs defaults 0 0NXZLinux联盟
sysfs /sys sysfs defaults 0 0
NXZLinux联盟

 

3、增加初始化脚本

[tekkamanninja@Tekkaman-Ninja etc]$ kwrite init.d/rcS

#! /bin/shNXZLinux联盟
echo "----------mount all"NXZLinux联盟
/bin/mount -a

NXZLinux联盟
echo "----------Starting mdev......"NXZLinux联盟
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplugNXZLinux联盟
mdev -s

NXZLinux联盟
echo "*********************************************************"NXZLinux联盟
echo " Tekkaman Ninja 2440 Rootfs(nfs) 2008.2 "NXZLinux联盟
echo " Love Linux ! ! @@ Love Ke Ke ! ! "NXZLinux联盟
echo "********************************************************"

 

4、删除备份文件

[tekkamanninja@Tekkaman-Ninja etc]$ rm *~ init.d/*~

 

5、为mdev创建配置文件

[tekkamanninja@Tekkaman-Ninja etc]$ vi mdev.conf

创建一个mdev.conf文件,内容可有可无。

4为使用用户登录功能移植TinyLogin

1、下载

http://tinylogin.busybox.net/ 下载tinylogin-snapshot.tar.bz2,并解压.

[tekkamanninja@Tekkaman-Ninja source]$ tar -xjvf tinylogin-snapshot.tar.bz2

 

2、修改tinyLogin的Makefile

[tekkamanninja@Tekkaman-Ninja source]$ cd tinylogin

[tekkamanninja@Tekkaman-Ninja tinylogin]$ kwrite Makefile

 

指明tinyLogin使用自己来处理用户密码

USE_SYSTEM_PWD_GRP = falseNXZLinux联盟
...... NXZLinux联盟
CROSS =/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-NXZLinux联盟
CC = $(CROSS)gccNXZLinux联盟
AR = $(CROSS)arNXZLinux联盟
STRIPTOOL = $(CROSS)strip

 3、 编译并安装  

[tekkamanninja@Tekkaman-Ninja tinylogin]$ make PREFIX=/home/tekkamanninja/working/nfs/rootfs installNXZLinux联盟
Aborting install -- You must be root, otherwise I can't.

make tinylogin be setuid root, which will cause it to fail.

 

make: *** [install] 错误 1

[tekkamanninja@Tekkaman-Ninja tinylogin]$su

口令:

[root@Tekkaman-Ninja tinylogin]# make PREFIX=/home/tekkamanninja/working/nfs/rootfs install

[root@Tekkaman-Ninja tinylogin]# exit

exit

 我是动态编译所以查看一下需要的动态库 

[tekkamanninja@Tekkaman-Ninja tinylogin]$ /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d tinylogin NXZLinux联盟
NXZLinux联盟
Dynamic section at offset 0x9670 contains 21 entries:NXZLinux联盟
  Tag Type Name/ValueNXZLinux联盟
 0x00000001 (NEEDED) Shared library: [libcrypt.so.1]NXZLinux联盟
 0x00000001 (NEEDED) Shared library: [libc.so.6]NXZLinux联盟
 0x0000000c (INIT) 0x9c40NXZLinux联盟
 0x0000000d (FINI) 0x10160

 0x00000004 (HASH) 0x8128NXZLinux联盟
 0x00000005 (STRTAB) 0x9070NXZLinux联盟
 0x00000006 (SYMTAB) 0x85e0NXZLinux联盟
 0x0000000a (STRSZ) 1430 (bytes)NXZLinux联盟
 0x0000000b (SYMENT) 16 (bytes)NXZLinux联盟
 0x00000015 (DEBUG) 0x0NXZLinux联盟
 0x00000003 (PLTGOT) 0x19740NXZLinux联盟
 0x00000002 (PLTRELSZ) 1064 (bytes)NXZLinux联盟
 0x00000014 (PLTREL) RELNXZLinux联盟
 0x00000017 (JMPREL) 0x9818NXZLinux联盟
 0x00000011 (REL) 0x97c8

 0x00000012 (RELSZ) 80 (bytes)

 0x00000013 (RELENT) 8 (bytes)NXZLinux联盟
 0x6ffffffe (VERNEED) 0x9758NXZLinux联盟
 0x6fffffff (VERNEEDNUM) 2NXZLinux联盟
 0x6ffffff0 (VERSYM) 0x9606NXZLinux联盟
 0x00000000 (NULL) 0x0

 

 

创建帐号及密码文件:

[tekkamanninja@Tekkaman-Ninja tinylogin]$ cd ../../nfs/rootfs/etc/NXZLinux联盟
[tekkamanninja@Tekkaman-Ninja etc]$
suNXZLinux联盟
口令:NXZLinux联盟
[root@Tekkaman-Ninja etc]# cp /etc/passwd . ;cp /etc/shadow . ;cp /etc/group .NXZLinux联盟
[root@Tekkaman-Ninja etc]# kwrite passwdNXZLinux联盟
root:x:0:0:root:/root:/bin/shNXZLinux联盟
[root@Tekkaman-Ninja etc]# kwrite group

root:x:0:rootNXZLinux联盟
[root@Tekkaman-Ninja etc]#
kwrite shadowNXZLinux联盟
root:$1$N8K8eEQe$.XkJo3xcsjOE6vo1jW9Nk/:13923:0:99999:7:::NXZLinux联盟
NXZLinux联盟
[root@Tekkaman-Ninja etc]#
rm *~NXZLinux联盟
rm:是否删除 普通文件 “group~? yNXZLinux联盟
rm:是否删除 普通文件 “passwd~? yNXZLinux联盟
rm:是否删除 普通文件 “shadow~? yNXZLinux联盟
[root@Tekkaman-Ninja etc]# exitNXZLinux联盟
exitNXZLinux联盟
[tekkamanninja@Tekkaman-Ninja etc]$

3个文件是从Host中拷贝来的,只留下root帐号

那么现在 root的登陆密码和Host的登陆口令一致了,可以登录后再修改以及创建新用户。若使用以上文件,则root密码为tekkaman)

 
 

 

 

拷贝必需的动态库文件

[tekkamanninja@Tekkaman-Ninja lib]$ cp -d /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/ld* .NXZLinux联盟
cp: 略过目录 “/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/ldscripts”NXZLinux联盟
[tekkamanninja@Tekkaman-Ninja lib]$ cp /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libc-2.3.2.so .;cp -d /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libc.so.6 .NXZLinux联盟
[tekkamanninja@Tekkaman-Ninja lib]$ cp /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libm-* . ;cp -d /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libm.s* .NXZLinux联盟
[tekkamanninja@Tekkaman-Ninja lib]$ cp /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libcrypt-* . ;cp -d /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libcrypt.s* .
NXZLinux联盟

 

 

以上是最基本的文件。

一个最基本根文件系统构建完成!未压缩的文件系统总大小不到3M

以下是启动信息:

U-Boot 1.3.1 (Feb 18 2008 - 16:04:40)NXZLinux联盟
NXZLinux联盟
DRAM: 64 MBNXZLinux联盟
Flash: 1 MBNXZLinux联盟
NAND: NAND flash probing at 0x4E000000NXZLinux联盟
  64 MBNXZLinux联盟
In: serialNXZLinux联盟
Out: serialNXZLinux联盟
Err: serialNXZLinux联盟
Hit any key to stop autoboot: 0NXZLinux联盟
dm9000 i/o: 0x20000300, id: 0x90000a46NXZLinux联盟
MAC: 08:08:08:08:12:27NXZLinux联盟
operating at 100M full duplex modeNXZLinux联盟
File transfer via NFS from server 192.168.1.22; our IP address is 192.168.1.2NXZLinux联盟
Filename '/home/tekkamanninja/working/nfs/zImage.img'.NXZLinux联盟
Load address: 0x30008000NXZLinux联盟
Loading: ###########################################NXZLinux联盟
         #######################################NXZLinux联盟
         ####################################NXZLinux联盟
         ##########################################NXZLinux联盟
         ############