博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

hellwolf

hellwolf.cublog.cn


Waltz Chroot -- 利用qemu,chroot到其他平台的sysroot
qemu能够做两种模拟,一种是完整系统模拟(System emulator,在i386下也成为PC系统模拟);还有一种是User Mode Emulation,这种类似wine,可以让其他平台的程序与你的系统程序在同一个环境下执行。

这里介绍的Waltz Chroot,就是利用qemu的User Mode Emulation(后简称UME)进行一次华美的交叉平台的chroot。当然,首先要说明的是,这仅仅使用来娱乐一下,qemu的UME还不支持好多系统调用,所以很多程序仍然不能顺畅的跑。

交叉平台以arm为例子,确保你有完整的arm-linux-*工具链。

首先,编译静态版本的qemu(必须是静态,因为要放在chroot环境下,除非你想再编译个glibc等),我选用的是0.8.2的qemu,并打上了一个支持ARM平台的NPTL所需系统调用的一个补丁,编译过程见此rpm spec:
# For FC >= 6 we have gcc 3.4, for FC <= 5 we have gcc 3.2
%if %{!?fedora:6}%{?fedora} >= 6
%define gccver 34
%else
%define gccver 32
%endif

Summary: QEMU is a FAST! processor emulator
Name: qemu-static
Version: 0.8.2
Release: 6%{?dist}
License: GPL/LGPL
Group: Development/Tools
URL: http://www.qemu.org/
Source0: http://www.qemu.org/qemu-%{version}.tar.gz
Patch0: qemu-0.7.0-build.patch
Patch1: qemu-0.8.0-sdata.patch
Patch2: qemu-0.8.2-kernheaders.patch
Patch3: qemu-0.8.2-target-sparc.patch
Patch4: qemu-0.8.2-mb-nops.diff
Patch10: qemu-0.8.2_nptl.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: compat-gcc-%{gccver} zlib-devel which
ExclusiveArch: %{ix86} x86_64 ppc alpha sparc armv4l

%description
QEMU is a generic and open source processor emulator which achieves a good
emulation speed by using dynamic translation. QEMU has two operating modes:

* Full system emulation. In this mode, QEMU emulates a full system (for
example a PC), including a processor and various peripherials. It can be
used to launch different Operating Systems without rebooting the PC or
to debug system code.
* User mode emulation. In this mode, QEMU can launch Linux processes compiled
for one CPU on another CPU.

As QEMU requires no host kernel patches to run, it is safe and easy to use.

%prep
%setup -q -n qemu-%{version}
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch10 -p1

%build
./configure \
--static \
--prefix=%{_prefix} \
--interp-prefix=%{_prefix}/qemu-%%M \
--cc=gcc%{gccver} \
--disable-gfx-check \
--disable-sdl \
--disable-alsa
make %{?_smp_mflags}

%install
rm -rf $RPM_BUILD_ROOT

make prefix="${RPM_BUILD_ROOT}%{_prefix}" \
bindir="${RPM_BUILD_ROOT}%{_bindir}" \
sharedir="${RPM_BUILD_ROOT}%{_prefix}/share/qemu" \
mandir="${RPM_BUILD_ROOT}%{_mandir}" \
docdir="${RPM_BUILD_ROOT}%{_docdir}/%{name}-%{version}" \
datadir="${RPM_BUILD_ROOT}%{_prefix}/share/qemu" install
rm -rf $RPM_BUILD_ROOT/%{_datadir}
rm -rf $RPM_BUILD_ROOT/%{_mandir}

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%{_bindir}/qemu*

%changelog
* Fri Apr 6 2007 ZC Miao <hellwolf.misty@gmail.com> - 0.8.2-6
- Fork a static version, for waltz chroot

后面的changelog省略部分。
补丁,你可以到FC的cvs上去找,那个nptl的patch,用google搜索"qemu nptl patch arm"应该也能出来。

如果你的arm-linux-*工具链能编译静态版本的程序,那你可以试试写个简单C hello wolrd程序,编译为静态版本后,用刚才编译出来的静态qemu-arm跑一下试试。

好,现在,准备好你的arm版本的sysroot,把静态版本的qemu-arm拷贝到$sysroot/下。然后拷贝一下下面这个Waltz Chroot脚本:
#!/bin/bash

[ "$UID" != 0 ] && echo Be root, s.v.p. && exit 1

usage(){
cat <<EOF
Usage: waltz_chroot cputype sysrootdir
EOF
}

[ "$#" != 2 ] && usage && exit 2

CPU=$1
SYSROOT=$2

[ ! -d "$SYSROOT" ] && echo No such direcotry $SYSROOT && exit 3

case "$CPU" in
arm)
echo ":qemu-arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff:/qemu-arm:" > /proc/sys/fs/binfmt_misc/register
;;
ppc)
echo ":qemu-ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff:/qemu-ppc:" > /proc/sys/fs/binfmt_misc/register
;;
*)
echo Unsupported cpu $CPU
exit 1
;;
esac

mount -t proc none $SYSROOT/proc
mount -t sysfs none $SYSROOT/sys
mount -o bind /dev $SYSROOT/dev

for i in resolv.conf hosts;do
cp /etc/$i $SYSROOT/etc/
done
echo Waltz Chroot to $SYSROOT ...
/usr/sbin/chroot $SYSROOT /bin/sh

umount $SYSROOT/dev
umount $SYSROOT/sys
umount $SYSROOT/proc

echo -1 > /proc/sys/fs/binfmt_misc/qemu-$CPU

使用例子:
hellwolf@cocteau#pts/10%J0S2:tmp$uname -m
i686
hellwolf@cocteau#pts/10%J0S2:tmp$sudo ~/mydoc/prog/embed/arm/ycross/sysroot/waltz_chroot arm mipkg
Waltz Chroot to mipkg ...


BusyBox v1.4.2 (2007-04-06 22:08:06 CST) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

/ # uname -m
armv5tel
/ #

说过了,好多系统调用并不支持,我试过跑X,gtk之类的,都失败了。

发表于: 2007-04-10 ,修改于: 2007-04-10 21:11,已浏览1486次,有评论1条 推荐 投诉


网友评论
内容:
弄arm的人不少啊~~呵呵~
bitstream评论于:2007-04-15 15:04:25 (124.89.56.★)

发表评论