Running Debian on Freecom FSG-3

From lxadm | Linux administration tips, tutorials, HOWTOs and articles
Jump to: navigation, search

Freecom FSG-3 is a small device with these specs:

  • Intel IXP425/IXP422 (ARM) CPU, running at 266 MHz
  • 64 MB RAM
  • 1 - WAN port and 3 - LAN ports
  • 4 USB ports
  • 1 eSATA port
  • HDD, ranging from 80 GB to 500 GB (depending on model)

If the original firmware is too little for you, you can run a full Linux distribution on FSG-3, like Debian (little-endian ARM port).


The process of installing Debian on a FSG-3 needs these steps:

  • you need a USB-stick with a custom system (available in downloads)
  • you need to flash a new kernel and a new bootloader configuration
  • you need to reboot FSG-3 - the system will boot from a custom USB-stick, you will be able to install Debian

You don't need to open the device.

Certainly, you also need some Linux knowledge.

Although it's not likely to brick the device if you understand and follow this HOWTO carefully - it can always happen. It's your risk, and you're the only person responsible. Don't blame me for that.
You can always repair the bricked device using a serial cable and/or JTAG.

We use "original FSG-3" when we refer to a new FSG-3 with original firmware.

We use "custom FSG-3" when we refer to a FSG-3 on which we already flashed a new kernel and a new bootloader configuration.

The kernel we flash contains a minimal initramfs. When kernel boots from flash, it tries to detect if there is any USB mass-storage device connected, tries to mount /dev/sdb2, checks if it has a /etc/emergency file there. If all conditions are met, the kernel tries to boot the operating system from that device.

This means that you can always boot the system from the USB-stick and repair it if you need.

USB-stick preparation

You need to have a USB stick of at least 256 MB. You need to set up two primary partitions on it (sda - USB stick):

/dev/sda1 - swap
/dev/sda2 - ext3 partition

Why this layout? It will match the layout on HDD.

Uncompress and copy the contents of fsg-3-deploy-stick.tar.bz2 to the ext3 partition (/dev/sda2) of the USB-stick. fsg-3-deploy-stick.tar.bz2 is available in downloads.

Configuration on the original FSG-3

  • Log in to your new FSG-3 box via a web interface (user: admin, password: admin):

  • Enable SSH in Services -> SSH server -> run SSH server -> Apply

  • Login via SSH, and su to root (below, the passwords are shown):
$ ssh admin@
admin@'s password:admin
~ $ su
root password:loginasrootisrisky
Login successful. Beware, you are root now!
/ #

Note that you can use the passwd command here to change the root password to something easier to remember.

  • The process needs that we flash a kernel and a new bootloader config.

Make sure your MTD partition layout is like below:

/ # cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00020000 "RedBoot"
mtd1: 00180000 00020000 "kern1"
mtd2: 00180000 00020000 "kern2"
mtd3: 00020000 00020000 "RedBoot config"
mtd4: 00020000 00020000 "FIS directory"

This layout has been verified correct for firmware versions 3.3.9, 3.3.14 and 4.1.6 - please check carefully if you are running other firmware versions.

Each MTD partition needs an explanaton:

"RedBoot" is /dev/mtd0, it's RedBoot bootloader, don't touch it.
"kern1", or /dev/mtd1, is the original FSG-3 kernel, also, don't touch it.
"kern2", or /dev/mtd2, is empty; this is where we'll flash our kernel.
"RedBoot config", or /dev/mtd3, is where the configuration of RedBoot is kept. Here we'll flash our own bootloader config.
"FIS directory", or /dev/mtd4, stands for Flash Image System, and also, don't touch it.

Note that after we flash a new kernel, the partition layout will change - the new kernel sees unallocated space on flash as separate place (you can put custom things there).

Also, because flashing is a dangerous process if we do it wrongly, and newer FSG-3 models can theoretically have MTD partition layout changed - we want to inspect the contents of the bootloader configuration ("RedBoot config"):

/ # strings /dev/mtd3
fis load kern1
exec -c "console=ttyS0,115200 root=/dev/hda1 mem=64M@0x00000000

