LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1646|回复: 8

[原创] 用 sbox2 为受限环境从源码构建 GNU/Linux 系统

[复制链接]
发表于 2009-3-16 23:47:53 | 显示全部楼层 |阅读模式
受限环境:这里特指没有编译能力或编译能力较弱的目标平台。
嵌入式环境:取决于您怎么定义嵌入式,范围相对受限环境就有些不明确了。


传统方法
包括 CLFS、HLFS、LFS、本人的类 CLFS-Sysroot 方式共同点是:尽快以 boot、chroot 方式脱离宿主环境,完成系统自举,之后进入新系统本地编译扩展新系统。

受限环境传统方法(如果您愿意这些系统也可用于非受限环境)
包括 CLFS-Sysroot、CLFS-embedded 等 共同点是:不脱离宿主环境,给源码打补丁、设置特殊的配置参数、交叉编译完成整个系统。

本方法
沿用 本人的类 CLFS-Sysroot 方式,建立交叉编译工具链,建立临时系统,然后 利用 sbox2 伪本地编译 基本系统、之后 继续利用 sbox2 拓展系统。


本方法传统方法 区别:不脱离宿主环境。
本方法受限环境传统方法 区别:不必给源码打补丁、不必设置特殊的配置参数。
sbox2:被用于 Nokia N810/N800 maemo-sdk 开发环境。
伪本地编译:
这是 sbox2 功能表现出的效果,您暂时可以想象成与在宿主本地编译一样,但使用的是交叉编译工具链。


简单的说,
以 sbox2 + qemu user mode 为例,
sbox2 利用宿主环境、交叉编译工具链、宿主上的目标系统 rootfs 在宿主中制造一种目标平台幻象
幻象中,
宿主 本地编译工具链路径 被影射到 交叉编译工具链,本地编译工具链事实上被屏蔽无法访问,
  1. sbox2 ./configure --prefix=/usr
  2. sbox2 make
  3. sbox2 -eR make install
复制代码
配置源码时,头文件、库路径 路径被转换到 宿主上的目标系统 rootfs,
编译时,事实上使用的是交叉编译工具链、目标系统 头文件、目标系统 库文件,
安装时,把路径 影射到 宿主上的目标系统 rootfs。


用本方法构建的系统纯净度:
交叉编译工具链纯度无问题,
临时系统纯度无问题,
基本系统 和 之后的拓展 仍在宿主环境中进行,由 sbox2 保证不引用宿主头文件、库文件,
只要小心操作,系统纯净度有保证。
 楼主| 发表于 2009-3-17 00:08:35 | 显示全部楼层

一、sbox2 + qemu + fakeroot 安装

[color="Red"]永远不要以 root 权限运行 sbox2

sbox2运行时 依赖 qemu user mode 或 sbrsh,建议安装 fakeroot 软件包

这里为简单安装到 /usr,您也可以用非 root 权限的用户编译安装到用户目录。
  1. wget -c http://ftp.debian.org/debian/pool/main/f/fakeroot/fakeroot_1.11.tar.gz
  2. tar -xvf fakeroot_1.11.tar.gz
  3. cd fakeroot-1.11/
  4. ./configure --prefix=/usr
  5. make
  6. make install
复制代码

您可以根据自己的需要完全安装 或 仅安装特定的 qemu user mode 部分。
  1. wget -c http://download.savannah.gnu.org/releases/qemu/qemu-0.10.0.tar.gz
  2. tar -xvf qemu-0.10.0.tar.gz
  3. cd qemu-0.10.0/
  4. ./configure --prefix=/usr --audio-drv-list=alsa
  5. #./configure --prefix=/usr --audio-drv-list=alsa --target-list=arm-linux-user
  6. make
  7. make install
复制代码
  1. #wget -c http://cgit.freedesktop.org/sbox2/snapshot/sbox2-master.tar.bz2
  2. #tar -xvf sbox2-master.tar.bz2
  3. #cd sbox2-master
  4. wget -c http://people.freedesktop.org/~lle/sbox2-releases/sbox2-1.99.0.31.tar.bz2
  5. cd sbox2-1.99.0.31
  6. sed -i "s@sb2@sbox2@g" $(grep sb2 * -lr)
  7. sed -i "s@SB2@SBOX2@g" $(grep SB2 * -lr)
  8. for x in $(find . -name "*sb2*"); do
  9.         mv $x $(echo $x | sed "s@sb2@sbox2@g")
  10. done
  11. ./autogen.sh
  12. ./configure prefix=/usr
  13. make
  14. make install
  15. #sed -i "s@/usr/bin/basename@/bin/basename@" /usr/share/scratchbox2/scripts/sbox2-generate-locales
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-3-17 11:26:38 | 显示全部楼层
好贴留名~~~貌似未完待续。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-17 13:07:39 | 显示全部楼层

二、建立交叉编译工具链

sbox2 要求使用 sysroot 方式的 交叉编译工具链,至少目前是这样。

