Файловая система только для чтения на 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

Android - это программный стек Google ... По вопросам, не связанным с разработчиком, обращайтесь к android.stackexchange.com
Selvin

2
Обратите внимание, что этот вопрос не следует путать со случаем, когда код приложения Android не работает с ошибкой файловой системы только для чтения. Это обычно вызывается попыткой записи файла без указания местоположения, т. Е. Попыткой записи в корневой каталог. Этот вопрос касается только изменения самой установки Android на рутированных / разрабатываемых / инженерных устройствах.
Крис Страттон

1
Есть ли способ сделать это с эмулятором Android ?? Ни одно из этих решений не работает для моего эмулятора.
MikeSchem

Ответы:


388

Не на всех телефонах и версиях Android установлены одинаковые вещи.
Ограничение параметров при перемонтировании было бы наилучшим.

Просто перемонтируйте как rw (чтение / запись):

# mount -o rw,remount /system

После внесения изменений перемонтируйте в ro (только для чтения):

# mount -o ro,remount /system

30
Вы можете сделать это на вашем компьютере тоже. Оболочка adb -o rw, remount / system
Матиас Вейлер,

8
Используйте вместе с adb rootили вы получите Отказ в разрешении при нажатии файла.
KrisWebDev

1
@MikeHenke, похоже, что вы не были пользователем root, когда выполняли его.
CurtisLeeBolin

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
Lauri Elias

85
adb remount

работает для меня и, кажется, самое простое решение.


6
"adb remount - если вы получили ошибки при попытке отправить файлы в / system из-за того, что он находится в режиме только для чтения, adb remount перемонтирует / system в режим чтения-записи - при условии, что оболочка имеет правильный корень разрешения для этого. Это заменяет необходимость набирать более длинную команду вручную, такую ​​как 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.
Вадим

1
На более новых устройствах это выглядит так, как будто нам также нужно $ adb disable-verityперезагрузить устройство, прежде чем мы сможем его запустить$ adb remount
Nebel22

1
$ adb disable-verity give: disable-verity работает только для сборок userdebug
Уильям

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 года, эмулятор должен быть запущен из командной строки с помощью:

-writable-system

Для чего-либо, чтобы быть доступным для записи /system. Без этого флага ни одна комбинация remountили mountне позволит писать /system.

После запуска эмулятора с этим флагом достаточно одного adb remountпосле, adb rootчтобы получить разрешения для отправки /system.

Вот пример командной строки, которую я использую для запуска своего эмулятора:

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

Значение для -avdфлагов происходит от:

./emulator -list-avds

моя командная строка становится очень медленной, пока не может продолжить работу с adb root и adb remount после запуска эмулятора с -writable-system, кто-нибудь может помочь?
Beeing Jk

29

Я думаю, что самый безопасный способ это перемонтировать / system как read-write, используя:

mount -o remount,rw /system

и когда закончите, перемонтируйте его только для чтения:

mount -o remount,ro /system

6
Добро пожаловать на ТАК! Ваш ответ технически полезен, но по сути дублирует предыдущий ответ curtlee2002. Это могло бы быть лучше, если бы в комментарии к его ответу говорилось: «Я согласен, что наиболее безопасно переключиться обратно в режим« только чтение »после того, как в режиме чтения и записи он переключился». У нас есть миллионы вопросов, поэтому всегда будет другой вопрос, когда вы будете первыми, кто найдет отличное решение или новую перспективу!
Джонатан Ван Матр

1
это сработало только для меня, как только я удалил «,» из заявления. т.е. "" mount -o remount rw / system ""
propjk007

@TechnikEmpire, он не ссылается на принятый ответ.
Пасхалис

16

На моем Samsung galaxy mini S5570 (после получения рута на мобильном телефоне):

Кулак, как корень, я побежал:

systemctl start adb

как обычный пользователь:

adb shell 
su 

Предоставление прав root на сенсорном экране

mount 

перечислите все точки монтирования, которые у нас есть, и мы можем видеть, в моем случае, что / dev / stl12 был смонтирован в / system как ro (только готово), поэтому нам просто нужно сделать:

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

