Optware

From DD-WRT Wiki

Revision as of 08:16, 22 January 2009 by Alvin (Talk | contribs)
Jump to: navigation, search

Contents

Introduction

With the latest DD-WRT (v23 SP2 and v24 SP1), it is possible to install Optware packages from NSLU2-Linux project. This port of Optware is tailored for DD-WRT and extends the router to full feature linux if enough storage (jffs, SD/MMC Card, USB) is provided for packages.

The main feature of this package is that it installs all required files under /opt with 1000 ported applications. With buildroot toolchain, system library independence is also added. This means that packages now depend on /opt/lib/uClibc.so and dynamic loader also in /opt/lib with separate /opt/etc/ld-opt.so.conf for custom .so cache. Applications are built with wchar and locale support which makes uClibc library somewhat greater than other uClibc packages, but still far smaller than glibc based aplications.

Buildroot toolchain features:

Some packages (perl, python, Transmission, buildroot, ...) are so memory hungry that swap is needed for normal operation. Buildroot package or optware-devel meta package provides complete development toolchain for compiling programs on router itself with gcc, gdb, make, g++ , svn, ...

Basic preparation of /jffs is required (enable, clean). On WRT54GS there is room for some aplications. SD card (/mmc) may give enough space for many applications. For testing purposes also smbmount can be used. If a non /jffs filesystem is available, it is recommended to unmount /jffs and then mount eg. mmc in place of /jffs.

Prerequisites

As always here are three prerequisites.

  • Hardware
  1. Recommended are routers with USB support (Asus WL-500g Deluxe|Premium, Linksys WRTSL54GS).
  2. WRT54g routers with hardware modification for MMC/SD card
  3. 32MB of RAM may not be enough for some application and thus swap is recommended
  4. USB hard disk for storage and swap or USB key without swap
  5. Routers with 8MB flash can also fit some applications in /jffs without the need for swap (e.g. WRT54GS v1.1)
  • Software
  1. DD-WRT v23 SP2 mini or standard when MMC is used
  2. You should be able to use telnet and the command line.
  3. DD-WRT v24 SP1 Mega (or eko special version with built-in USB drivers) when USB is used
  • Writable /opt folder, which can be mounted on one of the following writeable drives
  1. jffs drive
  2. USB drive
  3. CIFS - Client Samba drive
  4. mmc Flash drive

Example scenario of installing some packages on WRT54GS (v1.0 .. v3.0)

Option A: Preparing /jffs for /opt

Prerequisite for optware is writable /opt partition. Required size depends on packages installed. WRT54GS with 8MB flash and DD-WRT v23SP2 Mini leaves 5248k blocks for /jffs which can be binded to /opt.

~ # mkdir /jffs/opt
~ # mount -o bind /jffs/opt /opt

Read more about built-in flash drive option jffs2

Use command df to keep track of how much space is left on your /jffs and /opt "drives"

Option B: Preparing USB drive for /opt

Read USB storage wiki for guide to enable USB drives, and read section USB_storage - To access a network drive partition for advice of how to partition, format and mount a USB drive.

When you have your USB drive ready, continue with operations below...

Installing ipkg-opt and uclibc-opt

First we will install uClibc library required by all packages and better ipkg-opt packager. Recommended way for installing basic two packages is with installation script that will also check for possible network problems and /opt directory availability. To install (or reinstall) issue the following command:

wget http://www.wlan-sat.com/boleo/optware/optware-install-ddwrt.sh  -O - | tr -d '\r' > /tmp/optware-install.sh

Or

wget http://pastebin.ca/raw/1031954 -O - | tr -d '\r' > /tmp/optware-install.sh 

Or

lamsao: the above links seem to be dead.  I found this link and it works.

wget http://www.3iii.dk/linux/optware/optware-install-ddwrt.sh -O - | tr -d '\r' > /tmp/optware-install.sh

then run: sh /tmp/optware-install.sh

Output should look like:

