构建基本的嵌入式Linux根文件系统.docx
《构建基本的嵌入式Linux根文件系统.docx》由会员分享,可在线阅读,更多相关《构建基本的嵌入式Linux根文件系统.docx(16页珍藏版)》请在冰豆网上搜索。
构建基本的嵌入式Linux根文件系统
构建基本的嵌入式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/sh
echo"creatintrootfsdir......"
mkdirrootfs
cdrootfs
echo"makingdir:
bindevetclibprocsbinsysusr"
mkdirbindevetclibprocsbinsysusr#必备的8个目录
mkdirusr/binusr/libusr/sbinlib/modules
#Don'tusemknod,unlessyourunthisScriptasroot!
#mknod-m600dev/consolec51
#mknod-m666dev/nullc13
echo"makingdir:
mnttmpvar"
mkdirmnttmpvar
chmod1777tmp
mkdirmnt/etcmnt/jffs2mnt/yaffsmnt/datamnt/temp
mkdirvar/libvar/lockvar/logvar/runvar/tmp
chmod1777var/tmp
echo"makingdir:
homerootboot"
mkdirhomerootboot
echo"done"
在你想要建立根文件系统的地方,运行:
[tekkamanninja@Tekkaman-Ninjanfs]$./mkroot
creatintrootfsdir......
makingdir:
bindevetclibprocsbinsysusr
makingdir:
mnttmpvar
makingdir:
homerootboot
done
[tekkamanninja@Tekkaman-Ninjanfs]$cdrootfs/dev/
[tekkamanninja@Tekkaman-Ninjadev]$su
口令:
[root@Tekkaman-Ninjadev]#mknod-m600consolec51;mknod-m666nullc13;exit
exit
[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=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-Ninjabusybox-1.9.1]$makemenuconfig
在原有的基础上修改如下:
BusyboxSettings--->
InstallationOptions--->
[*]Don'tuse/usr
(/home/tekkamanninja/working/nfs/rootfs)BusyBoxinstallationprefix
BusyboxLibraryTuning--->
[*]Supportfor/etc/networks
[*]Additionaleditingkeys
[*]vi-stylelineeditingcommands
(15)Historysize
[*]Historysaving
[*]Tabcompletion
[*]Usernamecompletion
[*]Fancyshellprompts
Login/PasswordManagementUtilities--->选项全部N掉,后面单独使用TinyLogin。
(因为集成的好像不是很好用,我自己的经验是这样)
LinuxModuleUtilities--->
[N]Supportversion2.2.xto2.4.xLinuxkernels
Shells--->
---AshShellOptions下的选项全选
[tekkamanninja@Tekkaman-Ninjabusybox-1.9.1]$make
......
LINKbusybox_unstripped
Tryinglibraries:
cryptm
Librarycryptisneeded
Librarymisneeded
Finallinkwith:
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-dbusybox
Dynamicsectionatoffset0xac014contains22entries:
TagTypeName/Value
0x00000001(NEEDED)Sharedlibrary:
[libcrypt.so.1]
0x00000001(NEEDED)Sharedlibrary:
[libm.so.6]
0x00000001(NEEDED)Sharedlibrary:
[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-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.profilefilefortheBourneshells
echo
echo"Processing/etc/profile..."
#no-op
#Setsearchlibrarypath
echo"Setsearchlibrarypathin/etc/profile"
exportLD_LIBRARY_PATH=/lib:
/usr/lib
#Setuserpath
echo"Setuserpathin/etc/profile"
PATH=/bin:
/sbin:
/usr/bin:
/usr/sbin
exportPATH
#SetPS1
#注意:
ash除了SHELL变量外,支持\u、\h、\W、\$、\!
、\n、\w、\nnn(ASCII字符对应的八进制数)
#以及\e[xx;xxm(彩色特效)等等!
#而且前面还要多加一个'\'!
echo"SetPS1in/etc/profile"
exportPS1="\\e[05;32m[$USER@\\w\\a]\\$\\e[00;34m"
echo"Done"
echo
2、增加初始化文件
[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/procprocdefaults00
none/tmpramfsdefaults00
mdev/devramfsdefaults00
sysfs/syssysfsdefaults00
3、增加初始化脚本
[tekkamanninja@Tekkaman-Ninjaetc]$kwriteinit.d/rcS
#!
/bin/sh
echo"----------mountall"
/bin/mount-a
echo"----------Startingmdev......"
/bin/echo/sbin/mdev>/proc/sys/kernel/hotplug
mdev-s
echo"*********************************************************"
echo"TekkamanNinja2440Rootfs(nfs)2008.2"
echo"LoveLinux!
!
@@LoveKeKe!
!
"
echo"********************************************************"
4、删除备份文件
[tekkamanninja@Tekkaman-Ninjaetc]$rm*~init.d/*~
5、为mdev创建配置文件
[tekkamanninja@Tekkaman-Ninjaetc]$vimdev.conf
创建一个mdev.conf文件,内容可有可无。
--------------------------------------------------------------------------------
(4)为使用用户登录功能移植TinyLogin
1、下载
从下载tinylogin-snapshot.tar.bz2,并解压.
[tekkamanninja@Tekkaman-Ninjasource]$tar-xjvftinylogin-snapshot.tar.bz2
2、修改tinyLogin的Makefile
[tekkamanninja@Tekkaman-Ninjasource]$cdtinylogin
[tekkamanninja@Tekkaman-Ninjatinylogin]$kwriteMakefile
指明tinyLogin使用自己的算法来处理用户密码USE_SYSTEM_PWD_GRP=false
......
CROSS=/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-
CC=$(CROSS)gcc
AR=$(CROSS)ar
STRIPTOOL=$(CROSS)strip
3、编译并安装[tekkamanninja@Tekkaman-Ninjatinylogin]$makePREFIX=/home/tekkamanninja/working/nfs/rootfsinstall
Abortinginstall--Youmustberoot,otherwiseIcan't.
maketinyloginbesetuidroot,whichwillcauseittofail.
make:
***[install]错误1
[tekkamanninja@Tekkaman-Ninjatinylogin]$su
口令:
[root@Tekkaman-Ninjatinylogin]#makePREFIX=/home/tekkamanninja/working/nfs/rootfsinstall
[root@Tekkaman-Ninjatinylogin]#exit
exit
我是动态编译所以查看一下需要的动态库
[tekkamanninja@Tekkaman-Ninjatinylogin]$/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf-dtinylogin
Dynamicsectionatoffset0x9670contains21entries:
TagTypeName/Value
0x00000001(NEEDED)Sharedlibrary:
[libcrypt.so.1]
0x00000001(NEEDED)Sharedlibrary:
[libc.so.6]
0x0000000c(INIT)0x9c40
0x0000000d(FINI)0x10160
0x00000004(HASH)0x8128
0x00000005(STRTAB)0x9070
0x00000006(SYMTAB)0x85e0
0x0000000a(STRSZ)1430(bytes)
0x0000000b(SYMENT)16(bytes)
0x00000015(DEBUG)0x0
0x00000003(PLTGOT)0x19740
0x00000002(PLTRELSZ)1064(bytes)
0x00000014(PLTREL)REL
0x00000017(JMPREL)0x9818
0x00000011(REL)0x97c8
0x00000012(RELSZ)80(bytes)
0x00000013(RELENT)8(bytes)
0x6ffffffe(VERNEED)0x9758
0x6fffffff(VERNEEDNUM)2
0x6ffffff0(VERSYM)0x9606
0x00000000(NULL)0x0
创建创建帐号及密码文件:
[tekkamanninja@Tekkaman-Ninjatinylogin]$cd../../nfs/rootfs/etc/
[tekkamanninja@Tekkaman-Ninjaetc]$su
口令:
[root@Tekkaman-Ninjaetc]#cp/etc/passwd.;cp/etc/shadow.;cp/etc/group.
[root@Tekkaman-Ninjaetc]#kwritepasswd
root:
x:
0:
0:
root:
/root:
/bin/sh
[root@Tekkaman-Ninjaetc]#kwritegroup
root:
x:
0:
root
[root@Tekkaman-Ninjaetc]#kwriteshadow
root:
$1$N8K8eEQe$.XkJo3xcsjOE6vo1jW9Nk/:
13923:
0:
99999:
7:
:
:
[root@Tekkaman-Ninjaetc]#rm*~
rm:
是否删除普通文件“group~”?
y
rm:
是否删除普通文件“passwd~”?
y
rm:
是否删除普通文件“shadow~”?
y
[root@Tekkaman-Ninjaetc]#exit
exit
[tekkamanninja@Tekkaman-Ninjaetc]$
这3个文件是从Host中拷贝过来的,只留下root帐号。
那么现在root的登陆密码和Host的登陆口令一致了,可以登录后再修改以及创建新用户。
(若使用以上文件,则root密码为tekkaman)
拷贝必需的动态库文件[tekkamanninja@Tekkaman-Ninjalib]$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*.
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”
[tekkamanninja@Tekkaman-Ninjalib]$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.
[tekkamanninja@Tekkaman-Ninjalib]$cp/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/ar