您可以直接使用 CLFS-Sysroot 或 CLFS-embedded 的方法构建工具链。
视您的目标平台,和使用的 libc 而定。

这里以 arm-unknown-linux-gnueabi 为目标平台,使用 [color="Blue"]本人的类 CLFS-Sysroot 方式 中的工具链构建方法。(在 地球发动机 的协助下,相对 CLFS-Sysroot 工具链,简化掉 glibc-header 步骤)

已有相关文档,具体步骤略。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-17 13:40:28 | 显示全部楼层

三、建立临时系统

sbox2 要求一个 HFS 兼容的 rootfs。

CLFS-Sysroot 方法交叉编译的基本系统满足要求。

[color="Blue"]本人的类 CLFS-Sysroot 方式 中的临时系统也满足要求,相对上面精减的多。

已有相关文档,具体步骤略。


或者您可以懒惰些,用下面的方式:
这里不需要建立一个有本地编译能力的 rootfs,所以不需要编译目标平台工具链部分,binutils、gcc 可以不安装;
[color="Red"]为了提供完整运行环境,需要复制 交叉编译工具链 目录下的 libgcc_s.so.* 到 rootfs 的 usr/lib/ 目录下。
这里是
  1. cp -a /arm-linux-gnu/tools/arm-unknown-linux-gnueabi/lib/libgcc_s.so* /arm-linux-gnu/rootfs/usr/lib/
复制代码

使用 uclibc 时,具体步骤需适当修改,临时系统使用的软件包可参考 HLFS uclibc 分支,交叉编译时使用的补丁可参考 buildroot 工具包。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-17 21:35:12 | 显示全部楼层

四、设置 sbox2 环境

完成步骤三后,普通用户 arm-linux-gnu 家目录下有如下目录结构:
/arm-linux-gnu/tools/
/arm-linux-gnu/tools/bin/arm-unknown-linux-gnueabi-* 交叉编译工具链
/arm-linux-gnu/rootfs/ 目标平台临时系统

再次强调:sbox2 可访问整个文件系统,绝不能以 root 身份运行,否则误操作可损坏宿主系统。
选择合适的用户运行 sbox2

选择1、把普通用户 arm-linux-gnu 的 shell 配置清理成一般普通用户状态。
交叉编译过程中的环境变量对 sbox2 有一些影响。
如果用的是 bash,可以这样
  1. $ mkdir -pv ~/.bak
  2. $ mv ~/.bash* ~/.bak
  3. $ cp -a /etc/skel/.[^.]* ~/
复制代码
退出之后,重登录。

选择2、可以建立一个与 普通用户 arm-linux-gnu 同 userid 的新用户,如 arm-box2,并以 arm-box2 身份登录。
  1. # useradd -m -o -d /home/arm-box2 -u $(id -u arm-linux-gnu) -g $(id -g arm-linux-gnu) -s /bin/bash arm-box2
复制代码

验证 qemu user mode 安装是否有效
运行下面命令
  1. $ qemu-arm -L /arm-linux-gnu/rootfs /arm-linux-gnu/rootfs/bin/uname -a
  2. Linux localhost 2.6.28.7 #1 SMP Thu Mar 5 00:36:51 CST 2009 [color=SeaGreen]armv5tel[/color] GNU/Linux
复制代码
看到类似上面的显示结果,表明 qemu user mode 安装有效。

请注意,如执行命令后,无输出,并且内存占用不断上升,请查找并删除 目标系统 rootfs /arm-linux-gnu/rootfs 下指向 根文件系统中目录的链接,这是一个 bug,之后再测试。

下面命令应可找到出问题的链接文件,请手工删除
  1. for x in $(find /arm-linux-gnu/rootfs -type l); do
  2.     [ ! -z $(ls -l $x | awk -F" " '{print $10}' | grep "^/") ] && echo $x
  3. done
复制代码

为运行 sbox2 的用户准备环境
  1. cd /arm-linux-gnu/rootfs
  2. sbox2-init -c /usr/bin/qemu-arm -m simple ARM /arm-linux-gnu/tools/bin/arm-unknown-linux-gnueabi-gcc