Checking system config ...
 Using 192.168.1.1 as default gateway.
 Using the following nameserver(s):
 nameserver 192.168.1.30
 Warning: local nameserver is different than gateway!
 Check config or enter:
   sed -i s/192.168.*/192.168.1.1/ /tmp/resolv.conf
 to correct this.
 Installing package uclibc-opt_0.9.28-13_mipsel.ipk ...
 Connecting to ipkg.nslu2-linux.org[140.211.166.82]:80
 uclibc-opt_0.9.28-12 100% |***********************************************|   832 KB 00:00:00 ETA
 Updating /opt/etc/ld.so.cache
 /opt/sbin/ldconfig: can't create /opt/etc/ld.so.cache~ (No such file or directory)
 Installing package ipkg-opt_0.99.163-9_mipsel.ipk ...
 Connecting to ipkg.nslu2-linux.org[140.211.166.82]:80
 ipkg-opt_0.99.163-9_ 100% |***********************************************| 75896    00:00:00 ETA
 Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/Packages.gz
 Inflating http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/Packages.gz
 Updated list of available packages in /opt/lib/ipkg/lists/optware
 Successfully terminated.
 Installing uclibc-opt (0.9.28-12) to /opt/...
 Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/uclibc-opt_0.9.28-12_mipsel.ipk
 package uclibc-opt suggests installing ipkg-opt
 Configuring uclibc-opt
 Updating /opt/etc/ld.so.cache
 Successfully terminated.
 Installing ipkg-opt (0.99.163-9) to /opt/...
 Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/ipkg-opt_0.99.163-9_mipsel.ipk
 Configuring ipkg-opt
 Successfully terminated.

Besides pre-installing fundamental packages, there are also Optware manual installation instructions. This are now somewhat deprecated due to large number of user miss-understandings.

/opt backup

Now we have prepared /opt for adding more packages. We can also create backup of the whole /opt tree in case of router upgrade, to give preinstalled /opt to a friend or just safety backup. We will create such backup with

~ # tar czf /tmp/opt-backup.tar.gz /opt

Destination for /tmp/opt-backup.tar.gz should be large enough! Beware that /tmp is RAM. Destination should be disk or remote smbfs partition. Extracting /opt backup could be:

