在 x86 上 chroot 到 Arch Linux ARM 的 rootfs

日期: 04 月 23日, 2014
标签:

主机: x86_64 Arch Linux

目标rootfs: ARMv6, Arch Linux ARM, Raspberry Pi

获取 Archlinux ARM 的 rootfs

mkdir alarm-rootfs
wget http://mirrors.ustc.edu.cn/archlinuxarm/os/rpi/root.tar.xz
tar -C alarm-rootfs -Jxf root.tar.xz
wget http://mirrors.ustc.edu.cn/archlinuxarm/os/rpi/boot.tar.xz
tar -C alarm-rootfs/boot -Jxf boot.tar.xz

获取静态编译的 qemu-arm

从 Ubuntu 的软件包 qemu-user-static 中提取

wget http://mirrors.ustc.edu.cn/ubuntu/pool/universe/q/qemu/qemu-user-static_2.0.0%2bdfsg-2ubuntu3_amd64.deb
ar -x qemu-user-static_2.0.0+dfsg-2ubuntu3_amd64.deb
tar -Jxf data.tar.xz
mv usr/bin/qemu-arm-static alarm-rootfs/usr/bin/

编辑 qemu-wrapper.c

#include <string.h>
#include <unistd.h>

int main(int argc, char **argv, char **envp)
{
	char *newargv[argc + 3];

	newargv[0] = argv[0];
	newargv[1] = "-cpu";
	newargv[2] = "cortex-a15";

	memcpy(&newargv[3], &argv[1], sizeof(*argv) * (argc - 1));
	newargv[argc + 2] = NULL;
	return execve("/usr/bin/qemu-arm", newargv, envp);
}

用 gcc 静态编译并复制到 alarm-rootfs 中

gcc -static -O2 -o qemu-wrapper qemu-wrapper.c
mv qemu-wrapper alarm-rootfs/usr/bin/

binfmt_misc

binfmt_misc 用于在Linux上支持其他格式可执行文件(通过用户空间程序执行,如 wine、qemu)。

以 root 权限执行:

modprobe binfmt_misc
echo ':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\xfe\xff\xff\xff:/usr/bin/qemu-wrapper:' > /proc/sys/fs/binfmt_misc/register

chroot

安装 arch-install-scripts

sudo pacman -S arch-install-scripts

执行 chroot

sudo arch-chroot alarm-rootfs /bin/bash

参考资料

  1. 在 x86 下 chroot 到 ARM 平台的 rootfs
  2. binfmt_misc
  3. Compling with qemu user chroot