Journalling Flash File System
From DD-WRT Wiki
Contents |
Introduction
Journalling Flash File System (JFFS/JFFS2) is a re-writable area within a DD-WRT-enabled device.
- Located in /jffs.
Contents stored:
- On DD-WRT Device main flash directly on the device (/jffs), or
- mount --bind /storagelocation /jffs.
Where storagelocation is- Off-board supplemental flash, see SD/MMC_mod, (/mmc/jffs).
- Network Area Storage [NAS], or Server. (//servername/sharename)
- JFFS reports as it's own free space, the free space on Share or SD Card, in the Web Interface
Examples of the kind of programs and data are:
- Custom configuration files
- NoCat splash pages and configuration
- ipkg (Requires JFFS. See ipkg.)
- Web-site hosting
- Many other things.
- JFFS must be Enabled for certain /jffs-dependent applications.
Enable JFFS: Create /jffs
Prerequisites
On 4MB routers, enabling JFFS is made possible by using the DD-WRT Standard-NoKaid builds. NoKaid removes a specific XBOX module, leaving room for JFFS. The Mini builds of DD-WRT also work. This leaves between about 320KB - 700KB+ of available re-writable space in /jffs.
Very old versions of some Linksys routers (no longer manufactured for many years) contained 8MB of Flash and 32MB of RAM, many DD-WRT-capable devices today contain 4MB of Flash memory; a few models from certain manufacturers contain more flash (La Fonera, ASUS WL-500GP), some contain less (2MB). See Supported Devices.
Flash Wear: A Warning
Take care not to store frequently changing files (i.e. often-changing log files) on Flash as this can cause flash wear-out over time.
- A journalling flash file system is specifically designed to minimize frequent overwrites.
- Files which are read many times but written infrequently work well on main flash.
- Using the space provided by SD/MMC_mod removes wear from occurring on unreplaceable main flash.
Directions for (normal) users: Web Interface
The steps to enable JFFS through the router web page are very specific. To avoid having to reset and reprogram your router, it's smart to make a backup here of your settings. If you follow these steps exactly, it should not lock up.
- On the router web page click on Administration.
- Scroll down until you see JFFS2 Support.
- Click Enable JFFS.
- Click Save.
- Wait couple seconds, then click Apply.
- Wait again. Go back to the Enable JFFS option, click Clean JFFS.
- Do not click "Save". Click Apply instead.
The router formats the available space, which is now shown in the JFFS2 Support box.
Directions for (freaky) Linux Gurus: CLI
Enter the following commands from the CLI:
nvram set jffs_mounted=1 nvram set enable_jffs2=1 nvram set sys_enable_jffs2=1 nvram set clean_jffs2=1 nvram set sys_clean_jffs2=1 nvram commit reboot
Note: Device might reboot/hang after cleaning which might take long; be patient.
WARNING
A user comments: I tried the previous commands under La Fonera firmware v24 RC4 and corrupted all my settings. I had to recover my unit with the procedures on La Fonera flashing page. I am not sure if this is a bug or these commands are not suited for La Fonera. Please try to use the web interface above. It works for me.
To unmount the JFFS:
nvram set sys_enable_jffs2=0 nvram set sys_clean_jffs2=0 nvram set jffs_mounted=0 nvram commit reboot
Afterwards you can delete these variables with "nvram unset <variable>".
Options for Increasing JFFS Space
Add a 1GB flash memory card
- Add the SD/MMC mod
- up to (at least) 1GB storage using common swappable SD memory cards (built-in support with DD-WRT v2.4 and above).
- create the folder /mmc/jffs
mkdir /mmc/jffs - Use the Mount Bind command to point /jffs to the storage card:
mount --bind /mmc/jffs /jffs - with v24 ensure you still have jffs2 support enabled in the webgui
- Windows XP: WinSCP can be used to transfer files to and from the router, eliminating the need to pull the card out and put it in a card reader on a PC.
- Linux, Mac OS X: Other SCP transfer applications exist.
- Removed cards can be accessed natively in Linux or OS X, or on Windows with the Ext2FS driver [[1]].
- On older firmware (v2.3), the limited JFFS space can be used to hold the drivers to load support for the SD card.
Add USB Storage
- Routers with USB storage: A Linksys WRTSL54GS or ASUS WL-500g Premium device has USB capability (and more Flash and RAM).
- Some firmwares (older): Drivers and startup files are stored in a small amount of JFFS space
- Current firmware: USB support available within current v2.4 builds.
Using CIFS (Samba): Storing /jffs content remotely
One option is to create a share on the network and mount it on the router at /jffs using CIFS. Exact steps at CIFS
Overview:
- Enable JFFS or put the following command in a Script or Startup Command.
nvram set sys_enable_jffs2=1
- Create a share on a CIFS-capable server called jffs.
- Standard Microsoft Windows Shared Folder
- Other operating systems may refer to SMB or Samba
- In the Web GUI mount the CIFS share at /jffs.
- Folder /jffs appears locally, while
- Content actually saved remotely, on
- NAS (Network Attached Storage)
- Server (PC or some type of file server)
Costs:
- ! Setting up a NAS or Server only for router maybe not economical.
- Equipment Costs: Requires existing NAS or PC Server
- Electricity Costs: if entire Server is only serving router
- Availability Demands: CIFS share must be available
- 24/7, or whenever the DD-WRT Device is on, and
- Storing JFFS Share on quality equipment is required (i.e. Raid, Power Backup)
- ! Remote storage down means /jffs down, could mean DD-WRT Device down (increases the weak points).
- Security Limitations: CIFS is limited to Microsoft's SMB protocol, offering up to only 128-bit security.
- Poor Microsoft Protocol Security is not a problem if the LAN is physically and electronically protected from outside or inside intrusion (i.e. Guards, Guns, Locks, Dogs, Mines, Cameras, Firewalls)
- LAN Connection Required: NAS cannot be wirelessly attached to DD-WRT Device.
- Hassle: Using Microsoft Windows as the jffs Server
- ! Symbolic links in /jffs may not work.
- ! Rename (mv) commands on the /jffs mount may not work.
Most people only own an (inexpensive) Windows PC. A common Desktop PC does not a 24/7 Server make.
External Links:
See http://wrt-wiki.bsr-clan.de/index.php?title=Jffs.
Linux Newbies: http://wrt-wiki.bsr-clan.de/index.php?title=Jffs_sharing_in_a_Linux_server.
The following non-updated (as of 20080520) examples may be out of date:
- CIFS was broken on many builds this update author tried. Although other people have reported it working - It may be a limitation of BusyBox CIFS when using NTLMv2 and 128-bit encryption.
- (Mostly) only structural and spelling mistakes were corrected below (20080522)
Use a Startup Script: Example 1
- Read how to use Startup Scripts. Then place the following into your startup script to mount the JFFS partition:
umount /jffs #unmounts existing /jffs if existing mount.cifs //<server's IP>/jffs /jffs -o username=<the username>,password=<the password> nvram set sys_enable_jffs2=1 # fake-enable JFFS. Enable but do not commit. Makes ipkg think jffs2 is enabled.
NOTE: Username is Guest when hosted on Windows XP & 'Simple File Sharing' is enabled - This is the default on Windows XP Home.
Use Startup Scripts: Example 2
This method uses 2 scripts: The first will be started from /tmp/smbshare & mount the samba share under /jffs and start the other script. The second will be started from /jffs and unmount /tmp/sambashare.
Instructions:
- Enable CIFS (see also Jffs_sharing_in_a_Linux_server).
- Create a script called "startup.smb.sh" on the share:
#!/bin/sh #smb settings: same as the settings in the webgui # change these to mount a different share than the current at /jffs SMBSHARE=`nvram get samba_share` SMBUSER=`nvram get samba_user` SMBPASS=`nvram get samba_password` #script to start in /jffs once we're done mounting JFFS_SCRIPT=startup.jffs.sh #where to log what is happening export SMBLOG=/tmp/smblog ####### ok, here we go... ;) ####### echo "" > $SMBLOG cd / #make sure JFFS is unmounted. echo "umounting /jffs if necessary..." >> $SMBLOG umount /jffs >> $SMBLOG 2>&1 #mount our smbshare at /jffs echo "mounting $SMBSHARE at /jffs..." >> $SMBLOG mount.cifs $SMBSHARE /jffs -o username=$SMBUSER,password=$SMBPASS >> $SMBLOG 2>&1 #hand over startup to the JFFS part /jffs/$JFFS_SCRIPT & >> $SMBLOG 2>&1
4. create a script called "startup.jffs.sh" on the share:
#!/bin/sh #wait a sec, just to be sure the smb startup script has quit sleep 1 #unmount the smbshare, its identical to /jffs now anyway :) umount /tmp/smbshare #to enable ipkg, we fake JFFS enabled. #since theres no commit, this wont actually create a /jffs at Startup. nvram set sys_enable_jffs2=1 #ready to do specific stuff, like starting services #or other commands from /jffs
5. in the webinterface, enable CIFS with appropriate share/user/pass settings from step 2.
- Enter "startup.smb.sh" as the script
6. Apply Changes
7. reboot
Now you should have the share configured in the web interface mounted at /jffs and should also be able to run 'ipkg' !
- NOTE: If you are a Linux newbie, and you have problems with file permissions, look at this
- Script files must be saved in UNIX format, not DOS. Windows editors that can do this are UltraEdit. EditPadPro and Crimson Editor, are free.
- WinSCP can be used to easily change the execute flags on the scripts.
Use Startup Script: Example 3
This method requires 2 shares available for DD-WRT, but allows you to have 2 different areas of storage for the router. Some might find it useful. It is an amalgamation of the previous 2 methods.
Things you need:
- 2 writeable shares on an NAS or Server.
Procedure:
1. Enable CIFS
2. Create a shell script in the network share, as follows:
#!/bin/sh nvram set sys_enable_jffs2=1 # fake-enable JFFS umount /jffs # unmount /jffs if it exists mount.cifs //<server's IP>/<jffs share name> /jffs -o username=<your username>,password=<your password>
3. Enter the name of the script in the CIFS-Samba startup script box in the Web Interface.
4. Apply changes.
5. Reboot
As an example network setup:
- /tmp/smbshare located in a shared folder on the NAS called ddwrt, which contains scripts (including startup.sh containing the above commands), yet to be installed packages and other static data
- /jffs located in a shared folder called jffs, which contains program data for installed packages
Testing ipkg
Log in to the CLI (via Telnet or SSH) and enter the following commands:
mkdir -p /jffs/tmp/ipkg ipkg update ipkg list