cd /
rm -rf opt/*
tar xvzf /tmp/opt-backup.tar.gz

If /opt space is tight and no packages requiring libstdc++ will be used (like Amule) then removing this large shared library is recommended

 ~ # rm /opt/lib/libstdc\*

will remove

 /opt/lib/libstdc++.so         /opt/lib/libstdc++.so.6       /opt/lib/libstdc++.so.6.0.8 

ipkg-opt downloads packages into /opt directory and erases them after installing. If you have enough free RAM and /jffs only then adding --tmp-dir /tmp is recommended instead of default /opt

Search PATH

Note: as of EKO svn11218 (dec 2008) it is no longer necessary to add to path or profile. As the mentioned changes are already added to the default path and profile.

Adding /opt/bin to search PATH will save us from tedious typing of /opt/bin for each command from /opt/bin. For running applications from /opt tree search path should be expanded with

~# export PATH=/opt/bin:/opt/sbin:$PATH 

Now we can install any package from a list of available packages.

~# ipkg-opt list | more

or less or this Quick list of Optware packages

Note: DD-WRT sets LD_LIBRARY_PATH in /etc/profile that can cause library loading clash. Unset this variable with

unset LD_LIBRARY_PATH

Installing ncFTP client

We want to get list of packages containing name ftp

~ # /opt/bin/ipkg-opt list '*ftp*'
atftp - 0.7-6 - Advanced TFTP server and client
ftpcopy - 0.6.7-3 - A simple FTP client written to copy files or directories (recursively) from a FTP server.
ftpd-topfield - 0.6.10-2 - FTPD for the Topfield TF5000PVRt
ncftp - 3.2.0-2 - Nice command line FTP client
proftpd - 1.3.0a-1 - Highly configurable FTP server with SSL-TLS
tftp-hpa - 0.45-1 - A tftp package
tnftp - 20050625-1 - tnftp (formerly lukemftp) is what many users affectionately call the enhanced ftp client in NetBSD.
tnftpd - 20061217-2 - tnftpd (formerly lukemftpd) is a port of the NetBSD FTP server to other systems.
vsftpd - 2.0.1-7 - ftp daemon with an emphasis on speed and security
Successfully terminated.


For example we will install ncFTP client with:

~ # /opt/bin/ipkg-opt  --tmp-dir /tmp install ncftp 
Installing ncftp (3.2.0-2) to /opt/...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/ncftp_3.2.0-2_mipsel.ipk
Installing ncurses (5.6-1) to /opt/...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/ncurses_5.6-1_mipsel.ipk
Configuring ncftp
Configuring ncurses
Successfully terminated.

and run it

~ # /opt/bin/ncftp ftp.si.debian.org 
NcFTP 3.2.0 (Aug 05, 2006) by Mike Gleason (http://www.NcFTP.com/contact/).

Copyright (c) 1992-2005 by Mike Gleason.
All rights reserved.

Connecting to 164.8.6.249...                                                                                        
CAMTP Debian mirror [ftp.si.debian.org]
Logging in...                                                                                                       
Anonymous access granted, restrictions apply.
Logged in to ftp.si.debian.org.                                                                                     
ncftp / > ls
backports/      debian-cd/      debian-sl/      openoffice/
debian/         debian-non-US/  favicon.ico     robots.txt
ncftp / > bye


You have not saved a bookmark for this site.

Would you like to save a bookmark to:
        ftp://ftp.si.debian.org

Save? (yes/no) yes
Enter a name for this bookmark, or hit enter for "si": debian
Bookmark "debian" saved.

Always check available size of your /opt partition with

~ # df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/root                 1984      1984         0 100% /
/dev/mtdblock/4           5248      3860      1388  74% /jffs
/dev/mtdblock/4           5248      3860      1388  74% /opt

Remove unneeded packages with

~ # /opt/bin/ipkg-opt remove ncftp
Removing package ncftp from /opt/...
Successfully terminated.

You will notice that ncurses as depended package will not get removed. To correct this issue

~ # /opt/bin/ipkg-opt remove ncurses
Removing package ncurses from /opt/...
Successfully terminated.

unless some other package require this package.

Installing torrent client

Of course there are many more packages which should run on router without a problem. All binaries have built in /opt/lib search path and there should be no problem with libraries clash like problems with OpenWRT packages. All packages have builtin package dependencies and will install required libraries automagically. Lets show this on installing torrent clients:

~ # /opt/bin/ipkg-opt -t /tmp install enhanced-ctorrent 
Installing enhanced-ctorrent (dnh2.2-6) to /opt/...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/enhanced-ctorrent_dnh2.2-6_mipsel.ipk
Installing libuclibc   (0.2.2-4) to /opt/...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/libuclibc  _0.2.2-4_mipsel.ipk
Installing openssl (0.9.7l-3) to /opt/...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/openssl_0.9.7l-3_mipsel.ipk
 Configuring enhanced-ctorrent
Configuring libuclibc  
Configuring openssl
Successfully terminated.

We will not show running example for this clients as normally huge amount of storrage is required.


Another torrent client with WWW interface is Transmission.Now it has two branches listed in Optware.

Transmissiond 
The original one with transmission.cgi as its CGI web interface has changed its name from transmission to transmissiond,which works as a daemon,has a rich-functional web interface watching daemon state and controlling its work,transmission_watchdog can automatically watch and process torrent files in a directory.
Transmission 
Joshe created completely different "daemon" from scratch and maintained as one branch of transmission.Now it has merged the Clutch web interface,and listed as transmission in the list of Optware. The Clutch has better look but less function,and this daemon lacks of built in watchdog.Also the current build v1.42-1(transmission-daemon,transmisison-remote,transmissioncli) seems bugy.


Below is a example of installing transmissiond( the old transmission).For example of installing the one with Clutch web interface please hit Transmission (v1.42-1) Note the config file between the two daemons are not compatible.

Installing transmissiond(v1.42-1) is simple as

 ~ # /opt/bin/ipkg-opt install transmissiond
Installing transmissiond (1.42-1) to /opt/...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/transmissiond_1.42-1_mipsel.ipk
package transmissiond suggests installing gnuplot
package transmissiond suggests installing logrotate
package transmissiond suggests installing thttpd
package transmissiond suggests installing mini-sendmail
package transmissiond suggests installing transmission
Configuring transmissiond
Please note that /opt/etc/init.d/S80busybox_httpd is installed for
running CGI interface at http://localhost:8008/cgi-bin/transmission.cgi
See instructions for daemon and WWW interface in /opt/share/doc/transmissiond
Configure daemon with /opt/etc/transmission.conf
Successfully terminated.

Here you don't need to install the 'transmission', cause transmissiond is good enough. You can read /opt/share/doc/transmissiond/README.daemon for instructions.Here are quick steps:

After creating directories with

~ # mkdir /opt/torrent
~ # mkdir /opt/torrent/source
~ # mkdir /opt/torrent/work
~ # mkdir /opt/torrent/target

we will configure transmisisond itself by editing /opt/etc/transmisison.conf by using

~ # sed -i -e 's|/tmp/harddisk|/opt|' /opt/etc/transmission.conf

to change default path from /tmp/harddisk to /opt. So your transmission.conf will look like

~ # cat /opt/etc/transmission.conf
SOURCE=/opt/torrent/source
WORK=/opt/torrent/work
TARGET=/opt/torrent/target
ACTIVE=/opt/torrent/active-torrents.txt
HOME=/opt/torrent
 .....

Also user should be changed from admin to root. (Change USER=root in /opt/etc/transmission.conf)

After changing config transmission_watchdog should be run every half an hour with cron. We will start it manually and check if it is running

~ # /opt/sbin/transmission_watchdog
~ # ps |grep transmission
10621 root        808 S   transmissiond -p 65534 -w 300 -u -1 -d -1 -i /opt/var/run/transmission.pid /opt/torrent/active-torrents.txt
10624 root        808 S   transmissiond -p 65534 -w 300 -u -1 -d -1 -i /opt/var/run/transmission.pid /opt/torrent/active-torrents.txt
10625 root        808 S   transmissiond -p 65534 -w 300 -u -1 -d -1 -i /opt/var/run/transmission.pid /opt/torrent/active-torrents.txt

Transmissiond installation comes with /opt/etc/init.d/S80busybox_httpd to run its web interface. However,we will configure Throttling HTTP server(see next section) to show the startup page at port 8008. Although dd-wrt SP2 uses /opt/sbin/httpd(httpd -> /opt/bin/busybox) for its WEB interface, this httpd server cannot be reused as it has serioius problems running CGI programs and showing index.html files.

For public trackers CGI interface provides 'Fetch' button which downloads .torrent file into /opt/torrent/source directory. Private trackers use passkey which means that .torrent file should be saved with browser itself.

After seeing .torrent file int Queued list, one can press Watchdog button to force queue processing. This will move .torrent file from source into work directory and notify daemon for the change to start processing the file. After download finishes, transmission_watchdog will automaticly move torrent from work to target. Meanwhile, user can press Update button to see status of active torrents.

Besides transmissiond two other daemons are required for normal queue processing. Both are provided by dd-wrt if enabled. "Cron" is enabled under Admin control panel. "Syslogd" is enabled under Services tab.

Cron should regulary run /opt/sbin/transmisison_watchdog with sample /opt/etc/crontab

*/30 * * * * root /opt/sbin/transmission_watchdog

