一、LTIB简介
LTIB(Linux Target Image Builder)工程是一个使用在不同的目标平台下,用于开发和部署BSP(Board Support Packages)的简单工具。使用该工具,用户能够为其目标平台开发符合GNU/Linux标准的映像。
LTIB支持PPC,ARM,Coldfire等多种目标架构。包含超过200个用户使用的工具包以及通用跨平台的根文件系统。LTIB支持bootloader和内核映像的构建。编译时可对交叉编译工具进行选择。支持RAMDISK和JFFS2 Flash映像的创建。
二、安装与卸载
2.1 得到BSP
从飞思卡尔官网下载MPC8308的BSP包。得到的BSP为bin文件:
MPC8308-RDB_BSP _ltib.bin。
也可购买freescale发行的开发板,如MPC8308ERDB,该开发板附送的光盘中就包含了MPC8308的BSP。里面有完整的软件包。
2.2安装说明
本次进行LTIB的安装是基于在ubuntu 操作系统。该系统安装在虚拟机中。除root 用户外,还有一个jun用户。而LTIB要求在安装以及后面的编译时不能是root用户权限(在编译时可以,但是不建议)。在安装之前需要把BSP进行挂载,这要求您具备root权限。
在安装LTIB之前,主机必须安装有以下的软件包,否则安装无法正常进行。如下:
| *package* | *version* | *comment* |
| perl | >= 5.6.1 | to run the ltib script |
| glibc | >= 2.2.x | to build/run host packages |
| glibc-headers | >= 2.2.x | to build/run host packages |
| glibc-devel | >= 2.2.x | to build/run host packages |
| binutils | >= 2.11.93 | to build host packages |
| libstdc++ | any? | to build rpm-fs host package |
| libstdc++-devel | any? | to build rpm-fs host package |
| gcc | >= 2.96 | to build host packages |
| gcc-c++ | >= 2.26 | to build rpm-fs host package |
| sudo | any | to run the 'rpm install' phase on each package |
| zlib | any | to build rpm-fs and mtd-utils host packages |
| zlib-devel | any | to build rpm-fs and mtd-utils host packages |
| rpm | any | to build initial rpm-fs host package |
| rpm-build | any | to build initial rpm-fs host package |
| wget | any | to download packages/patches on demand |
| ncurses | >= 5.1 | to build lkc (config language) host package |
| ncurses-devel | >= 5.1 | to build lkc (config language) host package |
| m4 | any? | may be needed by bison |
| bison | any | to build lkc (config language) host package |
| flex | any | Not required we install:for host lkc |
| texinfo | any | to build genext2fs host package (requires ncurses-deve|
| gettext | any | genext2fs target package |
| autoconf | >= 2.54 | Not required we install: automake target package |
| libtool | >= 1.4.2 | Not required we install: libusb target package |
根据您安装的操作系统的不同,和安装选项的不同,您可能需要安装部分软件包,在下一小节,您会看到一个简单的解决过程。
2.3 开始安装
本节开始讲解如何安装ltib,中途会涉及到一些依赖软件包的安装,这在安装工程中是很重要的。等安装完成后我们需要首先运行一次./ltib,该脚本在第一次运行时会安装公共主机站点的支持包,这可能需要花较长的时间。
之后,我们可以预先安装一些必备的软件包,以方便以后的开发应用。比如说tftp功能包的安装,如果您现在还没有安装的话,可以跟着3.3.2小节的步骤进行安装。当然,如果您不清楚自己是否已经安装过相关软件包,可以参考后面章节的相关测试说明进行软件安装检测。您也可以暂时不安装,等以后需要的时候再回过头来进行安装。
2.3.1 安装ltib
首先,挂载MPC8308-RDB_BSP_ltib.bin;
进入ubuntu,以root用户进行挂载(我在mnt目录创建了一个cdrom的文件夹): mount -o loop MPC8308-RDB_Linux_BSP_ ltib.bin /mnt/cdrom
进入/mnt/cdrom目录。以user用户执行./install进行安装。安装过程中需要接受最终用户许可协议,然后再提示的时候输入期望LTIB的安装目录。
这里我的安装目录为/freescale/PPC。该目录可以自己创建和修改。
安装完成后,在/freescale/PPC目录下出现了ltib-mpc8308erdb-20100413文件夹。该文件夹包含了MPC8308ERDB BSP的主要的LTIB脚本和说明文件。
运行./ltib时出现错误,原因是有些包没有安装。
解决方法如下(以下安装的包都是本系统为安装的,根据您自己操作系统对各种支持包的安装会有相应的提示,所以不限于以下的安装操作,仅能作一个参考):
# apt-get install rpm # apt-get install patch # apt-get install m4 # apt-get install bison # apt-get install zlib1g-dev # apt-get install build-essential # apt-get install libncurses5-dev |
由于安装 LTIB需要普通用户身份,但部分命令要超级用户权限才行,所以需要执行visudo增加。根据说明文档和网络资料,操作如下:
a) # /usr/sbin/visudo
b) 找到User privilege section,在下面输入
c) <username> ALL=NOPASSWD: /bin/rpm, /opt/freescale/ltib/usr/bin/rpm
d) Ctrl+X,然后选择Y,回车后保存退出
e) #exit //退出root身份,回到普通用户<username>身份。
注意:/usr/bin/rpm, /opt/freescale/ltib/usr/bin/rpm路径一定要完全一致!
以下是本笔记添加的范例:
jun ALL = NOPASSWD: /usr/bin/rpm, /opt/freescale/ltib/usr/bin/rpm
接着就可以运行./ltib了,运行完成后在/opt目录就会产生freescale目录及其子目录和相关文件。
2.3.2 安装开发所需的软件包
- 安装tftp相关服务:
# apt-get install tftp tftpd xinetd
接下来在/etc/xinetd.d/下建立一个配置文件tftp,增加内容如下:
service tftp socket_type = dgram } |
建立Ubuntu tftp服务文件目录(上传文件与下载文件的位置),并且更改其权限
#sudo mkdir /tftpboot |
重新启动服务
sudo /etc/init.d/xinetd restart
tftp的测试,可以通过put和 get进行测试。要get的文件必须在/tftpboot能够找到。put的文件,在/tftpboot里面必须有相同文件名的文件,不然上传不会成功。
# tftp 127.0.0.1 tftp> get <下载文件名> //下载文件 tftp> put <上传文件名> //上传文件 tftp>quit //退出 |
- 安装NFS服务器和端口映射
在Ubuntu环境下,按常规软件包的安装方法,在命令行中输入:
#sudo apt-get install portmap #sudo apt-get install nfs-kernel-server |
执行完上述操作,NFS的软件包就安装完成了,接下来进行相关的配置和启动。执行:
#sudo gedit /etc/exports
该文件是一些访问控制列表文件系统,它们可被挂载到NFS客户端,新增一行:
/home/<uid>/ltib/rootfs *(rw,no_root_squash)
这里,我的用户名为jun,目标板的主机名为Startway所以这样添加:
/home/jun/ltib/rootfs Startway(rw,no_root_squash)
格式:共享目录 [主机] [选项]
例:
/ charlie(ro) john(rw,no_root_squash)
/tmp pc*.col.com.tw(rw) 172.29.0.0/255.255.0.0(ro)
/pub (ro)
/pub/private (noaccess)
选项说明:
ro read only
rw read write
no_root_squash 信任客户端,对应 UID
noaccess 客户端不能使用
启动及结束 NFS 的服务:
设定档更改后,要重新启动 NFS的服务,启动及停止的方式如下:
# /etc/rc.d/init.d/nfs [ start | stop | restart | reload ]
start 启动 NFS 服务
stop 停止 NFS 服务
restart 停止并重新启动 NFS服务
reload 重新载入 NFS设定值
启动NFS服务:
#sudo start portmap #sudo /etc/init.d/nfs-kernel-server restart |
至此,配置和启动就结束了,我们可以这样测试nfs是否配置成功,下面是将/home/jun/ltib/rootfs目录挂载到/mnt上,挂载成功后进行查看并卸载。
# mount –o nolock –t nfs 127.0.0.1:/home/jun/ltib/rootfs /mnt # ls /mnt # umount /mnt |
至于为什么要这样配置,请参考开发一节,里面有详细的说明,在此不累述。
2.4 运行LTIB
改变当前目录至上一部步中解压的目录,在这里输入如下命令:
#cd /freescale/PPC/ltib-mpc8308erdb-20100413
第一次运行可能需要一段比较长的时间,因为有许多主机包需要编译和安装以便支持ltib。等主机包安装完成后,会出现一个蓝色的屏幕(同内核的menuconfig相似),在这里,您可以选择希望的平台。
对于LTIB,目标镜像被放在子目录’rootfs’目录下,该目录需要被NFS输出,并且用于您选择目标的根文件系统。
在编译的时候,Host_config.log将记录整个过程,如果出现错误可以查看详细情况。
除此之外,我们可以运行./ltib --configure来改变目标镜像配置。执行该命令同样会弹出蓝色的板子配置屏幕,您可以选择适当的包,当您退出配置屏幕时,目标镜像将安装您的配置进行调整。关于它的详细介绍放在在下节进行。
若想使用powerpc-linux-gcc自动补全功能,需# vi /etc/bashrc,在最后添加一句:export PATH=/opt/freescale/usr/local/gcc-3.4.3-uClibc-0.9.28-1/powerpc-linux /bin:#PATH
最后重启后,可用
# echo #PATH
来查看环境变量中是否有/opt/mtwk/usr/local/powerpc-linux/gcc-3.4.3-glibc-2.3.3 /bin路径变量。
2.5 LTIB 卸载
LTIB没有提供卸载脚本,如果要卸载LTIB,需要如下步骤:
a) 执行ltib –m distclean
b) 移除 /opt/freescale/pkgs
c) 移除opt/freescale/ltib
d) 移除安装路径下的/ltib。
LTIB 编译配置选项
根据说明文档,ltib 可以通过以下的命令配置:
* <verbatim># ./ltib</verbatim> 安装后第一次运行,采用默认配置
* <verbatim># ./ltib -m config</verbatim> 仅配置
* <verbatim># ./ltib --configure</verbatim> 配置和编译
执行./ltib是LTIB的默认配置,事实上可以通过./ltib –c 来配置编译选项。运行该命令,将出现一个蓝色的配置窗口,类似Linux中的menuconfig 命令效果。里面有很多的配置选项。以下将逐一进行介绍。
1. Choose the target C library type
该选项可对toolchain使用的C库进行配置。LTIB可支持glibc和uClibc两种C库
2. Choose your toolchain
该选项允许用户从一系列有效的toolchain中进行选择。该选择将改变CFLAGS。对每一个平台还可以包含一个用户可定制的toolchain。
3. Bootloader
该选项允许对bootloader的配置进行选择。
4. Choose your Kernel
该配置目录下的选项意义分别为:
Kernel-选项允许用户从一系列有效的内核进行选择。
Always rebuild the kernel-每次配置完成总是重新编译内核。
Configure the kernel-LTIB编译内核前将进入Linux内核配置窗口。
Include kernel headers-ltib将内核头文件编译进rootfs/usr/src/linux/include下。 (Errors appear when select this option)
Leave the sources after building kernel-该选项将解压后的内核源码包保留下来。
5. Package selection
选择用户使用的工具包,在其中还可以选中对busybox的配置。
6. Target System Configuration
对网络和系统服务做基本的配置。
7. Target Image Generation
对生成的根文件系统进行配置。
8. Load an Alternate Configuration File
加载一个现有的配置文件。
9. Save Configuration to an Alternate File
当前配置另存为一个文件。
如果想得到相关帮助,您可以在命令行输入:
# ./ltib --help
接下来会提供LTIB的命令格式,以及所有的命令简要,一些命令在后面有详细的说明,均是参照官方的说明文档,鉴于命令内容繁多,只详细说明了前几个命令,如果需要其他命令的使用方法和说明,请查阅官方文档LtibFaq。
如下:
ltib [-m <mode>] [options....]
举例: ./ltib -m prep -p helloworld //对helloworld文件包解压 输出目录为/../安装目录/ltib-mpc8313erdb-20070824/rpm/BUILD
下面给出LTIB的常用命令:
--mode | m
prep //解开源码包并打补丁
scbuild //解开源码包、打补丁然后编译
scinstall //解开源码包、打补丁,编译后安装
scdeploy //运行一个scinstall命令并安装到rootfs下
patchmerge //生成并且合并一个补丁 (需要与-p <pkg>一起使用)
clean //清除并且反安装目标源码包
distclean //完全清除,移除相关的所有东西
listpkgs //列出源码包(按字母排序)
release //制作一个二进制发布iso镜像
config //使用--configure命令,仅做配置
shell //进入ltib命令行模式
--pkg|p : //仅操作指定源码包
--configure|c : //运行交互式配置
--preconfig : //配置文件来源
--profile : //profile文件。这个被用来选择用户空间源码包集合(例如
config/profiles/max.config)
--rcfile|r : //使用这个资源文件
--batch|b : //批处理模式,假定对所有的问题回答yes
--force|f : //强迫重新编译链接即使已经更新到最新
--reinstall|e : //重新安装rpm包
--nodeps|n : //关闭安装和反安装依赖关系检查
--conflicts|k : //不强迫安装有文件冲突的rpm包
--keepsrpms|s : //保留srpms 在编译链接之后 (缺省是删除的)
--verbose|v : //更多的输出
--dry-run|d : //只运行不打印 (仅输出echo消息)
--continue|C : //在源码包编译链接过程中出错也继续进行
--version|V : //打印应用程序版本并退出
--noredir|N : //不重定向到任何输出
--deploy|D : //运行部署脚本即使已经更新
--dlonly : //仅下载源码包
--dltest : //测试BSP的源码包是否有效
--leavesrc|l : //留下不解压的源码包 ( 仅在pkg模式下使用)
--hostcf : //重新配置编译链接安装主机支持的源码包集
--help|h : //使用帮助
运行 #./litb 将执行以下任务:
1 安装公共主机站点支持包(仅在第一次)
2 提示用户为目标平台(仅在第一次和git)
3 进入主要平台配置菜单(仅在第一次)。
初始状态是默认配置为这个平台, 对于大多数用户来说,通常是很好的。
4 编译/安装包的选择要求
带平台的配置菜单。退出配置菜单后ltib不继续编译包。
带平台的配置菜单。退出配置菜单后 ltib 编译/安装 选择的包。
为目标卸载所有的rpm包。可以有效的移除rootfs目录。
注意:
如果您使用NFS挂载这个目录到您的目标上,可能会有文件遗留在rootfs目录。
它不会删除二进制rmp文件,所以如果您重新运行没有任何更改的ltib,它将重新安装当前选择的二进制rmp。
这种模式是用来完全移除所有当前的ltib项目的文件,它并没有删除共享公共区域的任何文件。
这种模式通常使用git版本,这样您就能回到目标平台的选择屏幕并且编译一个不同的目标。
封装当前的LTIB项目为一个iso镜像,不需要网络访问。
默认情况下,只有在config/platform/host/ltib_preconfig和
config/platform/#PLATFORM/defconfig中使能的包会被包含进BSP ISO 的pkgs目录。
它的子命令在此不做介绍,可以查看帮助文档了解。
LTIB 中的包
在配置ltib之前,您可以在一个ltib配置文件上运行bin/listpkgs 。例如,对于mpc8548cds,您可以运行:
# bin/listpkgs config/platform/mpc8548cds/deconfig
这将列出所有可以选择的的包。那些在“Enable”列有一个‘y’将默认编译/安装。
如果您已经配置ltib,您可以得到更精确的(具体)清单通过运行:
# ./ltib -m listpkgs
只选择那些被使能,管道的软件包(y和单引号之间有个空格):
# ./ltib -m listpkgs | grep ' y '
使用[[#OptionListpkgs][-m listpkgs]] option
使用[[#OptionConfigure][--configure]] option
使用[[#OptionConfig][-m config]] option
# ./ltib -p <package_name>
注意1:当用’-p’指定一个软件包,它将被强制编译,即使它是最新的。
注意2:如果依赖包没有安装,那么编译/安装将失败。
默认情况下,rmp将在一个步骤里解压,配置,编译,安装和删除所有来源。这是一个经过充分考虑的特性来确保一个软件包被完全重编译。
显然,如果您正工作于一个包,这个方案是没有帮助的,为了促进这种开发过程,rpm提供short-circuited 编译/安装 的概念。
工作过程的例子
1、 解压源码并应用所有当前补丁
# ./ltib -m prep -p <package>
例如解压uboot 源码,可以使用 # ./ltib –m prep –p u-boot
2、 在“rpm/BUILD/package”下编辑/添加 文件。
3、 编译您改变的软件包。
# ./ltib -m scbuild -p <package>
4、 一旦软件包编译成功,检查安装状态。
# ./ltib -m scinstall -p <package>
5、 提交更改之前测试您的软件包
# ./ltib -m scdeploy -p <package>
6、 重复步骤2 ——> 5直到得到您满意的结果。
7、 生成一个补丁同时更新spec文件(dist/lsf/下)
# ./ltib -m patchmerge -p <package>
8、 手动清理补丁文件(根据需要)
9、 从头编译和安装
# ./ltib -p <package>
怎样添加一个全新的包到我们的根文件系统呢,下面将进行介绍。
第一种是:有一个现有的想使用的srpm。
1、 导入srpm。这将把素材放在rpm子目录下。
# ./ltib –m addsrpms <path_of_the_sprm_to_import>
2、 按要求修改spec 文件(参看dist.lfs-5.1/template/template.spec 的例子)。
3、 确定软件包编译:
# ./ltib –m scbuild –p <new_package>
4、 按需修改rpm/BUILD/new_package目录下的源文件。
5、 生成并合并一个补丁来封装您的改变:
# ./ltib –m patchmerge –p <new_package>
6、 手动清除补丁文件(根据需要)
7、 重头编译和安装
# ./ltib –p <new_package>-x.y
8、 保存您的改变:
a). 将spec文件从临时区域移到一个永久区域并且检查git存储库,例如:
#mkdir dist/lfs-5.1/new_package
#mv rpm/SPECS/new_package.spec dist/lfs-5.1/new_package/
#cd dist/lfs-5.1/new_package
#git add new_package.spec
#git commit -a -m "added new_package"
b). 拷贝源文件到您的LPP(Local Package Pool)
# rsync -vptgo --ignore-existing rpm/SOURCES/* /opt/freescale/pkgs/
c). 现在您需要上传您的源码/补丁 到PPP。
第二种: 没有现成的包,并且希望创建一个全新的包。可以按如下方法进行操作:
1、 首先清理您的源文件(删除所有的.o, .a, .so 后缀的生成文件)然后制作一个”tarball”,例如:
# cd <my_new_package>-x.y
# make clean
# cd ..
# tar zcvf <my_new_package>-x.y.tar.gz <my_new_package>-x.y
2、 移动这个tarball 到 LPP 以便 ‘ltib’能够找到它。
# mv <my_new_package>-x.y.tar.gz /opt/freescale/pkgs/
3、 使用现有的模板创建一个specfile
# mkdir dist/lfs-5.1/<my_new_package>
# cp dist/lfs-5.1/template/template.spec
dist/lfs-5.1/<my_new_package>/<my_new_package>.spec
4、 编辑固定模板来反映您的包,这个文件可能做如下改变(这部分的例子可以参看‘编译新的U-Boot’和‘编译新的Linux内核’等章节):
| *Field* | *Description* |
| Summary | put in a summary of what the package is/does |
| Name | put in the name of the packge (usually from the tarball name) |
| Version | put in the version (usually from the tarball/directory |
| Release | start at 1 and rev each time you change the spec file |
| License | e.g GPL/LGPL/BSD, look this up in the package's files |
| Group | If this exists on an rpm based machine, copy from rpm -qi <package> <br> If not, choose something from /usr/share/doc/rpm-<version>/GROUPS |
| %Build | often you'll need to add *--host=#CFGHOST --build=%{_build}* to the configure clause |
5、 解压新软件包源码
# ./ltib -m prep -p <my_new_package>
6、 编译您改变的新的软件包
# ./ltib -m scbuild -p <my_new_package>
7、 一旦新软件包编译完成,检查安装状态
# ./ltib -m scinstall -p <my_new_package>
8、 在提交改变之前,如果您想测试您的软件包,可以执行下面的操作
# ./ltib -m scdeploy -p <my_new_package>
9、 一旦您满意新包,提交更新的spec文件。
# git add .
# git commit -a -m "added new_package"
10、 通过http://auslxsc01.mtwk.freescale.net/ltib/index.html. 上传新包包含的源码和补丁到PPP。
注意:
只有批准文件可以释放BSP,所以请遵循流程
1、如果你想与其他人分享,上传文件到PPP
2、检查脚本的运行,那么您将得到twiki之类的页面链接到你的文件
3、发送请求的电子邮件,其中包括twiki之类的页面链接进行审查
4.3.8 如何介绍新软件包来配置系统(略)
这一节再此处省略,您可以参见LtibFaq 文件 的1439行(或者搜索关键字How do I introduce my new package to the config system来查找)
软件包的源码在什么地方呢?
如果本地公共缓存区不可用,它们被下载和缓存到一个公共区域。如果您使用的是一个ISO镜像,它们将被预安装进本地公共缓存。
我们能从哪儿得到这些源码呢?主系统使用的是GPP/LPP/PPP。首先我们了解一下什么是LPP/GPP/PPP。
PPP(Private Package Pool),它可以有选择的使用一个存储区域用于私有源码和补丁来私有的访问http服务器。
GPP(Global Package Pool)是一个公共可用的http服务器,被用于为LTIB存储源码和补丁。
LPP(Local Package Pool)是一个本地公共缓存,被用于存储所有源码和补丁。
当ltib 需要编译rpms 时,包的spec文件被解析,解析后,编译器有一个源码和补丁的列表,这个列表在编译包的时候被用到。接着,编译器将顺序完成如下的工作:
1)检查file/symlink(不带任何path/URL前缀)是否存在rpm/SPURCES目录,如果存在,则使用。否则,进行第二步。
2)检查file/symlink(不带任何path/URL前缀)是否存在于LPP目录,如果这个文件存在,一个symlink 被创建到rpm/SOURCE目录,并且链接使用。如果没有,进行第三步。
3)编译器尝试从PPP下载文件(如果被 *%ppp_url* tag in *.ltibrc* to the LPP using *wget*指定)。如果下载成功,一个symlink被创建到rpm/SOURCE,并且链接使用。如果下载失败则进行第四步。
4)编译器尝试从GPP下载文件(由*%gpp_url* tag in *.ltibrc* to the LPP using *wget*指定)。如果下载成功,一个symlink被创建到rpm/SOURCE,并且链接使用。如果下载失败则进行第五步。
5)如果上述步骤都失败了,编译器将给出失败错误信息。
注意:您可以输入您的代理服务器信息到”.ltibrc”源文件,如果您工作于公司VPN环境并且希望在英特网上的外部GPP得到源码,必须这样做。
根文件系统
您需要创建一个merge目录,这儿有2个选项:
1.顶层merge目录,适用于所有目标
2. 平台特定的merge目录
平台特定的merge目录会覆盖顶层的merge目录,也将覆盖rootfs中相应的文件。
例:您有一个git版本的LTIB,已经编译了tqm823l的默认配置,现在,您需要添加一个平台specific文件 /home/fred/myfile1;您想所有的平台可以编译使用您自己的/etc/hosts文件。下面给出如何完成的方法:
# cd <my_ltib_dir>
# mkdir -p config/platform/tqm823l/merge/home/fred
# cp <my_files>/myfile1 config/platform/tqm823l/merge/home/fred
# mkdir -p merge/etc
# cp <my_files>/hosts merge/etc
# ./ltib
第4,5步是加入一些配置到开发板如果不需要可以跳过。这个过程简单说就是建merge文件夹把要加的文件放到merge里执行./ltib。
您的merge文件夹中的文件将放置在rootfs相应的目录下。
系统为相同或不同的目标支持支持多个根文件系统。
如果你使用的是一个iso镜像,当安装脚本提示输入安装目录时,通过输入一个新目录名字安装您的ltib归档到不同的目录。
如果您使用git,克隆这个工程到不同的目录,例如:
# git clone git://git.am.freescale.net/git/ltib.git <directory>
如果目标体系结构与原来的一个不同,那么就需要一个不同的交叉编译器,如果当前没有该交叉编译器,它将被下载和安装在正确的位置。
设备节点与静态主要/次要编号可以被添加到ltib / bin / device_table.txt文件。该文件中自己描述了这种格式。
由于没有为device_tabl.txt的依赖项检查,添加一个新条目后,强制重新编译设备以确保新的/ dev节点存在于文件系统中:
# ./ltib -p dev -f
当执行完./ltib后,在安装目录下会生成以下几个镜像文件:
a) 根文件系统:
rootfs-文件夹,将要被部署到开发板上的根文件系统。用于NFS。
b) 引导文件
如果编译了bootloader,那么您可以在“rootfs/boot/”目录下找到,例如一些powerpc平台将产生以下的引导文件:
u-boot :elf版本的uboot,用于调试。
u-boot.bin :u-boot的二进制镜像,可以安装在flash里面。
c) 内核文件
如果编译了kernel,那么您可以在“rootfs/boot/”目录下找到,例如一些powerpc平台将产生以下的引导文件:
1 *vmlinux*:内核的elf镜像(如果编译适当可用于调试)
2 *uImage*: 可引导的内核镜像(名称取决于目标)
3 *System.map*: 编译内核的符号地址
4 *linux.config*: 用于内核编译的配置
rootfs.ext2.gz.uboot-能在开发板上使用的文件系统,可以被uboot识别。
rootfs/boot/uImage-uboot使用的内核映像。
在rootfs/boot/目录下包括如下文件:
u-boot, u-boot.bin,uImage(bootable_kernel),vmlinux,System.map, linux.config
LTIB原来的U-boot版本为u-boot-2009.11-rc1,本节的内容是移植最新的u-boot到ltib中。移植成功后可以在原来的uboot版本和现在的uboot版本中进行选择编译。本小节只讲述如何如何移植,u-boot本身的分析可以参考本人编著的《嵌入式开发应用笔记》。
从denx官网下载u-boot-2012.04-rc3(这时本笔记使用的版本,您也可以下载其他的希望移植的版本,此处仅是一个示例),这是当前最新的U-boot版本。之后开始移植工作,过程如下:
首先,将U-Boot源码包拷贝到/opt/freescale/pkgs目录下;
然后,新建u-boot-2012.04-rc3-mpc8308erdb.spec.in文件,也可以拷贝相似文件,在其基础上进行修改。之后增加如下内容(spec文件的格式在‘添加一个全新的包到根文件系统’一节中有简单介绍):
# template = u-boot-common.tmpl %define pfx /opt/freescale/rootfs/%{_target_cpu} %define dversion rc3 Summary : Universal Bootloader firmware Name : u-boot Version : 2012.04 Release : 1 License : GPL Vendor : Freescale Packager : lcjht@yahoo.com.cn Group : Applications/System URL : git://git.ap.freescale.net/scm/%{name}-mpc8315-jyt.git Source : %{name}-%{version}-%{dversion}.tar.bz2 BuildRoot : %{_tmppath}/%{name} Prefix : %{pfx} %Description %{summary} The source is taken from //ftp.denx.de/pub/u-boot and add in patches for MPC8308erdb. %Prep %setup -n %{name}-%{version}-%{dversion} |
修改完后,将其保存。然后修改mian.lkc文件,该文件所在目录为:
/freescale/PPC/ltib-mpc8308erdb-20100413/config/platform/mpc8308erdb
在comment “Bootloader”( mian.lkc文件中的内容,可以执行搜索找到)下添加对uboot的选择,简单的修改内容如下:
choice prompt "u-boot version" default VER_U_BOOT1 help This menu let you choose the u-boot version
config VER_U_BOOT1 bool "u-boot-2009.11-rc1-mpc8308erdb" config VER_U_BOOT2 bool "u-boot-2012.04-rc3-mpc8308erdb" endchoice
config PKG_U_BOOT string default "u-boot-2009.11-rc1-mpc8308erdb" if VER_U_BOOT1 default "u-boot-2012.04-rc3-mpc8308erdb" if VER_U_BOOT2 |
上面完成对新版本的选择菜单支持,接下来需要为该选项增加软件包的支持,修改内容(红色部分)如下:
config PKG_U_BOOT_CONFIG_TYPE string default "MPC8308ERDB_config" if PKG_U_BOOT_GENERAL && VER_U_BOOT1 default "MPC8308ERDB_NAND_config" if PKG_U_BOOT_NAND default "MPC8308ERDB_NAND_ECC_OFF_config" if PKG_U_BOOT_NAND_ECCOFF default "MPC8308ERDB_16bit_config" if PKG_U_BOOT_16BIT default "MPC8308RDB_config" if PKG_U_BOOT_GENERAL && VER_U_BOOT2 |
需要修改的地方已经全部完成了,接下来可以在配置菜单中选择所移植的新的U-Boot版本并编译它。
执行./ltib –m config选择新增的UBOOT包(该命令只配置不编译)。
配置完成之后,可以通过执行./ltib -m listpkgs | grep ' y ' (注意y与单引号之间有空格)查看是否修改成功。可以看到选择的u-boot包已经变成了我们新增的包。
对比:
最后,执行./ltib 完成编译。
让内核/根文件系统 运行在目标板上
怎样让内核和根文件系统运行在目标板上呢,最常见的方法是使用tftp下载内核到目标板上,然后通过适当的参数引导内核来挂载根文件系统(通过主机使用NFS)。
我们介绍一些需要执行的典型的步骤(需要root权限):
1. 选择一个在您的网络上未被使用的IP地址分配给您的目标。同时您需要确保您在配置ltib时,根文件系统可以使用该IP地址。目标甚至可以启用DHCP来得到IP。但是如果您在ltib配置时选择了DHCP和NFS部署,它实际上将绕过eth设备的设置,而且依赖于当前设置的内核启动参数。
2. 记住您主机的IP地址。例如,我们假设以下的参数:
目标IP地址: 192.168.0.254
主机地址:192.168.0.204
根文件系统位置:~/ltib(根据下载的BSP包可能不同,但是大多是以它为前缀)/rootfs
3. 创建一个链接,从/tftpboot目录到根文件系统:
# ln –s ~/ltib/rootfs /tftpboot/192.168.0.254
4. 确保您已经在您的系统上安装了NFS服务器和端口映射(若未安装可参考安装一节)。
5. 导出目录,通过编辑‘/etc/exports’,增加条目:
/home/<uid>/ltib/rootfs *(rw,no_root_squash)
注意:这个例子将关闭该目录下所有的安全性!任何主机都可以访问此导出的目录。可以通过 ”man exports”查看更多的信息。
6. 重启NFS(该目录仍在rootfs目录下):
# sh /etc/rc.d/init.d/nfs restart
大多数的bootloader加载内核的网络连接使用tftp协议。所以您的目标的bootloader可以处理已经编译的内核,您必须确保在主机上有一个tftp的守护进程。这里您可以做一些检查,如下:
1、检查tftp服务器程序出现在您的系统中。使用下面的命令检查,如果它没有出现,您可能需要安装tftp-server包。
# ls /usr/sbin/in.tftpd /usr/sbin/in.tftpd
|
2、检查inetd是否设置运行tftp服务,可以通过运行如下命令检查。您的输出可能类似这样:
# netstat –a | grep tftp udp 0 0 *:tftp *:*
|
如果这儿没有输出,可以在下面文件中进行修改,使它使能:
/etc/xinetd.d/tftp
In my copy I note the following line:
disable = no
3、如果您的主机有防火墙,请确保它不会阻塞来自于目标的包的传入。所以,建议关闭防火墙。
一般tftp服务器配置为“chroot”到这个目录。
/tftpserver</tftpserver>
这意味着您需要拷贝您的内核到这个目录或者其下的子目录。在我们的示例中,我们做如下操作:
# cp rootfs/boot/uImage /tftpboot
上句命令包含这些信息:/tftpboot是我们前面设置好的tftp服务器目录,该目录可在/etc/xinetd.d/tftp文件中修改;rootfs/boot/uImage 是LTIB生成的可引导的内核文件;命令的目的是将内核文件拷贝到tftp的服务器目录,方便后面进行tftp下载内核镜像。
5.2.4使用导出RFS为您的内核设置bootloader参数
这个例子显示的是一个系统(参数为前一节中的设置)使用uboot / ppcboot:
设置网络参数。在ppcboot的提示:
= >setenv ipaddr 192.168.0.254
= > setenv serverip 192.168.0.204
= > setenv bootargs root = /dev/nfs nfsaddrs = 192.168.0.254:192.168.0.204
=> tftp 100000 vmlinux.gz.uboot
.........
=> bootm 100000
====