Android上的只读文件系统


212

最近,我扎根了Droid X,一切似乎都运转良好。我对进行了一些更改,build.prop并在adb push build.prop /system/发生以下错误:failed to copy 'c:\build.prop' to '/system//build.prop': Read-only file system

我怎样才能解决这个问题?


19
您尝试过了adb remount,会得到什么?
silverfox 2011年

Android是Google的软件堆栈...对于非开发人员的问题,请参见android.stackexchange.com
Selvin

2
请注意,这个问题不应与Android 应用程序代码因只读文件系统错误而失败的情况混淆。这通常是由于尝试在不指定位置的情况下写入文件(即,尝试写入根目录)引起的。这个问题与修改Root /开发/工程设备上Android本身的安装有关。
克里斯·斯特拉顿

1
有没有办法用Android模拟器来做到这一点?这些解决方案均不适用于我的仿真器。
MikeSchem '16

Answers:


388

并非所有的手机和Android版本都具有相同的安装方式。
重新安装时最好使用限制选项。

只需重新安装为rw(读/写):

# mount -o rw,remount /system

完成更改后,将其重新安装到ro(只读):

# mount -o ro,remount /system

29
您也可以在PC上执行此操作。adb shell mount -o rw,remount / system
Matthias Weiler

8
与一起使用adb root或,在推送文件时将获得“拒绝权限”。
KrisWebDev

1
@MikeHenke,听起来好像您在执行时不是root。
CurtisLeeBolin 2014年

21
对我不起作用:Balazss-MBP:tools varh1i$ adb shell generic_x86_64:/ # mount -o rw,remount /system '/dev/block/vda' is read-only
Balazs Varhegyi