Visit CRON page to see where this line should be included. I recommend

cat /opt/etc/crontab >> /tmp/crontab 

at startup,

Syslog will collect cumulative reports from transmisisond and CGI will show it when Log or Update is pressed. If gnuplot is installed then also transfer graph is showed when Log is pressed. SYSLOG line in /opt/etc/transmission.conf must be changed to

SYSLOG=/opt/var/log/messages

to be able to see Log messages from daemon when Log button is pressed.
By default after enabled syslogd in the web control panel,syslogd logs messages to /tmp/var/log/messages which is in ram.You can create S05syslogd in /opt/etc/init.d/ as below so it will log messages into disk everytime the router rebooted.

#!/bin/sh
# startup script for syslogd
#stop meself if running
if [ -n "`pidof syslogd`" ]; then
	killall syslogd 2>/dev/null
fi
# remove old syslog.log
rm /tmp/var/log/messages
# add symlink so log is available at old location(e.g for webinterface)
ln -s /opt/var/log/messages /tmp/var/log/messages
/sbin/syslogd -m 0 -O /opt/var/log/messages -S -l 7

Make it executable by chmod +x /opt/etc/init.d/S05syslogd

Opening default listening port 65534 for Transmission is another required task which can be solved by DD-WRT control panel or adding

/usr/sbin/iptables -I INPUT 1 -p tcp --dport 65534 -j logaccept

to startup file. To test if the port has been opened properly and can accept incoming connections: First install the text based browser:lynx

ipkg-opt install lynx

then issue (assume your port is 65534)

lynx http://www.utorrent.com:16000/testport2.php?port=65534

This will tell you if your port is OK.

Installing Throttling HTTP server

For our purposes thttpd WEB server will handle most requirements like browsing directories and runing CGI program located at /opt/share/www/cgi-bin/transmission.cgi

~ # /opt/bin/ipkg-opt install thttpd
Installing thttpd (2.25b-4) to /opt/...
Downloading  http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/thttpd_2.25b-4_mipsel.ipk
Configuring thttpd


