【问题标题】:Read only file system on AndroidAndroid 上的只读文件系统
【发布时间】:2011-05-19 23:38:28
【问题描述】:

我最近植根了我的 Droid X,一切似乎都运行良好。我对build.prop 进行了一些更改,当我更改adb push build.prop /system/ 时,出现以下错误:failed to copy 'c:\build.prop' to '/system//build.prop': Read-only file system

我该如何解决这个问题?

【问题讨论】:

  • 你试过adb remount,你得到了什么?
  • Android 是 Google 的软件堆栈...对于非开发人员的问题,请参阅 android.stackexchange.com
  • 请注意,此问题不应与 Android Application 代码因只读文件系统错误而失败的情况相混淆。这通常是由于试图在没有指定位置的情况下写入文件,即试图写入根目录而引起的。这个问题是关于修改 Android 本身在 root/开发/工程设备上的安装。
  • 有没有办法用安卓模拟器做到这一点?这些解决方案都不适用于我的模拟器。
  • 只需使用adb shell mount -o rw,remount /sys(而不是/system)。为我工作。

标签: android


【解决方案1】:

并非所有手机和 android 版本都安装了相同的东西。
最好在重新安装时限制选项。

只需重新挂载为 rw(读/写):

# mount -o rw,remount /system

完成更改后,重新挂载到 ro(只读):

# mount -o ro,remount /system

【讨论】:

  • 您也可以在您的 PC 上执行此操作。 adb shell mount -o rw,remount /system
  • adb root 一起使用,否则在推送文件时会收到 Permission Denied。
  • 对我不起作用:Balazss-MBP:tools varh1i$ adb shellgeneric_x86_64:/ # mount -o rw,remount /system'/dev/block/vda' is read-only
  • 它对我不起作用。它显示“mount: Read-only file system”
  • 反正我有root,我把文件复制到/sdcard,然后使用(在我的情况下)mv hosts /system/etc/hosts
【解决方案2】:
adb remount

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

【讨论】:

  • "adb remount -- 如果你在尝试将文件推送到 /system 时遇到错误,因为它处于只读模式,adb remount 会将 /system 重新挂载到读写模式--- “ (source)。如果您对 root 权限有任何问题,请先尝试“adb root”。
  • 我有Not running as root. Try "adb root" first.。然后adbd cannot run as root in production builds.
  • 在较新的设备上,我们似乎还需要$ adb disable-verity,然后重启设备才能运行$ adb remount
  • $ adb disable-verity give : disable-verity 仅适用于 userdebug 构建
  • 它不起作用:Not running as root. Try "adb root" first.。我输入了adb root,然后又输入了adb remount,但仍然是同样的错误:Not running as root. Try "adb root" first.
【解决方案3】:

从我问过同样问题的 Android 论坛上得到这个。希望这对其他人有帮助。

在手机的终端模拟器上:

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

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

【讨论】:

  • adb shell <command> 可以在电脑上使用(如果您的手机上没有终端)
  • 这个 cmets 的结果是 mount: '/system' not in /proc/mounts
  • @임정섭 我也遇到了同样的问题,请问您找到解决方法了吗?没有什么对我有用。如果我正在执行 adb remount,我会得到remount of the / superblock failed: Permission denied remount failed,并且有了这个答案,我会得到'/system' not in /proc/mounts。请帮忙。
  • @HackRx 我有点放弃并找到了其他代理方法。总的来说,我想要将一些数据推送到手机,我通过推送到 /data/local/ 来做到这一点。这里没有引发权限错误。
【解决方案4】:

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

-writable-system

任何可写到/system 的东西。如果没有此标志,remountmount 的任何组合都不会允许写入 /system

使用该标志启动模拟器后,adb root 之后的单个adb remount 足以获得推送到/system 的权限。

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

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

-avd 标志的值来自:

./emulator -list-avds

【讨论】:

  • 我的命令提示符变得非常慢,直到无法继续使用 adb root 并在使用 -writable-system 启动模拟器后重新挂载,任何人都可以帮忙?
  • 请注意,在某些旧内核版本中,ext4 驱动程序中存在一个错误,导致重新挂载立即恢复为只读。检查 dmesg 是否有错误消息,例如“bg 0 的 Inode 表标记为需要归零”。这是由commit 8844618 修复的
【解决方案5】:

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

mount -o remount,rw /system

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

mount -o remount,ro /system

【讨论】:

  • 欢迎来到 SO!您的答案在技术上很有用,但本质上是 curtlee2002 先前答案的副本。作为对他的回答的评论说“我同意在读写模式下胡闹之后切换回只读是最安全的”,这可能会更好。我们有数百万个问题,所以总会有另一个问题,您是第一个提出出色解决方案或全新观点的人!
  • 这仅在我从声明中删除“,”后才对我有用。即 "" mount -o remount rw /system ""
  • @TechnikEmpire,他没有提到接受的答案。
【解决方案6】:
adb disable-verity
adb reboot
adb root
adb remount

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

【讨论】:

  • adb disable-verity -- 这是我的关键解决方案。
【解决方案7】:

在我的三星galaxy mini S5570上(手机root后):

