อ่านเฉพาะระบบไฟล์บน 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 ตัวเองในการพัฒนาอุปกรณ์ที่ฝังราก / / วิศวกรรม
Chris Stratton

1
มีวิธีการทำเช่นนี้กับตัวเลียนแบบ Android หรือไม่? โซลูชันเหล่านี้ไม่สามารถใช้กับอีมูเลเตอร์ของฉันได้
MikeSchem

คำตอบ:


388

โทรศัพท์บางรุ่นและทุกรุ่นของ Android มีสิ่งที่ติดตั้งเหมือนกัน
การ จำกัด ตัวเลือกเมื่อทำการเมาท์ใหม่จะดีที่สุด

เพียงติดตั้งใหม่เป็น rw (อ่าน / เขียน):

# mount -o rw,remount /system

เมื่อคุณทำการเปลี่ยนแปลงเสร็จแล้วให้นับใหม่เป็น ro (อ่านอย่างเดียว):

# mount -o ro,remount /system

30
คุณสามารถทำได้บนพีซีของคุณเช่นกัน adb shell -o rw, เมานต์ / ระบบ
Matthias Weiler

8
ใช้ร่วมกับadb rootหรือคุณจะได้รับอนุญาตถูกปฏิเสธเมื่อกดไฟล์
KrisWebDev

1
@ MikeHenke ดูเหมือนว่าคุณจะไม่รูทเมื่อคุณสั่งการ
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
เนื่องจากฉันมีรูตอยู่แล้วฉันจึงคัดลอกไฟล์ไปยัง / sdcard จากนั้นจึงใช้ (ในกรณีของฉัน)mv hosts /system/etc/hosts
Lauri Elias

85
adb remount

เหมาะกับฉันและดูเหมือนจะเป็นวิธีที่ง่ายที่สุด


6
"adb remount - หากคุณมีข้อผิดพลาดในการพยายามส่งไฟล์ไปยัง / ระบบเนื่องจากอยู่ในโหมดอ่านอย่างเดียว adb remount จะทำการ remount / ระบบเข้าสู่โหมดอ่าน - เขียน - หากเชลล์มีรูทที่ถูกต้อง การอนุญาตให้ทำเช่นนี้แทนการพิมพ์คำสั่งที่ยาวขึ้นด้วยมือเช่น mount -o rw, remount / system (เป็น root) หรืออะไรบางอย่าง " ( แหล่งที่มา ) หากคุณมีปัญหาเกี่ยวกับการอนุญาตให้ลอง "adb root" ก่อน
KrisWebDev

4
ฉันNot running as root. Try "adb root" first.เข้าใจแล้ว adbd cannot run as root in production buildsแล้วก็
Vadzim

1
สำหรับอุปกรณ์ใหม่ดูเหมือนว่าเรายังต้อง$ adb disable-verityรีบูตอุปกรณ์ก่อนที่จะสามารถเรียกใช้ได้$ adb remount
Nebel22

1
$ adb ปิดการใช้งาน - verity ให้: ปิดการใช้งาน - 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 prompt ให้ทำ 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 หลังจากเรียกใช้งานอีมูเลเตอร์ด้วย - เขียนได้ - ระบบทุกคนสามารถช่วยได้?
Beeing Jk

29

ฉันคิดว่าวิธีที่ปลอดภัยที่สุดคือทำให้ระบบ / เป็นแบบอ่าน - เขียนใหม่โดยใช้:

mount -o remount,rw /system

และเมื่อเสร็จแล้วให้นับใหม่เป็นแบบอ่านอย่างเดียว:

mount -o remount,ro /system

6
ยินดีต้อนรับสู่ SO! คำตอบของคุณมีประโยชน์ทางเทคนิค แต่โดยพื้นฐานแล้วเป็นคำตอบที่เหมือนกันกับ curtlee2002 นี่อาจจะดีกว่าเมื่อความเห็นของเขาตอบว่า "ฉันยอมรับว่าปลอดภัยที่สุดที่จะเปลี่ยนกลับไปเป็นแบบอ่านอย่างเดียวหลังจากลิงในโหมดอ่าน - เขียน" เรามีคำถามหลายล้านคำถามดังนั้นจะมีคำถามอีกคำถามที่คุณเป็นคนแรกที่มาพร้อมทางออกที่ยอดเยี่ยมหรือมุมมองใหม่!
Jonathan Van Matre