To complete the installation, you must edit /opt/etc/thttpd.conf,
and then run /opt/etc/init.d/S80thttpd to start thttpd.

Successfully terminated.

Edit /opt/etc/thttpd.conf with vi (or nano) and add cgipat, change user to root, change port to 8008 to see the following contents:

dir=/opt/share/www
port=8008
user=root
nochroot
nosymlink
novhost
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
cgipat=cgi-bin/*

Manually start thttpd with

~ # /opt/etc/init.d/S80thttpd start

After that you will be able to see default index.html page at http://192.168.1.1:8008/ assuming that your router is at 192.168.1.1 . There is also link to CGI page http://192.168.1.1:8008/cgi-bin/transmission.cgi which is preaty empty with several buttons for controlling daemon.Fetch command is useful only for fetching torrent files without passkey as there is no possibility to pass cookies to server. Use with care. Proper fetch would be "download in browser and then upload to server(using samba/ftp/scp)".

Installing Samba2

It looks like Samba 3 is too big for all "swapless" routers. Normally Samba 3 will use 10M RAM when up and will use more RAM when new connections established and it forks new threads. Samba 2 will roughly use half of this amount of RAM. For this reason I have prepared Samba 2 packages with Samba Web Admin Tool (SWAT) which will ease config and admin for samba newcomers.
But with Samba 2, you will get a slower data transfer speed(1.5M for Samba 3 and 1.3M/s for Samba 2 over wireless), this is a trade off for the RAM. If you have 64M RAM and have a external hard disk for swap, you can go for Samba 3. Also, you can run Samba as a xinetd service instead of a daemon, so it will only up on request. Running Samba 2 with xinetd, not as Daemon
See also Slim Samba - a strip down version of Samba 2 USB_storage#Slim_Samba_for_USB

SWAT interface looks like:

Installation of samba 2 is done by the following commands:

/opt/bin/ipkg-opt update 
/opt/bin/ipkg-opt remove samba
/opt/bin/ipkg-opt install samba2
/opt/bin/ipkg-opt install xinetd

First try /opt/sbin/xinetd -d, if you get a "can't resolve symbol '__ctype_b_loc' "error, means xinetd doesn't load the right lib from your environment setting. The recommended approach is adding this line at the top of /opt/etc/init.d/S10xinetd to override the environment setting for xinetd :

export LD_PRELOAD=/opt/lib/libuClibc-0.9.28.so

Now run Xinetd and Samba

/opt/etc/init.d/S10xinetd start
/opt/etc/init.d/S80samba start

Point your browser to http://192.168.1.1:901/ to administer samba.(Here xinetd start the SWAT when there's a request on port 901)
Installation of xinetd is optional and it is not required if one wants to manually edit /opt/etc/samba/smb.conf

I can't log in into the Samba share, it keeps asking me for user/password ?

  • Samba 2 USER mode not compatible with Vista/Server 2003/Windows 7 Beta

If you are using Vista/Windows 7 Beta, with the stock security settings of the OS, you won't be able to log in into Samba 2's share when your Samba 2 share mode set to USER. The issue is related to an incompatible authentication protocol that runs between Vista/Windows 7 Beta and Samba 2(lot's of NAS running it).This can be overcome by editing the security settings. See also Instructions for Using Windows Vista with a Network File Server (NAS) Samba 3 doesn't have this issue.

  1. Goto Start > Run
  2. Type "gpedit.msc" and push enter.
  3. Goto Computer Configuration / Windows Settings / Security Settings / Local Policies / Security Options.
  4. Find Network Security: LAN Manager authentcation level
  5. Change settings from: SendNTLMv2 response only to: Send LM & NTLM - use NTLMv2 session security if negotiated

Or you can edit it directly using regedit:

  1. start | run | regedit
  2. Find the key KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
  3. Set LmCompatibilityLevel to 1

The username need to be already in your /tmp/etc/passwd. And need to use the tool /opt/bin/smbpasswd to add that user into the Samba password file which by default is /opt/etc/samba/smbpasswd (configured in smb.conf). For example, add user root will be:

/opt/bin/smbpasswd -a root
  • Check the Samba log files

Try to look at the log files created by Samba, and check what happens. /opt/var/samba/log.*

  • dd-wrt does not include user nobody at startup

This can be overcome with adding this at startup with /opt/etc/init.d/S80samba script like:

#!/bin/sh
[ -d /tmp/samba ] || mkdir /tmp/samba
grep -q nobody /etc/passwd || echo "nobody:*:65534:65534:nobody:/var:/bin/false" >> /etc/passwd
killall smbd
killall nmbd
/opt/sbin/nmbd -D
/opt/sbin/smbd -D 

Protect your FLASH memory
Another long term problem that could happen when running samba on FLASH memory like jffs, mmc or USB stick is FLASH wear. Such use could destroy FLASH if log files and browsing databases are constantly updated. Use of /tmp partition is recommended for such use. Amend startup script with:

echo "Starting smbd:"
if [ ! -d /tmp/samba ]; then
       mkdir /tmp/samba
       mkdir /tmp/samba/log
       rm -rf /opt/var/log/samba
       ln -s /tmp/samba/log /opt/var/log/samba
       rm -rf /opt/var/samba
        ln -s  /tmp/samba /opt/var/samba
fi

or

if you have the line [ -d /tmp/samba ] || mkdir /tmp/samba in your samba start script, then simply add log file = /tmp/samba/sambalog.%m to smb.conf under [global], like:

[global]
log file = /tmp/samba/sambalog.%m

Running at startup

DD-WRT provides user startup files in /jffs/etc/config . To create optware startup file do

~ # mkdir /jffs/etc
~ # mkdir /jffs/etc/config
~ # vi /jffs/etc/config/optware.startup

with the following contents

#!/bin/sh

mount -o bind /jffs/opt /opt

unset LD_LIBRARY_PATH
unset LD_PRELOAD

[ -e /opt/etc/profile ] && mount -o bind /opt/etc/profile /etc/profile

if [ -d /opt/etc/init.d ]; then
  for f in /opt/etc/init.d/S* ; do
      [ -x $f ] && $f start
  done
fi 

and mark it as executable with

~ # chmod +x /jffs/etc/config/optware.startup

After reboot this file will be executed. I recommed first trying it manually

~ # /jffs/etc/config/optware.startup

Creating /opt/etc/profile with the following contents

export PATH=/opt/bin:/opt/sbin:/bin:/sbin:/usr/bin:/usr/sbin
export PS1='\u@\h:\w\$ '

[ -x /opt/bin/less ] ||  alias less=more
[ -x /opt/bin/vim ] ||  alias vim=vi
 

arp() { cat /proc/net/arp; }
ldd() { LD_TRACE_LOADED_OBJECTS=1 $*; }
reboot() { killall nmbd
           killall smbd
           killall xinetd
           killall thttpd
           sleep 1
           umount /opt
           /sbin/reboot 
          }

is also recommended as this will unset LD_LIBRARY_PATH provided by stock /etc/profile

Startup for external USB Disk

The following script is recommended when using external USB hard disk. The main feature of this script is prevention of disk corruption and automatic replacement. It also shows how LD_LIBRARY_PATH can be used to compensate uClibc incompatibility between dd-wrt /lib and OpenWRT /jffs/lib . With dd-wrt.V24 the difference between system and OpenWRT Whiterussian R6 uClibc is so big, that running even simple programs causes segmentation fault. Optware also uses its own uClibc that resides in /opt/lib but all programs have built-in rpath to /opt/lib. This means that it is simpler to use Optware packages under DD-WRT than OpenWRT packages. But the following script relies on two OpenWRT packages just to provide filesystem checking and enabling swap at startup. Besides reguired kernel modules, two disk related packages were installed: e2fsprogs and swap-utils. All others packages could be used from Optware.

#!/bin/sh
# /jffs/etc/config/optware.startup script for USB disk support
# Recommended ext3 partitions:
#  /dev/discs/disc0/part1 for /opt 1GB
#  /dev/discs/disc0/part2 for swap 512MB
#  /dev/discs/disc0/part3 /mmc for user files aka MultiMediaCenter
# Tune partition checks to max 10 counts disregarding last check time
# tune2fs -i 0 -c 10 /dev/discs/disc0/part1 
# tune2fs -i 0 -c 10 /dev/discs/disc0/part3
# Required OpenWrt packages: /bin/ipkg install swap-utils e2fsprogs  
(                 
 unset LD_PRELOAD                         
 export PATH=/bin:/usr/bin:/sbin:/usr/sbin
 export LD_LIBRARY_PATH=/lib:/usr/lib
                                                 
 echo "Inserting modules for USB disk support..."
 insmod  /jffs/lib/modules/2.4.30/usbcore.o 
 insmod  /jffs/lib/modules/2.4.30/ehci-hcd.o
 insmod  /jffs/lib/modules/2.4.30/scsi_mod.o   
 insmod  /jffs/lib/modules/2.4.30/usb-storage.o
 insmod  /jffs/lib/modules/2.4.30/sd_mod.o
 insmod  /jffs/lib/modules/2.4.30/jbd.o 
 insmod  /jffs/lib/modules/2.4.30/ext3.o

                                                         
 echo "Waiting for modules to initialize disk access..."
 sleep 20
                                                                 
 # assure correct paths when running OpenWRT programs like e2fsck
 export LD_LIBRARY_PATH=/jffs/lib:/jffs/usr/lib                          
 export PATH=/jffs/bin:/jffs/sbin:/jffs/usr/sbin:/jffs/usr/bin:/bin:/sbin
                          
 echo "Activating swap..."    
 swapon /dev/discs/disc0/part2
                                     
 echo "Checking optware partition..."
 e2fsck -p /dev/discs/disc0/part1
                                    
 echo "Checking user-data partition"
 e2fsck -p /dev/discs/disc0/part3
                                   
 echo "Mountint disk partitions..."  
 export LD_LIBRARY_PATH=/lib:/usr/lib                
 mount -t ext3 -o noatime /dev/discs/disc0/part1 /opt
 mount -t ext3 -o noatime /dev/discs/disc0/part3 /mmc
                                 
 if [ -e /opt/etc/profile ]; then
       cp /opt/etc/profile /tmp               
       mount -o bind /tmp/profile /etc/profile
 fi
                               
 # provide Optware search paths
 unset LD_LIBRARY_PATH                                       
 export PATH=/opt/bin:/opt/sbin:/bin:/sbin:/usr/sbin:/usr/bin
                                     
 echo "Starting Optware programs..."
 if [ -d /opt/etc/init.d ]; then       
       for f in /opt/etc/init.d/S* ; do
       [ -x $f ] && $f start
       done
 fi                     
) > /tmp/optware.log 2>&1

Forcing filesystem recheck on next boot could be marked with

tune2fs -C 100 /dev/discs/disc0/part1

Although ext3 filesystem uses journaling that prevents major corruption and faster recover during crash, it is recommended that one writes its shutdown scrtipt as alias for /etc/profile that kills all optware daemons, umounts filesystems and then issue /sbin/reboot. This is what we call clean shutdown.

Known bugs

ngrep doesn't work

ngrep is compiled with IPV6 support and ddwrt doesn't provide IPV6 support.

If ngrep is recompiled without IPV6 support, it works ok after adding the nobody user to /etc/passwd

# grep nobody /etc/passwd 
nobody:x:99:99:Nobody:/:


Remarks

  • DD-WRT provided /bin/ipkg is not full feature ipkg but it can do the job for installing ipkg-opt. It could also be used for installing other packages, but this is not recommended any more.
  • Using samba share for /opt is not easy as there is no notion for symbolic links on SMB. This is most problematic for symbolic links on shared libraries. Rewriting "ln" to act as a script and put it on the head of search path could be used to copy instead of link. See this dd-wrt forum topic for info on issueof relinking. Possibility of mounting filesystem in a file as a loop device on a samba share is not yet verified.
  • DD-WRT kernel lacks many "server" features like NFS, NBD support, ... Provided samba, mysql, thttp-php and other applications can do the job if enough space is provided. This means that external storage is required for memory hungry applications. Experience from nslu2 and Oleg firmware showed that 512MB swap space is recommended if external USB hard disk is available. See USB page for instructions how to initialize USB kernel modules and harddisk.
  • Do not use VFAT filesystem for /opt. Use ext2 or ext3 instead. Alternatively one can use loop device to mount filesystem in file that resides on VFAT. See http://www.nslu2-linux.org/wiki/FAQ/Optware-uClibcBuild for example on doing this on USB stick.
  • Optware for DD-WRT is beta-stage feature. Report problems and suggestions in DD-WRT forum under Optware.
  • For instuctions on some other packages look at http://www.nslu2-linux.org/wiki/Unslung/Packages
  • Optware package tracking and repository access
  • There is also posibility to install Optware packages under Oleg, X-wrt or OpenWRT Whiterussian firmware. See instructions on http://www.nslu2-linux.org/wiki/FAQ/Optware-uClibcBuild

Oleo