Editing Changing the eMMC filesystem

Warning: You are not logged in. Your IP address will be recorded in this page's edit history.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 4: Line 4:
Each filesystem got its own pros and cons. There is no 'one size fits all' type of filesystem; only filesystems each with their own use-cases. Therefore: do some extensive research before deciding to change your filesystem!
Each filesystem got its own pros and cons. There is no 'one size fits all' type of filesystem; only filesystems each with their own use-cases. Therefore: do some extensive research before deciding to change your filesystem!
-
 
-
This wiki page is focused on changing the filesystem of the <code>/home</code> partition.
 
Prerequisites:
Prerequisites:
-
*The kernel you're running should support the filesystem you want to use. Either use [[Kernel Power|kernel-power]] or compile a kernel yourself.
+
*The kernel you're running should support the filesystem you want to use. Either use kernel-power or compile a kernel yourself.
*Willingness to mess with Maemo's boot process (reflash risk!)
*Willingness to mess with Maemo's boot process (reflash risk!)
== How to do it ==
== How to do it ==
-
Basically, you need to move <code>/home</code> to a temporary location, reformat its original partition with the filesystem of your choice, copy <code>/home</code> back and finally edit <code>/etc/event.d/rcS-late</code>. This can be a challenge as Maemo gets into a reboot loop when <code>/home</code> can't be mounted. Back up all your data!
+
Basically, you need to move /home to a temporary location, reformat its original partition with the filesystem of your choice, copy /home back and finally edit /etc/event.d/rcS-late. This can be a challenge as Maemo gets into a reboot loop when /home can't be mounted. Back up all your data!
=== Solution #1: Do everything on-device ===
=== Solution #1: Do everything on-device ===
-
This solution is based on Solution #8 in [[Repartitioning_the_flash]].
+
This solution is based on Solution #7 in [[Repartitioning_the_flash]].
-
<ol>
+
1. Move /home as described in Solution #7 in [[Repartitioning_the_flash]]. Follow the described steps strictly until you reach the command which would actually repartition the flash (the sfdisk command). You don't need to follow any other steps from the mentioned solution from now onwards.
-
<li>
+
-
Move <code>/home</code> as described in Solution #8 in [[Repartitioning_the_flash]]. Follow the described steps strictly until you reach the command which would actually repartition the flash (the sfdisk command). You don't need to follow any other steps from the mentioned solution from now onwards.
+
-
</li>
+
-
<li>
+
-
Assuming you've successfully moved <code>/home</code> (e.g. you got a fully booted phone with <code>/home</code> on a different partition), format <code>/home</code> its original partition to your filesystem of choice and mount it. For example:
+
-
<pre>
+
-
mkfs.ext4 /dev/mmcblk0p2
+
-
mount -t ext4 -o rw,noatime,commit=1,data=writeback /dev/mmcblk0p2 /mnt
+
-
</pre>
+
-
</li>
+
-
<li>
+
-
Copy your <code>/home</code> back to (now its reformatted) original partition:
+
-
<pre>
+
-
cp -a /home/* /mnt
+
-
</pre>
+
-
Don't forget to unmount <code>/home/user/MyDocs</code> prior to copying!
+
-
</li>
+
-
<li>
+
-
Now you should edit <code>/etc/event.d/rcS-late</code> to make Maemo use <code>/home</code> its original partition again and accept its new filesystem type.
+
-
<ol>
+
-
<li>
+
-
''Making Maemo use <code>/home</code> its original partition again.''
+
-
In step 1, you've added two lines:
+
2. Assuming you've successfully moved /home (e.g. you got a fully booted phone with /home on a different partition), format /home its original partition to your filesystem of choice and mount it. For example:
-
<pre>
+
-
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
+
-
</pre>
+
mkfs.ext4 /dev/mmcblk0p2
-
to <code>/etc/event.d/rcS-late</code>. For ext4 (or any ext), remove both lines.
+
mount -t ext4 -o rw,noatime,commit=1,data=writeback /dev/mmcblk0p2 /mnt
 +
 
 +
3. Copy your /home back to (now its reformatted) original partition:
 +
 
 +
cp -a /home/* /mnt
 +
Don't forget to unmount /home/user/MyDocs prior to copying!
 +
 
 +
4. Now you should edit /etc/rcS-late to make Maemo use /home its original partition again and accept its new filesystem type.
 +
 
 +
4.1. ''Making Maemo use /home its original partition again''
 +
 
 +
In step 1, you've added the line:
 +
  echo "/dev/mmcblk1p1 /home ext3 rw,noatime,errors=continue,commit=1,data=writeback 0 0" >> $tmp_fstab
 +
to /etc/event.d/rcS-late. Modify this line to represent the fstab entry of your new filesystem on /home its original partition. Examples include:
 +
 
 +
  #ext4 example
 +
  echo "/dev/mmcblk0p2 /home ext4 rw,noatime,errors=continue,commit=1,data=writeback 0 0" >> $tmp_fstab
 +
 
 +
  #Reiser4 example
 +
  echo "/dev/mmcblk0p2 /home reiser4 rw,noatime 0 0" >> $tmp_fstab
-
For other filesystems, remove only second line (containing /opt) and modify first one, to include appropriate mount options for filesystem of Your choose:
 
-
<pre>
 
-
#Reiser4 example
 
-
echo "/dev/mmcblk0p2 /home reiser4 rw,noatime 0 0" >> $tmp_fstab
 
-
</pre>
 
Make sure you add no invalid mount options! Mount failure results in a reboot-loop. You can test the mount options by trying to mount the partition manually prior to making it permanent.
Make sure you add no invalid mount options! Mount failure results in a reboot-loop. You can test the mount options by trying to mount the partition manually prior to making it permanent.
-
</li>
 
-
<li>
 
-
''Making Maemo accept the new filesystem type.''
 
-
Line no. 12, 17, 22, 23 and 25 of rcS-late got "ext3" hard-coded in it (line 9 contains ext3 in comment, but this don't affect funcionality of script - You can change it if You want). We need to edit these lines to represent our new filesystem.  
+
4.2. ''Making Maemo accept the new filesystem type''
 +
 
 +
Line no. 13, 18, 23, 24 and 26 of rcS-late got "ext3" hard-coded in it. We need to edit these lines to represent our new filesystem.  
Ext4 example:
Ext4 example:
-
<pre>
+
  ##Begin of snippet
-
##Begin of snippet
+
  script
-
script
+
      #mount /home; fix ext4 and retry mounting if 1st attempt fails
-
    #mount /home; fix ext4 and retry mounting if 1st attempt fails
+
      mount_home ()
-
    mount_home ()
+
      {
-
    {
+
      /bin/mount /home && grep -q "/home ext4 rw" /proc/mounts
-
    /bin/mount /home && grep -q "/home ext4 rw" /proc/mounts
+
-
    if [ $? -eq 0 ]
+
-
    then
+
-
      return 0
+
-
    else
+
-
      grep -q "/home ext4 ro" /proc/mounts
+
       if [ $? -eq 0 ]
       if [ $? -eq 0 ]
       then
       then
-
         umount /home
+
         return 0
 +
      else
 +
        grep -q "/home ext4 ro" /proc/mounts
 +
        if [ $? -eq 0 ]
 +
        then
 +
          umount /home
 +
        fi
 +
        HOME_DEV=`grep "/home ext4" /etc/fstab | cut -d' ' -f1`
 +
        fsck.ext4 -y $HOME_DEV >> /var/lib/fsck_ext4_home.log 2>&1
 +
        sync
 +
        /bin/mount /home && grep -q "/home ext4 rw" /proc/mounts
 +
        return $?
       fi
       fi
-
       HOME_DEV=`grep "/home ext4" /etc/fstab | cut -d' ' -f1`
+
       }
-
      fsck.ext4 -y $HOME_DEV >> /var/lib/fsck_ext4_home.log 2>&1
+
  ##End of snippet
-
      sync
+
-
      /bin/mount /home && grep -q "/home ext4 rw" /proc/mounts
+
-
      return $?
+
-
    fi
+
-
    }
+
-
##End of snippet
+
-
</pre>
+
-
Make sure line 23 contains a valid fsck.X command. Try running the command with all its parameters manually before making it permanent.
+
-
 
+
-
File <code>/usr/lib/genfstab.awk</code> also contain ext3 hardcoded in it (line 19 in vanilla Maemo, line 20 in latest CSSU-Testing). For switching to another ext filesystem (like ext4) change it to appropriate value.
+
-
 
+
-
On systems with [[CSSU]], one also need to edit <code>/etc/default/mount-opts</code>, which contain mount options, including filesystem type (ext3 by default, manual modification required).
+
-
 
+
-
<code>//Note for Geeks:</code>
+
-
Original creator of this article didn't mention that You need to modify <code>/usr/lib/genfstab.awk</code> - instead, he suggested to keep 1st line added to <code>/etc/event.d/rcS-late</code>. This probably allowed to go around omitted modification of <code>/usr/lib/genfstab.awk</code>, but approach proposed now is more accurate to native way how Maemo do it. Ho ever, i only tested it using ext4 filesystem - that have identical mount options (except stating that it's ext4) as ext3. I don't know if editing <code>/usr/lib/genfstab.awk</code> will work with filesystems other than ext family (like reiser4), that's why I stated in instruction to modify - instead of delete - line in rcS-late, containing mount options for reiser4. The same apply for genfstab.awk - I stated it should be only modified for ext filesystem family. So, for reiser4 and other no ext filesystems, instructions remain same as made by original author.
+
-
 
+
-
If someone have experience with changing filesystem other to ext4 (or any ext), and/or like to experiment with setting genfstab.awk, please update this article with Your findings.
+
-
</li>
+
-
</ol>
+
-
</li>
+
-
<li>
+
-
Reboot your phone. You're done now.
+
-
</li>
+
-
</ol>
+
-
=== Solution #2: Easier GUI solution, need another PC + linux live CD===
+
Make sure line 24 contains a valid fsck.X command. Try running the command with all its parameters manually before making it permanent.
-
Coming soon - will write instructions based on use of gParted,Aptosid, or any other Linux liveCD and backupmenu (or backupmenu-multiboot). Inspired by main (GUI) solution in "repartitioning the flash" article.
+
5. Reboot your phone. You're done now.
== Some initial benchmarks ==
== Some initial benchmarks ==
Line 112: Line 79:
How the benchmarks were performed: Reflashed & repartitioned phone in offline mode, SSH over usb. Used script (first round out of five dismissed in the averaged result):
How the benchmarks were performed: Reflashed & repartitioned phone in offline mode, SSH over usb. Used script (first round out of five dismissed in the averaged result):
-
<source lang="bash">
+
  #!/bin/sh
-
#!/bin/sh
+
  for run in `seq 1 5`
-
for run in `seq 1 5`
+
  do
-
do
+
  sync
-
sync
+
  echo 3 > /proc/sys/vm/drop_caches
-
echo 3 > /proc/sys/vm/drop_caches
+
  sleep 1
-
sleep 1
+
  time sh -c "cp [FILE/DIRECTORY] /mnt && sync"
-
time sh -c "cp [FILE/DIRECTORY] /mnt && sync"
+
  done
-
done
+
 
 +
  df | grep /mnt
-
df | grep /mnt
+
The files were copied from /dev/mmcblk0p1 (FS: reiser4, LZO compression) to /dev/mmcblk0p2 (FS: depends on test)
-
</source>
+
-
 
+
-
The files were copied from <code>/dev/mmcblk0p1</code> (FS: reiser4, LZO compression) to <code>/dev/mmcblk0p2</code> (FS: depends on test)
+
Used ext3 options:
Used ext3 options:
-
mkfs.ext3 /dev/mmcblk0p2
+
  mkfs.ext3 /dev/mmcblk0p2
-
mount -t ext3 -o rw,noatime,errors=continue,commit=1,data=writeback /dev/mmcblk0p2 /mnt
+
  mount -t ext3 -o rw,noatime,errors=continue,commit=1,data=writeback /dev/mmcblk0p2 /mnt
Used ext4 options:
Used ext4 options:
-
mkfs.ext4 /dev/mmcblk0p2
+
  mkfs.ext4 /dev/mmcblk0p2
-
mount -t ext4 -o rw,noatime,errors=continue,commit=1,data=writeback /dev/mmcblk0p2 /mnt
+
  mount -t ext4 -o rw,noatime,errors=continue,commit=1,data=writeback /dev/mmcblk0p2 /mnt
Used reiser4 options:
Used reiser4 options:
-
mkfs.reiser4 -o create=ccreg40,compress=lzo1,cluster=8K,formatting=smart /dev/mmcblk0p2
+
  mkfs.reiser4 -o create=ccreg40,compress=lzo1,cluster=8K,formatting=smart /dev/mmcblk0p2
-
mount -t reiser4 -o noatime /dev/mmcblk0p2 /mnt
+
  mount -t reiser4 -o noatime /dev/mmcblk0p2 /mnt
Averaged values of the "real time" as reported by time
Averaged values of the "real time" as reported by time
{| class="wikitable"
{| class="wikitable"
-
! Filesystem
+
! width="90" | Filesystem
-
! linux-2.6.28.tar.bz2 @ 50.2MiB
+
! width="200" | linux-2.6.28.tar.bz2 @ 50.2MiB
-
! 500 (mostly text) files @ 4MiB
+
! width="200" | 500 (mostly text) files @ 4MiB
-
! 83 (mostly text) files @ 14.6MiB
+
! width="200" | 83 (mostly text) files @ 14.6MiB
|-
|-
|Ext3|| 14.3725s || 7.205s || 7.1025s
|Ext3|| 14.3725s || 7.205s || 7.1025s
Line 155: Line 120:
Space reported by df after each benchmark (in total 747264 1K blocks available)
Space reported by df after each benchmark (in total 747264 1K blocks available)
{| class="wikitable"
{| class="wikitable"
-
! Filesystem
+
! width="90" | Filesystem
-
! linux-2.6.28.tar.bz2 @ 50.2MiB
+
! width="200" | linux-2.6.28.tar.bz2 @ 50.2MiB
-
! 500 (mostly text) files @ 4MiB
+
! width="200" | 500 (mostly text) files @ 4MiB
-
! 83 (mostly text) files @ 14.6MiB
+
! width="200" | 83 (mostly text) files @ 14.6MiB
|-
|-
|Ext3|| 68668 (9%) || 22748 (3%) || 32368 (4%)
|Ext3|| 68668 (9%) || 22748 (3%) || 32368 (4%)
Line 167: Line 132:
|}
|}
-
Do note that both the stock Maemo kernel and kernel-power lack Reiser4 support; you'll have to compile a kernel with Reiser4 support yourself.
+
Do note that both Maemo and kernel-power lack Reiser4 support; you'll have to compile a kernel with Reiser4 support and reiser4progs yourself.
-
 
+
-
== Remarks about filesystems ==
+
-
''Please extend this text as you encounter stuff worthy to take note of.''
+
-
*Reiser4 has some problems with both cluster=8K and cluster=16K on the N900 ("<code>Wrong level found in node</code>" warnings in dmesg). The parameters cluster=32K and cluster=64K (the default value) work without error. Use these values to prevent potential data loss.
+
-
 
+
-
The following options have been tested by creating a tarball of /home/opt (~400MiB), extracting it once mounted, removing the original tar and then repeating for a tarball of the SDK (~500MiB). Originally cluster=8K was attempted but a reboot produced the dreaded <code>Wrong level found in node</code> error again so reverting to 32K
+
-
 
+
-
'''Take note of the fsck.reiser4 stage which should be executed before the first mount.''' It creates lost+found directory and inserts an entry for ".", amongst other fixes.
+
-
 
+
-
mkfs.reiser4 -y -o create=ccreg40,compress=lzo1,compressMode=ultim,cluster=32K,fibration=ext_3_fibre,formatting=smart /dev/mmcblkXpY
+
-
fsck.reiser4 -y --build-fs /dev/mmcblkXpY
+
-
mount -t reiser4 -o rw,noatime,nodiratime /dev/mmcblkXpY /path/to/mount
+
== Different filesystem in action ==
== Different filesystem in action ==
[[Image:screenshot_reiser4.png|Reiser4 in action]]
[[Image:screenshot_reiser4.png|Reiser4 in action]]
-
 
-
[[Category:N900]]
 
-
[[Category:Power users]]
 

Learn more about Contributing to the wiki.


Please note that all contributions to maemo.org wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see maemo.org wiki:Copyrights for details). Do not submit copyrighted work without permission!


Cancel | Editing help (opens in new window)