[Desire Android Development] sibere:
HI all.

I know it has been already done but I didn't find any detailed tutorial for the hTc Desire so I wrote one for you :)

Howto for a HTC desire with clockworkmod recovery:

I did this with a stock HTC sense 2.2 froyo rooted rom with init.d support and my own kernel, forked from richardtrip sense kernel v5e. I don't know for other ROMs or Kernels.

Your ROM must support init.d boot scripts.

What you need is:

* Fast µSD card (Class 4 or 6 recommended. Lots of issues reported with class 10 on the Desire)

* busybox (http://www.busybox.net/downloads/binaries/) on c:\

* Kernel

with EXT4 support. The kernel in original ROM does not provide ext4 support!!

* Rom with init.d script support (StarBurst (Froyo) or Supernova (Gingerbread) have a native DATA2SD support)

* If you already have app2sd+ or a similar script, don't do the following hack (or at your own risks) !!

* If you still want to try it, backup your A2SD scripts and roll-back to a pre-A2SD state. Don't ask me why it's not working, I never used APPs2SD so I can't help.

* To help you with ADB, you can use the GUI

If you feel a bit lazy or you're scared to make any mistake and want to skip all the manual installation, then go straight to the bottom of this post and download the flashable script made by droidzone. Many thanks to him!! You can also flash Supernova (Stock HTC gingerbread release) and you'll be good to go within no time.

If you already have this running but you flashed another rom, have a look here. droidzone posted another script to just update the rom you just flashed to get DATA2SD work properly

[size=+1]1/

Get yourself prepared

[/size]

A/ backup everything (nandroid).

B/ Make sure everything is backed-up

C/ Copy the content of you SD to your computer and keep it handy for a roll-back.

D/ make a copy !!!! (I think know that you've been warned )

[size=+1]2/

Make 2 primary Mb aligned partitions on your SD

[/size]

Primary partition 1

will be your usual storage, must be FAT32.

To optimize it, I really recommend to have a look here

Primary partition 2

will be your new storage (/data).

You can use gparted or fdisk (I do prefer fdisk and wrote a guide here ) to partition your SD; but it's up to you and Gparted is working great too.

Use the MB align option of gparted to align your partitions. This helps big time to get a better R/W speed.

With the latest busybox, you can do that on your phone in recovery mode.

You will need also e2fs progs. They're all attached at the bottom of this howto.

[size=+1]3/

Boot your phone in recovery and get it prepared

[/size]

Connect to your phone with "adb shell"

You should get a ~# prompt now.

mount /system

mount /data

mount /sdcard

exit

if mount /sdcard fails, try mount /dev/block/mmcblk0p1 /sdcard

You should get this as a result of a "mount" command:

~ # mount
mount
rootfs on / type rootfs (rw)
tmpfs on /dev type tmpfs (rw,relatime,mode=755)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
/dev/block/mtdblock4 on /cache type yaffs2 (rw,nodev,noatime,nodiratime)
/dev/block/mmcblk0p1 on /sdcard type vfat (rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,s
hortname=mixed,errors=remount-ro)
/dev/block/mtdblock3 on /system type yaffs2 (rw,relatime)
/dev/block/mtdblock5 on /data type yaffs2 (rw,relatime)

Replace you old busybox exec with the new one. It's located in /system/xbin/

adb push c:\busybox-armv6l /system/xbin/busybox

Add the script to init.d folder:

adb push c:\01data.txt /system/etc/init.d/01data

Add the fstab to /system/etc/

adb push c:\fstab.txt /system/etc/fstab

Extract e2fsprogs-arm.zip to c:\

Push all e2fs progs you've extracted from the zip to /system/bin/ the same way:

adb push c:\e2fsprogs\system\bin\e2fsck /system/bin/

adb push c:\e2fsprogs\system\bin\mke2fs /system/bin/

(etc.... for all apps)

Push all e2fs libs you've extracted from the zip to /system/lib/ the same way:

adb push c:\e2fsprogs\system\lib\libext2_blkid.so /system/lib/

adb push c:\e2fsprogs\system\lib\libext2_com_err.so /system/lib/

(etc... for all libs)

adb shell

cd /system/bin

chmod 755 e2fsck

chown 0.2000 e2fsck

(Do the same for all pushed apps.)

cd /system/lib

chmod 644 libext2*

chmod 755 /system/xbin/busybox

chown 0.0 /system/xbin/busybox

chmod 755 /system/etc/init.d/01data

chown 0.0 /system/etc/init.d/01data

Finally type this:

:> /system/etc/mtab

[size=+1]4/

Instant of creation

[/size]

cd /

For a non-journaled version:

/system/bin/mke2fs -T ext4 -b 4096 -E stride=64,stripe-width=64 -O ^has_journal,extent,^huge_file -m 0 -L userdata /dev/block/mmcblk0p2

For a journaled version (safety/AOSP ROMs):

/system/bin/mke2fs -T ext4 -b 4096 -E stride=64,stripe-width=64 -O extent,^huge_file -m 0 -L userdata /dev/block/mmcblk0p2

stride and stripe-width are RAID options but they are used here to align the filesystem to the max erase block size of an SD card. In conjunction with EXT4 extents feature (not present in ext3), it gives a bit of extra performance thanks to block allocation. It's used and recommended for SSDs, so it should help our poor little cheap (SSDs) SD cards :D

I use 64 because 64x4 (4kb block size)=256Kb. 256Kb is the max erase block size per the SD standards.

Your card may have a smaller erase block size but 256K is at least compatible with every card.

If you want to change the block allocation size, change the "64" parameter.

Just change it to - say - 32 (32x4=128kb) etc ...

Tune this to your actual erase block size if you know it.

If you want journaling (better data integrity) at the cost of performance and probably sd card wear, use the journaled option when you format the ext4 partition. Journal will also use some space on your EXT partition.

Read this article or my tutorial for more details on aligning partition and file system on linux.

I'd like to mention at this stage that fortunately, HTC has implemented a nice and clean unmount of /data at shutdown. Unless you remove your phone battery while it is running or android completely crashes and the cache hasn't been flushed to the sd card, you shouldn't suffer from data loss. In that case though, I've implemented a forced check of the data partition to try to recover any errors on the ext4 partition before booting the phone. You can expect to have a fair amount of safety without journal as long as you turn off your phone with standard HTC menu on sense ROMs :)

Anyway, if you want to try DATA2SD on a AOSP ROM, you *must* use a journal!

[size=+1]5/

verbatim

[/size]

type this:

mkdir /sd

/system/xbin/busybox mount -t ext4 /dev/block/mmcblk0p2 /sd

cd /data

cp -a * /sd

cd /

sync

All you data should copied now.

check with a "ls -l /sd" that you have a least the directory structure.

"df" should report the space used on the new filesystem and should be close to your /data.

/system/xbin/busybox umount /sd

[size=+1]6/

Reboot

[/size]

Reboot.

Move all you apps (if you have used the Froyo AP2SD) back to the phone, which is now the SD.

Reboot to get a clean and stable phone

Make sure that you don't install any app in the future to the SD. Some apps are installed automatically to SD, move them back to the phone if it is so.

[size=+1]7/

Comments

[/size]

IMHO, a readahead of 128kb could be a bit excessive and can penalise read speed when reading small amounts of data. I've reduced it on my phone to 64kb and noticed a slight improvement when for instance the phone reads data to show apps, icons and size when you open the application list in the settings/applications/manage applications menu. Some kernels have a default value of 4K. This is really bad for performance and it must be changed to get good read performance.

To change it, type this while android is running:

echo 64 > /sys/block/mmcblk0/queue/read_ahead_kb

This setting will be lost on reboot. Just add this line to the script if you want to keep it on reboot.

ownhere did a fantastic job at hacking the libsqlite.so library. I patched the original sense lib and I strongly recommend to replace it with the one attached below.

To do so, just boot into recovery mode, mount /system and backup your /system/lib/libsqlite.so file to your sdcard. Then push the patched lib to /system/lib/ and do a chmod 644 on the pushed file.

Reboot and VOILA! :D

Updates of the flashable ZIP are available here

If you're coming from previous version (2 FAT32 partitions, ext2 file and loop mount) and want to move to this new one, have a look at this post. You don't have to do everything from start and loose your data. You should get there all the needed info to backup your data and restore it to the new EXT4 partition.

ownhere posted a very interesting option to play with in this post. Apparently nodelalloc mount option is giving better score than delalloc on flash memories. I recently tested it and I had better Quadrant and TAP scores so check-it out!

If you want to impress your friends with Quadrant score, just add "noauto_da_alloc" in the mount option of the script or do this manually with adb shell : busybox mount -o remount,noauto_da_alloc /data

The effect is pretty similar on the final score than nodelalloc (at least on my phone/sdcard ;) )

To get back to normal: busybox mount -o remount,auto_da_alloc /data

(Got this setting from here).

It is simply making the system (thus Quadrant) working in cache (RAM) instead of the SD card.

I'm not sure that this settings improves that much real life usage, but at least you'll get what you're looking for: A super (fake) Quadrand I/O score :)

I may add this setting in future release of DATA2SD. I'm testing it ATM on my phone.

Many thanks to ownhere and melethron for all their thinkings at bringing issues, help and updates to get to this new version.

Many thanks to too droidzone for his great work on a flashable ZIP and integrating DATA2SD in his ROM to make your life easier you flash maniacs ;)

I hope that I didn't forget something. It's working for me so it should work for you.

Read the thread before asking a question !