Brian Vagnoni on 1 Mar 2009 17:28:18 -0800


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [PLUG] JFFS File System


----- Original Message -----
From: Brian Vagnoni

> I'm seeing the following as I boot a certain version of firmware on an
> embedded device. What command is producing this output in the log? Or
> how can I find out which command is producing this output?
> 
> jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
> jffs2_build_filesystem(): unlocking the mtd device... done.
> jffs2_build_filesystem(): erasing all blocks after the end marker...
> done.
> mini_fo: using base directory: /
> mini_fo: using storage directory: /jffs

-------------------------------

Never mind figured in out. Sorry to bother. 

Here is the answer if you are mildly interested in OpenWRT.


root@OpenWrt:/bin# cat firstboot
#!/bin/sh
# $Id: firstboot 5544 2006-11-17 03:07:10Z nbd $
. /etc/functions.sh

partname="rootfs_data"
mtdpart="$(find_mtd_part $partname)"

rom=$(awk '/squashfs/ {print $2}' /proc/mounts)
jffs=$(awk '/jffs2/ {print $2}' /proc/mounts)

dupe() { # <new_root> <old_root>
        cd $1
        echo -n "creating directories... "
        {
                cd $2
                find . -xdev -type d
                echo "./dev ./jffs ./mnt ./proc ./tmp"
                # xdev skips mounted directories
                cd $1
        } | xargs mkdir -p
        echo "done"

        echo -n "setting up symlinks... "
        for file in $(cd $2; find . -xdev -type f;); do
                case "$file" in
                ./rom/note) ;; #nothing
                ./etc/config*|\
                ./usr/lib/opkg/info/*) cp -af $2/$file $file;;
                *) ln -sf /rom/${file#./*} $file;;
                esac
        done
        for file in $(cd $2; find . -xdev -type l;); do
                cp -af $2/${file#./*} $file
        done
        echo "done"
}

pivot() { # <new_root> <old_root>
        mount -o move /proc $1/proc && \
        pivot_root $1 $1$2 && {
                mount -o move $2/dev /dev
                mount -o move $2/tmp /tmp
                mount -o move $2/sys /sys 2>&-
                mount -o move $2/jffs /jffs 2>&-
                return 0
        }
}

fopivot() { # <rw_root> <ro_root> <dupe?>
        root=$1
        {
                mount -t mini_fo -o base=/,sto=$1 "mini_fo:$1" /mnt 2>&- && root
=/mnt
        } || {
                [ "$3" = "1" ] && {
                mount | grep "on $1 type" 2>&- 1>&- || mount -o bind $1 $1
                dupe $1 $rom
                }
        }
        pivot $root $2
}

ramoverlay() {
        mkdir -p /tmp/root
        fopivot /tmp/root /rom 1
}

# invoked as an executable
[ "${0##*/}" = "firstboot" ] && {

        [ -z "$mtdpart" ] && {
                echo "MTD partition not found."
                exit 1
        }

        [ -z "$rom" ] && {
                echo "You do not have a squashfs partition; aborting"
                echo "(firstboot cannot be run on jffs2 based firmwares)"
                exit 1
        }

        [ "$1" = "switch2jffs" ] && {
                mount "$mtdpart" /rom/jffs -t jffs2 || exit

                # try to avoid fs changing while copying
                mount -o remount,ro none / 2>&-

                # copy ramoverlay to jffs2
                echo -n "copying files ... "
                cp -a /tmp/root/* /rom/jffs 2>&-
                echo "done"

                # switch back to squashfs (temporarily)
                # and park the ramdisk ontop of /tmp/root
                pivot /rom /mnt
                mount -o move /mnt /tmp/root

                # /jffs is the overlay
                # /rom is the readonly
                fopivot /jffs /rom

                # try to get rid of /tmp/root
                # this will almost always fail
                umount /tmp/root 2>&-

                exit 0
        }

        # script run manually
        [ \! -z "$jffs" ] && {
                echo "firstboot has already been run"
                echo "jffs2 partition is mounted, only resetting files"
                grep mini_fo /proc/filesystems >&-
                [ $? != 0 ] && {
                        dupe $jffs $rom
                        exit 0
                } || {
                        rm -rf $jffs/* 2>&-
                        mount -o remount $jffs / 2>&-
                        exit 0
                }
        }

        mtd erase "$partname"
        mount "$mtdpart" /jffs -t jffs2
        fopivot /jffs /rom 1
}
root@OpenWrt:/bin# mtd --help
mtd: invalid option -- -
Usage: mtd [<options> ...] <command> [<arguments> ...] <device>

The device is in the format of mtdX (eg: mtd4) or its label.
mtd recognizes these commands:
        unlock                  unlock the device
        refresh                 refresh mtd partition
        erase                   erase all data on device
        write <imagefile>|-     write <imagefile> (use - for stdin) to device
        jffs2write <file>       append <file> to the jffs2 partition on the devi
ce
Following options are available:
        -q                      quiet mode (once: no [w] on writing,
                                           twice: no status messages)
        -r                      reboot after successful command
        -f                      force write without trx checks
        -e <device>             erase <device> before executing the command
        -d <name>               directory for jffs2write, defaults to "tmp"
        -j <name>               integrate <file> into jffs2 data when writing an
 image

Example: To write linux.trx to mtd4 labeled as linux and reboot afterwards
         mtd -r write linux.trx linux

root@OpenWrt:/bin#



--------------------------------------------------
Brian Vagnoni
PGP Digital Fingerprint
F076 6EEE 06E5 BEEF EBBD  BD36 F29E 850D FC32 3955
--------------------------------------------------

 
___________________________________________________________________________
Philadelphia Linux Users Group         --        http://www.phillylinux.org
Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
General Discussion  --   http://lists.phillylinux.org/mailman/listinfo/plug