1
สิ่งนี้ใช้ได้สำหรับฉันเมื่อฉันลบ "," ออกจากคำสั่ง เช่น "" mount -o remount rw / system ""
propjk007

@TechnikEmpire เขาไม่ได้อ้างถึงคำตอบที่ยอมรับ
Paschalis

16

ใน Samsung galaxy mini S5570 ของฉัน (หลังจากรูทผ่านมือถือ):

ฉันวิ่งออกไปเหมือนกำปั้น

systemctl start adb

ในฐานะผู้ใช้ปกติ:

adb shell 
su 

ให้สิทธิ์การรูทบนหน้าจอสัมผัส

mount 

แสดงรายการจุดเมานท์ทั้งหมดที่เรามีและเราสามารถเห็นได้ในกรณีของฉันว่า / dev / stl12 ถูกเมาท์บน / ระบบเหมือน ro (พร้อมเท่านั้น) ดังนั้นเราต้องทำดังนี้:

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

ขอบคุณสำหรับคำตอบนี้ ด้วยเหตุผลบางอย่างฉันไม่เคยดูที่หน้าจอในโทรศัพท์ของฉันเพื่อให้อนุญาตการเข้าถึงรูทและการเข้าถึงถูกปฏิเสธไม่ว่าฉันจะพยายามทำอะไร
เกรแฮมมิทเชลล์

พูดว่า "คุณต้องระบุประเภทระบบไฟล์ด้วย -t." นี่หมายความว่าอย่างไร
NehaK

เมานต์ -o rw, remount -t ext4 / dev / block / vda / system, -t หมายถึงประเภทของระบบไฟล์ในตัวอย่างของฉัน ext4
Sérgio

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

การเปลี่ยนแปลงทั้งหมดที่คุณทำกับเนื้อหาระบบ / จะอยู่รอดรีสตาร์ท


4

ฉันตรวจสอบกับโปรแกรมจำลองและทำงานต่อไปนี้

  1. adb รีบูต
  2. adb root && adb remount && adb push ~ / Desktop / hosts / system / etc / hosts

ดังกล่าวข้างต้นเช่นกันดำเนินการขั้นตอนที่สองในนัดเดียว


3

เปิดเทอร์มินัลอีมูเลเตอร์บนโทรศัพท์: จากนั้น

adb shell

หลังจาก daemon นั้นเริ่มทำงาน

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 on / และ / ระบบ (เหล่านี้เป็นกระบวนการเดียวที่ฉันพยายามแก้ไข) และอื่น ๆ

ต่อไปนี้เป็นสิ่งที่ฉันวิ่งไปทำการเปลี่ยนแปลงที่ฉันพยายามทำ ฉันวางสิ่งเหล่านี้ลงในหน้าต่างเนื่องจากการลบบิตเรียกใช้ออกจาก / 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 /

ณ จุดที่ริคควรรีสตาร์ทโดยอัตโนมัติ (มันจะรีสตาร์ทโดยอัตโนมัติสำหรับฉัน)


1

การเพิ่มคำตอบของ Jan Bergströmอีกเล็กน้อย: เนื่องจาก Android เป็นระบบที่ใช้ Linux และเส้นทางใน Linux มีเครื่องหมายทับ (../) ในขณะที่ใช้คำสั่ง push ให้ใช้ "/" เพื่อกำหนดเส้นทางปลายทางในอุปกรณ์ Android

ตัวอย่างเช่นคำสั่งไปที่: adb push C: \ Users \ admin \ Desktop \ 1.JPG sdcard / pictures /

โปรดสังเกตว่าที่นี่แบ็กสแลชใช้เพื่อกำหนดพา ธ ต้นทางของไฟล์ที่จะถูกส่งจาก windows PC และสแลชสแลชจะใช้เพื่อกำหนดพา ธ ปลายทางเนื่องจาก Android เป็นระบบที่ใช้ Linux คุณไม่จำเป็นต้องทำหน้าที่เป็นรูทเพื่อใช้คำสั่งนี้และมันยังทำงานได้อย่างสมบูรณ์บนอุปกรณ์ที่ใช้


