[HOWTO] Combined emulated storage for the Nexus S (LVM) [NEW CM11: 20150726-NIGHTLY]

Search This thread

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020
Combined emulated storage for the Nexus S (LVM)

UPDATE! NEW CM11 ROM, version: 20150726-NIGHTLY

This is a guide to make your Nexus S use an internal emulated SDcard, and mount it using MTP (just like the Nexus 4 and newer smartphones)!
In order to do that, we have to enable the Logical volume partitioning (LVM) on our rom and recovery, using this great guide. Kudos to @steven676 because without him, this wouldn't be possible.

The end result is this:

mZIbkCL.png


in a Nexus S running latest CM11 M12

It’s going to be a long run, so take your time. This is a summary of what we are going to do:

Summary:

  1. TAKE A FULL BACKUP OF EVERYTHING, INCLUDING SDCARD! EVERYTHING WILL BE ERASED! WE ABSOLUTELY NEED A TWRP BACKUP!
  2. Create a modified recovery Use my custom built TWRP recovery, which will recognize the logical volumes and use the internal storage as SDcard
  3. Create the specified logical volumes
  4. Reboot into the recovery, and restore the twrp backup
  5. Modify the updater-script of the ROM you want to use and change the partition directories
  6. Create a modified boot image.
  7. Archive the modified boot image inside the rom .zip
  8. Create a modified framework-res.apk
  9. Archive the modified framework-res.apk inside the ROM .zip
  10. Copy the now-ready ROM .zip inside the mounted storage, and install it
  11. Boot into CM11 with ~13GB data+sdcard combined storage!

