Hi. I am creating this guide because i did not find any particular functional guide with details.
You must be running a 64 or 32 bit version of Ubuntu. Please note that i wont be going in the details on how to setup a build environment and sync sources as there are many guides for that.
Step 1 :
Install the required packages
Step 2 :
Setup the build environment and sync the sources for the required CWM. CWM source comes bundled with the CyanogenMod source.
Code:
CWM 5 - Gingerbread
CWM 6 - Jellybean
Step 3 :
Now we come to the actuall compiling part. Make sure you have synced the latest source using the "repo sync" command.
Change directory to your source.
Issue this command :
Code:
make -j4 otatools
Step 3.5 :
Do this step if your device is not officially supported by CM10.
Using terminal emulator on your device, issue the command
Code:
dump_image boot /sdcard/boot.img
This will dump the boot image to your sdcard. Transfer it to your home directory.
To build Android from source for a new device, you need to set up a board config and its makefiles. This is generally a long and tedious process. Luckily, if you are only building recovery, it is a lot easier. From the root of your Android source directory (assuming you've run envsetup.sh), run the following (substituting names appropriately):
Code:
build/tools/device/mkvendor.sh device_manufacturer_name device_name /your/path/to/the/boot.img
For example if you are having the Samsung Galaxy Ace device, the command will go as follows :
Code:
build/tools/device/mkvendor.sh Samsung cooper ~/boot.img
Please note that Cooper is the device name. Only use "~/boot.img" if you have the boot image in your home directory. Or else please specify the correct path.
You will receive the confirmation "Done!" if everything worked. The mkvendor.sh script will also have created the following directory in your Android source tree:
manufacturer_name/device_name
Step 3.5 ends here.
Step 4 :
Now that you have the device config ready, proceed.
Type the following code in your terminal in the source directory.
Code:
. build/envsetup.sh
This will setup the build environment for you to work.
Now launch the command
Code:
lunch full_device_name-eng
This will set the build system up to build for your new device. Open up the directory in a file explorer or IDE. You should have the following files: AndroidBoard.mk, AndroidProducts.mk, BoardConfig.mk, device_.mk, kernel, system.prop, recovery.fstab, and vendorsetup.sh.
The two files you are interested in are recovery.fstab and kernel. The kernel in that directory is the stock one that was extracted from the boot.img that was provided earlier. For the most part, recovery.fstab will work on most devices that have mtd, emmc, or otherwise named partitions. But if not, recovery.fstab will need to be tweaked to support mounts and their mount points. For example, if your /sdcard mount is /dev/block/mmcblk1p1, you would need the following lines in your BoardConfig.mk
/sdcard vfat /dev/block/mmcblk1p1
Once the recovery.fstab has been properly setup, you can proceed to the next step.
Step 5 :
Now we build the actual recovery.
Code:
make -j4 recoveryimage
This command builds the recovery image
You can use the command
Code:
make -j4 recoveryzip
to make a fakeflash recovery i.e. a temporary recovery to test out on the actual device.
Your recovery can then be found at "your_source_directory/OUT/target/product/device/recovery.img" and the temporary fakeflash zip in the utilities folder at the same location.
If everything works out well, you will have a working recovery.
Once you have working builds, notify "koush", on Github and he can build official releases and add ROM Manager support!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Some tips :
If you want to compile CWM 6, sync the jellybean branch using the command :
Code:
repo init -u git://github.com/CyanogenMod/android.git -b jellybean
repo sync
If you want to compile CWM 6 on a 32 bit system, you need to sync THIS source too. Instructions are given in the readme.
Run "make clobber" between builds if you change the BoardConfig.mk, or the change will not get picked up.
Credits :
Koush for this guide.
Nice.
Will come in handy
Excellent guide!
Thanks!
I will try on my Motorola PRO+, wish me luck
any ideeas how i can make the recovery font smaller? i read somewhere that i have to edit ui.c file, but what syntax? thanks
thank you for this
i will try to compile this
i tried before using koush online builder but the cwm has bugs.
Okay, I'm problly stupid, but.
repo init -u git://github.com/CyanogenMod/android.git -b jellybean
seems to work fine, but
repo sync does this:
Code:
fatal: '../CyanogenMod/android_abi_cpp.git' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
error: Cannot fetch CyanogenMod/android_abi_cpp
What did I screw up, or not have prepared correctly?
I have built AOSP and currently build kernels on this box, so I know git and all that is setup correctly.
D
.
edited
Got it. Needed an updated repo script.
D
.
what's this ?
shaaan said:
Hey guys, i present to you a new updated version of CyanogenMod Recovery a.k.a CWM 6.0.1.3. The current version that we use is 5.0.2.6
Edit : As you guys know, i bricked my ace while trying to get CWM working. The bootloader is lost. So there is no way i can get it working back. This is the end of developing for me for now atleast. I will have to replace the motherboard or get a new device. Any dev wanting to take over the project, please feel free. Contact me for help and i will try my best. But if you use my sources, please give credits to me and TeamCooper.
My sources are here.
Edit : You can refer my guide on compiling a recovery here.
Click to expand...
Click to collapse
now afraid to do it on my own
So you copy pasted a guide (and linked it in the end), and then you say you can't find any other guide.
Orelly?
Can jou tell a bit more about run "envsetup.sh"thats what i mis in this guide and the original guide. and most other guides.
The file "dump_image" needs to be placed on the phone. Can be put on the sd of the phone and than place on a place you like.(Folder bin/xbin ore some other) Use terminal on the phone. (any from google store play) cd to the dir the dump_image is than run the command.
How do i find the device name for my phone/tablet. I know the name of the tablet i bought.. But still. samsung ace hase device name cooper? Where did you find it?
Thx by the way. This guide is a bit more clear than the original.
the device name is in build.prop
[email protected] said:
Can jou tell a bit more about run "envsetup.sh"thats what i mis in this guide and the original guide. and most other guides.
The file "dump_image" needs to be placed on the phone. Can be put on the sd of the phone and than place on a place you like.(Folder bin/xbin ore some other) Use terminal on the phone. (any from google store play) cd to the dir the dump_image is than run the command.
How do i find the device name for my phone/tablet. I know the name of the tablet i bought.. But still. samsung ace hase device name cooper? Where did you find it?
Thx by the way. This guide is a bit more clear than the original.
Click to expand...
Click to collapse
dump_image would be on the phone, it was for MTD devices now a days ytou want to use DD on mmcblk devices
i solved the font problem, you need to edit the Anndroid.mk from bootable/recovery, but now i got messed up Graphics in the recovery and i cannot boot back into the OS. ideeas? thanks
PS: i think that the graphics.c may be the problem. but for booting, i really have no clue.
This will give you a non touch version of CWM
Any idea if the touch modifications are also available opensource to modify code?
Not yet. But finding it. Once I get it working, will add it to the op.
Thx for the answar on my question.:good:
I have a nother question:silly: For example, my recovery.fstab hase: /sdcard mount is /dev/block/mmcblk1p1
What lines do i ad in my BoardConfig.mk:
? what is here? /sdcard vfat /dev/block/mmcblk1p1
just adding /sdcard vfat /dev/block/mmcblk1p0 does not seem to work..
my recovery.fstab:
# mount point fstype device [device2]
/boot mtd boot
/cache yaffs2 cache
/data yaffs2 userdata
/misc mtd misc
/recovery mtd recovery
/sdcard vfat /dev/block/mmcblk0p1 /dev/block/mmcblk0
/system yaffs2 system
/sd-ext ext4 /dev/block/mmcblk0p2
My vold.fstab hase:
# External NAND Storage
dev_mount sdcard /mnt/sdcard auto /devices/virtual/block/ndda
# External SD card
dev_mount ext_sd /mnt/ext_sd auto /devices/platform/tcc-sdhc
# External USB storage
dev_mount usb_sda /mnt/usb_sda1 all /devices/platform/dwc_otg /devices/platform/tcc-ohci /devices/platform/tcc-ehci
dev_mount usb_sdb /mnt/usb_sdb1 all /devices/platform/dwc_otg /devices/platform/tcc-ohci /devices/platform/tcc-ehci
Some other info i found..:
/dev/block/platform/tcc-sdhc0.0/mmcblk0
if i use mount in terminal i get this:
/dev/block/vold/179:0 /mnt/ext_sd vfat ...
/dev/block/vold/240:0 /mnt/sdcard vfat ...
cat /proc/mtd
geeft:
dev: size: erasersize: name:
mtd0 00a00000 00100000 ¨boot¨
mtd1 00500000 00100000 ¨kpanic¨
mtd2 12c00000 00100000 ¨system¨
mtd3 00400000 00100000 ¨plash¨
mtd4 09600000 00100000 ¨cache¨
mtd5 40000000 00100000 ¨userdata¨
mtd6 00a00000 00100000 ¨recovery¨
mtd7 00100000 00100000 ¨misc¨
mtd8 00100000 00100000 ¨tcc¨
partitions /proc/partitions:
major: minor: #blocks name:
7 0 16664 loop0
31 0 10240 mtdblock0
31 1 5120 mtdblock1
etc/ sow on
179 0 15339520 mmcblk0
240 0 2392064 ndda
240 1 2392064 ndda1
240 0 16663 dm-0
My boot.img files on github. + some adding ...(/device/YG/m805_892x) https://github.com/Frank77GLD/Telechip_tcc892x
(just testing a github for fun...)
Hope you could give me some advice?
can someone please make an english working cwm for samsung galaxy young cdma ich-509 please?
Porting to a new "unknown" device
Hi folks. I`m trying to start to develop some stuff to an chinese tablet and, of course, my first need is the cmw ...
Then. I only can have it using the fakeflash method(locked bootloader). My problem that it`s kinda new stuff to me.
I have some files built by utkanos to start the job. But now I dont know where to go to ...
Theere appears do be no documentation in what files in what folders I have to edit/add to get it fully functional.
When i flash the zip and the cwm load there`s no partition table. It loads a lot of errors on the screen saying no /dev/block* ...
I little help will be much appreciated here. Even just a start point .. anything that can help!
Related
I am attempting to create my own port of android to my HTC touch diamond (rebranded as the XDA Ignito) and i've hit a slight problem, I'm using dd to create an image file:
Code:
dd if=/dev/zero of=~/system.img count=19000
(not sure if it was 19000 but it created an image of about 90mb.)
I then create an ext2 filesystem out of it:
Code:
mkfs.ext2 ~/system.img
and then mount it to /andsys:
Code:
mount ~/system.img /andsys -o loop
and put the cutomized system into this.
then I unmount it and copy the new system onto my phone,
when hariet runs it say that loop2 is an unvalid ext2 system and
cannot mount /sys. it works fine with the stock system.img that
comes in a zip. and idea's why my modified system isn't working?
thanks,
Sam Aldis
I hate to bump but has no one got any ideas?
am attempting to create a custom android system that
it specifically for other HTC phones rather than being
android for G1/G2 running on a HTC phone.
You may want to do a search. I believe that there are a number of threads which deal with Android porting to different devices.
Sorry I can't be of anymore help, but I wish you luck!
Seems to up in the market now, just wondering if it's good for the DHD, there are now 2 HTC desires in the 'choose your phone'
nope this won't work, its only out for the g2. The desire hd shouldn't be too far behind though so just hold off.
teihoata said:
nope this won't work, its only out for the g2. The desire hd shouldn't be too far behind though so just hold off.
Click to expand...
Click to collapse
ill compile it+ the kernel when i get home
Feel free to have a go yourself: http://www.koushikdutta.com/2010/10/porting-clockwork-recovery-to-new.html
This guide will assume you have some familiarity with doing an Android Build.
First, let's check out the CyanogenMod tree. The CyanogenMod repository contains Clockwork Recovery, which is part of a full Android build.
repo init -u git://github.com/CyanogenMod/android.git -b froyo
repo sync
make -j4 otatools
Now, use dump_image or dd to dump your recovery or boot image from a running phone and copy it to your computer somewhere.
dump_image boot boot.img
Note that dump_image only works on phones using MTD. You will need to use dd to dump mmc partitions.
To build Android from source for a new device, you need to set up a board config and its makefiles. This is generally a long and tedious process. Luckily, if you are only building recovery, it is a lot easier. From the root of your Android source directory (assuming you've run envsetup.sh), run the following (substituting names appropriately):
build/tools/device/mkvendor.sh device_manufacturer_name device_name /your/path/to/the/boot.img
You will receive the confirmation "Done!" if everything worked.
The mkvendor.sh script will also have created the following directory in your Android source tree:
manufacturer_name/device_name
Now, type the following:
lunch generic_device_name-eng
This will set the build system up to build for your new device.
Open up the directory in a file explorer or IDE. You should have the following files: AndroidBoard.mk, AndroidProducts.mk, BoardConfig.mk, device_.mk, kernel, system.prop, and vendorsetup.sh.The two files you are interested in are BoardConfig.mk and kernel. The kernel in that directory is the stock one that was extracted from the boot.img that was provided earlier. BoardConfig.mk will need to be tweaked to support ext mounts and their mount points.
For example, if your /data mount is ext and the device is /dev/block/mmcblk0p2, you would need the following lines added in your BoardConfig.mk:
BOARD_DATA_DEVICE := /dev/block/mmcblk0p2
BOARD_DATA_FILESYSTEM := auto
Once the BoardConfig.mk has been properly setup, you can build the recovery using:
make -j4 recoveryimage
Your recovery can then be found at $OUT/recovery.img.
If you are in need of building a fakeflash recovery, you will need to run the following to create the update.zip that hot replaces the recovery:
. build/tools/device/mkrecoveryzip.sh
Once this is done, build, and tested, notify me, "koush", on Github and I can build official releases and add ROM Manager support!
Tip: Run "make clobber" between builds if you change the BoardConfig.mk, or the change will not get picked up.
Hi,
I start this thread to speak about natively running Debian Squeeze on LG Optimus GT540.
I have put somme script to bootstrap complete installation on sdcard on :
poivron.org/~jimpulse/swift
Please read README first.
Kernel is 2.6.29 from lge source with minors modifications :
* lge source don't compile properly ( this is not what is distribute as binnary ?GPL violation? ).
* Framebuffer console on startup.
* Software refreshing enable.
* Race condition on mddi register function when using software refresher
* Inkernel command line.
* ext3fs
Kernel debian packages are in swift/kernel
the boot image is in swift/boot and is reconstruct at end of bootstrap.
Lxde environement with matchbox-window-manager and matchbox-keyboard is working fine for me.
Slim is used as display manager in autologin mode.
Freesmartphone is installed but not configured (TODO)
Wifi (4325) is working but module is not loaded on startup. The firmware is from lge source distribution but is the same as on binary distribution.
Bluetooth (?4325?) is not working. (blueman need dpkg --configure at first startup). (TODO)
Enjoy.
--
jim
i got: You don't have permission to access /~jimpulse/swift/README on this server.
You don't have permission to access /~jimpulse/swift/README on this server.
Says when i try to open README file
Sory, I"m noob !
Now, It's working.
I didnt understand how it's booting. What should i do. Just flash boot.img to recovery then boot from it? Is it enough or what should i do can you write it step by step?
Hi,
You must install debian on first partition of your sdcard.
The partition must be ext2 or ext3 formated (preferably ext3).
The script 'bootstrap.sh' is make for that, you have to be root to use it.
the card must be mounted with suid,dev,exec .
you must have installed somme packages on your host, read README file.
--
jim
hi there,
so its something like a dual boot ?
something like this http://forum.xda-developers.com/showthread.php?t=1408824.
Hi,
It is not dualboot by itself.
It is just a scritp to install Debian Squeeze armel on sdcard and build a boot image.
More explanation :
!!! Please, dont run the script if your dont understand what it do !!!
You have to edit the script to match your preference :
ROOT=<the target directory where to install to>
ROOTDEV=<Name of the device were your phone will look to find root filesystem>
This script is tested only on Ubuntu oneiric but should work on other debian-like distros.
You can format your sdcard like this : sudo mkfs.ext3 -L swift /dev/XXX
where XXX is the device file corresponding to the partition you want to format. You can figure out that by looking at kernel message after inserting the sdcard : dmesg
Eject and reinsert the card to mount the new filesystem.
Remount the filesystem with apropriate options : sudo mount -o remount,exec,suid,dev /media/swift (or wherether your filesystem is mounted).
So, change ROOT= variable as ROOT=/media/swift (or whatether ...)
and ROOTDEV=/dev/mmcblk0p1 (for the first partition of the sdcard)
Then run in the swift/ directory : sudo ./bootstrap.sh
If all is right, it take aprox 4 hours on my [email protected] to download and install everything.
After installation, you have choice to flash the boot rom (eg : sudo fastboot flash recovery /media/swift/boot/boot.img-2.6.29-swift) or to use it as chroot environnement from android.
jimpulse said:
Hi,
It is not dualboot by itself.
It is just a scritp to install Debian Squeeze armel on sdcard and build a boot image.
More explanation :
!!! Please, dont run the script if your dont understand what it do !!!
You have to edit the script to match your preference :
ROOT=<the target directory where to install to>
ROOTDEV=<Name of the device were your phone will look to find root filesystem>
This script is tested only on Ubuntu oneiric but should work on other debian-like distros.
You can format your sdcard like this : sudo mkfs.ext3 -L swift /dev/XXX
where XXX is the device file corresponding to the partition you want to format. You can figure out that by looking at kernel message after inserting the sdcard : dmesg
Eject and reinsert the card to mount the new filesystem.
Remount the filesystem with apropriate options : sudo mount -o remount,exec,suid,dev /media/swift (or wherether your filesystem is mounted).
So, change ROOT= variable as ROOT=/media/swift (or whatether ...)
and ROOTDEV=/dev/mmcblk0p1 (for the first partition of the sdcard)
Then run in the swift/ directory : sudo ./bootstrap.sh
If all is right, it take aprox 4 hours on my [email protected] to download and install everything.
After installation, you have choice to flash the boot rom (eg : sudo fastboot flash recovery /media/swift/boot/boot.img-2.6.29-swift) or to use it as chroot environnement from android.
Click to expand...
Click to collapse
I have done it for one time but it didn't boot So im gonna do it again tomorrow. I dont have time today
I'm always having problem with the script. Now im starting again. I hope it will done this time... And can you use a .35 kernel for this?
Hi,
I'm planning to include .35 kernel, but I dont know which one to use. I've start a thread to ask people there preferences. Kernel need minor modification to have frame buffer console working.
If you have probleme with the script, post last few line of output and I will try to help.
--
jim
I have the mismatch size problem with the one of xorg-bla-bla packages By the way Mikegapinski's kernel is good to work i think.
Edit:
And does this make a problem?
pre-installing dpkg
warning, in file '/var/lib/dpkg/status' near line 3 package 'dpkg':
missing description
warning, in file '/var/lib/dpkg/status' near line 3 package 'dpkg':
missing maintainer
Click to expand...
Click to collapse
These two warning are not a problem, these are only because dpkg/status is not complete before installing dpkg. It's a bootstrap edge effect (dpkg need dpkg to be installed).
If the script don't run until the end, you should have a phase number given at end of output. You can skip already ran phase by passing a phase number as parameter to the script.
The xserver-xorg-core problem is about dependencies against all video driver. So I mangle the control file to remove these dependencies. Perhaps this can fail if debian repo version has changed.
jimpulse said:
These two warning are not a problem, these are only because dpkg/status is not complete before installing dpkg. It's a bootstrap edge effect (dpkg need dpkg to be installed).
If the script don't run until the end, you should have a phase number given at end of output. You can skip already ran phase by passing a phase number as parameter to the script.
The xserver-xorg-core problem is about dependencies against all video driver. So I mangle the control file to remove these dependencies. Perhaps this can fail if debian repo version has changed.
Click to expand...
Click to collapse
Now i have bootedup but how can iload the wifi module now?
Hi,
The default password for root is root .
There is no sudo preinstalled so use su.
Firmware and nvram settings are in /etc/wl as for android names rte.bin and nvram.txt .
You have to pass parameters at load time :
modprobe wireless firmware_path=/etc/wl/rtecdc.bin nvram_path=/etc/wl/nvram.txt
or put this in /etc/modprobe.d/wireless.conf :
alias wlan0 wireless
options wireless firmware_path=/etc/wl/rtecdc.bin nvram_path=/etc/wl/nvram.txt
Wicd is not working correctly so you have to configure by hand
(iwconfig and ifconfig) or edit /etc/network/interfaces. (view debian administration guide for that).
I will update the script tomorrow to add a configuration file for modprobe and an alias to wlan0.
--
Jim
jimpulse said:
Hi,
The default password for root is root .
There is no sudo preinstalled so use su.
Firmware and nvram settings are in /etc/wl as for android names rte.bin and nvram.txt .
You have to pass parameters at load time :
modprobe wireless firmware_path=/etc/wl/rtecdc.bin nvram_path=/etc/wl/nvram.txt
or put this in /etc/modprobe.d/wireless.conf :
alias wlan0 wireless
options wireless firmware_path=/etc/wl/rtecdc.bin nvram_path=/etc/wl/nvram.txt
Wicd is not working correctly so you have to configure by hand
(iwconfig and ifconfig) or edit /etc/network/interfaces. (view debian administration guide for that).
I will update the script tomorrow to add a configuration file for modprobe and an alias to wlan0.
--
Jim
Click to expand...
Click to collapse
Thanks for these and how can i access the command line from my computer?
Hi,
Sorry, but I've forget to put openssh on package list. I'he also froget to add debian repo to sources.list .
Edit /etc/apt/sources.list with nano or vi and add a line with :
deb http://ftp.debian.org/debian/ squeeze main
then run apt-get update
You have to use the lxde terminal to configure wireless and install openssh-server (apt-get install openssh-server).
After that, you will be able to connect with ssh (ssh [email protected]<IP ADDRESS>) from your computer.
adbd is not working and need some tweak to work with debian.
--
Jim
Hi,
I've update bootstrap.sh :
* openssh-server and openssh-client are installed per default
* sources.list is now created durring bootstrap with same repo that the bootstrap process used.
* modprobe is configured to pass correct parameters to wireless module. There is also ans alias wlan0 ponting to wireless.
* network/interfaces is update to have the loopback interface configured at boottime. The configuration for wlan0 must be tweak for your network (essid, dhcp or static ...) .
Now, I'm working on 2.6.35 from wingrime and hope to publish it next week.
--
Jim
So, how is it going?
Sent from my GT540 using Tapatalk
jasper580 said:
So, how is it going?
Sent from my GT540 using Tapatalk
Click to expand...
Click to collapse
Yeah i wonder it too. I is so good to have debian on my phone. It'll be more usable with a touchscreen gui. It doesn't lag more. I think you should change the keyboard to a bigger. And we should can rotate screen. At least with running a sh file from terminal By the way you're great! I think this is gonna be awesome for our phones...
Always wanted a larger /data partition? Want to add a swap partition or an extra partition for your Debian/Ubuntu/Fedora chroot? Want your ROM to have the combined /data and /sdcard of Honeycomb and ICS devices? Then this guide is for you.
Table of contents
This post: background information
(Advanced) users: modifying your phone to use LVM
Developers: adding LVM support to a ROM
Building LVM for Android
The Linux [URL="http://sourceware.org/lvm2/]Logical Volume Manager[/URL] (LVM) is a set of tools which allows you to create virtual disks ("logical volumes", "LVs") backed by a set of real storage devices ("physical volumes", "PVs") organized into "volume groups" ("VGs"). Using LVM, you can:
Create logical volumes which are larger than any of the individual physical volumes available on your device's real storage.
Create an arbitrary number of logical volumes of arbitrary size, regardless of the number of physical volumes or partitions available on your real storage devices. You could, for example, add a dedicated swap partition, or create a separate /system and /data for a dual-boot setup.
Take a snapshot of a logical volume -- a copy of the LV which only stores differences between it and the original (requires additional kernel support). You could, for example, take a snapshot of the external storage LV and export it via USB mass storage to a computer, without needing to unmount the LV from your device.
Grow or shrink logical volumes without unmounting the file system ("online resize", requires filesystem support).
LVM was developed to manage storage on Linux servers and workstations, but was also used by Palm/HP in WebOS devices. It uses the Linux device-mapper technology used in Android for apps installed on the SD card, so any Android kernel will work with LVM.
This guide was developed with the Nexus S in mind, but the technique described should be applicable to many other Android devices as well.
Modifying your phone to use LVM
WARNING WARNING WARNING
While unlikely, you could brick your phone if you do this incorrectly!!!
Read this guide completely before attempting. If you don't understand the procedure, read it again until you do. If you still don't understand, wait for someone else to make this easier. If you're not sure you understand, you probably don't.
BACK UP EVERYTHING ON YOUR PHONE, INCLUDING THE CONTENTS OF /sdcard, BEFORE ATTEMPTING THIS PROCEDURE! This will erase everything on your phone.
The preassembled images attached to this post are for Nexus S GT-i9020T running stock Android 4.0.4 IMM76D ONLY. They may or may not work with other phones and ROMs. (See the next post for how to modify any ROM to use LVM.)
You will need:
A Nexus S with unlocked bootloader
A computer with fastboot and adb installed and working
A USB cable
Factory images for your phone, in case something goes wrong
Procedure:
Take a nandroid backup of your phone and copy it to your computer. We'll use it to restore the ROM later. You MUST copy the backup to your computer! This procedure will erase EVERYTHING on your phone, including the contents of /sdcard.
Download the boot and recovery images attached to this post. Reboot your phone into the bootloader, then flash the recovery to your phone using fastboot:
Code:
fastboot flash recovery recovery-lvm-clockwork-5.0.2.0-crespo.img
(GPL information: this is the stock kernel image from ClockworkMod 5.0.2.0. For LVM source, see this post.)
Boot into recovery.
Enter the shell on the device:
Code:
adb shell
In the shell on the device, do the following (# is your prompt):
Code:
# /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
This marks the partitions normally used for /system, /data, and /sdcard for use with LVM, and creates an LVM volume group named "lvpool" using those devices.
In the shell on the device, set up your desired logical volumes (partitions).
Code:
# /lvm/sbin/lvm lvcreate -L 320M -n system lvpool
# /lvm/sbin/lvm lvcreate -L 1G -n userdata lvpool
# /lvm/sbin/lvm lvcreate -L 10G -n media lvpool
[...]
This creates the mandatory logical volumes named "system", "userdata", and "media", which will be mounted on /system, /data, and /sdcard, respectively. Replace the argument to -L with the desired size of each partition. (/system needs to be at least 300 MB to fit the stock ROM.) You can create additional volumes similarly:
Code:
# /lvm/sbin/lvm lvcreate -L [size] -n [name] lvpool
replacing [size] with the desired size and [name] with the desired name. You have a little less than 15 GB space in the volume group to work with; depending on how many partitions you want to create, you can adjust the size of the "media" and "userdata" logical volumes as required.
Reboot back into recovery. Mount the USB storage on your computer. On your computer, format your phone's USB storage as you would a USB flash drive.
Copy your nandroid backup from your computer onto your phone.
Reboot back into recovery. Restore the nandroid backup.
Reboot into the bootloader. Flash the boot image to your phone via fastboot:
Code:
fastboot flash boot boot-lvm-crespo-IMM76D.img
(GPL information: this is the stock kernel image for IMM76D. Source is available from AOSP git. For LVM source, see this post.)
Reboot. You should have a working device running on LVM.
Additional tips and hints
To see the logical volumes you've created, use
Code:
# /lvm/sbin/lvm lvs
and to see how much free space you have remaining in the volume group, use
Code:
# /lvm/sbin/lvm vgs
If you want to delete a logical volume (for example, if you screwed up), use
Code:
# /lvm/sbin/lvm lvremove /dev/lvpool/name
(replacing "name" with the name of the LV you want to delete).
It's often useful to leave a bit of free space in the volume group (512 MB to 1 GB or so). This gives you a bit more flexibility to modify the layout or grow partitions in the future, and allows you to take snapshots of logical volumes.
Removing LVM from your phone
Flash a standard recovery such as the regular ClockworkMod recovery to your phone.
Do a full wipe/factory reset.
Restore your phone from a backup.
If things go really wrong, flash the factory image to your phone via fastboot.
Modifying an existing ROM to use LVM
(This is a condensed version of the full guide: https://raw.github.com/steven676/android-lvm-mod/master/HOWTO-MOD)
You will first want to grab a copy of the binaries and config files by cloning my git repository: https://github.com/steven676/android-lvm-mod.
Unpack the ramdisks from your boot and recovery images. Make the following changes:
Copy the contents of lvm-bin/ in the git repository to lvm/ in the ramdisks.
Copy devices/crespo/lvm.conf to lvm/etc/lvm.conf in the ramdisks.
For the boot image, integrate the changes in devices/crespo/boot/init.herring.rc-changes.diff into your init.herring.rc.
For the recovery image, integrate the changes in devices/crespo/recovery/init.rc-changes.diff into your init.rc.
For the recovery image, copy devices/crespo/recovery/recovery.fstab to etc/recovery.fstab.
Repack the ramdisks and create new boot and recovery images with them (the original kernels are fine to use).
If creating a flashable zip to install your ROM, you will also want to modify the installer script to set up the LVM volume group and logical volumes (see the previous post).
If you're building your own kernel, consider enabling CONFIG_DM_SNAPSHOT in your kernel's build configuration, to allow taking snapshots of logical volumes.
Remember that LVM is released under the terms of the GPL v2 (same as the Linux kernel), so you are required to comply with the GPL's source distribution requirements with respect to LVM.
More extensive modifications (such as changing the devices used to form the volume group) are possible; see the full HOWTO guide for details.
Building LVM from source for Android
The LVM source was written for standard glibc-based GNU/Linux systems, and doesn't build agains Android libc. We could invest time and effort into porting it to Android, but it's easier to just statically link the LVM binary against glibc (we already have to use a statically linked binary, since the boot image doesn't ship shared libraries).
To build LVM with glibc, you will need either an actual GNU/Linux ARM system with a development environment (gcc, make, and glibc header files) set up, or a GNU/Linux ARM cross-compiler toolchain (more difficult to set up). The binaries in lvm-bin/ were compiled with an Emdebian squeeze/armel toolchain running on a Debian squeeze/amd64 machine; this procedure has also been tested with a Nexus S running a Debian squeeze chroot (though any recent Linux distribution and any device should do). The Linaro prebuilt GCC toolchain and the CodeSourcery CodeBench Lite toolchain for ARM GNU/Linux should work; the Android NDK toolchain will not.
Getting the source
Clone the lvm-mod git repository. Then, in the newly cloned repository, do
Code:
git submodule init
git submodule update
You will have a copy of the LVM source (as used to build the binaries in lvm-bin/) in lvm-src/.
(Alternately, clone https://github.com/steven676/lvm2 and checkout branch android-lvm-mod. You can also use upstream's git repository or source tarballs; see their website for details.)
Building the source
(This is a condensed version of the full guide: https://raw.github.com/steven676/android-lvm-mod/master/HOWTO-BUILD)
These instructions are written for a native build (building in a Debian/Ubuntu/Fedora chroot on an actual ARM device).
Configure the LVM source:
Code:
$ ./configure --prefix=/lvm --enable-static_link --disable-readline \
--disable-selinux --with-pool=none --with-cluster=none \
--with-confdir=/lvm/etc --with-default-run-dir=/data/lvm/run \
--with-default-system-dir=/lvm/etc \
--with-default-locking-dir=/data/lvm/lock \
--with-optimisation="-Os -march=armv5te -mtune=cortex-a8 -mthumb"
For a cross build, you need to set up the system to run ARM binaries using QEMU (see the full HOWTO for details). (For extra credit, fix the build so that it works with the configuration produced by running configure without qemu-arm enabled.) Then configure the source with:
Code:
$ export CC=arm-linux-gnueabi-gcc # replace with your cross compiler
$ ./configure --host=arm-linux-gnueabi \
--prefix=/lvm --enable-static_link --disable-readline \
--disable-selinux --with-pool=none --with-cluster=none \
--with-confdir=/lvm/etc --with-default-run-dir=/data/lvm/run \
--with-default-system-dir=/lvm/etc \
--with-default-locking-dir=/data/lvm/lock \
--with-optimisation="-Os -march=armv5te -mtune=cortex-a8 -mthumb"
Build the source:
Code:
$ make
Grab the pieces you need: the statically linked, unstripped lvm binary is located in tools/lvm.static, and a sample configuration file is in doc/example.conf.
(reserved)
Hello steven676,
This post is helpful to me!
But I have some questions on LVM as I am new to it.
1. Is it possible to use LVM only on one pv, say /sdcard?
2. If 1. yes, will lv's on a pv be linear mapped, that is, lv's in a pv are placed one after one?
3. now that removing lvm is possible, is it also possible to backup lvm setting, and switching between non-lvm and lvm environment?
Thanks
solarispika said:
1. Is it possible to use LVM only on one pv, say /sdcard?
Click to expand...
Click to collapse
Sure. Just modify the arguments to pvcreate and vgcreate accordingly:
Code:
# /lvm/sbin/lvm pvcreate /dev/block/mmcblk0p3
# /lvm/sbin/lvm vgcreate lvpool /dev/block/mmcblk0p3
solarispika said:
2. If 1. yes, will lv's on a pv be linear mapped, that is, lv's in a pv are placed one after one?
Click to expand...
Click to collapse
Probably, but in general it is not safe to assume this. Imagine the following sequence of commands:
Code:
# /lvm/sbin/lvm lvcreate -L 1G -n vola lvpool
# /lvm/sbin/lvm lvcreate -L 1G -n volb lvpool
# /lvm/sbin/lvm lvresize -L +1G /dev/lvpool/vola
What's likely to happen here is that vola is going to be split into two segments on disk, like this:
Code:
[ 1GB vola ][ 1 GB volb ][ 1 GB vola ][ remaining free space ]
There are ways in which you can give LVM hints as to what on-disk layout you want, and the LVM tools will generate information about the current layout in /data/lvm/backup if that directory's available (and mounted read-write) at the time, but in general, it's best to treat the on-disk layout of a logical volume as unknown. In practice, unless you have physical volumes with widely varying characteristics in the same volume group (say, an SSD and some spinning-platter hard disks), you shouldn't need to worry about the actual layout.
solarispika said:
3. now that removing lvm is possible, is it also possible to backup lvm setting, and switching between non-lvm and lvm environment?
Click to expand...
Click to collapse
If /data is mounted read-write, running
Code:
# /lvm/sbin/lvm vgcfgbackup
will create a human-readable backup of the current LVM volume group metadata in /data/lvm/backup (if that directory is available and mounted read-write).
I'm not sure what you mean by "switching" between non-LVM and LVM environments. If you mean going between an unmodified stock boot image and an LVM boot image, the answer is yes, but you won't have access to any of the data in your LVM logical volumes while running an image not configured for LVM, and you need to be careful not to accidentally format the LVM physical volume.
If you're asking about having two or more ROMs on the phone, one installed to the normal /data and /system eMMC partitions, and another on LVM logical volumes, the answer is also yes, but both ROMs will need modified ramdisks. The one for the eMMC-installed ROM should only mount /sdcard from LVM, while the others should be set up to mount /data and /system from LVM as well.
Good write up;-)
wonder if lvm swap could be connected as extra memory .
Sent from my Nexus S using XDA
wizardslovak said:
wonder if lvm swap could be connected as extra memory .
Click to expand...
Click to collapse
Sure, of course. From my phone:
Code:
$ cat /proc/swaps
Filename Type Size Used Priority
/dev/mapper/lvpool-swap partition 65532 28196 -1
It works just fine, even if it's not a setup I'd use on a mission-critical server.
Hey Guys,
Thanks for this awesome guide.
I just have a quick question, what are the advantages of using LVM instead of the normal partitioning?
I just want to know cause i might added to my rom.
Thanks
mandaman2k said:
I just have a quick question, what are the advantages of using LVM instead of the normal partitioning?
Click to expand...
Click to collapse
Primarily flexibility in deciding the number and layout of partitions -- see the first post.
Sounds good . Ill try it once home ;-)
Sent from my Nexus S using XDA
I just pushed a couple of changes:
Updated prebuilt binaries and LVM source to 2.02.96.
Fixed the instructions for cross compiling LVM.
The boot and recovery images attached to the second post have been updated accordingly.
Is this the only way to make the device function like HC/ICS/JB devices that ship with combined storage?
Are the images from Google partitioned with internal/external storage or are the latest images partitioned with a layout similar to the Galaxy Nexus?
CocoCopernicus said:
Is this the only way to make the device function like HC/ICS/JB devices that ship with combined storage?
Click to expand...
Click to collapse
If you want a setup that's exactly as on a 3.0+ device with "SD card" data stored in /data, then yes, this is the only way I know of. If you just want MTP functionality, then no.
CocoCopernicus said:
Are the images from Google partitioned with internal/external storage or are the latest images partitioned with a layout similar to the Galaxy Nexus?
Click to expand...
Click to collapse
Official Google software builds use separate userdata and media partitions and continue to offer the 2.x-style USB mass storage access. I'm not sure the partition layout is adjustable in software -- the eMMC presents an EFI partition layout which no one seems to have figured out how to change.
Cool, thanks. Yea, I'm not too interested in the MTP functionality, I just don't want to deal with internal/external storage after using the Galaxy Nexus.
Swap partiton
Hi..
how i can to create a swap partition of 1G and added to system??
I had create a 1G partition "swap" but system no activated this partition.
xxmurdocxx said:
Hi..
how i can to create a swap partition of 1G and added to system??
I had create a 1G partition "swap" but system no activated this partition.
Click to expand...
Click to collapse
You'd need to format the swap partition:
Code:
# mkswap /dev/lvpool/swap
Also, you need to make sure that your kernel has swap support (CONFIG_SWAP=y -- the default kernel does not have this) and that your init scripts are enabling the swap partition (swapon /dev/lvpool/swap).
One other note: you might find lag to be somewhat severe with a 1 GB swap partition -- I'd suggest smaller.
I'm finally getting around to messing with my NS. From what I understand I can't just modify an existing rom(stock JB in this case) to use the larger partitions without compiling an entire new rom, right?
Which would mean I'd be at the mercy of whoever created the ROM to update when an OTA rolls around?
CocoCopernicus said:
I'm finally getting around to messing with my NS. From what I understand I can't just modify an existing rom(stock JB in this case) to use the larger partitions without compiling an entire new rom, right?
Which would mean I'd be at the mercy of whoever created the ROM to update when an OTA rolls around?
Click to expand...
Click to collapse
No, you can modify an existing ROM yourself. It's most definitely not the simplest process around, though -- see the documentation at the top of the thread for instructions. As I say there ... read thoroughly and understand before attempting.
Hi there,
I just found catherall's thread on [how to boot CM 7.1 from the external SD card][0] on a Desire Z/G2 with the infamously fried eMMC.
I used his instructions to boot CM 7.2 (the last stable version for the Vision); since the above thread ends with a dangling question on how to update the system to be booted, I thought I'd document my efforts.
anonymousthing said:
anybody know what system.img format he is using?
Click to expand...
Click to collapse
It's just an ext4 file system:
Code:
$ file system.img
system.img: Linux rev 1.0 ext4 filesystem data, UUID=b4db3ed8-7d52-46a0-85fb-46fb67c5e837 (needs journal recovery) (extents) (huge files)
$ adb shell
~ # mount | grep system
/dev/block/loop0 on /tmp/boot.img-ramdisk/system type ext4 (rw,nodev,noatime,nodiratime,nouser_xattr,commit=19,barrier=0,data=ordered)
Disclaimer: On the original image, `file` actually identifies the FS as a `mounted or unclean` ext2; it's definitely an ext4 with journaling, though. Accordingly a `mount -t ext2` will fail with a `wrong fs type`.
You can create a new one with
Code:
$ dd if=/dev/zero of=system.img bs=4k count=64000
$ /sbin/mkfs.ext4 system.img
# mount -o loop -t ext4 system.img /media/new_sys
anonymousthing said:
I have tried making my own system.img from the rom but it does not work
Click to expand...
Click to collapse
This is potentially due to missing binaries:
Code:
$ diff -r /media/orig_sys update-cm-7.1.0-vision-signed/system | head -n 5
Only in /media/orig_sys/bin: cat
Only in /media/orig_sys/bin: cmp
Only in /media/orig_sys/bin: date
Only in /media/orig_sys/bin: dd
Only in /media/orig_sys/bin: dmesg
If you download a version of CM, at least the `toolbox` and the `busybox` binaries will be missing from the `system/bin` and `system/xbin` directories respectively. I couldn't be bothered to check for up-to-date versions but just copied the ones provided by catherall before copying over the new CM version:
Code:
# cp -r /media/orig_sys/bin /media/orig_sys/xbin /media/new_sys
# cp -r cm-7.2.0-vision/system/* /media/new_sys
This will obviously update all the files that come with CM 7.2 and just keep what's not included in the box.
While you're at it, you might want to add up-to-date gapps:
Code:
# cp -r gapps-gb-20131214-signed/system/* /media/new_sys
This gives you a booting CM 7.2. Just replace the `system.img` that comes with catherall's `.zip` with the one you just created and off you go
Unpleasant issue: Booting from SD seems to require a specifically prepared kernel, so the `boot.img` that comes with a different ROM/CM version won't work. So until someone finds out how to prepare a kernel for booting from SD, you will have to continue to boot the one provided by catherall. However, the WIFI driver has not been compiled into the kernel but lives in a separate kernel module in `/system/lib/modules/bcm4329.ko`. Which we (by copying over the `/system` dir from the CM 7.2 build) replaced with a version incompatible with the old kernel we have to boot. So if you intend to boot through `fastboot` and use WIFI (and why wouldn't you? ;P), we will have to put the old kernel module back:
Code:
# cp /media/orig_sys/lib/modules/bcm4329.ko /media/new_sys/lib/modules/
Weirdly enough, in the CM 7.2 version I downloaded, the permissions for the `dhcpd-run-hooks` script were broken, so I at least needed to fix those too:
Code:
# chmod 550 /media/new_sys/etc/dhcpd/dhcpd-run-hooks
So, `umount` your pristine new `system.img`, move it to your SD card and boot into CM 7.2.
HTH
D.
PS I naively tried to create a larger 1 GB `data.img`, copying over the content from the existing one, but the phone didn't boot with that one. I might have made a mistake (was rather late at that point -.- and I didn't investigate any further), but it seems like the size of the partitions may be hardcoded somewhere. If someone has any additional information, please let me know Thx!
PPS If anyone ([MENTION]@catherall[/MENTION]? ;P) knows anything about the kernel issue, I'd be highly interested
PPPS After creating this account (to be fair, I've been profiting from this community since the old Windows Mobile days), I was informed that as an account noob, I obviously didn't have anything to contribute to this community and was ordered to place my undoubtedly profane question (which certainly had been answered may times before, I was only too lazy/dumb to search) outside the elite developer forums [/rage]. Maybe one of the Mods can stitch the [original thread][0] and this st0pid workaround back together again? :/ Thanks!
[0]: http://forum.xda-developers.com/showthread.php?t=1572924