1

บางครั้งคุณได้รับข้อผิดพลาดเนื่องจากไม่มีตำแหน่งปลายทางในโทรศัพท์ ยกตัวอย่างเช่นโทรศัพท์ Android บางสถานที่จัดเก็บข้อมูลภายนอกเป็นแทน/storage/emulated/legacy/storage/emulated/0


1

ขอบคุณ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และ voila!

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

ขั้นตอนถัดไปมีการอธิบายไว้แล้ว: remount ไปที่ RW, push และ remount กลับไปที่ RO


1

มันเป็น sames ที่จะต้องแตกและบรรจุใหม่ initrc.img และแก้ไขinitไฟล์ด้วยรหัสของ mount / system


BTW คุณต้องเริ่ม avd ด้วยตัวเลือก
เขียนได้

0

คัดลอกไฟล์ไปยังการ์ด SD หรือไม่

ฉันคิดว่าคุณต้องการคัดลอกข้อมูลไปยังการ์ด Sd จากคอมพิวเตอร์นักพัฒนาหรือไม่ คุณอาจรูทอุปกรณ์และทำให้พื้นที่ที่คุณอยู่พร้อมใช้งานหรือไม่?) ฉันมีปัญหาเดียวกันกับการอัปโหลดไฟล์ข้อมูลสำหรับแอปพลิเคชันของฉัน (Android Studio 1.3.2 ใน Win7) แต่

  • ก่อนอื่นต้องพบเชลล์คำสั่ง adb ในพา ธ th: PATH =% PATH%; C: \ Users \ XXXXX \ AppData \ Local \ Android \ sdk \ platform-tools (โฟลเดอร์ AppData ถูกซ่อนไว้ดังนั้นคุณต้องตั้งค่า การตั้งค่าโฟลเดอร์ไม่ซ่อนไฟล์และโฟลเดอร์ที่ซ่อนเพื่อค้นหา Path จะทำงานโดยไม่คำนึงถึง)
  • คุณต้องสะกดโฟลเดอร์เส้นทางให้ถูกต้องหรือคุณได้รับข้อความแสดงข้อผิดพลาดแบบอ่านอย่างเดียวส่วนใหญ่จะต้องเริ่มต้นด้วย / sdcard หรือเป็นแบบอ่านอย่างเดียว ทันทีที่ฉันไม่มีปัญหาในการผลักไฟล์ไปที่ตัวจำลอง

ตัวอย่างเช่นคำสั่ง adb สามารถมีลักษณะเช่นนี้:

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


0

หากมีความล้มเหลวในการคัดลอกไฟล์แบบอ่านอย่างเดียวคุณสามารถลองค้นหาไฟล์ต้นฉบับในไดเรกทอรีรากและแก้ไขด้วยตัวแก้ไขข้อความราก (โดยเฉพาะ) ตัวแก้ไขข้อความ RB โดยเฉพาะอย่างยิ่งมันมาพร้อมกับแอป ROM Toolbox



0

ในกรณีของฉันฉันใช้คำสั่ง adb push ~/Desktop/file.txt ~/sdcard/

ฉันเปลี่ยนเป็น~/Desktop/file.txt /sdcard/แล้วก็ใช้งานได้

ตรวจสอบให้แน่ใจว่าได้ตัดการเชื่อมต่อและเชื่อมต่อโทรศัพท์ใหม่


ผู้เขียนคำถามนี้ถามเกี่ยวกับการติดตั้ง / ระบบในขณะที่อ่าน - เขียนคำตอบของคุณคือ kinda off topic
Metonymy

0

ตามที่เฉินซิงพูดถึงวิธีที่ง่ายที่สุดคือ:

adb reboot

แต่สำหรับฉันฉันต้องเปลี่ยนการตั้งค่าของฉันก่อน:

การตั้งค่า→ตัวเลือกผู้พัฒนา→การเข้าถึงรูท

ตรวจสอบให้แน่ใจว่า ADB มีสิทธิ์เข้าถึงรูต:

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.