1

我想在 Android ICS Emulator 中运行 glibc,为此我将 glibc 捆绑为 AOSP 根文件夹中的一个单独文件夹,其中包含 Android.mk,内容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
$(shell mkdir -p $(TARGET_OUT)/glibc/)
$(shell cp -rf $(LOCAL_PATH)/* `pwd`/$(TARGET_OUT)/glibc/)

它将整个 glibc 文件夹复制到 out/target/product/generic/system/ 文件夹。并使snod包含在system.img中

带有 glibc 文件夹的 startglibc.sh 和 init.sh 脚本分别被复制到 /system/glibc 和 /system/glibc/root/ 文件夹。

我已经编译了busybox并将其复制到/system/bin/文件夹中。

/system/glibc/startglibc.sh 的内容如下:

BUSYBOX=/system/bin/busybox
mnt=/system/glibc

export PATH=/usr/bin:/usr/sbin:/bin:$PATH
export ROOT=/root

${BUSYBOX} chroot $mnt /root/init.sh

startglibc.sh 从 init.goldfish.rc 调用如下:

service myscript /system/bin/busybox ash /system/glibc/startglibc.sh
    class main
    oneshot

我已使用 system/core/include/private/android_filesystem_config.h 将 777 和 root:root 作为 init.sh 的文件权限,如下所示:

{ 00777, AID_ROOT,      AID_ROOT,     "system/glibc/root/init.sh" },

在启动期间,会调用 startglibc.sh 脚本,但在执行 chroot 时会出现权限被拒绝错误。

我是否错过了使用 init.sh 进行 chroot 的任何内容?还是我在 Android AOSP 构建期间错误地复制了 glibc 文件夹?

4

1 回答 1

0

我能够成功地执行 chroot。以下是我所做的:

chroot 不仅需要具有执行权限的初始化脚本或 /bin/sh,还需要大多数文件系统文件夹,如 bin。等变种。等用于创建新根。

因此,我在下面给出了 system/core/include/private/android_filesystem_config.h

{ 00755, AID_ROOT,      AID_ROOT,     "system/glibc/" },
{ 00755, AID_ROOT,      AID_ROOT,     "system/glibc/*" },

因为当我在 AOSP 构建期间复制整个文件夹时,默认情况下,复制文件夹中所有文件和文件夹的权限为 644,因此 chroot 所需的必要文件夹没有执行权限。

此外,如果复制中的任何文件夹需要额外的权限,那么我们可以在上面的代码中指定相同的内容。

我真的很喜欢 android 授予文件系统权限的方式。它是非常可配置的。

我希望这对其他人也有帮助。

于 2013-02-26T22:47:49.283 回答