Journalling Flash File System
From DD-WRT Wiki
Revision as of 09:58, 22 May 2008 (edit) S2s2 (Talk | contribs) m (Looking more at the CIFS section) ← Previous diff |
Revision as of 18:18, 22 May 2008 (edit) (undo) S2s2 (Talk | contribs) m (Clean-up continues...) Next diff → |
||
Line 14: | Line 14: | ||
* Custom configuration files | * Custom configuration files | ||
* NoCat splash pages and configuration | * NoCat splash pages and configuration | ||
- | * [[Ipkg|ipkg]] | + | * [[Ipkg|ipkg]] (Requires JFFS. See ipkg.) |
* Web-site hosting | * Web-site hosting | ||
* Many other things. | * Many other things. | ||
- | * JFFS must be Enabled | + | * JFFS must be Enabled for certain /jffs-dependent applications. |
- | + | ||
= Enable JFFS: Create ''/jffs'' = | = Enable JFFS: Create ''/jffs'' = | ||
Line 72: | Line 71: | ||
Afterwards you can delete these variables with "nvram unset <variable>". | Afterwards you can delete these variables with "nvram unset <variable>". | ||
- | =Increasing JFFS Space | + | =Options for Increasing JFFS Space= |
== Add a 1GB flash memory card == | == Add a 1GB flash memory card == | ||
* Add the [[SD/MMC mod]] | * Add the [[SD/MMC mod]] | ||
Line 89: | Line 88: | ||
Overview: | 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''. | * Create a share on a CIFS-capable server called ''jffs''. | ||
** Standard Microsoft Windows Shared Folder | ** Standard Microsoft Windows Shared Folder | ||
Line 112: | Line 113: | ||
** ! Rename (mv) commands on the ''/jffs'' mount may not work. | ** ! Rename (mv) commands on the ''/jffs'' mount may not work. | ||
- | '''Most people only own an (inexpensive) Windows PC | + | '''Most people only own an (inexpensive) Windows PC. A common Desktop PC does not a 24/7 Server make.''' |
External Links:<br> | External Links:<br> | ||
Line 124: | Line 125: | ||
# Read how to use [[Startup Scripts]]. Then place the following into your startup script to mount the JFFS partition: | # Read how to use [[Startup Scripts]]. Then place the following into your startup script to mount the JFFS partition: | ||
- | umount /jffs #unmounts existing /jffs | + | umount /jffs #unmounts existing /jffs if existing |
mount.cifs //<server's IP>/jffs /jffs -o username=<the username>,password=<the password> | 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 | + | 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. | *NOTE: username is ''Guest'' when hosted on Windows XP & 'Simple File Sharing' is enabled - This is the default on Windows XP Home. | ||
Line 135: | Line 136: | ||
Instructions: | Instructions: | ||
- | # JFFS is 'fake-enabled' in the script. | ||
- | #* With the JFFS NVRAM variable set to true (but not committed!), and the ''/jffs'' folder present, [[ipkg]] works. | ||
# Enable [[CIFS]] (see also [[Jffs_sharing_in_a_Linux_server]]). | # Enable [[CIFS]] (see also [[Jffs_sharing_in_a_Linux_server]]). | ||
# Create a script called "startup.smb.sh" on the share: | # Create a script called "startup.smb.sh" on the share: | ||
Line 159: | Line 158: | ||
#make sure JFFS is unmounted. | #make sure JFFS is unmounted. | ||
- | echo "umounting /jffs if | + | echo "umounting /jffs if necessary..." >> $SMBLOG |
umount /jffs >> $SMBLOG 2>&1 | umount /jffs >> $SMBLOG 2>&1 | ||
#mount our smbshare at /jffs | #mount our smbshare at /jffs | ||
echo "mounting $SMBSHARE at /jffs..." >> $SMBLOG | echo "mounting $SMBSHARE at /jffs..." >> $SMBLOG | ||
- | #Depricated: smbmount $SMBSHARE /jffs -o username=$SMBUSER,password=$SMBPASS >> $SMBLOG 2>&1 | ||
mount.cifs $SMBSHARE /jffs -o username=$SMBUSER,password=$SMBPASS >> $SMBLOG 2>&1 | mount.cifs $SMBSHARE /jffs -o username=$SMBUSER,password=$SMBPASS >> $SMBLOG 2>&1 | ||
Line 179: | Line 177: | ||
#to enable ipkg, we fake JFFS enabled. | #to enable ipkg, we fake JFFS enabled. | ||
- | #since theres no commit, this wont actually | + | #since theres no commit, this wont actually create a /jffs at Startup. |
nvram set sys_enable_jffs2=1 | nvram set sys_enable_jffs2=1 | ||
Line 185: | Line 183: | ||
#or other commands from /jffs | #or other commands from /jffs | ||
- | 5. in the webinterface, enable [[ | + | 5. in the webinterface, enable [[CIFS]] with appropriate share/user/pass settings from step 2.<br> |
* Enter "startup.smb.sh" as the script<br> | * Enter "startup.smb.sh" as the script<br> | ||
6. reboot<br> | 6. reboot<br> | ||
Line 193: | Line 191: | ||
*NOTE: If you are a Linux newbie, and you have problems with file permissions, look at [http://wrt-wiki.bsr-clan.de/index.php?title=Jffs_sharing_in_a_Linux_server this ] | *NOTE: If you are a Linux newbie, and you have problems with file permissions, look at [http://wrt-wiki.bsr-clan.de/index.php?title=Jffs_sharing_in_a_Linux_server 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 === | ===Use Startup Script: Example 3 === | ||
Line 204: | Line 203: | ||
Procedure: | Procedure: | ||
- | 1. Enable [[ | + | 1. Enable [[CIFS]]<br /> |
2. Create a shell script in the Samba share, as follows:<br /> | 2. Create a shell script in the Samba share, as follows:<br /> | ||
#!/bin/sh | #!/bin/sh | ||
nvram set sys_enable_jffs2=1 # fake-enable JFFS | nvram set sys_enable_jffs2=1 # fake-enable JFFS | ||
- | umount /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 Samba startup script box in the | + | 3. Enter the name of the script in the Samba startup script box in the Web Interface. |
- | + | 4. Apply changes.<br /> | |
+ | 5. Reboot | ||
As an example, my DD-WRT has these shares: | As an example, my DD-WRT has these shares: | ||
Line 220: | Line 220: | ||
* '''/jffs''' located in a shared folder called '''jffs''', which contains program data for installed packages | * '''/jffs''' located in a shared folder called '''jffs''', which contains program data for installed packages | ||
- | + | = Testing [[ipkg]]= | |
Log in to the shell (Telnet or SSH) and run:<br> | Log in to the shell (Telnet or SSH) and run:<br> | ||
Revision as of 18:18, 22 May 2008
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).
- 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. 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 another computer/server
Procedure:
1. Enable CIFS
2. Create a shell script in the Samba 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 Samba startup script box in the Web Interface.
4. Apply changes.
5. Reboot
As an example, my DD-WRT has these shares:
- /tmp/smbshare located in a shared folder on my 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 shell (Telnet or SSH) and run:
mkdir -p /jffs/tmp/ipkg ipkg update ipkg list