构建基本的嵌入式Linux根文件系统其实在去年8月份我做系统移植时就构建好了一个可以用的根文件系统,但是那时是跟着别人的《Linux全线移植文档》做的。有些东西我也不清楚,只是跟着做,做出来能用就了事了,没有深究其中的规范,以及文件系统中哪些要,哪些不要。趁着今年过年的几天假期,我移植重新移植了U-Boot1.3.1和Linux2.6.24到S3C2410及S3C2440后,我想好好的看看有关文件系统构建方法和规范,整理整理构建根文件系统的文档。之后,我用了近一周的时间,慢慢研究《构建嵌入式Linux系统》这本书有关根文件系统的部分,以及一些网上的参考资料,不断地实验。构建好了一个精简的根文件系统,下面我只介绍构建的过程和方法,至于原理我给出以下参考资料,自己看吧。1、《Linux系统移植》:一个经典的Linux移植文档,共有95页的PDF文档,内容十分详细,里面有根文件系统的创建,还多地方都有下载(有的网站称之为《Linux系统全线移植文档》等等),很值得参考。在这里感谢文档的作者们。2、《构建嵌入式Linux系统》必看!里面对文件系统的构建讲的挺细。3、《FilesystemHierarchyStandard》Linux文件系统的标准规范。我只看到英文的。其他再遇到不懂的就google,基本上都是Linux的相关知识,都是找得到的。(1)创建根文件系统的基本目录结构。我把这个过程做成了shell脚本(文件名为mkroot),很方便!#!/bin/shechocreatintrootfsdir......mkdirrootfscdrootfsechomakingdir:bindevetclibprocsbinsysusrmkdirbindevetclibprocsbinsysusr#必备的8个目录mkdirusr/binusr/libusr/sbinlib/modules#Don'tusemknod,unlessyourunthisScriptasroot!#mknod-m600dev/consolec51#mknod-m666dev/nullc13echomakingdir:mnttmpvarmkdirmnttmpvarchmod1777tmpmkdirmnt/etcmnt/jffs2mnt/yaffsmnt/datamnt/tempmkdirvar/libvar/lockvar/logvar/runvar/tmpchmod1777var/tmpechomakingdir:homerootbootmkdirhomerootbootechodone在你想要建立根文件系统的地方,运行:[tekkamanninja@Tekkaman-Ninjanfs]$./mkrootcreatintrootfsdir......makingdir:bindevetclibprocsbinsysusrmakingdir:mnttmpvarmakingdir:homerootbootdone[tekkamanninja@Tekkaman-Ninjanfs]$cdrootfs/dev/[tekkamanninja@Tekkaman-Ninjadev]$su口令:[root@Tekkaman-Ninjadev]#mknod-m600consolec51;mknod-m666nullc13;exitexit[tekkamanninja@Tekkaman-Ninjadev]$(2)配置、编译和安装Busybox-1.9.1[tekkamanninja@Tekkaman-Ninjasource]$tar-xjvfbusybox-1.9.1.tar.bz2修改Makefile文件:[tekkamanninja@Tekkaman-Ninjabusybox-1.9.1]$pwd/home/tekkamanninja/working/source/busybox-1.9.1[tekkamanninja@Tekkaman-Ninjabusybox-1.9.1]$kwriteMakefile......(第151-154行)#SUBARCH:=$(shelluname-m|sed-es/i.86/i386/-es/sun4u/sparc64/\#-es/arm.*/arm/-es/sa110/arm/\#-es/s390x/s390/-es/parisc64/parisc/\#-es/ppc.*/powerpc/-es/mips.*/mips/)......(第174行附近)#ARCH?=$(SUBARCH)#CROSS_COMPILE?=ARCH=armCROSS_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-Ninjabusybox-1.9.1]$makemenuconfig在原有的基础上修改如下:BusyboxSettings---InstallationOptions---[*]Don'tuse/usr(/home/tekkamanninja/working/nfs/rootfs)BusyBoxinstallationprefixBusyboxLibraryTuning---[*]Supportfor/etc/networks[*]Additionaleditingkeys[*]vi-stylelineeditingcommands(15)Historysize[*]Historysaving[*]Tabcompletion[*]Usernamecompletion[*]FancyshellpromptsLogin/PasswordManagementUtilities---选项全部N掉,后面单独使用TinyLogin。(因为集成的好像不是很好用,我自己的经验是这样)LinuxModuleUtilities---[N]Supportversion2.2.xto2.4.xLinuxkernelsShells------AshShellOptions下的选项全选[tekkamanninja@Tekkaman-Ninjabusybox-1.9.1]$make......LINKbusybox_unstrippedTryinglibraries:cryptmLibrarycryptisneededLibrarymisneededFinallinkwith:cryptm[tekkamanninja@Tekkaman-Ninjabusybox-1.9.1]$makeinstall我是动态编译所以查看一下需要的动态库[tekkamanninja@Tekkaman-Ninjabusybox-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-dbusyboxDynamicsectionatoffset0xac014contains22entries:TagTypeName/Value0x00000001(NEEDED)Sharedlibrary:[libcrypt.so.1]0x00000001(NEEDED)Sharedlibrary:[libm.so.6]0x00000001(NEEDED)Sharedlibrary:[libc.so.6]0x0000000c(INIT)0xc0f00x0000000d(FINI)0x976080x00000004(HASH)0x80e80x00000005(STRTAB)0xa3c00x00000006(SYMTAB)0x8b300x0000000a(STRSZ)3371(bytes)0x0000000b(SYMENT)16(bytes)0x00000015(DEBUG)0x00x00000003(PLTGOT)0xbc0ec0x00000002(PLTRELSZ)2976(bytes)0x00000014(PLTREL)REL0x00000017(JMPREL)0xb5500x00000011(REL)0xb4e00x00000012(RELSZ)112(bytes)0x00000013(RELENT)8(bytes)0x6ffffffe(VERNEED)0xb4000x6fffffff(VERNEEDNUM)30x6ffffff0(VERSYM)0xb0ec0x00000000(NULL)0x0(3)修改和创建必要的文件。[tekkamanninja@Tekkaman-Ninjabusybox-1.9.1]$cp-aexamples/bootfloppy/etc/*/home/tekkamanninja/working/nfs/rootfs/etc/[tekkamanninja@Tekkaman-Ninjabusybox-1.9.1]$cd../../nfs/rootfs/etc/1、增加为SHELL导入全局变量的文件/etc/profile[tekkamanninja@Tekkaman-Ninjaetc]$kwriteprofile#/etc/profile:system-wide.profilefilefortheBourneshellsechoechoProcessing/etc/profile...#no-op#SetsearchlibrarypathechoSetsearchlibrarypathin/etc/profileexportLD_LIBRARY_PATH=/lib:/usr/lib#SetuserpathechoSetuserpathin/etc/profilePATH=/bin:/sbin:/usr/bin:/usr/sbinexportPATH#SetPS1#注意:ash除了SHELL变量外,支持\u、\h、\W、\$、\!、\n、\w、\nnn(ASCII字符对应的八进制数)#以及\e[xx;xxm(彩色特效)等等!#而且前面还要多加一个'\'!echoSetPS1in/etc/profileexportPS1=\\e[05;32m[$USER@\\w\\a]\\$\\e[00;34mechoDoneecho2、增加初始化文件[tekkamanninja@Tekkaman-Ninjaetc]$kwriteinittab::sysinit:/etc/init.d/rcS::respawn:-/bin/login::restart:/sbin/init::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount-a-r::shutdown:/sbin/swapoff-a[tekkamanninja@Tekkaman-Ninjaetc]$kwritefstabproc/procprocdefaults00none/tmpramfsdefaults00mdev/devramfsdefaults00sysfs/syssysfsdefaults003、增加初始化脚本[tekkamanninja@Tekkaman-Ninjaetc]$kwriteinit.d/rcS#!/bin/shecho----------mountall/bin/mount-aecho----------Startingmdev....../bin/echo/sbin/mdev/proc/sys/kernel/hotplugmdev-secho*********************************************************echoTekkamanN