Repartitioning the flash

m (default swap partition is on /dev/mmcblk0p3 (not p2))
m (Solution #1: swap /home and MyDocs partition)
Line 85: Line 85:
  mount /home/user/MyDocs # mount it
  mount /home/user/MyDocs # mount it
voila!
voila!
 +
 +
NB: To check size of new home partition
 +
du -ch /home | grep total
==== How to revert ====
==== How to revert ====

Revision as of 13:59, 17 September 2011

By default the internal eMMC flash card on the N900 (/dev/mmcblk0) is partitioned as follows:

  1. 27 GiB VFAT MyDocs partition on /dev/mmcblk0p1. When Maemo is booted, this is mounted on /home/user/MyDocs, however it is unmounted and exposed when the N900 is connected to a PC in mass storage mode
  2. 2 GiB /home partition on /dev/mmcblk0p2. This also contains the /opt folder (mounted on /home/opt) where optified apps are stored
  3. 768 MiB swap partition /dev/mmcblk0p3

Total 32 GB (not GiB)

There are several reasons why you might want to repartition your eMMC flash:

  • if you have a Linux background you may prefer POSIX filesystems like ext3 over the ancient VFAT filesystem. VFAT is used as it can be accessed on most non-Linux computers and is thus useful for data exchange in USB mass storage mode
  • booting alternative operating systems (e.g., Mer, Moebian, Fedora) requires independent partitions
  • loopback files for chroots (see Easy Debian) can be stored in VFAT MyDocs, but access is much slower than on a native partition. Also, loopback files in MyDocs are not available during USB mass storage mode
  • a large /home (ext3) partition allows for many more installed applications. If backing up a linux computer it allows you to keep your filesystem permissions and other extended attributes. It can be used to create native Linux chroot enviroments (e.g., for installing non-optified software or Debian)

Contents

Before partitioning

  • BACKUP YOUR DATA! A mistake during partitioning could brick your device, lead to complete data loss and require reflashing. Use the built-in Backup application to backup all settings etc. Backup this and the contents of MyDocs to your computer. Remove your microSD card to prevent data loss. Following this tutorial should minimize your risk of data loss but as always repartitioning is at your own risk.
  • Make sure your battery is not nearly empty (rebooting costs a lot of power) or, even better, plug in your charger.
  • Partitions on flash memory should be aligned to flash block sizes, which are multiples of 2, for example 32 KB. To be on the safe side use 128 KB or even 1MB.

Using gparted

By far the simplest way to resize your partitions is to use a GParted live CD/USB, or parted on a Linux system. To gain access to the whole eMMC, install bootmenu or BackupMenu, and boot your N900 with the keyboard exposed. (Back up your rootfs and optfs to a microSD at this point.) It is also possible to access the full eMMC by loading the Rescue Initrd and kernel. This will give you an option to enter USB mass storage mode (read-write). If you boot into Maemo then only the MyDocs partition will be visible and you won't be able to partition properly.

Because of hardcoding etc. it is easiest to leave your partitions in the same order and filesystem: MyDocs vfat(blk0p1 mounted on /home/user/MyDocs), /home ext3 (blk0p2), and swap (blk0p3). Generally you will want to shrink MyDocs and grow /home. You can also grow the swap space, which is easier than setting up a swap on microSD. However this may not really result in much benefit (see the linked page for more information). You can then create a 4th partition if you wish. To be safe keep the last 64M of the eMMC unallocated, as is the case on the default partitioning.

Align to MiB, not cylinders! When you are done, apply your changes then disconnect and reboot your N900 and everything should load as usual. It would be very unlikely for something to go wrong if you only resized MyDocs and /home. If something does go wrong, you will need to reflash the eMMC. You should try again at this point. If you want to give up then you will need to restore your optfs from the BackupMenu backup as well as copy the MyDocs files back over.

If you want to have more than 4 partitions, create an extended partition. Always keep MyDocs as the first partition, and the first ext3 partition as /home. (Not sure whether an ext3 inside an extended partition would count.) You can edit genfstab.awk or rcS-late to automount any new partitions, or just mount them normally. (Remember to use mount options noatime, and maybe nodiratime,nobh as well)

Manual solutions

The rest of this page describes manual solutions.

  1. Swap the 2 GB /home and 27GB MyDocs partition to get a 2 GB VFAT MyDocs and a 27 GB ext3 /home. No partition size need to be changed and only a single reboot is necessary. This is the least invasive solution and can be easily reverted. It leaves a smaller MyDocs partition for VFAT USB mass storage mode.
  2. shrink MyDocs to add additional partitions (e.g., for other OS).
  3. setup an arbitrary /home and MyDocs division of the space. this is a little bit more complicated.
  4. get rid of the MyDocs partition, setup a single 31 GB ext3 partition, and replace MyDocs with loopback file(s) that could also be USB exported and have arbitrary size and filesystem. This is useful if you rarely need USB mass storage mode or if you want to export different filesystem images depending on the computer. However, the loopback files may be significantly slower.

Some remarks

  • Maemo hardcodes the MyDocs partition as /dev/mmcblk0p1 in several applications. If you want MyDocs as VFAT, it must be the first partition in the table (but not necessarily the first on the disk). To get around this, you could modify several scripts belonging to ke-recv
    • if you don't want a VFAT MyDocs partition, you need to create MyDocs/DCIM directory with "user" permissions for the camera app to work proper permissions.
  • /home is the first ext3 partition, swap can be any partition number
  • it is not a good idea to unmount /home in a running system. umounting /home/user/MyDocs is generally safe (if all applications are closed)
  • the most relevant scripts for partitioning are /etc/event.d/rcS-late, /usr/sbin/osso-usb-mass-storage-enable.sh and /usr/sbin/osso-usb-mass-storage-disable.sh
  • All instructions must be executed as root (either from Terminal or via ssh)
  • copy & paste is recommended (typos are dangerous). For the table files use "vi" or "cat > table" and Ctrl+D to quit
  • The only fdisk utility on the device is sfdisk. fdisk could be extracted from Debian packages but it aligns partitions based on virtual harddisk cylinders and not on flash blocks (you cn use option -uS in sfdisk for sector (512 byte) alignment)
    • to modify the whole partition table use
      sfdisk -d /dev/mmcblk0 > table
      edit the file table, and overwrite the partition table with
      sfdisk --no-reread /dev/mmcblk0 < table
    • ids of single partitions can be changed with
      sfdisk -c /dev/mmcblk0 2 83
      (this example changes the 2nd partition to 83=Linux).
  • you can boot without a /home partition (for example, by commenting out the line in rcS-late or by change the partition ids to something other than 83). Maemo will create a default home (about 10 MB) on NAND. Most relevant settings (wifi, desktop) are stored on NAND anyway. Make sure to
    rm -rf /home/user
    before reboot. This trick is useful if want to change the layout of the eMMC completely.
  • ext3 partitions can be grown online, but not be shrunk.
  • parted does not work from inside Maemo (it always crashed due to some mmap problem), works fine when booting from backupmenu and working outside of maemo.
  • If you create a new ext3 filesystem, you might want to do tune2fs -c0 -i0 device on your new newly created ext3 filesystems so the fs is never fsck'd on boot (these are the settings on the default ext3 /home partition).

Solutions

WARNING: The following instructions have not been tested thoroughly yet! Please report problems, positive and negative feedback to this address.

WARNING: Please have a look at Titan's comments Before Proceeding! It seems that with PR1.2 release below methods do not work as it is impossible to boot without /home. Just so that someone who missed the post doesn't have to reflash 5-6 times after tries & retries only to find it will not work.

Solution #1 Seems to be working fine as /home is preserved.

Solution #1: swap /home and MyDocs partition

TODO, see how to swap FAT and ext3 parition

We assume you have the standard Nokia partition layout on your device.

Warning: the contents of MyDocs will deleted. Perform a backup!

umount /home/user/MyDocs
sfdisk -c /dev/mmcblk0 1 83 # optional (safer): change FAT to ext3 id 
mkfs.ext3 /dev/mmcblk0p1 # create ext3 on large partition
mount /dev/mmcblk0p1 /mnt # mount new /home
cp -a /home/* /mnt # copy contents of /home to large partition
umount /mnt # unmount it

create the file "table":

unit: sectors
/dev/mmcblk0p1 : start= 56631360, size=  4194304, Id= c
/dev/mmcblk0p2 : start=       64, size= 56631296, Id=83
/dev/mmcblk0p3 : start= 60825664, size=  1572864, Id=82
/dev/mmcblk0p4 : start=        0, size=        0, Id= 0

continue with

sfdisk --no-reread /dev/mmcblk0 < table # change partition table, swap p1 and p2
reboot; exit # reboot to re-read new table

after reboot

mkfs.vfat -F32 /dev/mmcblk0p1  # create VFAT on 2GB partition
mount /home/user/MyDocs # mount it

voila!

NB: To check size of new home partition

du -ch /home | grep total

How to revert

Warning: /home must have less than 2 GB usage! MyDocs will be deleted!

umount /home/user/MyDocs
sfdisk -c /dev/mmcblk0 1 83 # optional (safer): change FAT to ext3 id 
mkfs.ext3 /dev/mmcblk0p1 # create ext3 on smaller partition
mount /dev/mmcblk0p1 /mnt # mount new /home
cp -a /home/* /mnt # copy contents of /home to large partition
umount /mnt # unmount it

create the file "table" (this is the original layout):

unit: sectors
/dev/mmcblk0p1 : start=       64, size= 56631296, Id=c
/dev/mmcblk0p2 : start= 56631360, size=  4194304, Id= 83
/dev/mmcblk0p3 : start= 60825664, size=  1572864, Id=82
/dev/mmcblk0p4 : start=        0, size=        0, Id= 0

continue with

sfdisk --no-reread /dev/mmcblk0 < table # change partition table, swap p1 and p2
reboot; exit # reboot to re-read new table

after reboot

mkfs.vfat -F32 -s64 /dev/mmcblk0p1  # create VFAT on 27GB partition
mount /home/user/MyDocs # mount it

Solution #2: shrink MyDocs to add additional partitions

TODO, see Repartitioning: create extended partitions

Warning: the contents of MyDocs will deleted. Perform a backup!

umount /home/user/MyDocs

create a new partition layout in file "table" (here 8 GB MyDocs were used for an extended partition with 3+5 GB partitions):

unit: sectors
/dev/mmcblk0p1 : start=       64, size= 39854080, Id= 0
/dev/mmcblk0p2 : start= 39854144, size= 16777216, Id= 5
/dev/mmcblk0p3:  start= 56631360, size=  4194304, Id=83
/dev/mmcblk0p4 : start= 60825664, size=  1572864, Id=82
/dev/mmcblk0p5 : start= 39854160, size=  9765680, Id=83
/dev/mmcblk0p6 : start= 49619856, size=  7011504, Id=83

continue with

sfdisk --no-reread /dev/mmcblk0 < table # change partition table
reboot; exit # reboot to re-read new table

after reboot

sfdisk -c /dev/mmcblk0 1 c # optional (safer): change FAT to ext3 id 
mkfs.vfat -F32 /dev/mmcblk0p1  # recreate VFAT on MyDocs
mkfs.ext3 /dev/mmcblk0p5
mkfs.ext3 /dev/mmcblk0p6

reboot and restore MyDocs

Solution #3: arbitrary size for /home and MyDocs

TODO, see also User:Ruskie#Repartitioning

Warning: /home and MyDocs will be deleted. Backup everything. Backup all settings (to your computer or SD), reflash, restore the settings and install rootsh (no other applications!).

create your new partition table layout in the file "table". Make sure all partitions are aligned to 32 KB and sizes are multiples of 32 KB. The sectors are 512 bytes, so the block counts must multiplied by 2. For example, 2GB= 4194304 blocks. Each partition should start at start+size of the previous partition. The first partition must start at 64. Make sure to keep the swap partition (the number may be changed). Initially set the id of your partition to 0 so that they are not mounted at reboot. An example layout with 2 GB part1 and 27 GB part2:

unit: sectors
/dev/mmcblk0p1 : start=       64, size= 4194304 , Id=0
/dev/mmcblk0p2 : start= 4194368, size=  56631296, Id=0
/dev/mmcblk0p3 : start= 60825664, size=  1572864, Id=82
/dev/mmcblk0p4 : start=        0, size=        0, Id= 0

(Optional) Dump your current partition table with the following command

sfdisk -d /dev/mmcblk0 > table.old

continue with

sfdisk --no-reread /dev/mmcblk0 < table # change partition table
reboot; exit

The device creates a default /home in NAND. Now change the parition ids and create the file systems

sfdisk -c /dev/mmcblk0 1 c
mkfs.vfat -F32 -s64 /dev/mmcblk0p1
sfdisk -c /dev/mmcblk0 2 83
mkfs.ext3 /dev/mmcblk0p2

if you have change to location or size of swap run

mkswap <swap-partition>

finish with

rm -rf /home/user
reboot; exit

finally restore all your backups

Solution #4: single large /home partition, loopback for USB

TODO, see how to implement USB mass storage with a loopback file

like solution #3, but don't create a MyDocs partition.

how to create a sparse 1GB loopback file:

dd if=/dev/zero of=FAT1GB bs=1M seek=1024 count=0 # small 256MB image
losetup /dev/loop0 FAT1GB
mkfs.vfat -F32 /dev/loop0
vi /etc/fstab # replace /dev/mmcblk0p2 with /dev/loop0
mount MyDocs

Solution #5: Edit eMMC image (works on PR1.2, by globalbus)

Backup MyDocs, we need to flash device. Open eMMC image in hex editor, go to 0xcb, you will see this

partition {size = 4096;fs_type = "ext3";prefix = "home";}

Edit size parameter (do not change the size of file! The number must be from 1000 to 9999) Flash it now.

If MyDocs have incorrect size or it's not mounting automatically you need to format it and paste files from backup.

umount /dev/mmcblk0p1
mkfs.vfat -F32 -s64 /dev/mmcblk0p1
mount /dev/mmcblk0p1

Solution #6: Custom repartitioning from a linux PC

Taken from Using Rescue Initrd - MeeGo Wiki.

This way is only intended for users who have partitioned their systems before. Your files will not be affected unless you explicitly ask your partitioner to do so although there's nothing wrong with taking extra care and backing up your files

Install flasher-3.5 on your box.

Get the rescue kernel and initrd rpm and extract them in a directory:

mkdir n900-rescue-initrd
cd n900-rescue-initrd
wget http://repo.meego.com/MeeGo/releases/1.0/core/repos/armv7l/packages/armv7l/nokia-n900-rescue-initrd-0.1-1.3.armv7l.rpm
wget http://repo.meego.com/MeeGo/releases/1.0/core/repos/armv7l/packages/armv7l/kernel-n900-2.6.33.3-11.2.armv7l.rpm
rpm2cpio nokia-n900-rescue-initrd-0.1-1.3.armv7l.rpm | cpio -vid 
rpm2cpio kernel-n900-2.6.33.3-11.2.armv7l.rpm  | cpio -vid 

Now you're ready to boot the device:

Turn off your N900 by removing the battery.

Start flasher:

sudo flasher-3.5 -k boot/vmlinuz-2.6.33.3-11.2-n900 -n boot/initrd.img-rescue-2.6.33.3-11.2-n900 -l -b"rootdelay=1 root=/dev/ram0" --set-rd-flags=no-omap-wd --set-rd-flags=no-ext-wd --enable-rd-mode

Connect N900 to your PC.

Press U on the keyboard and keep holding it.

Put the battery back in.

Wait for the device to boot and press U to enable USB storage mode. The device is now added to the list of your storage devices as an increment of /dev/sd.

Partition it using your favorite partitioner (GParted recommended)

Don't forget to repeat the "Start flasher" procedure with sudo flasher-3.5 --disable-rd-mode to disable R&D mode.

Solution #7: arbitrary size for /home and MyDocs (PR 1.2/3 compatible)

This solution is based off solution #3. The key difference is that this solution uses a MicroSD card as a temporary /home, so Maemo will be able to reboot in the process, thus making this solution PR1.2 and 1.3 compatible. MyDocs will be deleted, make a backup of it! This solution is tested on a PR 1.3 reflashed device, but it should work on non-clean devices aswell. If done correctly, you won't lose any settings/calendar/etc (just MyDocs), but as repartitioning is a risky proces: backup everything!

Prerequisites:

  • Partition the MicroSD card so that it has a partition big enough to hold all data on /home (which is 2gb at its max).
  • Format this partition as ext3. I'll assume you've only made one big partition (which will be /dev/mmcblk1p1 in Maemo).
  • Make sure you've read and understood solution #3 completely, as this one is based on it

This method involves moving /home. If you mess up the device names, format incorrectly or copy /home wrongly, Maemo will get into an infinite reboot loop, requiring a reflash to restore!!

-Mount your freshly partitioned and formatted MicroSD card

mount /dev/mmcblk1p1 /mnt

-Unmount MyDocs (after backing it up ;)

umount /home/user/MyDocs

-Copy /home to your MicroSD card (assuming one big ext3 partition)

cp -a /home/* /mnt

-Open /usr/lib/genfstab.awk and comment out the following pieces of code

start == 1 && $6 == 83 && !__home {
       printf "%s /home ext3 %s 0 0\n", $1, home_opts            
        printf "/home/opt /opt none bind\n"
        __home++
}
start == 1 && $6 == "c" && !__fat {
       printf "%s /home/user/MyDocs vfat %s 0 0\n", $1, fat_opts
       __fat++
}

This will make sure the default /home and MyDocs won't get mounted on reboot.

-Open /etc/event.d/rcS-late, find the line '-f /usr/lib/genfstab.awk > $tmp_fstab' and add this below it

echo "/dev/mmcblk1p1 /home ext3 rw,noatime,errors=continue,commit=1,data=writeback 0 0" >> $tmp_fstab
echo "/home/opt /opt none bind" >> $tmp_fstab

Maemo will then use the MicroSD ext3 partition (containing a copy of your /home) as the new /home after a reboot

-Reboot your phone now. If all went well, you should notice no difference between now and the situation before you started, except for that MyDocs is unavailable. If it is available, you can unmount it with 'umount /home/user/MyDocs'

-Now we can repartition the flash, as it is unused right now (except for the swap partition). An example layout with 2 GB MyDocs and 27 GB /home:

unit: sectors
/dev/mmcblk0p1 : start=       64, size= 4194304 , Id=c
/dev/mmcblk0p2 : start= 4194368, size=  56631296, Id=83
/dev/mmcblk0p3 : start= 60825664, size=  1572864, Id=82
/dev/mmcblk0p4 : start=        0, size=        0, Id= 0

Save the above code as a plain text file (eg. as table)on your N900. Use Id=c for MyDocs (FAT), 83 for EXT partitions and 82 for swap partition.

-Apply the partition table by running the following command in the same directory as the table file:

sfdisk --no-reread /dev/mmcblk0 < table 

-Reboot the phone

-Format the newly created large partition as ext3

mkfs.ext3 /dev/mmcblk0p2

-And the fresh smaller one as FAT for MyDocs

mkfs.vfat -F32 -s64 /dev/mmcblk0p1

-Mount the ext3 partition as /mnt

mount /dev/mmcblk0p2 /mnt

-Copy you /home back

cp -a /home/* /mnt

-Open /usr/lib/genfstab.awk again and uncomment the code you've previously commented.

-Remove the lines from /etc/event.d/rcS-late you've added before

Reboot again and you're done!. The great part is with the aid of a MicroSD card, you can truly partition exactly as you like. For example: you can also create a swap partition on the sd card, comment out the swap part of genfstab.awk, add an "echo "/dev/mmcblk1pX none swap sw 0 0" >> $tmp_fstab" to rcS-late (where X is the MicroSD swap partition). This will allow you to repartition the swap partition on the eMMC (or completely remove it, so that only the MicroSD card will be used as swap (for discussion about this see this thread. As long as you edit rcS-late and genfstab.awk correcly, you can partition without restrictions

P.s. Solution #4 applies in the same way to this solution, as to #3

Solution #8: The GUI-Solution for arbitrary size for /home and MyDocs using a Linux Live-CD (PR1.3 compatible)

This solution is inspired by the methods sub7 was promoting in a couple of posts in the talk.maemo.org forum like here

Lets face it: You are using a Linux phone, so make familiar with Linux! Grab yourself a Debian or Ubuntu based Live-CD.

Personally i recommend using an aptosid KDE4 Live-CD http://aptosid.com You will find the Downloads behind the Downloads/Mirrors link in the upper left corner. The image size is some 450MB

You need some prerequisites installed on your N900: You need either Backup-Menu or Backup-Menu-Multiboot by RobbieThe1st installed.

Start your PC with the Linux-Live-CD. Make sure to choose a fitting localisation for your keyboard layout. Restart your phone now with the keyboard ejected. Connect the phone to your PC via the USB. Choose the BackupMenu item. A boot screen like this http://robbiethe1st.afraid.org/BackupMenu/IMGP2653-small.jpeg will greet you Choose 'w' from the menu of the N900, this will export the partitions of the N900 internal memory to the PC.

Now start the KDE-Partition-Manager from the menu, you will find it in the System section.

You will have to choose the N900 in the devices section to the left. It will open the device in the right. Click on the first partition (the MyDocs partition), choose resize/move from the toolbar. Select the handle to the right and resize the partition to the desired size. Now choose your second partition (the optfs partition, where you will have some more space for installable applications real soon :) ), resize it using the left handle and resize it to the available space. Now apply the actions you were preparing. This will take some time, so stay patient.

After the process is finished shut down the PC and reboot the phone with typing 'q' in the backup-menu. Voila, you are done!

P.S. I have still to figure out how to upload some screenshots. Stay tuned.

References