The first line marked in bold tell that by default, the bootloader loads the kernel from "kern1", in our case, /dev/mtd1. This means, we can safely flash a new kernel on "kern2" (/dev/mtd2).
The second line are the options passed to the kernel. The root= line will refer to either /dev/hda1 or /dev/hda2 depending on how many times you have updated the firmware (it alternates each time). Note that the /dev/hda1 will be /dev/sda1 in version 4.x firmware.

  • Now, we'll flash a new kernel. Connect the USB-stick. You will notice that it was automatically mounted (/dev/sda2 for version 3.x firmware, and /dev/sdb2 for version 4.x firmware):
/ # mount
/dev/hda1 on / type reiserfs (rw,noatime,nodiratime)
/proc on /proc type proc (rw)
none on /proc/bus/usb type usbdevfs (rw)
/dev/hda4 on /home type reiserfs (rw,noatime,nodiratime)
/dev/sda2 on /home/Cruzer_Mini_132 type ext3 (rw,noatime,nodiratime)

(For version 4.x firmware, replace /dev/hda[1-4] with /dev/sda[1-4] and /dev/sda2 with /dev/sdb2)

Our USB-stick was mounted in /home/Cruzer_Mini_132. We go to a directory containing a kernel and a new bootloader configuration:

/ # cd /home/Cruzer_Mini_132
/home/Cruzer_Mini_132 # cd root/deploy/
/home/Cruzer_Mini_132/root/deploy # 

You need to erase kernel partition's contents first:

/home/Cruzer_Mini_132/root/deploy # erase /dev/mtd2 0 12 1
Erase Total 12 Units
Performing Flash unlock at offset 0x160000 done offset 0x160000

...and flash a kernel:

/home/Cruzer_Mini_132/root/deploy # dd if=kernels/2.6.20/vmlinuz-fsg3-2.6.20-arm of=/dev/mtd2
2143+1 records in
2143+1 records out

Next, flash a new RedBoot config, which will start FSG-3 using a new kernel.

WARNING: This will permanently change the MAC addresses of your WAN and LAN ethernet interfaces (as those values are stored in the Redboot config partition).

/dev/mtd3 is smaller, and that's why we use different erase options:

/home/Cruzer_Mini_132/root/deploy # erase /dev/mtd3 0 1 1
Erase Total 1 Units
Performing Flash unlock at offset 0x0 done offset 0x0
/home/Cruzer_Mini_132/root/deploy # dd if=redboot-config/redboot-config of=/dev/mtd3
256+0 records in
256+0 records out

  • If everything's fine, you may reboot. Your system will boot from USB-stick.

/home/Cruzer_Mini_132/root/deploy # reboot

The system is going down NOW !! Sending SIGTERM to all processes. Connection to closed by remote host. Connection to closed.

Shortly, you should see USB-stick flashing and blinking as it loads the system.

Configuration on the custom FSG-3

Log in to FSG-3 running Debian on USB-stick (password is toor) - IP is (make sure you have proper netmask on the machine you are connecting from):

$ ssh -l root

Another possiblility is to use a USB-serial cable - connect the serial part to your PC, and USB part to the FSG-3.

Port settings are:

Bps/Par/Bits  : 115200 8N1
Hardware Flow Control : No
Software Flow Control : No

Debian GNU/Linux 4.0 fsg-3-usb ttyUSB0

fsg-3-usb login: root
Linux fsg-3-usb 2.6.20 #60 PREEMPT Wed Feb 21 12:18:31 CET 2007 armv5tel

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

Now, do these things:

  • create two primary partitions on /dev/sda (HDD): /dev/sda1 (swap) and /dev/sda2 (ext3)
  • mount /dev/sda2
  • copy and uncompress fsg-3-deploy-stick.tar.bz2 on HDD (make sure /bin, /etc, /dev will be at the top of that device)
  • halt FSG-3
  • unplug USB-stick
  • power on FSG-3 - it will boot from HDD - welcome to Debian on FSG-3.


fsg-3-deploy-stick.tar.bz2 - a customized minimal Debian (ARM, LE)
Size: 66530995 bytes
md5sum: a8d31c29614b6a21505febdef9ec74a7
Please see for a security note.

