Skip to content

Converting Cache and Preload to LVM

Marcin Kaluza edited this page Jan 21, 2015 · 16 revisions

BIG FAT WARNING

LVM in terms of Android is an advanced feature. In terms of custom roms it's an advanced and potentially dangerous feature.

Potential problems with ROMs

Using other kernel

HELP!!!

HELP! I did as you said I should not do and it's not booting! And it ate my cat!!!

I can't help you fix it because there are many things that can go wrong (see warning above). But reverting all the changes is easy:

  1. Reboot into recovery (ignore any errors) and login with adb
  2. ensure that /efs is mounted by typing mount or df. if not, mount it mount -t ext4 /dev/block/mmcblk00p7 /efs
  3. Remove lvm.cpio.gz and fstab.samsungjanice rm -f /efs/common/lvm.cpio.gz /efs/common/overlay/fstab.samsungjanice
  4. Recreate /cache filesystem mkfs.ext4 /dev/block/mmcblk0p4
  5. Recreate /preload filesystem mkfs.ext4 /dev/block/mmcblk0p9

There's nothing we can do for the cat though... get another...

Converting /preload and /cache to lvm

Prerequisites

You need to be using kernel 5.3.0 or higher

Download lvm.cpio.gz from MediaFire plugins folrder and place it in /efs/common/

Copy /fstab.samsungjanice to /efs/common/overlay/ and edit it - comment out /preload and /cache lines

Create /efs/common/overlay/fstab.lvm with the following line:

/dev/vg00/cache /cache ext4 noatime,nosuid,nodev,journal_async_commit,discard,data=writeback wait

Reboot into recovery. Recovery will complain about being unable to access /cache - that's ok.

Type mount or df and ensure that neither /preload or /cache are mounted

Commands

Remember to copy/paste all the commands to avoid typos

Create physical volumes

pvcreate /dev/block/mmcblk0p4
pvcreate /dev/block/mmcblk0p9

Create volume group

vgcreate -s 16M vg00 /dev/block/mmcblk0p4 /dev/block/mmcblk0p9

Create logical volume for cache (400M should be fine for a start) and ext4 filesystem on it

lvcreate -L 400M -n cache vg00
mke2fs -t ext4 -L cache -i $((32*1024)) -b 4096 -E stride=1024,stripe_width=1024,resize=$((7500*1024/4)) -m 0 -O sparse_super,filetype,dir_index,ext_attr,has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize /dev/vg01/cache
tune2fs -c 0 -i 0 -o nobarrier,discard /dev/vg00/cache

Transcript

~ # pvcreate /dev/block/mmcblk0p9
  Physical volume "/dev/block/mmcblk0p9" successfully created

~ # vgcreate -s 16M vg00 /dev/block/mmcblk0p9
  Volume group "vg00" successfully created

~ # mkdir /mnt/cache

~ # lvcreate -L 20M -n cache vg00
  Rounding up size to full physical extent 32.00 MiB
  Logical volume "cache" created

~ # cat /sys/block/mmcblk0/device/preferred_erase_size
4194304

~ # unzip /tmp/e2fsprogs-android-static-1.42.8-all.zip -d /tmp/
~ # mv /tmp/e2fsprogs-android-static-1.42.8/* /sbin/

~ # mke2fs -t ext4 -L cache -i $((32*1024)) -b 4096 -E stride=1024,stripe_width=1024,resize=$((7500*1024/4)) -m 0 -O sparse_super,filetype,dir_index,ext_attr,has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize /dev/vg01/cache
mke2fs 1.42.8 (20-Jun-2013)
Discarding device blocks: done
Filesystem label=cache
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=1024 blocks, Stripe width=1024 blocks
1024 inodes, 8192 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=8388608
1 block group
32768 blocks per group, 32768 fragments per group
1024 inodes per group

Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

~ # tune2fs -c 0 -i 0 -o nobarrier,discard /dev/vg00/cache
tune2fs 1.42.8 (20-Jun-2013)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds

~ # mount -t auto /dev/vg00/cache /mnt/cache/
~ # mount | grep cache
/dev/block/mmcblk0p4 on /cache type ext4 (rw,relatime,errors=panic,user_xattr,acl,barrier=1,journal_async_commit,data=ordered)
/dev/vg00/cache on /mnt/cache type ext4 (rw,relatime,user_xattr,acl,barrier=1,stripe=1024,data=ordered)

~ # find cache/ -depth -print | /system/xbin/cpio -vdp /mnt/cache/

~ # umount /cache
~ # mount /dev/vg00/cache  /cache/
~ # mkdir /cache/dalvik-cache

~ # pvcreate /dev/block/mmcblk0p4
  Physical volume "/dev/block/mmcblk0p4" successfully created

~ # vgextend vg00 /dev/block/mmcblk0p4
  Volume group "vg00" successfully extended

~ # lvresize -L400M vg00/cache
  Extending logical volume cache to 400.00 MiB
  Logical volume cache successfully resized

~ # resize2fs -f /dev/vg00/cache
resize2fs 1.42.8 (20-Jun-2013)
Resizing the filesystem on /dev/vg00/cache to 102400 (4k) blocks.
The filesystem on /dev/vg00/cache is now 102400 blocks long.

Clone this wiki locally