嵌入式系统根文件系统制作.docx
《嵌入式系统根文件系统制作.docx》由会员分享,可在线阅读,更多相关《嵌入式系统根文件系统制作.docx(20页珍藏版)》请在冰点文库上搜索。
嵌入式系统根文件系统制作
嵌入式系统根文件系统制作(up-2410)
2012-05-0207:
17:
46| 分类:
嵌入式系统移植| 标签:
|字号大中小 订阅
一、主机环境
Linuxvm-dev2.6.9-42.ELRedHatEL4,VMWare6.0.3;
gccversion3.4.620060404(RedHat3.4.6-3)Threadmodel:
posixgccversion3.4.6
所需源文件:
busybox-1.12.2.tar.bz2;
1.1获取所需的源码包
cramfs-1.1.tar.gz(用来生成cramfs格式的文件系统映像)、yaffs2.tar.gz(用来生成yaffs2格式的文件系统映像)。
1.2解压源码包生成映像工具
依次解压三个源码包,然后进入cramfs-1.1目录,执行以下命令:
#apt-getinstallzlib1g-dev
#make
执行完成后就生成了mkcramfs工具,用来生成cramfs映像。
再进入yaffs2目录,执行以下命令:
#make
执行完成之后就在yaffs2目录下的utils目录生成了mkyaffsimage(最大支持512B页)和mkyaffs2image(最大支持2KB页,并向前兼容)两个工具,这两个工具用来生成yaffs映像。
二、用Busybox创建文件系统
前提是:
通过samba服务器把源码包 busybox-1.12.2.tar.bz2拷贝到了虚拟机的/home/uptech目录
1、解压busybox-1.12.2.tar.bz2,路径为
[root@vm-dev2410-s]#pwd
/root/2410-s
[root@vm-dev2410-s]#mkdirrootfs
[root@vm-dev2410-s]#cdrootfs
[root@vm-devrootfs]#cp/mnt/hgfs/rootfs/busybox-1.12.0.tar.bz2./
[root@vm-devrootfs]#ls
busybox-1.12.0.tar.bz2
[root@vm-devrootfs]#tar-vxjfbusybox-1.12.2.tar.bz2
[root@vm-devrootfs]#cdbusybox-1.12.2
[root@vm-devbusybox-1.12.2]#pwd
/root/2410-s/rootfs/busybox-1.12.2
[root@vm-devbusybox-1.12.2]#viMakefile
[root@vm-devbusybox-1.12.2]#
修改Makefile中的ARCH和CROSS_COMPILE与本机的路径一致:
CROSS_COMPILE?
=arm-linux-
...
ARCH?
=arm
2、编译busybox。
先makemenuconfig,修改以下:
[root@vm-devbusybox-1.12.2]#makemenuconfig
BusyboxSettings--->
BuildOptions--->
[*]BuildBusyBoxasastaticbinary(nosharedlibs)
//直接编译成静态库,省事点
(/opt/crosstools/gcc-3.4.6-glibc-2.3.6/bin/arm-linux-)CrossCompilerprefix
//这里和Makefile里保持一致,应该写一处就行了
InstallationOptions--->
[]Don'tuse/usr
//使用usr目录
BusyboxLibraryTuning--->
[*]Fancyshellprompts
//一定要选上,否则很多转意字符无法识别
Shells--->
Chooseyourdefaultshell(ash)--->
//这里选择shell为ash,应该是默认选中的
---ash
//把ash这档的选项全部选上
MiscellaneousUtilities--->
[]inotifyd
//不选
LinuxModuleUtilities--->
[]Simplifiedmodutils//不选
[]depmod
[*]insmod
[]Moduleversionchecking(NEW)
[]Addmodulesymbolstokernelsymboltable(NEW)
[]Inkernelmemoryoptimization(uClinuxonly)(NEW)
[]Enableloadmap(-m)option(NEW)
[*]rmmod
[*]lsmod
保存退出,直接make,makeinstall。
可以看到如下目录
[root@vm-devbusybox-1.12.2]#ls_install/
binlinuxrcsbinusr
[root@vm-devbusybox-1.12.2]#
3、用shell脚本创建根文件系统的目录结构,并在想要建立根文件系统的地方运行此脚本。
我是用root用户登陆的,直接创建了设备节点。
[root@vm-devbusybox-1.12.2]#cd../
[root@vm-devrootfs]#pwd
/root/2410-s/rootfs
[root@vm-devrootfs]#mkdirroot_stand
[root@vm-devrootfs]#cdroot_stand
[root@vm-devroot_stand]pwd
/root/2410-s/rootfs/root_stand
[root@vm-devroot_stand]#vibuild_fs.sh
#!
/bin/sh
echo"makeingrootdir"
mkdirrootfs
cdrootfs
echo"makeingdir:
bindevetclibprocsbinsysusr"
mkdirbindevetclibprocsbinsysusr#8dirs
mkdirusr/binusr/libusr/sbinlib/modules
#Don'tusemknod,unlessyourunthisScriptas
mknod-m600dev/consolec51
mknod-m666dev/nullc13
echo"makingdir:
mnttmpvar"
mkdirmnttmpvar
chmod777tmp
mkdirmnt/etcmnt/jiffs2mnt/yaffsmnt/datamnt/temp
mkdirvar/libvar/lockvar/logvar/runvar/tmp
chmod777var/tmp
echo"makingdir:
homerootboot"
mkdirhomerootboot
echo"done"
[root@vm-devroot_stand]#
执行这个sh:
[root@vm-devroot_stand]#shbuild_fs.sh
makeingrootdir
makeingdir:
bindevetclibprocsbinsysusr
makingdir:
mnttmpvar
makingdir:
homerootboot
done
创建出一个主文件夹rootfs,里面有一批文件目录:
[root@vm-devroot_stand]#cdrootfs/
[root@vm-devrootfs]#ls
binbootdevetchomelibmntprocrootsbinsystmpusrvar
[root@vm-devrootfs]#
4、把busybox源码目录下的etc的内容拷贝到这里的etc下
[root@vm-devrootfs]#cdetc/
[root@vm-devetc]#ls
[root@vm-devetc]#cp-a/root/2410-s/rootfs/busybox-1.12.2/examples/bootfloppy/etc/*./
[root@vm-devetc]#ls
fstabinit.dinittabprofile
[root@vm-devetc]#
5、修改拷贝过来的profile文件
[root@vm-devetc]#viprofile
#/etc/profile:
system-wide.profilefilefortheBourneshells
echo"Processing/etc/profile"
#no-op
#Setsearchlibrarypath
echo"Setsearchlibrarypath"
exportLD_LIBRARY_PATH=/lib:
/usr/lib
#Setuserpath
echo"Setuserpath"
PATH=/bin:
/sbin:
/usr/bin:
/usr/sbin
exportPATH
#SetPS1
echo"SetPS1"
HOSTNAME=`/bin/hostname`
#此处让shell提示符显示host名称的。
是`,不是’,要注意
#会在进入根系统后显示Jacky
exportPS1="\\e[32m[$USER@$HOSTNAME\\w\\a]\\$\\e[00;37m"
#此处\\e[32m是让后面的“[$USER@$HOSTNAME\\w\\a]”显示为绿色
#\\e[00是关闭效果
#\\e[05是闪烁
#37m是让后面的显示为白色
#多个命令可以;号隔开
echo"Alldone!
"
echo
6、修改初始化文件inittab和fstab
Inittab
[root@vm-devetc]#viinittab
:
:
sysinit:
/etc/init.d/rcS
:
:
respawn:
-/bin/sh
:
:
restart:
/sbin/init
tty2:
:
askfirst:
-/bin/sh
:
:
ctrlaltdel:
/bin/umount-a-r
:
:
shutdown:
/bin/umount-a-r
:
:
shutdown:
/sbin/swapoff–a
Fstab
[root@vm-devetc]#vimfstab
none/procprocdefaults00
none/dev/ptsdevptsmode=062200
tmpfs/dev/shmtmpfsdefaults00
/dev/mtdblock3/rootyaffsdefaults11
none/syssysfsdefaults00
tmpfs/tmptmpfsdefaults00
7、修改初始化的脚本文件init.d/rcS
[root@vm-devetc]#viinit.d/rcS
#!
/bin/sh
echo"Processingetc/init.d/rc.S"
#hostname${HOSTNAME}
hostnameup-tech
/bin/mount-tprocnone/proc
/bin/mount-tsysfsnone/sys
/bin/mount-ttmpfs-omode=0755none/dev
/bin/mkdir/dev/pts
/bin/mkdir/dev/shm
echo"Startmdev...."
/bin/echo/sbin/mdev>proc/sys/kernel/hotplug
mdev-s
echo"Mountall"
/bin/mount-a
echo-n"Settingupinterfacelo:
"
ifconfigloup127.0.0.1
echo-n"Settingupinterfaceeth0:
"
ifconfigeth0up192.168.1.193
echo"****************************************************"
echo"rootfsfors3c2410"
echo"Createdbylyj_uptech@2008.11.28"
echo"GoodLuck"
echo"www.up-"
echo"****************************************************"
echo
8、创建一个空的mdev.conf文件,在挂载根文件系统时会用到的(到这儿)
[root@vm-devetc]#touchmdev.conf
9、从本机拷贝passwd、shadow、group文件。
[root@vm-devetc]#cp/etc/passwd.
[root@vm-devetc]#cp/etc/shadow.
[root@vm-devetc]#cp/etc/group.
修改passwd文件,把第一行和最后一行的bash修改成ash。
10、把busybox默认安装目录中的文件全部复制到这里的rootfs中。
会发现多了linuxrc->bin/busybox文件,这是挂载文件系统需要执行的。
[root@vm-devetc]#cd..
[root@vm-devrootfs]#cp-rfv/root/2410-s/rootfs/busybox-1.12.2/_install/*./
OK,以上用busybox创建了一个基本的文件系统。
PS:
如果编译busybox时选择动态库方式编译,则需要查看生成的busybox使用哪些动态库,然后把它们拷贝到rootfs/lib目录下。
[root@vm-devlib]#arm-linux-readelf-d../bin/busybox
Dynamicsectionatoffset0xc1014contains21entries:
TagTypeName/Value
0x00000001(NEEDED)Sharedlibrary:
[libm.so.6]
0x00000001(NEEDED)Sharedlibrary:
[libc.so.6]
0x0000000c(INIT)0xc2ec
0x0000000d(FINI)0xa96b8
0x00000004(HASH)0x80e8
0x00000005(STRTAB)0xa4c4
0x00000006(SYMTAB)0x8b64
0x0000000a(STRSZ)3505(bytes)
0x0000000b(SYMENT)16(bytes)
0x00000015(DEBUG)0x0
0x00000003(PLTGOT)0xd10e4
0x00000002(PLTRELSZ)3112(bytes)
0x00000014(PLTREL)REL
0x00000017(JMPREL)0xb6c4
0x00000011(REL)0xb674
0x00000012(RELSZ)80(bytes)
0x00000013(RELENT)8(bytes)
0x6ffffffe(VERNEED)0xb5a4
0x6fffffff(VERNEEDNUM)2
0x6ffffff0(VERSYM)0xb276
0x00000000(NULL)0x0
可以看出,使用了libm.so.6和libc.so.6两个库。
发现只拷贝这两个库还不够,还需要ld-linux.so.2和libgcc_s.so.1,也就是我编译出来的这个busybox需要4个动态库文件。
#cp/opt/crosstools/gcc-3.4.6-glibc-2.3.6/lib/libm.so.6.
#cp/opt/crosstools/gcc-3.4.6-glibc-2.3.6/lib/libc.so.6.
#cp/opt/crosstools/gcc-3.4.6-glibc-2.3.6/lib/ld-linux.so.2.
#cp/opt/crosstools/gcc-3.4.6-glibc-2.3.6/lib/libgcc_s.so.1.
这样,使用动态库可以节省一半左右的空间,不过效率有所降低。
11.由于以后的实验程序会依赖一些库文件,为了方便,我们预先将用到的库文件拷贝到lib目录下(可拷贝光盘中提供的lib.tar.bz2目录),如下所示:
[root@vm-devrootfs]#cd../
[root@vm-devroot_stand]#cp/mnt/hgfs/rootfs/lib.tar.bz2./
[root@vm-devroot_stand]#tarjxvflib.tar.bz2
[root@vm-devroot_stand]#cdrootfs/lib
[root@vm-devlib]#cp../../lib/*-a-rf./
12.制作cramfs的文件系统
[root@vm-devlib]#cd../../
[root@vm-devroot_stand]#ls
build.shliblib.tar.bz2rootfs
进入cramfs-1.1目录
[root@vm-devroot_stand]#./mkcramfsrootfs/../root.cramfs
[root@vm-devroot_stand2]#cproot.cramfs/tftpboot
三、测试
注意:
前提是已烧写好uboot和内核镜像
烧写文件系统
1. 开启windows的tftp服务器,设置环境变量,保证开发板和windows在同一网段及开发板的tftp服务器的IP为windows的IP。
[up-class2410#]setenvserverip192.168.1.126
[up-class2410#]setenvipaddr192.168.1.129
[up-class2410#]saveenv
SavingEnvironmenttoNAND...
ErasingNand...WritingtoNand...done
2.下载并烧写到nandflash文件系统对应的分区中
[up-class2410#]tftp0x30008000root.cramfs
[up-class2410#]nanderase0x2800000x400000
[up-class2410#]nandwrite0x300080000x2800000x300000
3.设置启动参数
[up-class2410#]setenvbootcmdnandread0x300080000x800000x200000\;bootm
此项是内核自动启动的参数,如果已设置就不用再重新设置
[up-class2410#]setenvbootargsroot=/dev/mtdblock2init=/linuxrcconsole=ttySAC0,115200
[up-class2410#]saveenv
SavingEnvironmenttoNAND...
ErasingNand...WritingtoNand...done
[up-class2410#]printenv
bootdelay=5
baudrate=115200
ethaddr=08:
00:
3e:
26:
0a:
5b
bootfile="uImage"
stdin=serial
stdout=serial
stderr=serial
filesize=26D000
fileaddr=30008000
netmask=255.255.255.0
ipaddr=192.168.1.129
serverip=192.168.1.126
bootcmd=nandread0x300080000x800000x200000;bootm
bootargs=root=/dev/mtdblock2init=/linuxrcconsole=ttySAC0,115200
Environmentsize:
332/16380bytes
4.重启开发板
[up-class2410#]reset
启动目标板,串口输出显示根文件系统已经加载成功:
U-Boot1.3.2(Nov272016-17:
43:
03)
DRAM:
64MB
Flash:
512kB
NAND:
64MiB
In:
serial
Out:
serial
Err:
serial
FoundDM9000ID:
90000a46ataddress10000000!
DM9000workin16buswidth
bd->bi_entaddr:
08:
00:
3e:
26:
0a:
5b
[eth_init]MAC:
8:
0:
3e:
26:
a:
5b:
Hitanykeytostopautoboot:
0
NANDread:
device0offset0x80000,size0x1b0000
1769472bytesread:
OK
##Bootingimageat30008000...
ImageName:
Linux-2.6.24.4
Created:
2016-11-277:
24:
11UTC
ImageType:
ARMLinuxKernelImage(uncompressed)