不能用android中的init shell脚本做chroot

时间:2013-02-21 00:57:35

标签: android android-emulator chroot android-build prebuild

我想在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

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

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文件夹?

1 个答案:

答案 0 :(得分:0)

我能够成功地做chroot。 以下是我的所作所为:

chroot不仅需要具有执行权限的init脚本或/ 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赋予文件系统权限的方式。它非常易于配置。

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