复制代码
cd 是必须的,sbox2-init 初始化当前目录为目标平台根目录;
-c /usr/bin/qemu-arm 必须指明绝对路径,否则后面会有些奇怪的问题
-m simple 指明 sbox2 默认的路径映射规则,/usr/share/scratchbox2/lua_scripts/pathmaps/* 是具体的规则;
ARM 是为这个目标平台起的名字,随意;
/arm-linux-gnu/tools/bin/arm-unknown-linux-gnueabi-gcc 必须指明绝对路径,否则后面会有些奇怪的问题,用于指明交叉编译工具链路径。

运行时,sbox2 会下载 libtool 并以合适的参数编译、安装,
当显示成功设置时,最后显示
sbox2-init completed successfully, have fun!

运行下面命令
  1. $ sbox2 /bin/uname -a
  2. Linux localhost 2.6.28.7 #1 SMP Thu Mar 5 00:36:51 CST 2009 arm GNU/Linux
  3. $
  4. $ sbox2 /arm-linux-gnu/rootfs/bin/uname -a
  5. Linux localhost 2.6.28.7 #1 SMP Thu Mar 5 00:36:51 CST 2009 armv5tel GNU/Linux
  6. $
  7. $ sbox2 /usr/bin/gcc -v
  8. Using built-in specs.
  9. Reading specs from /usr/share/scratchbox2/modeconf/gcc-specs.devel
  10. rename spec cpp to old_cpp
  11. Target: arm-unknown-linux-gnueabi
  12. Configured with: /arm-linux-gnu/source/gcc-4.3.3/configure --prefix=/arm-linux-gnu/tools --build=i686-cross-linux-gnu --host=i686-cross-linux-gnu --target=arm-unknown-linux-gnueabi --with-sysroot=/arm-linux-gnu/rootfs --disable-nls --enable-shared --enable-languages=c,c++ --enable-__cxa_atexit --enable-c99 --enable-long-long --enable-threads=posix --disable-multilib
  13. Thread model: posix
  14. gcc version 4.3.3 (GCC)
  15. $
  16. $ sbox2 /usr/bin/ld
  17. /arm-linux-gnu/tools/bin/arm-unknown-linux-gnueabi-ld: no input files
复制代码
看到类似上面的显示结果,表明 qemu user mode 安装有效。

另一个验证方法,是编译经典的 hello,world。
  1. $ cat > hello.c << eof
  2. #include <stdio.h>
  3. int main ()
  4. {
  5.         printf ("hello,world!\n");
  6.         return 0;
  7. }
  8. eof
  9. $
  10. $ sbox2 gcc -o hello hello.c
  11. $ file ./hello
  12. hello: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.6.0, dynamically linked (uses shared libs), not stripped
  13. $
  14. $ sbox2 ./hello
  15. hello,world!
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-17 22:22:34 | 显示全部楼层

五、用 sbox2 为目标平台编译软件包

前面已经设置好 sbox2 环境,您可以像下面这样直接运行
  1. $ sbox2
  2. [SBOX2 simple ARM] $
复制代码

进入到一个类似 shell 的环境。

下面是一个具体的例子,为 目标系统 编译安装 wget。
  1. $ wget -c http://ftp.gnu.org/gnu/wget/wget-1.11.4.tar.bz2
  2. $ tar -xvf wget-1.11.4.tar.bz2
  3. $ cd wget-1.11.4
  4. $ sbox2
  5. [SBOX2 simple ARM] $ ./configure --prefix=/usr
  6. [SBOX2 simple ARM] $ make
复制代码

安装有两种方式
  1. [SBOX2 simple ARM] $ make install DESTDIR=/arm-linux-gnu/rootfs
复制代码

或者
  1. [SBOX2 simple ARM] $ ^C
  2. $ sbox2 -eR make install
复制代码

-e 是使用 emulate 模式,相当于 -m emulate,路径影射的方式不同于 simple 模式,/usr 被影射到 目标系统 rootfs /arm-linux-gnu/rootfs;
-R 是启用 fakeroot 方式,不加一般没什么问题,一些需要 root 权限安装的软件包需要,这个 fakeroot 是指 虚假的 root 用户环境。

测试安装
  1. $ file /arm-linux-gnu/rootfs/usr/bin/wget
  2. $ sbox2 /arm-linux-gnu/rootfs/usr/bin/wget ftp://ftp.gimp.org/pub/gimp/v2.6/gimp-2.6.6.tar.bz2
复制代码


上面的例子中,形式上和本地编译一致,但事实上是交叉编译。

现在,参考 [color="Blue"]本人的类 CLFS-Sysroot 方式 基本系统软件包安装次序 拓展完成 基本系统,前面 临时系统 中的软件包可以覆盖安装一遍,工具链部分仍可省略。

之后,可以继续用 sbox2 拓展 目标系统,做任何想做的事。


交叉编译内核、设置引导程序,可参考文档很多,略去。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-17 23:06:38 | 显示全部楼层
sbox2 http://freedesktop.org/wiki/Software/sbox2
正处于开发阶段,文档严重缺乏,但其特性甚吸引人,http://maemo-sdk.garage.maemo.org/ 有一些可参考的信息。
这里有偶各种碰壁经历 [color="Blue"]找到一新玩具 sbox2

其前身 scratchbox http://www.scratchbox.org/
已发展多年,稳定、文档丰富、限制多多,且需要修改一些支持软件。


他们工作原理并不相同,但 两者均使用 伪本地编译 方式。
sbox2 工作原理请参考 http://maemo-sdk.garage.maemo.org/user-guide.html
scratchbox 工作原理请参考 http://scratchbox.org/~tsavola/crocodile-debconf5.pdf
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-22 22:12:52 | 显示全部楼层
再一次翻看 sbox2 的 README,注意到其例子中 rootfs 只有 libc 部分。
也许 步骤三、建立临时系统 可以完全省略。

等有时间,再验证。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表