Strange problem - "/sdcard" becoming read-only during file copy - Please help!
Hello all, I am trying to load LineageOS on a Samsung Tab 3 (SM-T217S, aka "lt02ltespr") and I am having a very strange issue that I am really hoping someone can help me with. Specifically, when I'm trying to push the Lineage installer with adb, it starts copying normally, but 20-80MB into the copy it fails out as the /sdcard partition has suddenly become "read-only." If I copy significantly smaller files they copy over without error, but even then immediately after the copy the filesystem is read-only as before.
For reference, here's what I've done:
* I have wiped the stock OS
* I have loaded TWRP v3.1.0-0 on the tablet, but I previously had TWRP 2.7.0 on it and had the exact same problem.
* adb seems to be fully functional, other commands work as normal
* There is plenty of space available in /sdcard/, something like 11GB
* If I push the files to other locations (e.g. /tmp) they copy over just fine. But if I then try to move or copy the files from there to /sdcard the same problem happens
* /sdcard is definitely not read-only before the attempt to copy to it
* Problem occurs with other files as well, so not specific to the Lineage installer
My current attempted process is as follows:
* Boot into "recovery mode", aka TWRP
* Go in to mount and "Disable MTP" to make ADB functional
* Attempt to push Lineage installer (although same problem happens with other files) with the command:
* adb push lineage-14.1-20171221-nightly-lt02ltespr-signed.zip /sdcard/
It starts copying, but after a while the following happens:
adb: error: failed to copy 'lineage-14.1-20171221-nightly-lt02ltespr-signed.zip' to '/sdcard/lineage-14.1-20171221-nightly-lt02ltespr-signed.zip': remote write failed: Read-only file system
lineage-14.1-20171221-nightly-lt02ltespr-signed.zip: 0 files pushed. 6.1 MB/s (36499096 bytes in 5.700s)
Once this happens, i can't fix/change the /sdcard/ partition (even trying to remount it read-write doesn't work), and i need to reboot the phone back into TWRP again to delete the partially written file or make any other changes.
Any help here would be hugely appreciated, thanks!
Well after all that i fixed it. Needed an fsck.
In case anyone else experiences this problem, here was the fix:
# mount
...
/dev/block/mmcblk0p25 on /data type ext4 (rw,seclabel,relatime,data=ordered)
/dev/block/mmcblk0p25 on /sdcard type ext4 (rw,seclabel,relatime,data=ordered)
# umount /data
# umount /sdcard
# e2fsck -pcfv /dev/block/mmcblk0p25
When that finished I rebooted the device, and after that the file copies worked just fine.
Related
Hi, I'd like to ask a general question about device boot. I'd like to mount /system, /data, and /cache partitions in selected locations based on detection of sdcard in the device.
How could I add an if ... then ... else statement to init.rc before that /system, /data, and /cache partitions are mounted? Any ideas?
Solved
I've found a way to perform this task. It's possible to place if ... then ... else statement into a shell script and put the shell script into ramdisk root directory of boot.img. Then, just run the script by busybox ash command from init.rc (with busybox located into ramdisk root directory).
cristian_c said:
I've found a way to perform this task. It's possible to place if ... then ... else statement into a shell script and put the shell script into ramdisk root directory of boot.img. Then, just run the script by busybox ash command from init.rc (with busybox located into ramdisk root directory).
Click to expand...
Click to collapse
Hey... I managed to mount /dev/block/mmcblk1p2 as my /data partition by editing my boot.img ramdisk(the 3. fstab files and the .rc files... i replaced [email protected] with dev/block/mmcblk1p2 wherever i saw them)
So i was trying to use an if statement in some of the .rc files to check if /dev/block/mmcblk1p2 was mounted on /data and if not then mount /dev/block/mmcblk0p9 (my usrdata partition) on /data... Soon i realised that this isn't exactly bash...
Please explain how you managed to get a .sh to run from your .rc files( or do you only need it in the init.rc, and remove all the /data mounting lines from them and do it all from the script???)
I don't always have access to a pc so if my sdcard somehow dies i want my phone to boot using the internal /data partition otherwise i will bootloop until i flash the original boot.img
nullbyte001 said:
Hey... I managed to mount /dev/block/mmcblk1p2 as my /data partition by editing my boot.img ramdisk(the 3. fstab files and the .rc files... i replaced [email protected] with dev/block/mmcblk1p2 wherever i saw them)
So i was trying to use an if statement in some of the .rc files to check if /dev/block/mmcblk1p2 was mounted on /data and if not then mount /dev/block/mmcblk0p9 (my usrdata partition) on /data... Soon i realised that this isn't exactly bash...
Please explain how you managed to get a .sh to run from your .rc files( or do you only need it in the init.rc, and remove all the /data mounting lines from them and do it all from the script???)
I don't always have access to a pc so if my sdcard somehow dies i want my phone to boot using the internal /data partition otherwise i will bootloop until i flash the original boot.img
Click to expand...
Click to collapse
I've found on fs_property:ro.mount.fs=EXT4 in init.rc. In that section, I've added the following iine:
Code:
exec /busybox ash /mount_partitions.sh
[of course, I've placed busybox arm compiled binary (the version provided by busybox android app should work) and a mount_partitions.sh script (created by myself) into boot image ramdisk (I mean / main directory, the same where init.rc is located) ]
You could also need to give permissions to busybox and to .sh script. You could also need to remount / in read-write mode, in case of issues with the above command.
Reasons:
0.) You know, apps like messing up internal storage.
1.) I have installed dozens of ROMs flashed with DualBoot Patcher(It's a great tool), and all of them share the same /sdcard path( /data/media/0, actually it's /raw/data/media/0 ), it's a terriable mess.
2.) Android Nougat does NOT have xposed yet, so I cannot use xposed module XInternalSD to do this.
Due to /sdcard being linked to /storage/emulated/0, I should mount -o bing $another_path to /storage/emulated/0.
What I want to do is:
remount $data_partition_mount_point/media/$my_path to /storage/emulated/0 when the phone is booting, so my system can use another path for internal storage
I want to unmount the default /storage/emulated and only to mount /storage/emulated/0 to keep /storage/emulated clean.
CAN I ?
But after too many times failed, I failed again. I CANNOT mount $my_path as Internal Storage again. It ends up with "Access Denied",or "cross-device link", or seperated permissions(not as a sdcard)
Also, I tried to modify install-recovery.sh to let my scripts execute when booting, but sepolicy denied my orders (like mkdir, mount, setenforce ). So, I run my scripts via APP "Boot Shell".
Is there anyone who know how to do this? Or, can a script change the default Internal Storage path?
Hi guys. Does any of you know how to push su.d directory into su folder? I mean I need radio.sh script in su/su.d to get root call sms manager working. Every time I try it disappears after reboot.
Rooted rom 34.3.A.0.217 with TWRP.
Anyone?
It's late though, but for the guidance of other noobs like me. /su/su.d/ can't be flashed in recovery because this isn't available. For system-less roots, binaries/libraries required to start supersu daemon and to manage root permissions, don't reside in /system/bin but in /data/su.img while (at least) two files reside in boot.img i.e. boot.img/ramdisk/init.supersu.rc and boot.img/ramdisk/sbin/.*daemonsu*.sh. When ROM boots, init.supersu.rc mounts /data/su.img on /su directory and calls /sbin/*daemonsu*.sh for initial setup which starts /su/bin/daemonsu and other se-linux related stuff and then executes any scripts found in /su/su.d/ and /system/su.d.
You can find this:
Code:
mido:/ # mount | grep loop
/dev/block/loop0 on /su type ext4 (rw,seclabel,noatime,data=ordered)
So, the init.d scripts placed in /su/su.d actually reside in /data/su.img which isn't mounted in recovery mode and anything flashed to /su/su.d goes to volatile rootfs which is gone on reboot. Either mount su.img in recovery, or place this script while ROM is running or instead flash to /system/su.d which is permanent filesystem unlike rootfs (which lives in RAM). And finally don't forget to set permissions to 0700 as advised here. Another thing, mostly init.d scripts don't work with .sh extension. Avoid this too.
Hi, i formatted my sdcard to f2fs and it can be mounted on custom rom i previously use, PixelExtended by changing <type> from vfat to auto in fstab.qcom. Yesterday, i moved to AOSP Kraken and did the same modification to fstab.qcom but sdcard still can't be mounted (unsupported). Is there anything i can do to make my current rom able to mount f2fs sdcard? Maybe like replacing the files or anything using the files from previous rom that is responsible to mounting sdcard?
NB : My device is Redmi Note 9 Pro (joyeuse). Im using same custom kernel in both rom
I have same problem here
Spicy_WinG said:
Hi, i formatted my sdcard to f2fs and it can be mounted on custom rom i previously use, PixelExtended by changing <type> from vfat to auto in fstab.qcom. Yesterday, i moved to AOSP Kraken and did the same modification to fstab.qcom but sdcard still can't be mounted (unsupported). Is there anything i can do to make my current rom able to mount f2fs sdcard? Maybe like replacing the files or anything using the files from previous rom that is responsible to mounting sdcard?
NB : My device is Redmi Note 9 Pro (joyeuse). Im using same custom kernel in both rom
Click to expand...
Click to collapse
@namhoang235
Its possible to mount f2fs/ext4 microSD / usb-otg on android.
i use f2fs since 2017 for microSD on Android.
u need to be rooted, and, a your need to have kernel f2fs-support.
if you can format /data as f2fs and mount it.
then, youtl already have f2fs support.
else you can use any custom kernel with f2fs support.
as (on 2018) for my asus x00td device, i requested @Sakhtlonda69 to add f2fs support in his custom kernel build.
(and, he did it!)
----
these are few values , which u need to know, to execute the below commands
# YOUR_DEVICE_NUMBER = the exact partition which is your memory card's 1st partition.
# If you have a device with UFS storage (not eMMC), then, microSD will be most likely at "mmcblk0p1"
# If you have a device with eMMC Storage (not UFS), then, microSD will be most likely at "mmcblk1p1"
# If you still can't understand what I'm saying,
# Make sure your memory card is inserted,
# then,
# just go to /dev/block from any rooted file manager
# search "mmcblk1" there.
# if it only shows these 2 files: mmcblk1 and mmcblk1p1
# then, "YOUR_DEVICE_NUMBER" is "mmcblk1p1"
but, if you can't find anything with "mmcblk1"
#then, search "mmcblk0" there.
# if it only shows these 2 files: mmcblk0 and mmcblk0p1
# then, "YOUR_DEVICE_NUMBER" is "mmcblk0p1"
so, "YOUR_DEVICE_NUMBER" is actually either "mmcblk0p1" or "mmcblk1p1"
WARNING: (If you format any wrong system's internal storages partition, your device will most likely be bricked!)
Understand?
---
#---Format your microSD part with f2fs---#
simply unmount the memory card from Settings > Storage.
then, launch Terminal Emulator/ Termux App
(make sure you have root)
enter below 2 commands one by one:
su
make_f2fs -f /dev/block/YOUR_DEVICE_NUMBER
#---Formated successfully---#
-----
Now reboot your device
After reboot your device show a notification that your Memory Card is corrupted!
(because most of the android system can't mount anything except fat/exFAT for Memory Card - it's normal)
---
to mount the microSD (Memory Card),
Launch Terminal/Termux: and, enter below lines one by one:
(YOU NEED TO ENTER THESE LINES EVERY TIME AFTER YOU REBOOT YOUR DEVICE)
su
mkdir -p /mnt/extsd
mkdir -p /sdcard/_MemoryCard_
# Mount f2fs-microSD at /mnt/extsd
mount -t f2fs -o rw,nosuid,nodev,noatime,noexec,discard,fsync_mode=nobarrier /dev/block/platform/soc/*.sdhci/mmcblk*p1 /mnt/extsd
# Bind using sdcardfs f2fs-microSD from /mnt/extsd to /sdcard/_MemoryCard_
mount -t sdcardfs -o rw,nosuid,nodev,noatime,noexec,fsuid=1023,fsgid=1023,gid=9997,mask=2 /mnt/microSD /mnt/runtime/default/emulated/0/_MemoryCard_
----
Now,
microSD is mounted under Internal Storage's _MemoryCard_ folder.
---------
(Extra things)
If you dont want to show Memory Card Corrupted (annoying) Notification on each boot,
simply edit your /vendor/etc/fstab* file.
(it will be under : /vendor/etc/fstab.qcom or /vendor/etc/fstab.default or /vendor/etc/fstab.emmc)
(if you have more that one fstab, edit all)
Edit fstab* :
Find the line contains
"/devices/platform/soc/ ......... /mmc_host*"
add a "#" at the starting of that line (without quotation marks)
and save that file.
Reboot your device.
Now, It won't show any corruption device notification.
Hey everyone,
I have pulled a block of encrypted userdata partition ".img" and trying to mount it on unecnrypted device (same device with encryption set to off). My device is rooted
I have tried these steps
1. Pulled the block on local system using adb pull - userdata_block.img
2. mounted the block on an unencrypted device over CIFS using busybox mount command - userdata_block is virtually present on /sdcard/temp/userdata_block.img
3. Want to mount this img file on device to check the directory status on Android 11 if all the directories are encrypted or not.
/system/bin/losetup /dev/block/loop2 /sdcard/temp/userdata_block.img
/system/bin/mount -o ro /dev/block/loop2 /sdcard/dummy
Getting below error on Android 11, same command works fine on Android 10.
mount: /dev/block/loop2: need -t
Does anyone has any idea how to fix this?