构建基本的嵌入式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)创建根文件系统的基本目录结构。 我把这个过程做成了shell脚本(文件名为 mkroot ) ,很方便! # ! / bin/ sh echo "creatint rootfs dir......" mkdir rootfs cd rootfs echo "making dir : bin dev etc lib proc sbin sys usr" mkdir bin dev etc lib proc sbin sys usr # 必备的8个目录 mkdir usr/ bin usr/ lib usr/ sbin lib/ modules
# Don't use mknod ,unless you run this Script as root ! # mknod -m 600 dev/console c 5 1 # mknod -m 666 dev/null c 1 3
echo "making dir : mnt tmp var" mkdir mnt tmp var chmod 1777 tmp mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp mkdir var/lib var/lock var/log var/run var/tmp chmod 1777 var/tmp
echo "making dir : home root boot" mkdir home root boot
echo "done"
在你想要建立根文件系统的地方,运行:
[ tekkamanninja@Tekkaman- Ninja nfs] $ . / mkroot creatint rootfs dir. . . . . . making dir : bin dev etc lib proc sbin sys usr making dir : mnt tmp var making dir : home root boot done[ tekkamanninja@Tekkaman- Ninja nfs] $ cd rootfs/ dev/ [ tekkamanninja@Tekkaman- Ninja dev] $ su 口令:[ root@Tekkaman- Ninja dev] # mknod - m 600 console c 5 1; mknod - m 666 null c 1 3; exit exit [ tekkamanninja@Tekkaman- Ninja dev] $
(2 )配置、编译和安装Busybox-1.9.1
[ tekkamanninja@Tekkaman- Ninja source] $ tar - xjvf busybox- 1. 9. 1. tar. bz2
修改Makefile 文件:
[ tekkamanninja@Tekkaman- Ninja busybox- 1. 9. 1] $ pwd/ home/ tekkamanninja/ working/ source/ busybox- 1. 9. 1[ tekkamanninja@Tekkaman- Ninja busybox- 1. 9. 1] $ kwrite Makefile. . . . . . ( 第151- 154行) # SUBARCH : = $( shell uname - m | sed - e s/ i. 86/ i386/ - e s/ sun4u/ sparc64/ \# - e s/ arm. * / arm/ - e s/ sa110/ arm/ \# - e s/ s390x/ s390/ - e s/ parisc64/ parisc/ \# - e s/ ppc. * / powerpc/ - e s/ mips. * / mips/ ) . . . . . . ( 第174行附近) # ARCH ? = $( SUBARCH) # CROSS_COMPILE ? = ARCH = arm 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- [ tekkamanninja@Tekkaman- Ninja busybox- 1. 9. 1] $ make menuconfig
在原有的基础上修改如下:
Busybox Settings ---> Installation Options ---> [*] 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] $ make. . . . . . LINK busybox_unstripped Trying libraries: crypt m Library crypt is needed Library m is needed Final link with: crypt m[ 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 busybox Dynamic section at offset 0xac014 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) 0xc0f0 0x0000000d ( FINI) 0x97608 0x00000004 ( HASH) 0x80e8 0x00000005 ( STRTAB) 0xa3c0 0x00000006 ( SYMTAB) 0x8b30 0x0000000a ( STRSZ) 3371 ( bytes) 0x0000000b ( SYMENT) 16 ( bytes) 0x00000015 ( DEBUG) 0x0 0x00000003 ( PLTGOT) 0xbc0ec 0x00000002 ( PLTRELSZ) 2976 ( bytes) 0x00000014 ( PLTREL) REL 0x00000017 ( JMPREL) 0xb550 0x00000011 ( REL) 0xb4e0 0x00000012 ( RELSZ) 112 ( bytes) 0x00000013 ( RELENT) 8 ( bytes) 0x6ffffffe ( VERNEED) 0xb400 0x6fffffff ( VERNEEDNUM) 3 0x6ffffff0 ( VERSYM) 0xb0ec 0x00000000 ( NULL ) 0x0
(3 )修改和创建必要的文件。
[ tekkamanninja@Tekkaman- Ninja busybox- 1. 9. 1] $ cp - a examples/ bootfloppy/ 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 shells echo
echo "Processing /etc/profile... " # no- op
# Set search library path echo "Set search library path in /etc/profile" export LD_LIBRARY_PATH= / lib: / usr/ lib # Set user path echo "Set user path in /etc/profile" PATH= / bin: / sbin: / usr/ bin: / usr/ sbinexport PATH # Set PS1 # 注意:ash 除了SHELL变量外,支持\u、\h、\W、\$、\! 、\n、\w 、\nnn(ASCII字符对应的八进制数)# 以及\e[ xx; xxm ( 彩色特效) 等等!# 而且前面还要多加一个 '\' !
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/ rcS: : respawn管理员在2009年8月13日编辑了该文章文章。 -->
阅读(1018) | 评论(0) | 转发(1) |