SouthPawn
New Around Here
Hello,
So I did a search and found some people wanted to offload the JFFS to a USB stick.
I'm actually one of these people, I understand it's likely not necessary with the better flash storage that's being used but I generally don't like things writing to areas I can't physically replace.
In any case this is the post-mount script I made, partially based on what I saw on http://www.snbforums.com/threads/syslog-on-jffs.13899/page-2
The script initially syncs the existing jffs mount point to the usb's jffs folder, then from that point on does a one way sync from the usb to the jffs mount if there are changes in scripts or configs.
	
	
	
		
				
			So I did a search and found some people wanted to offload the JFFS to a USB stick.
I'm actually one of these people, I understand it's likely not necessary with the better flash storage that's being used but I generally don't like things writing to areas I can't physically replace.
In any case this is the post-mount script I made, partially based on what I saw on http://www.snbforums.com/threads/syslog-on-jffs.13899/page-2
The script initially syncs the existing jffs mount point to the usb's jffs folder, then from that point on does a one way sync from the usb to the jffs mount if there are changes in scripts or configs.
		Code:
	
	#!/bin/sh
# post-mount script designed to offload jffs to usb.
# 1. Create folder with name "jffs" under mount usb disk.
# 2. Create this script as /jffs/scripts/post-mount, chmod a+x it so it can be executed.
# 3. Be sure to check that 'Enable JFFS custom scripts and configs' is enabled under Administration->System.
# 4. Create symbolic link /jffs/scripts/unmount to /jffs/scripts/post-mount.
# 5. Reboot router.
IFS=$'\n'
JFFS_DISK=$(mount | grep -i jffs | awk '{print $1}')
# Abort if we don't have a jffs mount point to begin with.
if [ -z "$JFFS_DISK" ]; then
    logger -s "No JFFS mount point detected, aborting USB->JFFS."
    exit 1
fi
MNT=$1
CUR_DISK=$(mount | grep -i $MNT | awk '{print $1}')
if [ "$JFFS_DISK" == "$CUR_DISK" ]; then
    ORIG_JFFS=$(cat $MNT/.jffs_sync/orig_jffs.map 2>/dev/null)
    if [ -z "$ORIG_JFFS" ]; then
        logger -s "Couldn't locate original jffs mount point: $1/.jffs_sync/orig_jffs.map."
        exit 1
    fi
    umount /jffs
    mount -t jffs2 -o rw,noatime $ORIG_JFFS /jffs
fi
# Return if we don't find a jffs folder.
if [ -z "$(find $MNT -name jffs 2>/dev/null)" ]; then
    logger -s "Couldn't locate jffs folder, skipping $1 as JFFS->USB."
    exit 1
fi
if [ -z "$(find $MNT -name .jffs_sync)" ]; then
    logger -s "Cloning JFFS to USB. ($1)"
    mkdir $MNT/.jffs_sync
    cp -pr /jffs/* $MNT/jffs/
    echo $(mount | grep jffs | awk '{print $1}' ) > $MNT/.jffs_sync/orig_jffs.map
    echo $(ls -l $MNT/jffs/scripts | md5sum) > $MNT/.jffs_sync/scripts.md5
    echo $(ls -l $MNT/jffs/configs | md5sum) > $MNT/.jffs_sync/configs.md5
fi
update_folder ()
{
    DEPTH=$(echo $1 | grep -o "/" | wc -l)
    DEPTH=$((DEPTH+1))
    DEST=$(echo $1 | cut -d'/' -f${DEPTH} )
    LAST=$(cat $MNT/.jffs_sync/$DEST.md5 2>/dev/null)
    CUR=$(ls -l $MNT/jffs/$DEST | md5sum)
    if [ "$CUR" == "$LAST" ]; then
        return
    fi
    # Update files from USB to JFFS.
    for FILE in $(ls $1); do
        USB_FILE=$(md5sum $1/$FILE 2>/dev/null | awk '{print $1}')
        JFFS_FILE=$(md5sum /jffs/$DEST/$FILE 2>/dev/null | awk '{print $1}')
        if [ "$USB_FILE" != "$JFFS_FILE" ]; then
            logger -s "USB->JFFS Sync: Copying $1/$FILE to /jffs/$DEST."
                    cp -pf $1/$FILE /jffs/$DEST/
            if [ "$DEST" == "scripts" ]; then
                chmod a+x /jffs/$DEST/$FILE
            fi
        fi
    done
    # Remove files not found on USB.
    for FILE in $(ls /jffs/$DEST); do
        if [ -z "$(find $1/$FILE 2>/dev/null)" ]; then
            logger -s "USB->JFFS Sync: Erasing '$FILE' from /jffs/$DEST."
            rm -rf /jffs/$DEST/$FILE
        fi
    done
    echo $(ls -l /jffs/$DEST | md5sum) > $MNT/.jffs_sync/$DEST.md5
}
update_folder $MNT/jffs/scripts
update_folder $MNT/jffs/configs
# If this is not an unmount, unmount jffs and remount the usb jffs.
if [ -z $(echo "$0" | grep "unmount") ]; then
   umount -l /jffs
   mount -o rbind $1/jffs /jffs
fi
	
			
				Last edited: 
			
		
	
								
								
									
	
								
							
							
	