对init.rc进行持久更改

时间:2012-03-19 09:55:11

标签: android persistence boot

我想更改android pad的init.rc文件。但是在我更改它并重新启动系统后,原来的init.rc会回来。

如何在不重建系统的情况下持续更改init.rc(因为我没有系统的源代码)?或者有什么方法可以解决吗?

8 个答案:

答案 0 :(得分:12)

使用主机PC(Linux)中的以下命令解压缩uramdisk

mkdir /tmp/initrc cd /tmp/initrd
sudo mount /dev/sdb1 /mnt          

sdb1uramdisk/uInitrd所在的分区。

dd bs=1 skip=64 if=/mnt/uInitrd of=initrd.gz
gunzip initrd.gz

此时运行命令file initrd应显示:

mkdir fs
cd fs
cpio -id < ../initrd

init.rc

进行更改

使用以下命令打包uramdisk:

find ./ | cpio -H newc -o > ../newinitrd
cd ..
gzip newinitrd
mkimage -A arm -O linux -C gzip -T ramdisk -n "My Android Ramdisk Image" -d newinitrd.gz uInitrd-new

答案 1 :(得分:10)

试试这个网站: http://bootloader.wikidot.com/linux:boot:android 阅读底部的部分: •Android启动映像:boot.img ◦解压缩,重新打包启动映像:http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images#Background

答案 2 :(得分:9)

许多Android设备都包含防止对系统文件进行根修改的代码。这样做的方法是使用恢复分区。在重新启动时,它们基本上使用恢复映像还原系统分区。如果您的系统正在执行此操作,那么您无法进行持久更改 - 您可以做的最好的事情就是在重新启动后连接某些内容以重新应用您的更改。在CyanogenMod中,如果找到,他们在init.rc中有钩子来运行sdcard脚本。也许你可以创建一个应用程序或小部件,然后启动一个脚本,使用数据分区中的setuid根脚本来生成所需的mod。如果不构建自己的ROM,那么这个领域就非常受限制了。

可能您可以获取恢复映像并尝试解压缩,进行更改并重新打包并闪烁。但是,在尝试此操作之前,请确保您可以使用fastboot进行恢复。

答案 3 :(得分:9)

当android系统启动时,uboot会将启动分区中名为“uRamdisk”的特殊压缩文件包解压缩到RAM中,并将这些文件定义为包含系统的根目录。 uRamdisk通常包含一堆目录(系统,数据,媒体等),它们作为包含其中文件的分区的挂载点,但也有一些对您的系统至关重要的非常基本的文件,包括init二进制文件和启动脚本,如init.rc。

当你编辑init.rc时,你实际上只是编辑了驻留在你RAM中的init.rc的解压缩副本。要真正改变它,你必须复制你的uRamdisk,解压缩它,从那里编辑init.rc,重新打包uRamdisk,然后用/ boot中的旧的替换它。

尝试查找'xuramdisk'和'mkuramdisk'脚本,这些过程非常简单。

答案 4 :(得分:4)

您的根分区(其中/init.rc存在)是一个ramdisk,它从initrd文件解压缩并在每次设备启动时挂载。您所做的任何更改仅适用于ramdisk,并且会在下次重新启动时丢失。

如果您可以获取initrd文件,可以将其安装在Linux主机系统上,修改其中的文件,卸载它,然后将其写回Android。

initrd文件存在于设备上自己的分区中。如果您可以确定它是哪个分区,您可以将其从设备中获取到主机上,安装它,修改它,然后将其写回设备。这就是三人在上面谈论的内容。

通常,修改boot.img只是系统开发人员所做的事情。如果您要构建整个Android系统,则可以访问必要的源代码。我的工作流程如下所示:

# Modify init.rc
m -j8 bootimage_signed
adb reboot bootloader
fastboot flash boot $OUT/boot.img
fastboot reboot

答案 5 :(得分:3)

我不知道你是否还在尝试这样做,但如果不知道你的确切设备,没有人可以给你一个确切的答案。

尝试获取所有内部分区的dd image,并使用xda论坛上的android kitchen附带的脚本。您的恢复和启动分区都将具有ram磁盘,但是您希望修改init.rc未恢复中的boot.img,除非您只希望恢复模式中存在更改。

unyaffs的东西不适用于所有设备,大多数设备都有不同的分区布局,所以你必须弄清楚哪个是启动,以及它是什么类型的fs。也许如果你提供你的设备规格,你可以得到更好的答案。

答案 6 :(得分:0)

请注意,您可能更容易使用Scripter这样的应用在启动时运行脚本而不是修改此文件。

在按照上面的@ tripler说明进行操作之前,您需要一个名为boot.img的文件,该文件可以被提取(在root设备上运行,未经测试,无需root):

dd if=/dev/block/platform/<someplatform>/by-name/boot of=/sdcard/boot.img

然后将Android连接到您的计算机并从那里复制boot.img文件。

脚本:

http://linuxclues.blogspot.ca/2012/11/split-bootimg-python-android.html

这是一个经过修改的,更容易看到的三重奏指令版本(假设boot.img在tmp中):

cd /tmp
mkdir fs
# Now use the linked script above to split the boot.img file into ramdisk.gz and kernel
python split_boot_img.py -i boot.img -o parts
cd fs
gunzip -c ../parts/ramdisk.gz | cpio -id
# make changes to init.rc

此时,您必须在重新刷新之前重新构建boot.img,这将是特定于设备的。对不起,对不起!

答案 7 :(得分:-2)

在构建Android pad文件系统之前,您必须编辑/更改init.rc。这是首选方式,并始终有效。