Requirements:

  1. My git repository: https://github.com/KreAch3R/crespo-lvm-emulated-storage
  2. LVM repository: https://github.com/steven676/android-lvm-mod
  3. A ROM .zip (CM11-M12)
  4. A kernel boot.img (as of M12, I used stock)(Guru kernel)http://xdaforums.com/nexus-s/development/kernel-guru-t2783561
  5. A custom built TWRP recovery (you can download mine from the Downloads post, or build it yourself)
  6. Android SDK tools configured on your PC (ADB running etc)
  7. Android Image Kitchen
  8. Apktool 2 (setup and ready, using this guide and this file (renamed to apktool.jar).
  9. Basic linux, terminal, adb knowledge

This is my first guide, so any help is appreciated! I have used these steps and they worked for me, but YMMV. I will try to help you as much as I can, but you should be aware that using this guide may brick your phone. Please, be patient, read the guide carefully, take any precautions you want, and of course, I cannot be held responsible for whatever happens to your device. You are following this guide with your own risk (DISCLAIMER). Also, please excuse my wrong terminology, if there is any, and correct any mistakes.

So, if you are ready, let's start!
 
Last edited:

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020
Instructions

  1. BACKUP, BACKUP, BACKUP!

    Backup everything you can, we need a nandroid backup, sdcard backup, etc. Try to imagine you have lost your phone, and backup what you would have missed!



    [*]USE MY CUSTOM BUILT TWRP RECOVERY

    Or, if you want to modify it yourself folllow the instructions:

    If you only want to take an existing build of a recovery and modify it to accept and recognize LVM volumes, but you don't care about the internal media storage depicted as sdcard, follow the steps below:


    • Unpack the recovery image you want using the Android Image Kitchen
    • Copy the contents of lvm-bin/ in the lvm repository to lvm/ in the ramdisk folder
    • Copy devices/crespo/lvm.conf to lvm/etc/lvm.conf in the ramdisk folder
    • Intergrate the changes from my git files
      (NOTE: I think fstab.herring and recovery.fstab should be identical to fstab.herring from boot.img, and twrp.fstab should be the only different, - but it is just a theory, not tested)
    • Repack
    • Flash using fastboot

    If you want to compile your own TWRP build and make it accept LVM, you have to build TWRP from source using @daxxter 's build flags from this post (c/p here for clarity):

    BoardConfig.mk (device_samsung_crespo):
    Code:
    PRODUCT_COPY_FILES += device/samsung/crespo/twrp.fstab:recovery/root/etc/twrp.fstab
    DEVICE_RESOLUTION := 480x800
    RECOVERY_SDCARD_ON_DATA := true
    RECOVERY_GRAPHICS_USE_LINELENGTH := true
    BOARD_HAS_NO_REAL_SDCARD := true
    TW_NO_USB_STORAGE := true
    
    TW_INTERNAL_STORAGE_PATH := "/data/media"
    TW_INTERNAL_STORAGE_MOUNT_POINT := "data"

    twrp.fstab
    Code:
    # mount point	fstype		device
    
    /system		ext4		/dev/lvpool/system
    /cache		yaffs2		cache
    /data		ext4		/dev/lvpool/userdata
    /misc 		mtd 		misc
    /boot		mtd		boot
    /recovery	        mtd		recovery
    /bootloader	mtd		bootloader
    /radio		mtd		radio
    /efs                  yaffs2      efs   flags=display="EFS";backup=1;canbewiped

    You also have to include the other modifications needed for LVM, such as the LVM folder and the necessary changes to init.rc. I suppose you can incorporate them in the building process, possibly doing modifications in the crespo tree files, but I didn't build it this way because I didn't think of it at the time, so the process is undocumented. I just built the modified twrp and then used the above process (with apktool) to make the lvm changes. Gross and ugly, I know, but I learn with all of this, too. Next time will be better.





    [*]CREATE SPECIFIED LOGICAL VOLUMES


    I created 2 logical partitions on the device, on top of the mmcblk0p1, mmcblk0p2, mmcblk0p3 partitions.

    LVs:
    • /dev/lvpool/system 1G
    • /dev/lvpool/userdata 13.5G

    Gracious command sharing by @RappyBMX :
    Code:
    # adb shell
    # /lvm/sbin/lvm pvcreate /dev/block/mmcblk0p1 /dev/block/mmcblk0p2 /dev/block/mmcblk0p3
    # /lvm/sbin/lvm vgcreate lvpool /dev/block/mmcblk0p1 /dev/block/mmcblk0p2 /dev/block/mmcblk0p3
    # /lvm/sbin/lvm lvcreate -L 1G -n system lvpool
    # /lvm/sbin/lvm lvcreate -L 13G -n userdata lvpool

    OLD WAY:
    Android OS is supposed to only recognize and mount the first two, (/system and /userdata). SDcard is created and symlinked in the /data/media folder, as per official Google examples.
    TWRP Recovery, on the other hand, can mount all three of them, and uses the "media" partition as sdcard storage. I had to hack it like that for now, because I could not build the twrp recovery from source, using the correct make-configs (32bit system only here!), and the current crespo recovery can't recognize the emulated storage correctly, at least as far as I could try.

    NOTE #2:
    The plan is to build a correctly modified twrp for this crespo configuration when I get to my main PC and ditch the /lvpool/media partition. At this point I should mention that /media/ for a recovery-only partition is a terrible name, but I was following the lvm guide to the point, and I didn’t have time to re-do it just for a name change. If you want to change it, also change it in every .fstab file / mount point you find it.

    CURRENT WAY:
    Android OS is recognizing and mounting /system and /userdata as /data. The SDcard is created and symlinked in the /data/media folder, as per official Google examples.

    Steps:
    • Boot into the recovery you just created (hope it boots)
    • Use the LVM guide and give the necessary lvm commands to create the logical volumes (ATTENTION! THIS WILL ERASE EVERYTHING!)
    • Reboot
    • Advanced format /system to ext4
    • Advanced format /data (type "yes")
    • Full Wipe-factory reset
      In general, format everything you can to ext4 to make TWRP recognize them. No harm done, as your device is empty.
    • Now our phone is ready to take our modified rom.zip, once we build it!




    [*]ROM UPDATER-SCRIPT

    • Open the ROM .zip and navigate to the updater-script. Replace the block partitions with the logical ones (I didn’t mess with ‘EMMC’ tag at all). Example, from this:
      Code:
      mount("ext4", "EMMC", "/dev/block/platform/s3c-sdhci.0/by-name/userdata ", "/data")
      To this:
      Code:
      mount("ext4", "EMMC", "/dev/lvpool/userdata", "/data")
    • Save the file.

    This is an example of a working updater-script file (the one used in my latest LVM-CM11-M12 rom):
    Code:
    assert(getprop("ro.product.device") == "crespo" ||
           getprop("ro.build.product") == "crespo" ||
           abort("This package is for device: crespo; this device is " + getprop("ro.product.device") + "."););
    mount("ext4", "EMMC", "/dev/lvpool/system", "/system");
    package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");
    package_extract_file("system/bin/backuptool.functions", "/tmp/backuptool.functions");
    set_metadata("/tmp/backuptool.sh", "uid", 0, "gid", 0, "mode", 0755);
    set_metadata("/tmp/backuptool.functions", "uid", 0, "gid", 0, "mode", 0644);
    run_program("/tmp/backuptool.sh", "backup");
    unmount("/system");
    show_progress(0.500000, 0);
    mount("ext4", "EMMC", "/dev/lvpool/userdata", "/data");
    package_extract_file("system/bin/otasigcheck.sh", "/tmp/otasigcheck.sh");
    package_extract_file("META-INF/org/cyanogenmod/releasekey", "/tmp/releasekey");
    set_metadata("/tmp/otasigcheck.sh", "uid", 0, "gid", 0, "mode", 0755);
    run_program("/tmp/otasigcheck.sh");
    sha1_check(read_file("/tmp/releasekey"),"7241e92725436afc79389d4fc2333a2aa8c20230") && abort("Can't install this package on top of incompatible data. Please try another package or run a factory reset");
    unmount("/data");
    format("ext4", "EMMC", "/dev/lvpool/system", "0", "/system");
    mount("ext4", "EMMC", "/dev/lvpool/system", "/system");
    package_extract_dir("recovery", "/system");
    package_extract_dir("system", "/system");
    symlink("../bin/fsck.f2fs", "/system/bin/dump.f2fs");
    symlink("../xbin/su", "/system/bin/su");
    symlink("Roboto-Bold.ttf", "/system/fonts/DroidSans-Bold.ttf");
    symlink("Roboto-Regular.ttf", "/system/fonts/DroidSans.ttf");
    symlink("busybox", "/system/xbin/[", "/system/xbin/[[",
            "/system/xbin/adjtimex", "/system/xbin/arp", "/system/xbin/ash",
            "/system/xbin/awk", "/system/xbin/base64", "/system/xbin/basename",
            "/system/xbin/bbconfig", "/system/xbin/blkid", "/system/xbin/blockdev",
            "/system/xbin/brctl", "/system/xbin/bunzip2", "/system/xbin/bzcat",
            "/system/xbin/bzip2", "/system/xbin/cal", "/system/xbin/cat",
            "/system/xbin/catv", "/system/xbin/chattr", "/system/xbin/chcon",
            "/system/xbin/chgrp", "/system/xbin/chmod", "/system/xbin/chown",
            "/system/xbin/chroot", "/system/xbin/chvt", "/system/xbin/clear",
            "/system/xbin/cmp", "/system/xbin/comm", "/system/xbin/cp",
            "/system/xbin/cpio", "/system/xbin/crond", "/system/xbin/crontab",
            "/system/xbin/cut", "/system/xbin/date", "/system/xbin/dc",
            "/system/xbin/dd", "/system/xbin/deallocvt", "/system/xbin/depmod",
            "/system/xbin/devmem", "/system/xbin/df", "/system/xbin/diff",
            "/system/xbin/dirname", "/system/xbin/dmesg", "/system/xbin/dnsd",
            "/system/xbin/dos2unix", "/system/xbin/du", "/system/xbin/echo",
            "/system/xbin/ed", "/system/xbin/egrep", "/system/xbin/env",
            "/system/xbin/expand", "/system/xbin/expr", "/system/xbin/false",
            "/system/xbin/fbsplash", "/system/xbin/fdisk", "/system/xbin/fgconsole",
            "/system/xbin/fgrep", "/system/xbin/find", "/system/xbin/findfs",
            "/system/xbin/flash_lock", "/system/xbin/flash_unlock",
            "/system/xbin/flashcp", "/system/xbin/flock", "/system/xbin/fold",
            "/system/xbin/free", "/system/xbin/freeramdisk", "/system/xbin/fstrim",
            "/system/xbin/fsync", "/system/xbin/ftpget", "/system/xbin/ftpput",
            "/system/xbin/fuser", "/system/xbin/getenforce", "/system/xbin/getopt",
            "/system/xbin/getsebool", "/system/xbin/grep", "/system/xbin/groups",
            "/system/xbin/gunzip", "/system/xbin/gzip", "/system/xbin/halt",
            "/system/xbin/head", "/system/xbin/hexdump", "/system/xbin/hwclock",
            "/system/xbin/id", "/system/xbin/ifconfig", "/system/xbin/inetd",
            "/system/xbin/insmod", "/system/xbin/install", "/system/xbin/ionice",
            "/system/xbin/iostat", "/system/xbin/ip", "/system/xbin/kill",
            "/system/xbin/killall", "/system/xbin/killall5", "/system/xbin/less",
            "/system/xbin/ln", "/system/xbin/losetup", "/system/xbin/ls",
            "/system/xbin/lsattr", "/system/xbin/lsmod", "/system/xbin/lspci",
            "/system/xbin/lsusb", "/system/xbin/lzcat", "/system/xbin/lzma",
            "/system/xbin/lzop", "/system/xbin/lzopcat", "/system/xbin/man",
            "/system/xbin/matchpathcon", "/system/xbin/md5sum", "/system/xbin/mesg",
            "/system/xbin/mkdir", "/system/xbin/mke2fs", "/system/xbin/mkfifo",
            "/system/xbin/mkfs.ext2", "/system/xbin/mkfs.vfat",
            "/system/xbin/mknod", "/system/xbin/mkswap", "/system/xbin/mktemp",
            "/system/xbin/modinfo", "/system/xbin/modprobe", "/system/xbin/more",
            "/system/xbin/mount", "/system/xbin/mountpoint", "/system/xbin/mpstat",
            "/system/xbin/mv", "/system/xbin/nanddump", "/system/xbin/nandwrite",
            "/system/xbin/nbd-client", "/system/xbin/netstat", "/system/xbin/nice",
            "/system/xbin/nmeter", "/system/xbin/nohup", "/system/xbin/nslookup",
            "/system/xbin/ntpd", "/system/xbin/od", "/system/xbin/openvt",
            "/system/xbin/patch", "/system/xbin/pgrep", "/system/xbin/pidof",
            "/system/xbin/ping", "/system/xbin/pipe_progress", "/system/xbin/pkill",
            "/system/xbin/pmap", "/system/xbin/poweroff", "/system/xbin/printenv",
            "/system/xbin/printf", "/system/xbin/ps", "/system/xbin/pstree",
            "/system/xbin/pwd", "/system/xbin/pwdx", "/system/xbin/rdate",
            "/system/xbin/rdev", "/system/xbin/readlink", "/system/xbin/realpath",
            "/system/xbin/renice", "/system/xbin/reset", "/system/xbin/resize",
            "/system/xbin/restorecon", "/system/xbin/rev", "/system/xbin/rm",
            "/system/xbin/rmdir", "/system/xbin/rmmod", "/system/xbin/route",
            "/system/xbin/run-parts", "/system/xbin/runcon", "/system/xbin/rx",
            "/system/xbin/sed", "/system/xbin/selinuxenabled", "/system/xbin/seq",
            "/system/xbin/sestatus", "/system/xbin/setconsole",
            "/system/xbin/setenforce", "/system/xbin/setfiles",
            "/system/xbin/setkeycodes", "/system/xbin/setsebool",
            "/system/xbin/setserial", "/system/xbin/setsid", "/system/xbin/sh",
            "/system/xbin/sha1sum", "/system/xbin/sha256sum",
            "/system/xbin/sha3sum", "/system/xbin/sha512sum", "/system/xbin/sleep",
            "/system/xbin/smemcap", "/system/xbin/sort", "/system/xbin/split",
            "/system/xbin/stat", "/system/xbin/strings", "/system/xbin/stty",
            "/system/xbin/sum", "/system/xbin/swapoff", "/system/xbin/swapon",
            "/system/xbin/sync", "/system/xbin/sysctl", "/system/xbin/tac",
            "/system/xbin/tail", "/system/xbin/tar", "/system/xbin/taskset",
            "/system/xbin/tee", "/system/xbin/telnet", "/system/xbin/telnetd",
            "/system/xbin/test", "/system/xbin/tftp", "/system/xbin/tftpd",
            "/system/xbin/time", "/system/xbin/timeout", "/system/xbin/top",
            "/system/xbin/touch", "/system/xbin/tr", "/system/xbin/traceroute",
            "/system/xbin/true", "/system/xbin/ttysize", "/system/xbin/tune2fs",
            "/system/xbin/umount", "/system/xbin/uname", "/system/xbin/uncompress",
            "/system/xbin/unexpand", "/system/xbin/uniq", "/system/xbin/unix2dos",
            "/system/xbin/unlzma", "/system/xbin/unlzop", "/system/xbin/unxz",
            "/system/xbin/unzip", "/system/xbin/uptime", "/system/xbin/usleep",
            "/system/xbin/uudecode", "/system/xbin/uuencode", "/system/xbin/vi",
            "/system/xbin/watch", "/system/xbin/wc", "/system/xbin/wget",
            "/system/xbin/which", "/system/xbin/whoami", "/system/xbin/xargs",
            "/system/xbin/xz", "/system/xbin/xzcat", "/system/xbin/yes",
            "/system/xbin/zcat");
    symlink("libGLESv2.so", "/system/lib/libGLESv3.so");
    symlink("logcat", "/system/bin/lolcat");
    symlink("mksh", "/system/bin/sh");
    symlink("mount.exfat", "/system/bin/fsck.exfat",
            "/system/bin/mkfs.exfat");
    symlink("pigz", "/system/xbin/unpigz");
    symlink("toolbox", "/system/bin/cat", "/system/bin/chcon",
            "/system/bin/chmod", "/system/bin/chown", "/system/bin/clear",
            "/system/bin/cmp", "/system/bin/cp", "/system/bin/date",
            "/system/bin/dd", "/system/bin/df", "/system/bin/dmesg",
            "/system/bin/du", "/system/bin/getenforce", "/system/bin/getevent",
            "/system/bin/getprop", "/system/bin/getsebool", "/system/bin/grep",
            "/system/bin/hd", "/system/bin/id", "/system/bin/ifconfig",
            "/system/bin/iftop", "/system/bin/insmod", "/system/bin/ioctl",
            "/system/bin/ionice", "/system/bin/kill", "/system/bin/ln",
            "/system/bin/load_policy", "/system/bin/log", "/system/bin/ls",
            "/system/bin/lsmod", "/system/bin/lsof", "/system/bin/md5",
            "/system/bin/mkdir", "/system/bin/mkswap", "/system/bin/mount",
            "/system/bin/mv", "/system/bin/nandread", "/system/bin/netstat",
            "/system/bin/newfs_msdos", "/system/bin/notify", "/system/bin/printenv",
            "/system/bin/ps", "/system/bin/r", "/system/bin/readlink",
            "/system/bin/renice", "/system/bin/restart", "/system/bin/restorecon",
            "/system/bin/rm", "/system/bin/rmdir", "/system/bin/rmmod",
            "/system/bin/route", "/system/bin/runcon", "/system/bin/schedtop",
            "/system/bin/sendevent", "/system/bin/setconsole",
            "/system/bin/setenforce", "/system/bin/setfattr", "/system/bin/setprop",
            "/system/bin/setsebool", "/system/bin/sleep", "/system/bin/smd",
            "/system/bin/start", "/system/bin/stop", "/system/bin/swapoff",
            "/system/bin/swapon", "/system/bin/sync", "/system/bin/top",
            "/system/bin/touch", "/system/bin/umount", "/system/bin/uptime",
            "/system/bin/vmstat", "/system/bin/watchprops",
            "/system/bin/wipe");
    set_metadata_recursive("/system", "uid", 0, "gid", 0, "dmode", 0755, "fmode", 0644, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata_recursive("/system/addon.d", "uid", 0, "gid", 0, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata_recursive("/system/bin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/bin/app_process", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:zygote_exec:s0");
    set_metadata("/system/bin/clatd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:clatd_exec:s0");
    set_metadata("/system/bin/debuggerd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:debuggerd_exec:s0");
    set_metadata("/system/bin/dhcpcd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:dhcp_exec:s0");
    set_metadata("/system/bin/dnsmasq", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:dnsmasq_exec:s0");
    set_metadata("/system/bin/drmserver", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:drmserver_exec:s0");
    set_metadata("/system/bin/hostapd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:hostapd_exec:s0");
    set_metadata("/system/bin/installd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:installd_exec:s0");
    set_metadata("/system/bin/keystore", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:keystore_exec:s0");
    set_metadata("/system/bin/mediaserver", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:mediaserver_exec:s0");
    set_metadata("/system/bin/mksh", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:shell_exec:s0");
    set_metadata("/system/bin/mtpd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:mtp_exec:s0");
    set_metadata("/system/bin/netcfg", "uid", 0, "gid", 3003, "mode", 02750, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/bin/netd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:netd_exec:s0");
    set_metadata("/system/bin/ping", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:ping_exec:s0");
    set_metadata("/system/bin/pppd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:ppp_exec:s0");
    set_metadata("/system/bin/racoon", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:racoon_exec:s0");
    set_metadata("/system/bin/rild", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:rild_exec:s0");
    set_metadata("/system/bin/run-as", "uid", 0, "gid", 2000, "mode", 0750, "capabilities", 0xc0, "selabel", "u:object_r:runas_exec:s0");
    set_metadata("/system/bin/sdcard", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:sdcardd_exec:s0");
    set_metadata("/system/bin/servicemanager", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:servicemanager_exec:s0");
    set_metadata("/system/bin/surfaceflinger", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:surfaceflinger_exec:s0");
    set_metadata("/system/bin/vold", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:vold_exec:s0");
    set_metadata("/system/bin/wpa_supplicant", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:wpa_exec:s0");
    set_metadata_recursive("/system/etc/dhcpcd", "uid", 0, "gid", 0, "dmode", 0755, "fmode", 0644, "capabilities", 0x0, "selabel", "u:object_r:dhcp_system_file:s0");
    set_metadata("/system/etc/dhcpcd/dhcpcd-run-hooks", "uid", 1014, "gid", 2000, "mode", 0550, "capabilities", 0x0, "selabel", "u:object_r:dhcp_system_file:s0");
    set_metadata_recursive("/system/etc/init.d", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/etc/init.d", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/etc/install-cm-recovery.sh", "uid", 0, "gid", 0, "mode", 0544, "capabilities", 0x0);
    set_metadata_recursive("/system/etc/ppp", "uid", 0, "gid", 0, "dmode", 0755, "fmode", 0555, "capabilities", 0x0, "selabel", "u:object_r:ppp_system_file:s0");
    set_metadata("/system/recovery-from-boot.p", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
    set_metadata("/system/vendor", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata_recursive("/system/vendor/bin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:gpsd_exec:s0");
    set_metadata("/system/vendor/bin", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/vendor/bin/pvrsrvinit", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:pvrsrvinit_exec:s0");
    set_metadata("/system/vendor/etc", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/vendor/firmware", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/vendor/lib", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/vendor/lib/egl", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/vendor/lib/hw", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata_recursive("/system/xbin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/xbin/librank", "uid", 0, "gid", 0, "mode", 06755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/xbin/procmem", "uid", 0, "gid", 0, "mode", 06755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/xbin/procrank", "uid", 0, "gid", 0, "mode", 06755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
    set_metadata("/system/xbin/su", "uid", 0, "gid", 0, "mode", 06755, "capabilities", 0x0, "selabel", "u:object_r:su_exec:s0");
    show_progress(0.200000, 0);
    delete("/system/bin/otasigcheck.sh");
    show_progress(0.200000, 10);
    package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");
    package_extract_file("system/bin/backuptool.functions", "/tmp/backuptool.functions");
    set_metadata("/tmp/backuptool.sh", "uid", 0, "gid", 0, "mode", 0755);
    set_metadata("/tmp/backuptool.functions", "uid", 0, "gid", 0, "mode", 0644);
    run_program("/tmp/backuptool.sh", "restore");
    delete("/system/bin/backuptool.sh");
    delete("/system/bin/backuptool.functions");
    show_progress(0.200000, 10);
    package_extract_file("boot.img", "/tmp/boot.img");write_raw_image("/tmp/boot.img", "boot");
    show_progress(0.100000, 0);
    unmount("/system");




    [*]MODIFY BOOT.IMG


    • Unpack boot.img
    • Copy the contents of lvm-bin/ in the git repository to lvm/ in the ramdisk folder.
    • 2)Copy devices/crespo/lvm.conf to lvm/etc/lvm.conf in the ramdisk folder.
    • Intergrate the changes for the following files: fstab.herring, init.herring.rc, init.herring.usb.rc, default.prop
    • Repack



    [*]UPDATE ROM .ZIP W/ NEW BOOT.IMG


    Open the ROM .zip again and drag ‘n’ drop the kernel boot.img inside. It should replace the other one.



    [*]MODIFY FRAMEWORK-RES.APK


    • Extract the .apk from the ROM .zip
    • Install the framework to apktool [apktool if ...]
    • Decode the framework-res.apk [apktool d ...]
    • Intergrate the changes
    • Build the .apk [apktool b ...]
    • Open simultaneously the created apk and the unmodified one. Drag ‘n’ drop the changed file from the created one to the unmodified. Save the unmodified file. Be careful to use the now-modified-previously-unmodified .apk from now on.

    TIP: DO NOT use spaces in the apktool directories. Keep it simple to avoid errors.



    [*]UPDATE ROM .ZIP W/ NEW FRAMEWORK-RES.APK


    Open the ROM .zip again, drag ‘n’ drop the new framework-res.apk inside /system/framework, and save the file.



    [*]INSTALLATION


    Copy the modified ROM .zip inside the mounted USB storage. Install it using the recovery.



    [*]BOOT


    Let’s hope that everything went as planned and now you are rocking a Nexus S with a ~13GB combined internal storage! MTP should work, too.
 
Last edited:

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020

Attachments

  • lvm-twrp-ext4-2.8.4.0.img
    6.4 MB · Views: 214
Last edited:

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020
So, this is it. I hope I covered all edges, and did not make any mistakes (it is a big guide). Please let me know if something is wrong, or you have any suggestions or advice.
 
Last edited:

cshnz

Senior Member
Nov 11, 2013
58
30
did the partition is compatible with art?can i install much app in art mode? :confused:
 

Zeratul91

Senior Member
Jan 9, 2012
90
38
Hi!
I'm trying to follow your guide but i'm struck with the twrp recovery, i can boot in the twrp but the recovery doesn't mount any partition and i can't lunch the lvm commands from the other thread (i got "permission denied"). So i made successfully to the lvm partitions with the modded clockwork recovery, format the usb storage, copy the twrp backup and the reflash the modded twrp but even after that the twrp recovery won't mount anything and won't find the backup.
I'll attach my twrp img, can you post yours or help me someway?
 

Attachments

  • openrecovery-twrp-2.7.1.0-crespo.img
    5.8 MB · Views: 69

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020
did the partition is compatible with art?can i install much app in art mode? :confused:

I have not tried ART at all, sorry. You can install many apps using the Dalvik runtime, though, just like any other phone. :)

Hi!
I'm trying to follow your guide but i'm struck with the twrp recovery, i can boot in the twrp but the recovery doesn't mount any partition and i can't lunch the lvm commands from the other thread (i got "permission denied"). So i made successfully to the lvm partitions with the modded clockwork recovery, format the usb storage, copy the twrp backup and the reflash the modded twrp but even after that the twrp recovery won't mount anything and won't find the backup.
I'll attach my twrp img, can you post yours or help me someway?

Hello!

Your twrp.img looks fine! I couldn't understand if you managed to actually create the lvm partitions though. Did you get past this "permission denied" error?
If you are using Linux, try:
Code:
adb kill-server
sudo adb start-server
In Windows try to launch it using administrator privileges

Also, after "adb shell" you can try to "su".
Code:
adb shell
su

If you think you managed to create the lvs successfully, use this command:
Code:
#/lvm/sbin/lvm lvs

to actually see what you have created.

Did you use the same partitions names as the guide? If you changed something, you also change it in all the fstabs, too.

I flashed your recovery, and you are right, no partition is mounted. Re-flashed back to mine and everything works. I can't find any difference though! I will keep searching. For now wait 5 mins for the upload.

I have started uploading my twrp.img, my boot.img and my ROM .zip, to help you test things, I didn't think of that earlier. I will post the links ASAP.
 
Last edited:

Zeratul91

Senior Member
Jan 9, 2012
90
38
Hello!

Your twrp.img looks fine! I couldn't understand if you managed to actually create the lvm partitions though. Did you get past this "permission denied" error?
If you are using Linux, try:
Code:
adb kill-server
sudo adb start-server
In Windows try to launch it using administrator privileges

Also, after "adb shell" you can try to "su".
Code:
adb shell
su

If you think you managed to create the lvs successfully, use this command:
Code:
#/lvm/sbin/lvm lvs

to actually see what you have created.

Did you use the same partitions names as the guide? If you changed something, you also change it in all the fstabs, too.

I flashed your recovery, and you are right, no partition is mounted. Re-flashed back to mine though and everything works. I can't find any difference though! I will keep searching. For now wait 5 mins for the upload.

I have started uploading my twrp.img, my boot.img and my ROM .zip, to help you test things, I didn't think of that earlier. I will post the links ASAP.

I created the partitions with the names and sizes you said using the modded clockwork from the steven676's guide, I lunched #/lvm/sbin/lvm lvs under clockwork and everything was right and i formatted the 1gb media partition as FAT. TWRP wouldn't anything, not even mount the usb storage, and the adb shell would give me "~ # ←[6n" and permission denied with every command
 

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020
I created the partitions with the names and sizes you said using the modded clockwork from the steven676's guide, I lunched #/lvm/sbin/lvm lvs under clockwork and everything was right and i formatted the 1gb media partition as FAT. TWRP wouldn't anything, not even mount the usb storage, and the adb shell would give me "~ # ←[6n" and permission denied with every command

Let's take this one step at a time. Grab the twrp image from the third post and test it. I can't understand what I forgot to include to the instructions. Testing now.

UPDATE: I think I found the culprit. Are you using Linux or Windows? your "lvm/sbin'lvm" file didn't have executing permissions.
Code:
cd /ramdisk/lvm/sbin
chmod +x lvm
Once I changed that, the twrp recovery worked. I don't know why yours was different from mine, I didn't have to change that.
 
Last edited:

Zeratul91

Senior Member
Jan 9, 2012
90
38
Let's take this one step at a time. Grab the twrp image from the third post and test it. I can't understand what I forgot to include to the instructions. Testing now.

UPDATE: I think I found the culprit. Are you using Linux or Windows? your "lvm/sbin'lvm" file didn't have executing permissions.
Code:
cd /ramdisk/lvm/sbin
chmod +x lvm
Once I changed that, the twrp recovery worked. I don't know why yours was different from mine, I didn't have to change that.

Unfortunately I'm on windows :S
BRB I'm going to try with your files

EDIT

I flashed your twrp, now i can use lvm commands and i created successfully the partitions:

Code:
C:\android-sdk-windows\platform-tools>adb shell
~ # ←[6n/lvm/sbin/lvm lvs
/lvm/sbin/lvm lvs
File descriptor 8 (/dev/__properties__) leaked on lvm invocation. Parent PID 120
: /sbin/sh
File descriptor 9 (socket:[1993]) leaked on lvm invocation. Parent PID 120: /sbi
n/sh
  LV       VG     Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert
  media    lvpool -wi-ao---   1.00g
  system   lvpool -wi-a---- 552.00m
  userdata lvpool -wi-a----  13.00g

Now i should format the 1gb media to fat, but usb storage mount does nothing and i still get "unable to mount" error in the twrp log
 
Last edited:

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020
Unfortunately I'm on windows :S

I guess Windows created the permission error, then.

I flashed your twrp, now i can use lvm commands and i created successfully the partitions:
...
Now i should format the 1gb media to fat, but usb storage mount does nothing

I don't know if that is going to work in Windows, but try to go to Disk Management, and see if your usb storage is seen. It shouldn't popup a "new removable media" detected, it has to be formatted first.

In Lubuntu, I had to go to the "Disks" program, and locate the usb storage there.

and i still get "unable to mount" error in the twrp log

Unable to mount what? /system or /data?
 

Zeratul91

Senior Member
Jan 9, 2012
90
38
I guess Windows created the permission error, then.



I don't know if that is going to work in Windows, but try to go to Disk Management, and see if your usb storage is seen. It shouldn't popup a "new removable media" detected, it has to be formatted first.

In Lubuntu, I had to go to the "Disks" program, and locate the usb storage there.



Unable to mount what? /system or /data?

Ok i managed to do the trick, i did a manual wipe from twrp then i rebooted the recovery and successfully mounted all the partitions, then I adb pushed your rom and simply flashed it and it booted with the single virtual partition :cool:. Now i copying all my stuff back again on the phone and i will try to flash the euroskank build i modded
 

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020
Ok i managed to do the trick, i did a manual wipe from twrp then i rebooted the recovery and successfully mounted all the partitions, then I adb pushed your rom and simply flashed it and it booted with the single virtual partition :cool:. Now i copying all my stuff back again on the phone and i will try to flash the euroskank build i modded

I am glad! Good job.:good: Report back if everything is working correctly (or not :p). :)
 

Zeratul91

Senior Member
Jan 9, 2012
90
38
I am glad! Good job.:good: Report back if everything is working correctly (or not :p). :)

After the flash the rom would boot (the first boot takes very long) but most of the apps like camera crash and the MTP usb is somehow broken... I suppose I also messed up the framework-res.apk mod :crying:...
I attached the modded framework
 

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020
After the flash the rom would boot (the first boot takes very long) but most of the apps like camera crash and the MTP usb is somehow broken... I suppose I also messed up the framework-res.apk mod :crying:...
I attached the modded framework

I have a working camera and MTP. Does this happen to my ROM, too? If it doesn't, that something is off in your edits. Did you make the appropriate boot changes to the euroskank boot.img? I don't know if the Guru boot .img is compatible.

Please share the unmodified framewok-res.apk from the euroskank build to let me help you. Did you follow the drag 'n' drop procedure?

EDIT The framework-res.apk you attached is not modded:
Code:
 <storage android:mountPoint="/storage/sdcard0" android:storageDescription="@string/storage_usb" android:primary="true" android:allowMassStorage="true" android:maxFileSize="4096" />
 
Last edited:

Zeratul91

Senior Member
Jan 9, 2012
90
38
I have a working camera and MTP. Does this happen to my ROM, too? If it doesn't, that something is off in your edits. Did you make the appropriate boot changes to the euroskank boot.img? I don't know if the Guru boot .img is compatible.

Please share the unmodified framewok-res.apk from the euroskank build to let me help you. Did you follow the drag 'n' drop procedure?

Your rom works fine and guru is compatible (i used your boot.img), I used android multitool to decompile and recompile the apk then i used 7zip to copy androindmanifest.xml and resources.arsc from the old apk to the new
 

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020
Your rom works fine and guru is compatible (i used your boot.img), I used android multitool to decompile and recompile the apk then i used 7zip to copy androindmanifest.xml and resources.arsc from the old apk to the new

Ah, I see. Android Image Kitchen has a windows version, why don't you try with that, too, to eliminate differences between our setups?

Nevertheless, using your setup (android multitool), try to just copy storage_list.xml from the new apk to the old one, and use this file.

The second attached framework-res.apk is still unmodded:
Code:
<?xml version="1.0" encoding="utf-8"?>
<StorageList
  xmlns:android="http://schemas.android.com/apk/res/android">
    <storage android:mountPoint="/storage/sdcard0" android:storageDescription="@string/storage_usb" android:primary="true" android:allowMassStorage="true" android:maxFileSize="4096" />
</StorageList>
 

Zeratul91

Senior Member
Jan 9, 2012
90
38
Ah, I see. Android Image Kitchen has a windows version, why don't you try with that, too, to eliminate differences between our setups?

Nevertheless, using your setup (android multitool), try to just copy storage_list.xml from the new apk to the old one, and use this file.

The second attached framework-res.apk is still unmodded:
Code:
<?xml version="1.0" encoding="utf-8"?>
<StorageList
  xmlns:android="http://schemas.android.com/apk/res/android">
    <storage android:mountPoint="/storage/sdcard0" android:storageDescription="@string/storage_usb" android:primary="true" android:allowMassStorage="true" android:maxFileSize="4096" />
</StorageList>

Sorry I attached the same file, my pc is full of frameworks at this point lol...
I used android image kitchen to mod the twrp img but as you have seen windows is no good to do this kind of stuff :S

BTW seems I made it :good:, I hope no geek reads this:
I opened with 7zip your rom and the untouched euroskank and I drag'n'dropped updater-script, boot.img and storagelist.xml to the latter and... it works!
 
  • Like
Reactions: KreAch3R

KreAch3R

Inactive Recognized Developer
Nov 15, 2010
1,080
2,020
Sorry I attached the same file, my pc is full of frameworks at this point lol...
I used android image kitchen to mod the twrp img but as you have seen windows is no good to do this kind of stuff :S

BTW seems I made it :good:, I hope no geek reads this:
I opened with 7zip your rom and the untouched euroskank and I drag'n'dropped updater-script, boot.img and storagelist.xml to the latter and... it works!

For reference only, Android Image Kitchen shouldn't be responsible for the "Permissions denied" error, it has to do with the Windows filesystem.

After all, well done! Enjoy your new storage! I will try to start a FAQ from our encounter, and I will include your tip!
 
  • Like
Reactions: Zeratul91

Top Liked Posts

  • There are no posts matching your filters.
  • 17
    Combined emulated storage for the Nexus S (LVM)

    UPDATE! NEW CM11 ROM, version: 20150726-NIGHTLY

    This is a guide to make your Nexus S use an internal emulated SDcard, and mount it using MTP (just like the Nexus 4 and newer smartphones)!
    In order to do that, we have to enable the Logical volume partitioning (LVM) on our rom and recovery, using this great guide. Kudos to @steven676 because without him, this wouldn't be possible.

    The end result is this:

    mZIbkCL.png


    in a Nexus S running latest CM11 M12

    It’s going to be a long run, so take your time. This is a summary of what we are going to do:

    Summary:

    1. TAKE A FULL BACKUP OF EVERYTHING, INCLUDING SDCARD! EVERYTHING WILL BE ERASED! WE ABSOLUTELY NEED A TWRP BACKUP!
    2. Create a modified recovery Use my custom built TWRP recovery, which will recognize the logical volumes and use the internal storage as SDcard
    3. Create the specified logical volumes
    4. Reboot into the recovery, and restore the twrp backup
    5. Modify the updater-script of the ROM you want to use and change the partition directories
    6. Create a modified boot image.
    7. Archive the modified boot image inside the rom .zip
    8. Create a modified framework-res.apk
    9. Archive the modified framework-res.apk inside the ROM .zip
    10. Copy the now-ready ROM .zip inside the mounted storage, and install it
    11. Boot into CM11 with ~13GB data+sdcard combined storage!

    Requirements:

    1. My git repository: https://github.com/KreAch3R/crespo-lvm-emulated-storage
    2. LVM repository: https://github.com/steven676/android-lvm-mod
    3. A ROM .zip (CM11-M12)
    4. A kernel boot.img (as of M12, I used stock)(Guru kernel)http://xdaforums.com/nexus-s/development/kernel-guru-t2783561
    5. A custom built TWRP recovery (you can download mine from the Downloads post, or build it yourself)
    6. Android SDK tools configured on your PC (ADB running etc)
    7. Android Image Kitchen
    8. Apktool 2 (setup and ready, using this guide and this file (renamed to apktool.jar).
    9. Basic linux, terminal, adb knowledge

    This is my first guide, so any help is appreciated! I have used these steps and they worked for me, but YMMV. I will try to help you as much as I can, but you should be aware that using this guide may brick your phone. Please, be patient, read the guide carefully, take any precautions you want, and of course, I cannot be held responsible for whatever happens to your device. You are following this guide with your own risk (DISCLAIMER). Also, please excuse my wrong terminology, if there is any, and correct any mistakes.

    So, if you are ready, let's start!
    11
    Instructions

    1. BACKUP, BACKUP, BACKUP!

      Backup everything you can, we need a nandroid backup, sdcard backup, etc. Try to imagine you have lost your phone, and backup what you would have missed!



      [*]USE MY CUSTOM BUILT TWRP RECOVERY

      Or, if you want to modify it yourself folllow the instructions:

      If you only want to take an existing build of a recovery and modify it to accept and recognize LVM volumes, but you don't care about the internal media storage depicted as sdcard, follow the steps below:


      • Unpack the recovery image you want using the Android Image Kitchen
      • Copy the contents of lvm-bin/ in the lvm repository to lvm/ in the ramdisk folder
      • Copy devices/crespo/lvm.conf to lvm/etc/lvm.conf in the ramdisk folder
      • Intergrate the changes from my git files
        (NOTE: I think fstab.herring and recovery.fstab should be identical to fstab.herring from boot.img, and twrp.fstab should be the only different, - but it is just a theory, not tested)
      • Repack
      • Flash using fastboot

      If you want to compile your own TWRP build and make it accept LVM, you have to build TWRP from source using @daxxter 's build flags from this post (c/p here for clarity):

      BoardConfig.mk (device_samsung_crespo):
      Code:
      PRODUCT_COPY_FILES += device/samsung/crespo/twrp.fstab:recovery/root/etc/twrp.fstab
      DEVICE_RESOLUTION := 480x800
      RECOVERY_SDCARD_ON_DATA := true
      RECOVERY_GRAPHICS_USE_LINELENGTH := true
      BOARD_HAS_NO_REAL_SDCARD := true
      TW_NO_USB_STORAGE := true
      
      TW_INTERNAL_STORAGE_PATH := "/data/media"
      TW_INTERNAL_STORAGE_MOUNT_POINT := "data"

      twrp.fstab
      Code:
      # mount point	fstype		device
      
      /system		ext4		/dev/lvpool/system
      /cache		yaffs2		cache
      /data		ext4		/dev/lvpool/userdata
      /misc 		mtd 		misc
      /boot		mtd		boot
      /recovery	        mtd		recovery
      /bootloader	mtd		bootloader
      /radio		mtd		radio
      /efs                  yaffs2      efs   flags=display="EFS";backup=1;canbewiped

      You also have to include the other modifications needed for LVM, such as the LVM folder and the necessary changes to init.rc. I suppose you can incorporate them in the building process, possibly doing modifications in the crespo tree files, but I didn't build it this way because I didn't think of it at the time, so the process is undocumented. I just built the modified twrp and then used the above process (with apktool) to make the lvm changes. Gross and ugly, I know, but I learn with all of this, too. Next time will be better.





      [*]CREATE SPECIFIED LOGICAL VOLUMES


      I created 2 logical partitions on the device, on top of the mmcblk0p1, mmcblk0p2, mmcblk0p3 partitions.

      LVs:
      • /dev/lvpool/system 1G
      • /dev/lvpool/userdata 13.5G

      Gracious command sharing by @RappyBMX :
      Code:
      # adb shell
      # /lvm/sbin/lvm pvcreate /dev/block/mmcblk0p1 /dev/block/mmcblk0p2 /dev/block/mmcblk0p3
      # /lvm/sbin/lvm vgcreate lvpool /dev/block/mmcblk0p1 /dev/block/mmcblk0p2 /dev/block/mmcblk0p3
      # /lvm/sbin/lvm lvcreate -L 1G -n system lvpool
      # /lvm/sbin/lvm lvcreate -L 13G -n userdata lvpool

      OLD WAY:
      Android OS is supposed to only recognize and mount the first two, (/system and /userdata). SDcard is created and symlinked in the /data/media folder, as per official Google examples.
      TWRP Recovery, on the other hand, can mount all three of them, and uses the "media" partition as sdcard storage. I had to hack it like that for now, because I could not build the twrp recovery from source, using the correct make-configs (32bit system only here!), and the current crespo recovery can't recognize the emulated storage correctly, at least as far as I could try.

      NOTE #2:
      The plan is to build a correctly modified twrp for this crespo configuration when I get to my main PC and ditch the /lvpool/media partition. At this point I should mention that /media/ for a recovery-only partition is a terrible name, but I was following the lvm guide to the point, and I didn’t have time to re-do it just for a name change. If you want to change it, also change it in every .fstab file / mount point you find it.

      CURRENT WAY:
      Android OS is recognizing and mounting /system and /userdata as /data. The SDcard is created and symlinked in the /data/media folder, as per official Google examples.

      Steps:
      • Boot into the recovery you just created (hope it boots)
      • Use the LVM guide and give the necessary lvm commands to create the logical volumes (ATTENTION! THIS WILL ERASE EVERYTHING!)
      • Reboot
      • Advanced format /system to ext4
      • Advanced format /data (type "yes")
      • Full Wipe-factory reset
        In general, format everything you can to ext4 to make TWRP recognize them. No harm done, as your device is empty.
      • Now our phone is ready to take our modified rom.zip, once we build it!




      [*]ROM UPDATER-SCRIPT

      • Open the ROM .zip and navigate to the updater-script. Replace the block partitions with the logical ones (I didn’t mess with ‘EMMC’ tag at all). Example, from this:
        Code:
        mount("ext4", "EMMC", "/dev/block/platform/s3c-sdhci.0/by-name/userdata ", "/data")
        To this:
        Code:
        mount("ext4", "EMMC", "/dev/lvpool/userdata", "/data")
      • Save the file.

      This is an example of a working updater-script file (the one used in my latest LVM-CM11-M12 rom):
      Code:
      assert(getprop("ro.product.device") == "crespo" ||
             getprop("ro.build.product") == "crespo" ||
             abort("This package is for device: crespo; this device is " + getprop("ro.product.device") + "."););
      mount("ext4", "EMMC", "/dev/lvpool/system", "/system");
      package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");
      package_extract_file("system/bin/backuptool.functions", "/tmp/backuptool.functions");
      set_metadata("/tmp/backuptool.sh", "uid", 0, "gid", 0, "mode", 0755);
      set_metadata("/tmp/backuptool.functions", "uid", 0, "gid", 0, "mode", 0644);
      run_program("/tmp/backuptool.sh", "backup");
      unmount("/system");
      show_progress(0.500000, 0);
      mount("ext4", "EMMC", "/dev/lvpool/userdata", "/data");
      package_extract_file("system/bin/otasigcheck.sh", "/tmp/otasigcheck.sh");
      package_extract_file("META-INF/org/cyanogenmod/releasekey", "/tmp/releasekey");
      set_metadata("/tmp/otasigcheck.sh", "uid", 0, "gid", 0, "mode", 0755);
      run_program("/tmp/otasigcheck.sh");
      sha1_check(read_file("/tmp/releasekey"),"7241e92725436afc79389d4fc2333a2aa8c20230") && abort("Can't install this package on top of incompatible data. Please try another package or run a factory reset");
      unmount("/data");
      format("ext4", "EMMC", "/dev/lvpool/system", "0", "/system");
      mount("ext4", "EMMC", "/dev/lvpool/system", "/system");
      package_extract_dir("recovery", "/system");
      package_extract_dir("system", "/system");
      symlink("../bin/fsck.f2fs", "/system/bin/dump.f2fs");
      symlink("../xbin/su", "/system/bin/su");
      symlink("Roboto-Bold.ttf", "/system/fonts/DroidSans-Bold.ttf");
      symlink("Roboto-Regular.ttf", "/system/fonts/DroidSans.ttf");
      symlink("busybox", "/system/xbin/[", "/system/xbin/[[",
              "/system/xbin/adjtimex", "/system/xbin/arp", "/system/xbin/ash",
              "/system/xbin/awk", "/system/xbin/base64", "/system/xbin/basename",
              "/system/xbin/bbconfig", "/system/xbin/blkid", "/system/xbin/blockdev",
              "/system/xbin/brctl", "/system/xbin/bunzip2", "/system/xbin/bzcat",
              "/system/xbin/bzip2", "/system/xbin/cal", "/system/xbin/cat",
              "/system/xbin/catv", "/system/xbin/chattr", "/system/xbin/chcon",
              "/system/xbin/chgrp", "/system/xbin/chmod", "/system/xbin/chown",
              "/system/xbin/chroot", "/system/xbin/chvt", "/system/xbin/clear",
              "/system/xbin/cmp", "/system/xbin/comm", "/system/xbin/cp",
              "/system/xbin/cpio", "/system/xbin/crond", "/system/xbin/crontab",
              "/system/xbin/cut", "/system/xbin/date", "/system/xbin/dc",
              "/system/xbin/dd", "/system/xbin/deallocvt", "/system/xbin/depmod",
              "/system/xbin/devmem", "/system/xbin/df", "/system/xbin/diff",
              "/system/xbin/dirname", "/system/xbin/dmesg", "/system/xbin/dnsd",
              "/system/xbin/dos2unix", "/system/xbin/du", "/system/xbin/echo",
              "/system/xbin/ed", "/system/xbin/egrep", "/system/xbin/env",
              "/system/xbin/expand", "/system/xbin/expr", "/system/xbin/false",
              "/system/xbin/fbsplash", "/system/xbin/fdisk", "/system/xbin/fgconsole",
              "/system/xbin/fgrep", "/system/xbin/find", "/system/xbin/findfs",
              "/system/xbin/flash_lock", "/system/xbin/flash_unlock",
              "/system/xbin/flashcp", "/system/xbin/flock", "/system/xbin/fold",
              "/system/xbin/free", "/system/xbin/freeramdisk", "/system/xbin/fstrim",
              "/system/xbin/fsync", "/system/xbin/ftpget", "/system/xbin/ftpput",
              "/system/xbin/fuser", "/system/xbin/getenforce", "/system/xbin/getopt",
              "/system/xbin/getsebool", "/system/xbin/grep", "/system/xbin/groups",
              "/system/xbin/gunzip", "/system/xbin/gzip", "/system/xbin/halt",
              "/system/xbin/head", "/system/xbin/hexdump", "/system/xbin/hwclock",
              "/system/xbin/id", "/system/xbin/ifconfig", "/system/xbin/inetd",
              "/system/xbin/insmod", "/system/xbin/install", "/system/xbin/ionice",
              "/system/xbin/iostat", "/system/xbin/ip", "/system/xbin/kill",
              "/system/xbin/killall", "/system/xbin/killall5", "/system/xbin/less",
              "/system/xbin/ln", "/system/xbin/losetup", "/system/xbin/ls",
              "/system/xbin/lsattr", "/system/xbin/lsmod", "/system/xbin/lspci",
              "/system/xbin/lsusb", "/system/xbin/lzcat", "/system/xbin/lzma",
              "/system/xbin/lzop", "/system/xbin/lzopcat", "/system/xbin/man",
              "/system/xbin/matchpathcon", "/system/xbin/md5sum", "/system/xbin/mesg",
              "/system/xbin/mkdir", "/system/xbin/mke2fs", "/system/xbin/mkfifo",
              "/system/xbin/mkfs.ext2", "/system/xbin/mkfs.vfat",
              "/system/xbin/mknod", "/system/xbin/mkswap", "/system/xbin/mktemp",
              "/system/xbin/modinfo", "/system/xbin/modprobe", "/system/xbin/more",
              "/system/xbin/mount", "/system/xbin/mountpoint", "/system/xbin/mpstat",
              "/system/xbin/mv", "/system/xbin/nanddump", "/system/xbin/nandwrite",
              "/system/xbin/nbd-client", "/system/xbin/netstat", "/system/xbin/nice",
              "/system/xbin/nmeter", "/system/xbin/nohup", "/system/xbin/nslookup",
              "/system/xbin/ntpd", "/system/xbin/od", "/system/xbin/openvt",
              "/system/xbin/patch", "/system/xbin/pgrep", "/system/xbin/pidof",
              "/system/xbin/ping", "/system/xbin/pipe_progress", "/system/xbin/pkill",
              "/system/xbin/pmap", "/system/xbin/poweroff", "/system/xbin/printenv",
              "/system/xbin/printf", "/system/xbin/ps", "/system/xbin/pstree",
              "/system/xbin/pwd", "/system/xbin/pwdx", "/system/xbin/rdate",
              "/system/xbin/rdev", "/system/xbin/readlink", "/system/xbin/realpath",
              "/system/xbin/renice", "/system/xbin/reset", "/system/xbin/resize",
              "/system/xbin/restorecon", "/system/xbin/rev", "/system/xbin/rm",
              "/system/xbin/rmdir", "/system/xbin/rmmod", "/system/xbin/route",
              "/system/xbin/run-parts", "/system/xbin/runcon", "/system/xbin/rx",
              "/system/xbin/sed", "/system/xbin/selinuxenabled", "/system/xbin/seq",
              "/system/xbin/sestatus", "/system/xbin/setconsole",
              "/system/xbin/setenforce", "/system/xbin/setfiles",
              "/system/xbin/setkeycodes", "/system/xbin/setsebool",
              "/system/xbin/setserial", "/system/xbin/setsid", "/system/xbin/sh",
              "/system/xbin/sha1sum", "/system/xbin/sha256sum",
              "/system/xbin/sha3sum", "/system/xbin/sha512sum", "/system/xbin/sleep",
              "/system/xbin/smemcap", "/system/xbin/sort", "/system/xbin/split",
              "/system/xbin/stat", "/system/xbin/strings", "/system/xbin/stty",
              "/system/xbin/sum", "/system/xbin/swapoff", "/system/xbin/swapon",
              "/system/xbin/sync", "/system/xbin/sysctl", "/system/xbin/tac",
              "/system/xbin/tail", "/system/xbin/tar", "/system/xbin/taskset",
              "/system/xbin/tee", "/system/xbin/telnet", "/system/xbin/telnetd",
              "/system/xbin/test", "/system/xbin/tftp", "/system/xbin/tftpd",
              "/system/xbin/time", "/system/xbin/timeout", "/system/xbin/top",
              "/system/xbin/touch", "/system/xbin/tr", "/system/xbin/traceroute",
              "/system/xbin/true", "/system/xbin/ttysize", "/system/xbin/tune2fs",
              "/system/xbin/umount", "/system/xbin/uname", "/system/xbin/uncompress",
              "/system/xbin/unexpand", "/system/xbin/uniq", "/system/xbin/unix2dos",
              "/system/xbin/unlzma", "/system/xbin/unlzop", "/system/xbin/unxz",
              "/system/xbin/unzip", "/system/xbin/uptime", "/system/xbin/usleep",
              "/system/xbin/uudecode", "/system/xbin/uuencode", "/system/xbin/vi",
              "/system/xbin/watch", "/system/xbin/wc", "/system/xbin/wget",
              "/system/xbin/which", "/system/xbin/whoami", "/system/xbin/xargs",
              "/system/xbin/xz", "/system/xbin/xzcat", "/system/xbin/yes",
              "/system/xbin/zcat");
      symlink("libGLESv2.so", "/system/lib/libGLESv3.so");
      symlink("logcat", "/system/bin/lolcat");
      symlink("mksh", "/system/bin/sh");
      symlink("mount.exfat", "/system/bin/fsck.exfat",
              "/system/bin/mkfs.exfat");
      symlink("pigz", "/system/xbin/unpigz");
      symlink("toolbox", "/system/bin/cat", "/system/bin/chcon",
              "/system/bin/chmod", "/system/bin/chown", "/system/bin/clear",
              "/system/bin/cmp", "/system/bin/cp", "/system/bin/date",
              "/system/bin/dd", "/system/bin/df", "/system/bin/dmesg",
              "/system/bin/du", "/system/bin/getenforce", "/system/bin/getevent",
              "/system/bin/getprop", "/system/bin/getsebool", "/system/bin/grep",
              "/system/bin/hd", "/system/bin/id", "/system/bin/ifconfig",
              "/system/bin/iftop", "/system/bin/insmod", "/system/bin/ioctl",
              "/system/bin/ionice", "/system/bin/kill", "/system/bin/ln",
              "/system/bin/load_policy", "/system/bin/log", "/system/bin/ls",
              "/system/bin/lsmod", "/system/bin/lsof", "/system/bin/md5",
              "/system/bin/mkdir", "/system/bin/mkswap", "/system/bin/mount",
              "/system/bin/mv", "/system/bin/nandread", "/system/bin/netstat",
              "/system/bin/newfs_msdos", "/system/bin/notify", "/system/bin/printenv",
              "/system/bin/ps", "/system/bin/r", "/system/bin/readlink",
              "/system/bin/renice", "/system/bin/restart", "/system/bin/restorecon",
              "/system/bin/rm", "/system/bin/rmdir", "/system/bin/rmmod",
              "/system/bin/route", "/system/bin/runcon", "/system/bin/schedtop",
              "/system/bin/sendevent", "/system/bin/setconsole",
              "/system/bin/setenforce", "/system/bin/setfattr", "/system/bin/setprop",
              "/system/bin/setsebool", "/system/bin/sleep", "/system/bin/smd",
              "/system/bin/start", "/system/bin/stop", "/system/bin/swapoff",
              "/system/bin/swapon", "/system/bin/sync", "/system/bin/top",
              "/system/bin/touch", "/system/bin/umount", "/system/bin/uptime",
              "/system/bin/vmstat", "/system/bin/watchprops",
              "/system/bin/wipe");
      set_metadata_recursive("/system", "uid", 0, "gid", 0, "dmode", 0755, "fmode", 0644, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata_recursive("/system/addon.d", "uid", 0, "gid", 0, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata_recursive("/system/bin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/bin/app_process", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:zygote_exec:s0");
      set_metadata("/system/bin/clatd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:clatd_exec:s0");
      set_metadata("/system/bin/debuggerd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:debuggerd_exec:s0");
      set_metadata("/system/bin/dhcpcd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:dhcp_exec:s0");
      set_metadata("/system/bin/dnsmasq", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:dnsmasq_exec:s0");
      set_metadata("/system/bin/drmserver", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:drmserver_exec:s0");
      set_metadata("/system/bin/hostapd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:hostapd_exec:s0");
      set_metadata("/system/bin/installd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:installd_exec:s0");
      set_metadata("/system/bin/keystore", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:keystore_exec:s0");
      set_metadata("/system/bin/mediaserver", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:mediaserver_exec:s0");
      set_metadata("/system/bin/mksh", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:shell_exec:s0");
      set_metadata("/system/bin/mtpd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:mtp_exec:s0");
      set_metadata("/system/bin/netcfg", "uid", 0, "gid", 3003, "mode", 02750, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/bin/netd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:netd_exec:s0");
      set_metadata("/system/bin/ping", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:ping_exec:s0");
      set_metadata("/system/bin/pppd", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:ppp_exec:s0");
      set_metadata("/system/bin/racoon", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:racoon_exec:s0");
      set_metadata("/system/bin/rild", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:rild_exec:s0");
      set_metadata("/system/bin/run-as", "uid", 0, "gid", 2000, "mode", 0750, "capabilities", 0xc0, "selabel", "u:object_r:runas_exec:s0");
      set_metadata("/system/bin/sdcard", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:sdcardd_exec:s0");
      set_metadata("/system/bin/servicemanager", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:servicemanager_exec:s0");
      set_metadata("/system/bin/surfaceflinger", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:surfaceflinger_exec:s0");
      set_metadata("/system/bin/vold", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:vold_exec:s0");
      set_metadata("/system/bin/wpa_supplicant", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:wpa_exec:s0");
      set_metadata_recursive("/system/etc/dhcpcd", "uid", 0, "gid", 0, "dmode", 0755, "fmode", 0644, "capabilities", 0x0, "selabel", "u:object_r:dhcp_system_file:s0");
      set_metadata("/system/etc/dhcpcd/dhcpcd-run-hooks", "uid", 1014, "gid", 2000, "mode", 0550, "capabilities", 0x0, "selabel", "u:object_r:dhcp_system_file:s0");
      set_metadata_recursive("/system/etc/init.d", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/etc/init.d", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/etc/install-cm-recovery.sh", "uid", 0, "gid", 0, "mode", 0544, "capabilities", 0x0);
      set_metadata_recursive("/system/etc/ppp", "uid", 0, "gid", 0, "dmode", 0755, "fmode", 0555, "capabilities", 0x0, "selabel", "u:object_r:ppp_system_file:s0");
      set_metadata("/system/recovery-from-boot.p", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
      set_metadata("/system/vendor", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata_recursive("/system/vendor/bin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:gpsd_exec:s0");
      set_metadata("/system/vendor/bin", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/vendor/bin/pvrsrvinit", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:pvrsrvinit_exec:s0");
      set_metadata("/system/vendor/etc", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/vendor/firmware", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/vendor/lib", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/vendor/lib/egl", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/vendor/lib/hw", "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata_recursive("/system/xbin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/xbin/librank", "uid", 0, "gid", 0, "mode", 06755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/xbin/procmem", "uid", 0, "gid", 0, "mode", 06755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/xbin/procrank", "uid", 0, "gid", 0, "mode", 06755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
      set_metadata("/system/xbin/su", "uid", 0, "gid", 0, "mode", 06755, "capabilities", 0x0, "selabel", "u:object_r:su_exec:s0");
      show_progress(0.200000, 0);
      delete("/system/bin/otasigcheck.sh");
      show_progress(0.200000, 10);
      package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");
      package_extract_file("system/bin/backuptool.functions", "/tmp/backuptool.functions");
      set_metadata("/tmp/backuptool.sh", "uid", 0, "gid", 0, "mode", 0755);
      set_metadata("/tmp/backuptool.functions", "uid", 0, "gid", 0, "mode", 0644);
      run_program("/tmp/backuptool.sh", "restore");
      delete("/system/bin/backuptool.sh");
      delete("/system/bin/backuptool.functions");
      show_progress(0.200000, 10);
      package_extract_file("boot.img", "/tmp/boot.img");write_raw_image("/tmp/boot.img", "boot");
      show_progress(0.100000, 0);
      unmount("/system");




      [*]MODIFY BOOT.IMG


      • Unpack boot.img
      • Copy the contents of lvm-bin/ in the git repository to lvm/ in the ramdisk folder.
      • 2)Copy devices/crespo/lvm.conf to lvm/etc/lvm.conf in the ramdisk folder.
      • Intergrate the changes for the following files: fstab.herring, init.herring.rc, init.herring.usb.rc, default.prop
      • Repack



      [*]UPDATE ROM .ZIP W/ NEW BOOT.IMG


      Open the ROM .zip again and drag ‘n’ drop the kernel boot.img inside. It should replace the other one.



      [*]MODIFY FRAMEWORK-RES.APK


      • Extract the .apk from the ROM .zip
      • Install the framework to apktool [apktool if ...]
      • Decode the framework-res.apk [apktool d ...]
      • Intergrate the changes
      • Build the .apk [apktool b ...]
      • Open simultaneously the created apk and the unmodified one. Drag ‘n’ drop the changed file from the created one to the unmodified. Save the unmodified file. Be careful to use the now-modified-previously-unmodified .apk from now on.

      TIP: DO NOT use spaces in the apktool directories. Keep it simple to avoid errors.



      [*]UPDATE ROM .ZIP W/ NEW FRAMEWORK-RES.APK


      Open the ROM .zip again, drag ‘n’ drop the new framework-res.apk inside /system/framework, and save the file.



      [*]INSTALLATION


      Copy the modified ROM .zip inside the mounted USB storage. Install it using the recovery.



      [*]BOOT


      Let’s hope that everything went as planned and now you are rocking a Nexus S with a ~13GB combined internal storage! MTP should work, too.
    6
    Downloads

    My TWRP, BOOT, ROM files, if you want to use them (MOVED TO AFH):

    AFH LINK IS DOWN WITH NO LOCAL BACKUPS, SORRY :(
    Current Download: CM11-20150726-NIGHTLY ROM (08/2015)
    CM11-20150726-NIGHTLY ROM


    Here is a CM11-M11 ROM File (11/2014) I found lying around:
    CM11-M11-LVM-emulatedSD-guru101.zip

    NEW FILE!: custom built 2.8.4.0 TWRP
    @daxxter 's custom built TWRP 2.8.0.0 recovery (modifed by me for ext4)



    CM11-M9 ROM Files (9/2014)

    Mediafire links:
    TWRP Recovery
    BOOT img
    CM11-M9 ROM
    3
    It works - SlimKat ROM with LVM support

    I guess then that it is indeed something different in Slimkat. I will get to play with my Nexus S around April. If you are still using it, I will let you know my findings. If you have any problems with my CM11 mod, let me know. :D

    Hello @KreAch3R
    I managed to get SlimKat running properly with LVM support. I didn't have to do much - just added your LVM related changes to SlimKat and it worked like a charm. I don't know why it did't work the last time (may be I had missed something that time)
    Here's what I did:-
    1. Take the latest SlimKat ROM (9.0-WEEKLY-8321)
    2. Replace its kernel with your lvm supported kernel of CM12
    3. Replace its framework-res.apk with the one provided by you a few weeks back.
    And we are ready to roll.

    A SlimKat ROM with entire 16GB available for apps - Its like a dream come true for us crespo users. I hope to use this ROM for a long time now (crespo is still my main phone - can't afford to keep trying new ROMs daily). I also believe next time I will flash an L ROM - it probably would be on a new phone :(

    This is the best farewell I could have expected for my Nexus. Ton of thanks to you. None of this would have been possible without you. I have just collected pieces from your original work into a different ROM. You are doing a great job. Continue the work. Who knows we may have similar kind of great farewell for bacon in 2020 :)

    Even though its easy to "create" this LVM-Supported-SlimKat ROM, I will still upload it - may save some effort for other users.

    Here's the link to ROM - http://www.mediafire.com/download/j7imvg94ep34crg/LVM-Slim-crespo-4.4.4.build.9.0-WEEKLY-8321.zip
    2
    Please do share it! I am going to try it, and whoever else wants to, and if everything looks ok for other users too, I will update the guide to add your version!

    I haven't built a recovery yet, but if I understand correctly, you have to use some specific build options in the Make Config, is that correct? Can you share those?

    I will push tomorrow morning the device and kernel trees on GitHub and share the source code.

    I will also upload the boot.img and recovery.img for anyone that wants to use the precompiled ones.

    The flags you need to build the TWRP, assuming that you already using the android_bootable_recovery tree from Omnirom source are place in the BoardConfig.Mk.

    I will quote those as well in the morning.

    I am still working on some kernel modifications because i used as base CM11-M9 with some merges from @ekerazha 's Guru kernel but different configuration in the make file. The above gives good performance overall but fails 3D tests and some times there is stutter in the Google Camera app and on occasions the videos fail to load.

    I might abandon this kernel and start from scratch with Bedalus Marmite v10.3 as source to bring it to where i will be happy.

    In any case, more tomorrow.

    See ya.