拳头,作为root,我跑了:

systemctl start adb

作为普通用户:

adb shell 
su 

在触摸屏上授予root权限

mount 

列出我们拥有的所有挂载点,在我的例子中,我们可以看到 /dev/stl12 作为 ro 挂载在 /system 上(仅就绪),所以我们只需要这样做:

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

【讨论】:

  • 感谢您的回答。出于某种原因,我从来没有看过手机屏幕来授予 root 权限,并且无论我尝试什么都被拒绝访问。
  • 说“你必须用-t指定一个文件系统类型”,这是什么意思?
  • mount -o rw,remount -t ext4 /dev/block/vda /system , -t 在我的例子中表示文件系统的类型 ext4
【解决方案8】:

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

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

【讨论】:

  • 应该是adb root remount
【解决方案9】:

这对我有用。我正在运行一个模拟的 Android 7.1.1 (Nougat) 设备。

在终端上,我点击了以下命令。需要注意的一件事是 -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 内容所做的所有更改都将在重新启动后继续存在。

【讨论】:

    【解决方案10】:

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

    1. adb 重启
    2. adb root && adb remount && adb push ~/Desktop/hosts /system/etc/hosts

    同上,单发执行第二步。

    【讨论】:

      【解决方案11】:

      在手机上打开终端模拟器: 那么

      adb shell
      

      在该守护进程启动之后

      su
      mount -o rw,remount /mnt/sdcard
      

      然后将只读转换为读写。

      【讨论】:

        【解决方案12】:
        mount -o rw,remount /dev/stl12 /system
        

        为我工作

        【讨论】:

          【解决方案13】:
          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"
          

          【讨论】:

            【解决方案14】:

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

            Sony 有一个看门狗进程,它可以检测您何时将 / 和 /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
            

            我在此处修改了 hosts 文件,因此您可以在此处对文件系统进行所需的更改。要按照我们找到它们的方式保留它们,请执行以下操作:

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

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

            【讨论】:

              【解决方案15】:

              在 Jan Bergström 的回答中补充一点:因为 Android 是基于 Linux 的系统,并且 Linux 中的路径包含正斜杠(../),所以在使用 push 命令时,使用“/”来定义目标路径安卓设备。

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

              注意这里,反斜杠用于定义要从 Windows PC 推送的文件的源路径,而正斜杠用于定义目标路径,因为 Android 是基于 Linux 的系统。您无需以 root 身份使用此命令,而且它在生产设备上运行良好。

              【讨论】:

                【解决方案16】:

                有时您会收到错误消息,因为手机中的目标位置不存在。例如,某些安卓手机的外部存储位置是/storage/emulated/legacy,而不是/storage/emulated/0

                【讨论】:

                  【解决方案17】:

                  谢谢,Sérgio,“mount”命令不带参数的想法。 对于某些测试问题,我需要将 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。

                  【讨论】:

                    【解决方案18】:

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

                    【讨论】:

                    • 顺便说一句。您必须使用 -writeable-system 选项启动 avd
                    【解决方案19】:

                    将文件复制到 SD 卡?

                    好吧,我假设您喜欢将数据从开发人员计算机复制到 SD 卡?您可能已经根植了该设计并提供了您解决的区域?)我在为我的应用程序(Win7 中的 Android Studio 1.3.2)上传数据文件时遇到了同样的问题,但是。

                    • 首先必须在路径中找到 adb 命令外壳: PATH=%PATH%;C:\Users\XXXXX\AppData\Local\Android\sdk\platform-tools (文件夹AppData是隐藏的,所以你必须设置文件夹设置不隐藏隐藏的文件和文件夹才能找到它,路径无论如何都可以使用)
                    • 您必须正确拼写文件夹路径,否则会收到只读错误消息,很可能它必须以 /sdcard 开头,或者它是只读区域。只要我将文件推送到模拟器没有问题。

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

                    adb push C:\testdata\t.txt /sdcard/download/t.txt

                    【讨论】:

                      【解决方案20】:

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

                      【讨论】:

                        【解决方案21】:

                        以 root 身份在终端模拟器中尝试:

                        restorecon -v -R /data/media
                        

                        【讨论】:

                          【解决方案22】:

                          在我的例子中,我使用命令 adb push ~/Desktop/file.txt ~/sdcard/

                          我把它改成~/Desktop/file.txt /sdcard/,然后就可以了。

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

                          【讨论】:

                          • 这个问题的作者询问重新安装/系统为读写,你的回答有点离题
                          【解决方案23】:

                          正如chen-xing 提到的最简单的方法是:

                          adb reboot
                          

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

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

                          确保 ADB 具有 Root 访问权限:

                          【讨论】:

                          • 我见过很多,但我的任何设备上都没有这个选项。模拟器或其他。
                          【解决方案24】:

                          我只需要这个:

                          su -c "mount -o rw,remount /system"
                          

                          【讨论】:

                            猜你喜欢
                            • 2012-06-03
                            • 1970-01-01
                            • 1970-01-01
                            • 2016-08-04
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2018-04-10
                            相关资源
                            最近更新 更多