构建基本的嵌入式Linux根文件系统.docx
- 文档编号:5510805
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:13
- 大小:25.83KB
构建基本的嵌入式Linux根文件系统.docx
《构建基本的嵌入式Linux根文件系统.docx》由会员分享,可在线阅读,更多相关《构建基本的嵌入式Linux根文件系统.docx(13页珍藏版)》请在冰豆网上搜索。
构建基本的嵌入式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 -m666 null c13;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 .profile file for theBourneshells
echo
echo "Processing/etc/profile..."
# no-op
# Set search librarypath
echo "Setsearchlibrarypathin/etc/profile"
export LD_LIBRARY_PATH=/lib:
/usr/lib
# Set userpath
echo "Setuserpathin/etc/profile"
PATH=/bin:
/sbin:
/usr/bin:
/usr/sbin
export PATH
# Set PS1
#注意:
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]$kwritefstab
proc /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/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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 构建 基本 嵌入式 Linux 文件系统