对init.rc进行持久性更改

41

我想修改安卓平板电脑的init.rc文件。但是,在我修改后重新启动系统后,原始的init.rc文件又回来了。

有什么方法可以使对init.rc的更改持久化,而不需要重建系统(因为我没有系统的源代码)?或者有没有其他解决办法?


你是如何修改 init.rc 的?是通过 ADB 拉取文件,然后推送到设备上吗? - Yugandhar Babu
设备是否具有 root 权限? - Yugandhar Babu
1
是的,busybox已经安装了,whoami=root。我可以更改和替换/中的init.rc而没有问题。但是旧的init.rc在重新启动后会被恢复。并且似乎/目录中添加的所有新文件在重新启动后都会消失。这不仅发生在两个不同的平板电脑上,也发生在模拟器中。据我所知,模拟器应该使用ramdisk.img进行修改,但我没有尝试过。我想找到一种在真实平板电脑上持久更改init.rc的方法。 - user1278251
1
如果你遇到了同样的问题,可以在这里找到解决方案 - https://gist.github.com/ashutosh-mishra/863d7f3b0a3099842530244b8bb8696d - a.m.
1
我仍然无法修改init.rc(即使已安装magisk并禁用了dm-verity) - 如果您没有访问ROM源代码的推荐方法来更新init.rc是什么? - dazza5000
8个回答

14
在主机PC(Linux)上使用以下命令解压uramdisk:
mkdir /tmp/initrc cd /tmp/initrd
sudo mount /dev/sdb1 /mnt          

sdb1 是存储 uramdisk/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
你怎么知道 /dev/sdb1 是 uramdisk/uInitrd 的位置?当我连接手机时,我只能在 /dev/sdb 下看到 sdcard 的内容。我该如何搜索 uramdisk? - melopsitaco
我的设备上不存在/dev/sdb1。您可能需要讨论如何确定引导映像所在的正确块设备。 - Pointer Null
2
它将根据Android设备而异。如果您的设备已经取得了root权限,请尝试执行“adb shell mount”以获取已挂载文件系统的列表。这将为您提供一些好的提示,指导您查找位置。 - Edward Falk

12
许多安卓设备都包含了代码,以防止对系统文件进行root修改。它们使用恢复分区来实现这一点。重新启动时,它们基本上使用恢复镜像来还原系统分区。如果你的系统是这样做的话,那么你就不能进行持久性修改 - 最好的方法是在重新启动后连接某些内容以重新应用你的更改。在CyanogenMod中,如果找到sdcard脚本,它们会在init.rc中设置钩子以运行脚本。也许你可以创建一个应用程序或小部件,然后启动一个脚本,使用数据分区中的setuid root脚本来进行所需的修改。除非你自己构建ROM,否则你在这个领域的限制相当大。
可能你可以获取恢复镜像,并尝试解压缩它,进行修改,再重新打包和刷入它。但在尝试这之前,请确保你能通过fastboot进行恢复。

谢谢您的信息。看起来这两个板子使用了恢复分区方法。钩子方法是我想在init.rc中执行的操作,通过它我可以在系统启动期间进行一些控制。但是恢复阻止了这种情况的发生。如果存在恢复映像,那么它在哪里?我如何找到它? - user1278251
如果您可以使用nandroid备份,那么这是获取恢复镜像的一种方法。否则,您可以使用dd并将恢复分区复制到文件中。一旦您拥有恢复分区的映像,您应该能够使用unyaffs来解包它。您应该研究一下Android源代码是如何创建这些内容的,以了解如何从文件树重新创建一个。 - patthoyts
根据此提示尝试了一下:http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images。但是使用指令 "cat /dev/mtd/mtd1 > mtd1.img" 提取恢复镜像后,无法通过 unyaffs 打开,出现了“损坏的图像文件”错误。有什么建议吗?谢谢! - user1278251

11

当安卓系统启动时,uboot会将存储在启动分区中的一个名为'uRamdisk'的特殊压缩文件解压到RAM中,并定义这些文件组成系统的根目录。uRamdisk通常包含一些目录(如system、data、media等),用于挂载包含相应文件的分区,但也包含一些非常基本的文件,如init二进制文件和启动脚本(例如init.rc),这些文件对于您的系统至关重要。

当您编辑init.rc时,实际上是编辑了驻留在RAM中未打包的init.rc副本。因此,如果要进行真正的更改,则需要复制uRamdisk并将其解压,从其中编辑init.rc,重新打包uRamdisk,然后将新的uRamdisk替换/boot目录中的旧文件。

尝试查找“xuramdisk”和“mkuramdisk”脚本,这样可以使该过程变得非常简单。


10

4

您的根分区(/init.rc所在的位置)是一种RAM磁盘,每次设备启动时都会从initrd文件中解压缩并挂载。您所做的任何更改都只针对RAM磁盘,并将在下次重启时丢失。

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

initrd文件存在于设备上的自己的分区中。如果您可以找出它在哪个分区中,就可以从设备上抓取它到主机上,将其挂载,修改它,然后将其写回设备。这就是tripler在上面谈到的。

通常,修改boot.img仅由系统开发人员执行。如果您正在构建整个Android系统,则将可访问所需的源代码。我的工作流程如下:

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

我尝试在sdcard中创建init.rc的静态链接(ln-s /sdcard/init.rc init.rc),以便更轻松地更改init.rc,但它没有起作用。有什么想法吗? - ransh
你所说的“静态链接”是指硬链接吗?你不能在文件系统之间进行这样的链接,因此你必须链接到ramdisk中的另一个文件。同样,在下一次重启时,这将会丢失。如果你创建了一个符号链接,我想它是指向另一个文件系统的,当需要时可能还没有被挂载。无论哪种方式,我认为这都不会起作用。无论如何,你需要修改init.rd镜像。 - Edward Falk

3

我不知道你是否还在尝试着做这个,但是没有确切的设备信息,没有人能给出确切的答案。

尝试对所有内部分区进行dd镜像,并使用一些如xda论坛上包含的android厨房脚本。您的恢复和引导分区都将具有Ram磁盘,但很可能您想要修改boot.img中的init.rc而不是恢复,除非您只希望在恢复模式下进行更改。

解压yaffs不适用于所有设备,并且大多数设备具有不同的分区布局,因此您必须弄清楚哪个是启动分区以及它是何种类型的文件系统。也许如果您提供设备规格,您可以得到更好的答案。


2
请注意,使用类似Scripter的应用程序在启动时运行脚本可能比修改此文件更容易。
在按照@tripler上面的说明之前,您需要一个名为boot.img的文件,可以通过以下方式提取(在已root的Android设备上运行,未经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

这是 tripler 指令的一个修改版,更容易查看(假定 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,这是与设备相关的。对此我无能为力,抱歉!


-2

在构建Android平板文件系统之前,您必须编辑/更改init.rc。这是首选的方法,始终可行。


1
我没有这个平板系统的源代码,我该如何构建它?有没有绕过重建系统来解决这个问题的方法? - user1278251

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接