`
ggsonic
  • 浏览: 266722 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Scratchbox来开发嵌入式Linux

阅读更多
scratchbox介绍
Scratchbox is a configuration and compilation environment for building Linux software and entire Linux distributions. The basic idea of Scratchbox is to offer developers an environment that works and looks like the target environment before the target environment is available.


安装,配置scratchbox
这里使用源代码来安装scratchbox, 使用Ubuntu/Debian的用户可以直接使用apt来安装. 具体可参考Cross-Compiling tutorial with Scratchbox和Installing Scratchbox

ScratchBox组件
必选:
scratchbox-core : scratchbox环境, 常用工具及本地编译器.
scratchbox-libs   : scratchbox-core, devkits和toolchains所需的库.

可选:
scratchbox-devkit-debian     : 用于Debian包开发的环境和工具.
scratchbox-devkit-doctools  : 文档生成工具
scratchbox-devkit-perl          : 额外的perl模块.

工具链(可选)
scratchbox-toolchain-arm-gcc3.3-glibc2.3
scratchbox-toolchain-i686-gcc3.3-glibc2.3
scratchbox-toolchain-arm-gcc3.2-uclibc20040229
scratchbox-toolchain-i386-gcc3.2-uclibc20040229

到 Scratchbox download page 下载下面这些组件.scratchbox-core-1.0.5-i386.tar.gz
scratchbox-libs-1.0.5-i386.tar.gz
scratchbox-toolchain-arm-gcc3.4-glibc2.3-1.0.2-i386.tar.gz

将这些包解压 $ tar xvzf <package_name> -C ~/project/sb

ScratchBox默认是要安装到/scratchbox目录的. 但如果你的根目录空间不够, 可以这样:(我把它安装到我的~/project/sb目录中)
$ sudo ln -s ~/project/sb/scratchbox /scratchbox

注意, 前面的包解压后都位于scratchbox目录中, 不需要自己建立scratchbox目录. 可以在全部解压缩工作结束后建立符号连接.

配置scratchbox
1, 运行 $ sudo /scratchbox/run_me_first.sh
会提示你一些问题:
Do you want to use sudo mode? [yes/no] (no): no
选为yes会存在一些权限问题.
Give the name of the scratchbox group (sbox): sbox
sbox是默认的组.

2, 选择这两项之后, scratch重启, 并提示你添加用户:
Now you should add one or more users with /home/zp/project/sb/scratchbox/sbin/sbox_adduser
$ sudo /scratchbox/sbin/sbox_adduser zp
注意, 被添加的用户只能是本地主机上已有的用户(这里是zp)!
3, 运行 $ groups 命令, 如果你看到有sbox这个组, 那么你就可以使用scratchbox了. 如果
没看到, 你需要注销, 再登录.
完成了上面的步骤之后, 运行 $ df -h ,看看是不是多了关于scratchbox的文件系统?

卸载scratchbox
由于scratchbox将本机系统的某些目录挂载(运行mount命令看看挂载信息), 所以不能直接通过删除目录来卸载scratchbox. 应该按下面的方法:

1, 停止scratchbox:
$ sudo /scratchbox/sbin/sbox_ctl stop
2,再使用mount命令确定没有目录被挂载到scratchbox后再删除目录:
$ rm -r /scratchbox
在你删除全部目录之前, 最好将scratchbox的usrs目录中有用的资料拷贝到别处备份.
使用scratchbox
使用scratchbox有两类方法:
(1)不登录到scratchbox中, 直接使用它提供的交叉编译工具. 这是我们常见的交叉编译开发手段.
(2)登录到scratchbox, 如果登录到任何一台linux主机, 在scratchbox中进行开发. scratchbox就是一个完备的开发环境.
这里分别介绍使用scratchbox的两类方法

outside scratchbox
安装上scratchbox之后, 在/scratchbox/compilers/中有这样一个目录:
arm-linux-gcc3.4.cs-glibc2.3
它正是我们安装的gcc-3.4 + glibc2.3的交叉编译工具.
在该下层目录bin中的即是交叉编译工具.

利用scratchbox提供的工具编译hello,world:
$ /scratchbox/compilers/arm-linux-gcc3.4.cs-glibc2.3/bin/arm-linux-gcc \
> -Wall -o hello hello.c
$ file hello
看看,它生成的hello可执行文件与使用别的交叉编译工具所生成的并无二致.

这样,我们就可把生成的hello拿到目标系统中运行.

在Cross-Compiling tutorial with Scratchbox中的2.2节介绍了相关内容.

如果嫌输入完整的命令比较麻烦, 可以更改环境变量PATH, 把相应的目录放到PATH的开头.

inside scratchbox
Scratchbox是一个chrooted的交叉编译环境.登录它之前,先要添加用户.
(这在安装,配置scratchbox的过程中已经完成了)

1, 登录到scratchbox
运行$ /scratchbox/login登录到scratchbox,出现这样的命令行提示符: [sbox-: ~] >
第一次登录到sb, 需要配置target, 先看看下一节!

在该提示符后, 可以输入常用的shell命令.
eg. 运行 ls /, 我们会看到一些熟悉的目录. 不要以为这就是你原来的Linux系统中的目录, 实际上, 这些目录中有些根本就是空的. scratchbox就是一个完备的环境. 与原来的linux没多大关系!

scratchbox将本地主机的一些目录挂载到scratchbox中. 运行$ mount可以看到哪些目录被挂载.

但在scratchbox中, 是看不到本地主机的home目录的. 如何解决呢? --可以在scratchbox中建立一些符号连接来共享本地主机的目录, 比如在~/project/sb中, $ ln -s /scratchbox/users/zp/home/zp/app/ app-sb 这样往~/project/sbscratchbox-/app-sb/目录中添加的内容都能在scratchbox用户zp的home目录中的app目录中看到.

在scratchbox中进行开发之前, 我们还有一些准备工作要做: 设置target.

2, 配置target

正如文章开头的scratchbox组件列表所述, 它提供了用于debian的开发环境和一些可选的glibc, uClibc的开发链. 先前我们只使用了3个源码包,  现在再下载一些你觉得会有用的包, 解压到同一目录, 这样在配置target的过程中, 可以基于这些包配置不同的target: scratchbox可以配置不同的目标target用于开发.

在scratchbox中, 可以通过sb-menu图形配置工具来配置target, 也可以使用命令行sb-conf, sbrsh-conf来配置. 使用sb-menu比较方便. (sb-menu命令也可以用于选择另外一个target).

我现在针对手头的ARM9开发板来配置target.
arm9glibc: 使用glibc库; arm9uClibc: 使用uClibc库.

运行 > sb-menu 进入配置菜单.
关于建立target的详细配置步骤, 可参考Installing Scratchbox的第2.4节.

这里有一点要注意: 在 Selected devkits 中要选择cputransp配置模拟器. 选为qemu-arm.

QEMU是一个ARM指令集仿真器. scratchbox中提供了qemu和sbrsh两种仿真手段. 要使用qemu仿真, 需安装devkit-cputransp包!


这里使用一个简单的例子来演示在scratchbox中进行交叉编译的方法

(1)打开一个terminal, 进入~/project/sb/app-sb 目录. 这就是我在前面建立的符号连接, 它指向zp用户在scratchbox中的/home/zp/app目录. 我在里面写个hello, world程序.

(2)打开另一个terminal, 登录到scratchbox. 在/home/zp/app目录, 能看到hello, world的源代码. 现在编译它:
$ gcc -Wall -o hello hello.c
这里的gcc调用的是scratchbox中对应该target选择的tool-chain. 还记得我们配置target时选择的吗?
$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
$ ./hello
hello, world!
上面显示的结果实际上就是qemu模拟器上显示的结果.

怎么样? 在scratchbox中进行交叉开发是不是如同在本地主机上开发一样方便?


使用sbrsh进行开发
使用sbrsh应该算在上一节中"inside scratchbox"中的内容. 这里把它拿出来单独介绍.

Sbrsh is an alternative to QEMU for implementing the CPU-transparency feature of Scratchbox. It runs the configure scripts' test programs on a remote device with the CPU architecture used by the cross-compilation toolchain-typically the device that you are developing software for. Some build systems also benefit from it when they attempt to execute a target binary which is used to generate data files. Running programs on an actual target device is more reliable than emulating a specific device because emulators might not support all required features or there might not be an appropriate emulator available at all.

设置NFS

使用sbrsh需要将用户的home目录和target目录对目标系统可见, 通过NFS挂载来实现.

我使用的Ubuntu, 先前已经安装好了NFS服务. 关于设置NFS, 具体可参考本blog的这篇文章

要将home, target目录挂载到目标系统, 需修改/etc/exports配置文件. 将home和target对应的目录添加到其中:

/scratchbox/users/<USER>/targets/<TARGET><IP>(rw,all_squash,anonuid=<UID>,anongid=<GID>)
/scratchbox/users/<USER>/home<IP>(rw,all_squash,anonuid=<UID>,anongid=<GID>)

我用这样的配置:
/scratchbox/users/zp/target/hh-glibc 192.168.2.120(rw,async,all_squash,anonuid=1000,anongid=1000)

/scratchbox/users/zp/home 192.168.2.120(rw,async,all_squash,anonuid=1000,anongid=1000)

all_squash : 将所有的UID和GID映射到他们各自的匿名版本上.
anonuid     :  指定远程UID被映射到的uid
anongid     :   指定远程uid帐号被映射到的gid

运行 $ id zp, 可以知道uid = 1000, gid = 1000. 将1000分配给anonuid和anongid.
目标系统mount后, 相当以用户zp的权限登录.

更改了/etc/exports, 运行 $ sudo exportfs -r 更新
运行 $ sudo /etc/init.d/nfs-kernel-server restart 重启nfs服务

安装sbrsh
接着要在主机上安装sbrsh dameon, 并在目标系统上运行它.
分享到:
评论

相关推荐

    应用Scratchbox构建嵌入式Linux系统.pdf

    使用Scratchbox来构建嵌入式Linux系统具有以下优点:①运行于chroot的环境中,完全独立于主机,编译过程将与主机系统无关;②可以很容易的变换目标系统中的工具链;③根据Linux系统的目标运行环境对chroot后的系统...

    嵌入式Linux几大开发环境.pdf

    Scratchbox是一种为嵌入式Linux系统开发设计的跨平台编译环境。它提供了一个为交叉编译优化的虚拟环境,让开发者可以在一个隔离的环境中为不同目标架构编译软件,而不受宿主机系统的限制。Scratchbox特别适合需要为...

    应用Scratchbox构建基于CF卡的嵌入式linux系统.doc应用Scratchbox构建基于CF卡的嵌入式linux系统.doc

    本文将介绍一种使用Scratchbox工具来构建基于CF卡的嵌入式Linux系统的方法,以简化这一过程。 **Scratchbox工具介绍** Scratchbox是一个强大的交叉编译环境,它允许开发者在主机系统上创建和管理针对不同目标硬件...

    基于ARM的嵌入式Linux图形界面的研究与实现.pdf

    嵌入式Linux图形界面研究与实现 本文主要研究基于ARM的嵌入式Linux图形界面的设计和实现。通过裁剪定制在ARM9上构建一个基本的Linux系统,然后在此Linux系统上移植了X协议和一个小型的窗口管理器Matchbox,最后在此...

    几种Linux嵌入式开发环境的简单介绍

    Linux 嵌入式开发环境是开发者构建针对各种硬件平台的轻量级操作系统的重要工具。在选择合适的开发环境时,我们需要考虑系统资源的限制、性能优化需求以及软件包的可用性等因素。以下是对几种常见的Linux嵌入式开发...

    scratchbox

    Scratchbox是一个强大的开源交叉编译环境,特别适用于嵌入式系统开发,如Linux设备和移动设备。它允许开发者在主机系统上构建针对其他架构(如ARM)的应用程序,而无需在目标硬件上进行实际的编译过程。这极大地提高...

    几种Linux下嵌入式开发环境的简单介绍

    本文将简要介绍几种常见的 Linux 嵌入式开发环境,包括 emDebian、uClinux、buildroot、scratchbox 和 openEmbedded。 emDebian 是一个基于 Debian 的嵌入式系统开发环境,它提供了一些工具来协助完成从现有的系统...

    scratchbox-core-1.0.8-i386.tar.gz

    Scratchbox是一个开源的交叉编译环境,主要应用于嵌入式设备开发,特别是Linux系统。它的核心目标是简化软件构建过程,特别是在资源有限的硬件上。"scratchbox-core-1.0.8-i386.tar.gz" 文件是Scratchbox的一个特定...

    嵌入式系统/ARM技术中的Linux下嵌入式开发环境的简单介绍

    在这里把Linux下嵌入式开发环境简要总结一下,介绍给有需要的人,主要包括:  emDebian - http://emdebian.sourceforge.net  uCLinux - http://www.ucLinux.org  buildroot - http://buildroot.uclibc.org  ...

    scratchbox-toolchain-host-gcc-1.0.8-i386.tar.gz

    Scratchbox支持多种操作系统,包括Linux、FreeBSD等,并且能够处理复杂的依赖关系,简化了嵌入式系统开发的流程。 "scratchbox-toolchain-host-gcc-1.0.8-i386.tar.gz"这个名字中包含了几个关键信息。首先,"gcc"是...

    hildon英文开发书

    - **自动安装 Scratchbox**:Scratchbox 是一个嵌入式 Linux 构建环境。可以通过脚本自动安装。 - **手动安装 Scratchbox**:如果自动安装失败或遇到问题,则可以手动下载并安装 Scratchbox。 - **自动安装 Maemo ...

    tools.zip arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2

    标题中的"tools.zip arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2"表明这是一个用于Linux环境下的ARM架构开发工具集合,主要包含的是arm-linux-gcc 3.4.5版本的编译器,以及glibc 2.3.6动态链接库。这个压缩包可能是...

    Linux下嵌入式开发环境的简单介绍

    在这里把Linux下嵌入式开发环境简要总结一下,介绍给有需要的人,主要包括:  emDebian - https://emdebian.sourceforge.net  uCLinux - https://www.ucLinux.org  buildroot - https://buildroot.uclibc.org  ...

    交叉编译环境及其他开发工具

    交叉编译环境是嵌入式开发中的核心环节,它允许开发者在一台强大的主机(HOST)上编写、编译和构建适用于...理解和掌握交叉编译环境的搭建、工具链的使用以及文件传输方法,对于高效地开发和调试嵌入式系统至关重要。

    maemo 安装手册

    Maemo是一个基于Debian Linux的开源嵌入式Linux操作系统,专为手持设备设计,尤其是诺基亚智能手机。Maemo支持多种应用和服务,能够为用户提供丰富的多媒体体验,并且具备高度定制化的能力。 #### 二、Maemo开发...

    Maemo_Diablo_Reference_Manual_for_maemo_4.1

    Maemo系统是基于Linux的一个嵌入式平台,专为手持设备设计,而Hildon则是Maemo上用于构建用户界面的应用程序框架。这份手册适用于希望在Maemo 4.1版本上开发应用的程序员,提供了从环境搭建到开发流程的全面指导。 ...

    基于ARM11的精简BootLoader的设计.pdf

    在开发环境中,通常会使用基于Ubuntu的Linux操作系统,配合ARM嵌入式交叉工具链(如GCC)、开发环境(如Scratchbox2)和通信工具(如Minicom、Kermit)进行BootLoader的编写和调试。 在ARM汇编编程中,有两个关键点...

    ARM11的精简BootLoader的设计

    软件开发环境基于Ubuntu-9.10 Linux操作系统,辅以ARM嵌入式交叉工具链、scratchbox2、minicom、kermit等软件开发工具包。这些工具共同构建了一个高效稳定的开发平台,有助于完成BootLoader的设计与测试工作。 ####...

Global site tag (gtag.js) - Google Analytics