Спасибо за этот ответ. По какой-то причине я никогда не смотрел на экран своего телефона, чтобы предоставить права root, и получал отказ в доступе, что бы я ни пытался.
Грэм Митчелл

говоря «Вы должны указать тип файловой системы с -t.», что это значит?
NehaK

mount -o rw, remount -t ext4 / dev / block / vda / system, -t означает тип файловой системы в моем примере ext4
Сержио

11

Попробуйте следующее в командной строке:

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

Это должно бытьadb root remount
tqjustc

10
adb disable-verity
adb reboot
adb root
adb remount

Это работает для меня и является самым простым решением.


7

Вот что сработало для меня. У меня было эмулированное устройство 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, сохранятся после перезапуска.


4

Я проверил с эмулятором и следующий работал.

  1. перезагрузка adb
  2. корень adb && adb remount && adb push ~ / рабочий стол / hosts / system / etc / hosts

Как уже упоминалось выше, выполните второй шаг за один выстрел.


3

Откройте эмулятор терминала на телефоне: тогда

adb shell

после запуска этого демона

su
mount -o rw,remount /mnt/sdcard

затем только чтение преобразуется в чтение-запись.



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).

У Sony есть сторожевой процесс, который обнаруживает, когда вы изменили ro на rw на / и / system (это единственные, которые я пытался изменить) и, возможно, другие.

Ниже было то, что я побежал, чтобы выполнить изменения, которые я пытался достичь. Я вставил их в окно, потому что удаление бита выполнения из / 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 должен автоматически перезапустить. (Он перезапустился для меня автоматически.)


1

Добавим немного больше к ответу Яна Бергстрёма: поскольку Android - это система на основе Linux, а путь в Linux содержит косую черту (../), при использовании команды push используйте «/» для определения пути назначения на устройстве Android.

Например, команда выглядит так: adb push C: \ Users \ admin \ Desktop \ 1.JPG sdcard / pictures /

Обратите внимание, что здесь, обратная косая черта используется для определения пути к исходному файлу, который должен быть передан с компьютера с Windows, а прямая косая черта используется для определения пути назначения, потому что Android - это система на основе Linux. Вам не нужно выступать в роли пользователя root, чтобы использовать эту команду, а также, она отлично работает на производственных устройствах.


1

Иногда вы получаете сообщение об ошибке, потому что адресата в телефоне не существует. Например, некоторые андроид телефон внешнего хранилища /storage/emulated/legacyвместо /storage/emulated/0.


1

Спасибо, Сержио , за команду «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.


1

это то же самое, что нужно распаковать и перепаковать файл initrc.img и отредактировать initфайл с кодом mount / system


Кстати. вы должны запустить avd с опциями -writeable-system
xsilen T

0

Копировать файлы на SD-карту?

Ну, я полагаю, вам нравится копировать данные на SD-карту с компьютера разработчиков? Возможно, вы укоренили устройство и сделали доступной область, к которой обращаетесь?) У меня была примерно такая же проблема при загрузке файлов данных для моего приложения (Android Studio 1.3.2 в Win7), но.

  • Сначала нужно найти командную оболочку 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


0

Если при копировании файла, доступного только для чтения, происходит сбой, можно попытаться найти исходный файл в корневом каталоге и изменить его с помощью корневого текстового редактора (предпочтительно) текстового редактора RB, он поставляется с приложением ROM Toolbox.


0

Попробуйте это в эмуляторе терминала от имени пользователя root:

restorecon -v -R /data/media

0

В моем случае я использовал команду adb push ~/Desktop/file.txt ~/sdcard/

Я изменил это на ~/Desktop/file.txt /sdcard/и тогда это сработало.

Обязательно отключите и снова подключите телефон.


Автор этого вопроса спрашивает о повторном монтировании / system как чтение-запись, ваш ответ отчасти не соответствует теме
Метонимия

0

Как упоминал Чэнь-Син, самый простой способ:

adb reboot

Но мне пришлось сначала изменить свои настройки:

Настройки → Параметры разработчика → Root-доступ

Убедитесь, что у ADB есть Root-доступ:

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.