2
由于无论如何我都有root用户,所以将文件复制到/ sdcard,然后使用(以我mv hosts /system/etc/hosts
为例

85
adb remount

为我工作,似乎是最简单的解决方案。


6
“ adb重新挂载-如果由于处于只读模式而试图将文件推送到/ system时出错,adb重新挂载会将/ system挂载为读写模式---只要shell具有正确的根目录这样做的权限。这代替了必须手动键入更长的命令,例如mount -o rw,remount / system(作为root)或其他命令。” (来源)。如果您对root权限有任何疑问,请尝试“ adb root”。
KrisWebDev

4
我有Not running as root. Try "adb root" first.。然后adbd cannot run as root in production builds
Vadzim'17年

1
在较新的设备上,我们似乎还需$ adb disable-verity要先重新启动设备,然后才能运行$ adb remount
Nebel22 '18

1
$ adb disable-verity Give:disable-verity仅适用于userdebug版本
William

3
它不起作用:Not running as root. Try "adb root" first.。我输入adb root,然后再次输入,adb remount但仍然是相同的错误:Not running as root. Try "adb root" first.
user924

78

我在一个Android论坛上问了同样的问题。希望这对其他人有帮助。

在电话上的终端仿真器上:

mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system

然后在cmd提示符下,执行 adb push


3
adb shell <command>可以从计算机上使用(如果您的手机上没有终端)
Fletcher91

73

虽然我知道问题是关于真实设备的,但如果有人在模拟器中遇到类似问题(使用截至2017年2月的最新工具),则需要使用以下命令从命令行启动模拟器:

-writable-system

对于任何可写的东西/system。没有此标志的组合remountmount不允许写入/system

在使用该标志启动仿真器之后,单adb remountadb root一个足以获取推送到的权限/system

这是我用来运行模拟器的命令行示例:

./emulator -writable-system -avd Nexus_5_API_25 -no-snapshot-load -qemu

-avd标志的值来自:

./emulator -list-avds

我的命令提示符变得非常缓慢,直到用-writable-system启动模拟器后无法继续使用adb root和adb重新挂载,任何人都可以帮忙吗?
Beeing Jk

29

我认为最安全的方法是使用以下方式将/ system重新安装为读写:

mount -o remount,rw /system

完成后,将其重新安装为只读:

mount -o remount,ro /system

6
欢迎来到SO!您的答案在技术上很有用,但实际上是curtlee2002先前答案的重复。在评论他的回答时说:“我同意在以读写模式闲逛之后切换回只读状态最安全,这可能会更好。” 我们有成千上万的问题,所以总会有另一个问题,您是第一个提出出色解决方案或以崭新视角提出问题的人!
乔纳森·范·马特雷

1
这只有在我从语句中删除“,”后才对我有用。即“” 安装-o重新安装rw /系统 “”
propjk007

@TechnikEmpire,他没有引用已接受的答案。
Paschalis 2015年

16

在我的三星银河迷你S5570上(在手机上扎根后):

作为拳头,我跑了:

systemctl start adb

作为普通用户:

adb shell 
su 

在触摸屏上授予root权限

mount 

列出我们拥有的所有挂载点,就我而言,我们可以看到/ dev / stl12以/ ro挂载在/ system上(只读),因此我们只需要执行以下操作:

mount -o rw,remount /dev/stl12 /system

感谢您的回答。由于某种原因,我从未看过手机上的屏幕来授予root权限,并且无论尝试如何,都拒绝访问。
Graham Mitchell

说“您必须使用-t指定文件系统类型”,这是什么意思?
NehaK

安装邻RW,重新装入-t EXT4的/ dev /块/ VDA /系统,-T意味着文件系统的类型在我的例子EXT4
塞尔吉奥

11

在命令提示符下尝试以下操作:

>adb remount
>adb push framework-res_old.apk /system/framework-res.apk

应该是adb root remount
tqjustc '18

10
adb disable-verity
adb reboot
adb root
adb remount

这对我有用,是最简单的解决方案。


7

这对我有用。我正在运行仿真的Android 7.1.1(牛轧糖)设备。

在终端上,我按下了以下命令。要注意的一件事是-writable-system标志

./emulator -writable-system -avd Nexus_6_API_25  -partition-size 280

在另一个标签上

./adb shell
su
mount -o rw,remount -t ext4 /dev/block/vda /system

您对/ system内容所做的所有更改都将在重新启动后保留下来。


4

我检查了模拟器,以下工作正常。

  1. adb重新启动
  2. adb root && adb重新安装&& adb push〜/ Desktop / hosts / system / etc / hosts

同样,如上所述,单步执行第二步。


3

打开手机上的终端仿真器:然后

adb shell

该守护程序启动后

su
mount -o rw,remount /mnt/sdcard

然后将只读转换为读写。


2
mount -o rw,remount /dev/stl12 /system

为我工作


2
This worked for me

#Mount as ReadOnly

su -c "mount -o rw,remount /system"
# Change Permission for file
su -c "chmod 777 /system/build.prop" 
#Edit the file to add the property
su -c "busybox vi /system/build.prop"
# Add now
service.adb.tcp.port=5678

# Reset old permissions
su -c "chmod 644 /system/build.prop"

# Mount as readonly again once done
su -c "mount -o ro,remount /system"

1

我从Google找到了这篇文章,并认为我会在Sony Xperia Z(4.2.2)上添加必要的步骤。

索尼有一个看门狗程序,它可以检测到您何时在/和/ system上将ro更改为rw(这是我唯一尝试修改的内容),以及其他情况。

以下是我执行的尝试要实现的更改。我将它们粘贴到一个窗口中,因为需要快速完成从/ sbin / ric中删除执行位的操作,以阻止它重新启动。(我尝试过stop ric;这不起作用-尽管它在手机上的android早期版本中可以使用)。

pkill -9 ric; mount -o rw,remount -t rootfs /
chmod 640 /sbin/ric
mount -o rw,remount /system

我在这里修改了主机文件,因此在这里您可以对文件系统进行更改。为了使事物保持我们找到它们的方式,请执行以下操作:

mount -o ro,remount /system
chmod 750 /sbin/ric
mount -o ro,remount -t rootfs /

此时ric应该自动重启。(它会自动为我重新启动。)


1

JanBergström的答案还多了一点:由于Android是基于Linux的系统,并且Linux中的路径包含正斜杠(../),因此在使用push命令时,请使用“ /”在Android设备中定义目标路径。

例如,命令如下:adb push C:\ Users \ admin \ Desktop \ 1.JPG sdcard / pictures /

请注意,在这里,反斜杠用于定义要从Windows PC推送的文件的源路径,正斜杠用于定义目标路径,因为Android是基于Linux的系统。您不必充当root即可使用此命令,而且,它在生产设备上也可以正常工作。


1

有时您会收到错误消息,因为电话中的目标位置不存在。例如,一些Android手机的外部存储位置/storage/emulated/legacy来代替/storage/emulated/0


1

谢谢Sérgio的“挂载”命令,没有参数提示。我需要做adb push/data/data/com.my.app/lib了一些测试问题,并获得“只读文件系统”的消息。

ls命令显示给我:

root@android:/ # ls -l /data/data/com.my.app/
drwxrwx--x u0_a98 u0_a98 2016-05-06 09:16 cache drwxrwx--x u0_a98 u0_a98 2016-05-06 09:04 files lrwxrwxrwx system system 2016-05-06 11:43 lib -> /mnt/asec/com.my.app-1/lib

因此,可以理解,“ lib”目录与其他应用程序目录是分开的。

命令 mount -o rw,remount /mnt/asec 无法解决“ r / o fs”问题,它需要设备参数先于目录参数。

“ df”命令也无济于事,但显示我的/mnt/asec/com.my.app-1目录位于单独的安装点。

然后我看着 mount瞧!

root@android:/ # mount ......... /dev/block/dm-4 /mnt/asec/com.my.app-1 ext4 ro,dirsync,relatime 0 0

上面已经描述了下一步:重新安装到RW,推入并重新安装到RO。


1

它与必须提取并重新打包initrc.img并init使用mount / system的代码编辑文件相同


顺便说一句 您必须使用-writeable-system选项启动avd
xsilen T

0

将文件复制到SD卡?

好吧,我想您想从开发人员计算机将数据复制到SD卡中?您可能已经扎根了设计,使您可以访问的区域可用?)我在为应用程序(Win7中的Android Studio 1.3.2)上载数据文件时遇到了同样的问题。

  • 首先,必须在以下路径中找到adb命令外壳:PATH =%PATH%; C:\ Users \ XXXXX \ AppData \ Local \ Android \ sdk \ platform-tools(AppData文件夹处于隐藏状态,因此您必须设置文件夹设置未隐藏隐藏的文件和文件夹以找到它,无论路径如何工作)
  • 您必须正确拼写文件夹路径,否则会收到一条只读错误消息,很可能它必须以/ sdcard开头,或者它是只读区域。只要我没问题,就可以将文件推送到仿真器。

因此,例如adb命令可以如下所示:

亚行推送C:\ testdata \ t.txt /sdcard/download/t.txt


0

如果复制只读文件失败,则可以尝试在根目录中找到原始文件,并使用ROM Toolbox应用程序附带的根文本编辑器(最好是RB文本编辑器)对其进行修改。


0

以root用户身份在终端仿真器中尝试以下操作:

restorecon -v -R /data/media

0

就我而言,我正在使用命令adb push ~/Desktop/file.txt ~/sdcard/

我将其更改为~/Desktop/file.txt /sdcard/,然后它起作用了。

确保断开并重新连接手机。


这个问题笔者询问重新挂载/系统读写,你的答案是有点偏离主题
转喻

0

正如陈星提到的,最简单的方法是:

adb reboot

但是对我来说,我必须先更改设置:

设置→开发人员选项→根访问权限

确保ADB具有Root访问权限:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.