Editing Modifying the root image
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 1: | Line 1: | ||
- | This | + | This HOWTO describes 2 methods for extending and modifying an existing JFFS2 root image of 770. |
- | + | =Background = | |
- | The root filesystem (rootfs) of the | + | The root filesystem (rootfs) of the Nokia 770 is stored in a Journal Flash File System version 2 (JFFS2) format. It resides on one of the partitions on the flash chip in the Nokia 770. Additionally, a pristine version of the rootfs can be obtained from the [http://tablets-dev.nokia.com/nokia_770.php Nokia official firmware]. |
There are two ways to mount the JFFS2 image: | There are two ways to mount the JFFS2 image: | ||
- | #Have a block device emulate a Memory Technology Device (MTD) via block2mtd. | + | #Have a block device emulate a Memory Technology Device (MTD) via blkmtd (v2.4.x Linux kernels) or block2mtd (v2.6.x Linux kernels) |
- | #Have kernel memory emulate a MTD via mtdram | + | #Have kernel memory emulate a MTD via mtdram |
- | + | =Getting the JFFS2 Image= | |
+ | First of all, we need to get the rootfs.jffs2 from the official [http://tablets-dev.nokia.com/nokia_770.php Nokia binary]: | ||
- | + | $ mkdir SE2005_image | |
- | + | $ cd SE2005_image | |
+ | $ sudo ./flasher --unpack -F /path_to_file/Nokia_770_SE2005_3_2005_51_13.bin | ||
- | + | Found image 2nd (length 8576) | |
+ | Found image secondary (length 79360) | ||
+ | Found image xloader (length 13824) | ||
+ | Found image initfs (length 1581824) | ||
+ | Found image kernel (length 1481856) | ||
+ | Found image rootfs (length 58851328) | ||
+ | Unpacking 2nd image to file '2nd.bin'... | ||
+ | Unpacking X-Loader image to file 'xloader.bin'... | ||
+ | Unpacking secondary image to file 'secondary.bin'... | ||
+ | Unpacking kernel image to file 'zImage'... | ||
+ | Unpacking initfs image to file 'initfs.jffs2'... | ||
+ | Unpacking rootfs image to file 'rootfs.jffs2'... | ||
- | + | =Mounting JFFS2 Image= | |
- | + | It is assume that all these commands will be executed on the development/hacking host and not on the Nokia 770 itself. Also assumed is all these commands will be executed with root privileges (i.e. sudo /bin/sh). | |
- | == | + | =='''Block Device Emulating a MTD'''== |
- | + | ==='''Linux 2.4.x Kernel'''=== | |
+ | If you are using a Linux 2.4.x kernel, you must have the following kernel modules compiled: | ||
- | + | *CONFIG_MTD (mtdcore) | |
- | * | + | *CONFIG_MTD_PARITIONS (mtdpart) |
- | * | + | *CONFIG_MTD_MTDRAM (mtdram) |
- | * | + | *CONFIG_MTD_BLKMTD (blkmtd) |
- | ''' | + | *CONFIG_BLK_DEV_LOOP (loop) |
- | * | + | |
- | * | + | ==='''Linux 2.6.x Kernel'''=== |
- | + | If you are using a Linux 2.6.x kernel, you must have the following kernel modules compiled: | |
- | * | + | |
- | + | *CONFIG_MTD (mtdcore) | |
- | * | + | *CONFIG_MTD_PARITIONS (mtdpart) |
- | * | + | *CONFIG_MTD_MTDRAM (mtdram) |
+ | *CONFIG_MTD_BLOCK2MTD (block2mtd) | ||
+ | *CONFIG_BLK_DEV_LOOP (loop) | ||
I suggest you do not make these modules statically linked into the kernel. It is more practical to be able to unload these modules when not needed or when you want to start over from scratch. | I suggest you do not make these modules statically linked into the kernel. It is more practical to be able to unload these modules when not needed or when you want to start over from scratch. | ||
Line 42: | Line 58: | ||
losetup /dev/loop0 rootfs.jffs2 | losetup /dev/loop0 rootfs.jffs2 | ||
modprobe mtdblock | modprobe mtdblock | ||
- | modprobe block2mtd | + | modprobe blkmtd device=/dev/loop0 ### for Linux 2.4.x |
- | # | + | or |
- | + | modprobe block2mtd ### for Linux 2.6.x | |
+ | echo "/dev/loop0" > /sys/module/block2mtd/parameters/block2mtd ### Linux 2.6.x | ||
modprobe jffs2 | modprobe jffs2 | ||
- | |||
mount -t jffs2 /tmp/mtdblock0 /media/jffs2 | mount -t jffs2 /tmp/mtdblock0 /media/jffs2 | ||
- | |||
To unmount and cleanup: | To unmount and cleanup: | ||
umount /media/jffs2 | umount /media/jffs2 | ||
- | modprobe -r block2mtd | + | modprobe -r blkmtd ### Linux 2.4.x |
+ | or | ||
+ | modprobe -r block2mtd ## Linux 2.6.x | ||
modprobe -r mtdblock | modprobe -r mtdblock | ||
losetup -d /dev/loop0 | losetup -d /dev/loop0 | ||
- | + | You can use the following Shell script to automate the process. | |
- | + | ==Kernel Memory Emulating a MTD== | |
- | + | (Idea originally from Michael Mlivoncic) To mount the JFFS2 image, you perform the following steps: | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
mknod /tmp/mtdblock0 b 31 0 | mknod /tmp/mtdblock0 b 31 0 | ||
Line 90: | Line 94: | ||
modprobe -r mtdblock | modprobe -r mtdblock | ||
- | + | You can use the following Shell script to automate the process. | |
- | + | =Archiving and Extracting the Root Image= | |
- | The image is now accessible under /media/jffs2. Copy the whole image to another directory. This new directory will be used for modifying the image. Extending the currently mounted JFFS2 image is not suggested. Using cp for copying the image to a working directory won't work due to special files in /media/jffs2/dev, | + | The image is now accessible under /media/jffs2. Copy the whole image to another directory. This new directory will be used for modifying the image. Extending the currently mounted JFFS2 image is not suggested. Using cp for copying the image to a working directory won't work due to special files in /media/jffs2/dev, for example. This is the reason we use tar. proceed as above, i.e.: |
- | cd /media/jffs2 | + | $ cd /media/jffs2 |
- | tar cvzf /my_path/myRootImage.tar.gz . | + | $ tar cvzf /my_path/myRootImage.tar.gz . |
- | cd $HOME | + | $ cd $HOME |
- | mkdir myRootImage | + | $ mkdir myRootImage |
- | cd myRootImage | + | $ cd myRootImage |
- | tar xvpzf /my_path/myRootImage.tar.gz | + | $ tar xvpzf /my_path/myRootImage.tar.gz |
- | == | + | =Modifying the Copy of Image= |
- | + | Now the image is successfully archived and copied. The working directory $HOME/myRootImage can now be used for adding packages etc, for example. | |
- | + | $ cd $HOME/myRootImage | |
- | + | $ dpkg -x $HOME/arm_debs/mypackage_arm.deb . | |
- | + | ||
- | + | ||
- | dpkg -x $HOME/arm_debs/mypackage_arm.deb . | + | |
Now we create a new tarball from the working directory of the image. | Now we create a new tarball from the working directory of the image. | ||
- | cd $HOME/myRootImage | + | $ cd $HOME/myRootImage |
- | tar cvzf $HOME/myNewRootImage.tar.gz . | + | $ tar cvzf $HOME/myNewRootImage.tar.gz . |
- | == | + | =Installing into Nokia 770= |
+ | When the new tarball is created, refer to HOWTO: Using flasher and the reference root filesystem for creating JFFS2 image from the myNewRootImage.tar.gz. | ||
- | + | Use flasher to install the image to Nokia 770. | |
- | + | $ ./flasher --flash-only rootfs -F image.bin -f | |
- | + | ||
- | + | ||
- | + | ||
- | + | $ ./flasher --rootfs rootfs.jffs2 --flash-only rootfs --flash | |
- | + | $ ./flasher --enable-rd-mode --reboot | |
- | The | + | The flash-only parameter is used just to make sure ;-) |
- | |||
- | + | =Final remarks= | |
+ | Tonight, I had to re-flash the first time, as I screwed up a script in /etc/init.d/. For the future, I will try to make a full backup of my productive rootfs, to avoid starting all over again | ||
- | |||
- | |||
- | + | -------------------------------------------------------------------------------- | |
- | + | =Shell script to mount/unmount JFFS2 using Block device Emulating MTD= | |
- | + | ||
- | + | ||
Create a shell script (mount_jffs2.sh) from the following: | Create a shell script (mount_jffs2.sh) from the following: | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | + | #!/bin/sh | |
- | + | JFFSIMG=$1 # jffs image | |
- | + | LOOP="/dev/loop1" # loop device | |
- | + | MP="/media/jffs2" # mount point | |
- | + | MTDBLOCK="/tmp/mtdblock0" # MTD device file | |
+ | KVER="2.6" | ||
+ | BLKMTD="block2mtd" | ||
+ | UMNT="" | ||
- | + | echo "$0" | grep unmount_ >/dev/null 2>&1 | |
- | + | [ $? -eq 0 ] && UMNT=1 | |
- | + | if [ $# -gt 1 -a x"$2"x = x"unmount"x ]; then | |
- | + | UMNT=1 | |
- | fi | + | fi |
- | + | uname -r | egrep '^2\.6' >/dev/null 2>&1 | |
- | + | if [ $? -ne 0 ]; then | |
- | + | KVER="2.4" | |
- | + | BLKMTD=blkmtd | |
- | + | fi | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | if [ x"${UMNT}"x = x""x ]; then | |
+ | if [ ! -b ${MTDBLOCK} ] ; then | ||
+ | mknod ${MTDBLOCK} b 31 0 || exit 1 | ||
+ | fi | ||
+ | lsmod | grep loop >/dev/null 2>&1 | ||
+ | if [ $? -ne 0 [; then | ||
+ | modprobe loop | ||
+ | [ $? -ne 0 ] && echo "loopback loading failed" && exit 1 | ||
+ | sleep 1 | ||
+ | fi | ||
+ | losetup ${LOOP} ${JFFSIMG} || exit 1 | ||
+ | sleep 1 | ||
+ | modprobe mtdblock | ||
+ | if [ x"${KVER}"x = x"2.4"x [; then | ||
+ | modprobe ${BLKMTD} device=${LOOP} || exit 1 | ||
+ | else | ||
+ | modprobe ${BLKMTD} || exit 1 | ||
+ | echo "${LOOP}" > /sys/module/block2mtd/parameters/block2mtd | ||
+ | fi | ||
+ | sleep 1 | ||
+ | modprobe jffs2 | ||
+ | [ ! -d ${MP} ] && mkdir -p ${MP} | ||
+ | mount -t jffs2 ${MTDBLOCK} ${MP} || exit 1 | ||
+ | else | ||
+ | umount ${MP} | ||
+ | if [ $? -ne 0 ]; then | ||
+ | echo "Cannot unmount JFFS2 at $MP" && exit 1 | ||
+ | fi | ||
+ | modprobe -r jffs2 | ||
+ | modprobe -r ${BLKMTD} | ||
+ | modprobe -r mtdblock | ||
+ | sleep 1 | ||
+ | losetup -d ${LOOP} | ||
+ | fi | ||
- | + | Make sure you chmod a+x mount_jffs2.sh to make the shell script executable. | |
+ | |||
+ | Usage: $ ./mount_jffs2.sh rootfs.jffs2 | ||
You can also use this script to unmount and unload the non-utilized kernel modules and loopback reference: | You can also use this script to unmount and unload the non-utilized kernel modules and loopback reference: | ||
- | + | $ ./mount_jffs2.sh rootfs.jffs2 unmount | |
- | + | ||
+ | -------------------------------------------------------------------------------- | ||
+ | |||
+ | =Shell script to mount/unmount JFFS2 using Kernel Memory Emulating MTD= | ||
Create a shell script (mount_jffs2.sh) from the following: | Create a shell script (mount_jffs2.sh) from the following: | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | echo "$0" | grep unmount_ >/dev/null 2>&1 | + | #!/bin/sh |
- | [ $? -eq 0 ] && UMNT=1 | + | JFFSIMG=$1 # jffs image |
- | if [ $# -gt 1 -a x"$2"x = x"unmount"x ]; then | + | MP="/media/jffs2" # mount point |
- | + | MTDBLOCK="/tmp/mtdblock0" # MTD device file | |
- | fi | + | UMNT="" |
+ | |||
+ | echo "$0" | grep unmount_ >/dev/null 2>&1 | ||
+ | [ $? -eq 0 ] && UMNT=1 | ||
+ | if [ $# -gt 1 -a x"$2"x = x"unmount"x ]; then | ||
+ | UMNT=1 | ||
+ | fi | ||
+ | |||
+ | if [ x"${UMNT}"x = x""x ]; then | ||
+ | if [ ! -b ${MTDBLOCK} ] ; then | ||
+ | mknod ${MTDBLOCK} b 31 0 || exit 1 | ||
+ | fi | ||
+ | modprobe mtdblock | ||
+ | modprobe mtdram total_size=65536 erase_size=256 | ||
+ | modprobe jffs2 | ||
+ | dd if=${JFFSIMG} of=${MTDBLOCK} | ||
+ | [ ! -d ${MP} ] && mkdir -p ${MP} | ||
+ | mount -t jffs2 ${MTDBLOCK} ${MP} | ||
+ | else | ||
+ | umount ${MP} | ||
+ | if [ $? -ne 0 ]; then | ||
+ | echo "Cannot unmount JFFS2 at $MP" && exit 1 | ||
+ | fi | ||
+ | modprobe -r jffs2 | ||
+ | modprobe -r mtdram | ||
+ | modprobe -r mtdblock | ||
+ | fi | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
Make sure you chmod a+x mount_jffs2.sh to make the shell script executable. | Make sure you chmod a+x mount_jffs2.sh to make the shell script executable. | ||
- | Usage: | + | Usage: $ ./mount_jffs2.sh rootfs.jffs2 |
- | + | ||
You can also use this script to unmount and unload the non-utilized kernel modules: | You can also use this script to unmount and unload the non-utilized kernel modules: | ||
- | + | $ ./mount_jffs2.sh rootfs.jffs2 unmount | |
+ | |||
+ | |||
+ | -------------------------------------------------------------------------------- | ||
+ | |||
+ | =Maybe one could write a script removing unwanted stuff from that image (sample video, song), changing sudoers, gainroot script, adding sshd, ...= | ||
+ | |||
- | [[Category: | + | [[Category:HowTos]] |
- | + |
Learn more about Contributing to the wiki.