initramfs - initramfs embedded in the kernel
Size: 57429 bytes
md5sum: 02622575d83bf69e1d8c5a0c9c32b6b8


flash partition layout

The new kernel will see a different flash partition layout - it sees unallocated space on flash as separate partitions (you can put custom things there).

New kernel:

# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00020000 "RedBoot"
mtd1: 00040000 00020000 "unallocated"
mtd2: 00180000 00020000 "kern1"
mtd3: 00180000 00020000 "kern2"
mtd4: 00040000 00020000 "unallocated"
mtd5: 00020000 00020000 "RedBoot config"
mtd6: 00020000 00020000 "FIS directory"

Old kernel:

/ # cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00020000 "RedBoot"
mtd1: 00180000 00020000 "kern1"
mtd2: 00180000 00020000 "kern2"
mtd3: 00020000 00020000 "RedBoot config"
mtd4: 00020000 00020000 "FIS directory"

Here's a small table that summarizes the change:

what     orig FSG-3     custom FSG-3
kern2    /dev/mtd2      /dev/mtd3
redboot  /dev/mtd3      /dev/mtd5

Don't forget about it if you want to change the kernel in the future!

controlling fan

This one disables fan:

echo 0 > /sys/devices/platform/IXP4XX-I2C.0/i2c-0/0-0028/pwm1

This one sets fan at full speed:

echo 255 > /sys/devices/platform/IXP4XX-I2C.0/i2c-0/0-0028/pwm1

You can also choose any other value between 0 and 255.

You can use it in your shutdown scripts (don't forget to disable the HDD, too).

Note that disabling fan during normal work can be dangerous!

LEDs, buttons

Currently, they don't work.

See NSLU2 mailing lists for an update on that.


The kernel has kexec support. This means, you don't have to flash a kernel if you want to boot it: it's enough to load and execute a new kernel:

fsg-3-usb:~/deploy/kernels/2.6.20# kexec -l zImage
fsg-3-usb:~/deploy/kernels/2.6.20# kexec -e
(wait a minute or so... you will be able to login again once the device boots again)


The kernel was built from NSLU2 svn kernel trunk (revision 695 from 14-Feb-2007).

If you want to build a new kernel, you can use the config in /proc/config.gz.

The device starts in big-endian mode, but this kernel runs in little-endian mode. This means, that any LE kernel you write on flash needs to have bytes swapped. If you use NSLU2 build, it will be done by default - vmlinuz-fsg3-2.6.20-arm will be the file you want to flash.
If you're unsure, don't flash the kernel anymore, use kexec to load a new kernel (and adjust your startup scripts appropriately to start kexec just once) - it's way safer.


The kernel used here contains an embedded initramfs: it starts after the kernel is executed, and tries to detect if there is a USB-storage device connected, and if yes, if it contains /etc/emergency file (can be empty).
If both conditions are met, the kernel will try to boot from USB-storage device (USB-stick etc.) - this can be handy if you screw your filesystem, and you want to boot from another device.

If you want to use it with your custom kernel, download initramfs.tar.bz2 from the downloads section, uncompress it, and make sure your .config points where initramfs files are:


compiling custom kernel modules

To compile custom kernel modules:

  • download kernel 2.6.20
  • unpack it to /usr/src/linux-2.6.20
  • uncompress /proc/config.gz to /usr/src/linux-2.6.20
  • make oldconfig
  • make menuconfig

All that on your FSG running Debian of course.


If your model didn't have a wireless card when you bought it, it has been reported that Atheros mini-PCI cards work fine with FSG-3.

If you want to use madwifi, you will have to compile it yourself. If it's too difficult for you, see Atheros on FSG-3.


For other troubleshooting ideas, see troubleshooting Debian on ASUS WL-500g Deluxe / Premium.

Device currently shipped seem to have marvel based wifi cards

Contact and support

If you have any questions, please subscribe to the mailing list on

For general debian-arm info, please ask at debian-arm mailing list.
For more specific questions, try NSLU2 mailing lists:

To make sure Debian is well supported on arm architecture, please participate in Debian Popularity Contest. To do it, install popularity-contest package:

# apt-get install popularity-contest