As a fresh ADSL subscriber I became the owner of Asus AM200g ADSL modem/wireless router. The box is quite powerful - it is run by a 256 MHz processor, has 16 MB of RAM and is running Linux, so I'd like to use it for some other useful tasks. Since Asus has not yet released the source code it's not going to be that easy.
I want to touch the original firmware the least possible, so I'm going to add everything to an attached flash drive.
But the firmware only supports vfat and squashfs! Because of vfat filesystem limitations I decided to use a squashfs partition to store program files and a vfat one to store data that need to be modified, let's see how it works out. Note that all is done using Mandriva Linux 2008.1.
# urpmi squashfs-tools $ mksquashfs /tmp/directory /tmp/dir.sqsh Parallel mksquashfs: Using 1 processor Creating little endian 3.1 filesystem on /tmp/dir.sqsh, block size 131072. [==============================================================] 6136/6136 100% Exportable Little endian filesystem, data block size 131072, compressed data, compressed metadata, compressed fragments, duplicates are removed Filesystem size 4586.44 Kbytes (4.48 Mbytes) 8.61% of uncompressed filesystem size (53255.07 Kbytes) Inode table size 53222 bytes (51.97 Kbytes) 23.13% of uncompressed inode table size (230058 bytes) Directory table size 73178 bytes (71.46 Kbytes) 31.71% of uncompressed directory table size (230774 bytes) Number of duplicate files found 3581 Number of inodes 7327 Number of files 6092 Number of fragments 224 Number of symbolic links 0 Number of device nodes 0 Number of fifo nodes 0 Number of socket nodes 0 Number of directories 1235 Number of uids 1 hajma (500) Number of gids 0
Now I wrote the created image to the flash drive's first partition:
# dd if=/tmp/dir.sqsh of=/dev/sdb1
Rather surprisingly, the firmware only supports squashfs v2.0, so after plugging the flash to the router, it shows in the logs
kernel: SQUASHFS error: Major/Minor mismatch, filesystem is (3:1), I support (1 : x) or (2 : <= 0)and in addition squashfs v3 does not support creating v2 images. Oh fsck. So I downloaded squashfs2.0-r2.tar.gz and
# urpmi make # urpmi zlib1-devel $ tar -xvf squashfs2.0-r2.tar.gz # note that tar now automatically gunzips the file too! $ cd squashfs2.0-r2/squashfs-tools/ $ make cc -I. -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -O2 -c -o mksquashfs.o mksquashfs.c mksquashfs.c: In function ‘create_inode’: mksquashfs.c:476: warning: integer constant is too large for ‘long’ type mksquashfs.c:489: error: lvalue required as left operand of assignment mksquashfs.c:541: warning: integer constant is too large for ‘long’ type mksquashfs.c:546: warning: integer constant is too large for ‘long’ type mksquashfs.c:549: error: lvalue required as left operand of assignment mksquashfs.c:568: warning: integer constant is too large for ‘long’ type mksquashfs.c: In function ‘write_file’: mksquashfs.c:1030: warning: integer constant is too large for ‘long’ type mksquashfs.c:1096: warning: integer constant is too large for ‘long’ type mksquashfs.c: In function ‘dir_scan’: mksquashfs.c:1275: warning: integer constant is too large for ‘long’ type mksquashfs.c:1352: warning: integer constant is too large for ‘long’ type make: *** [mksquashfs.o] Error 1 $hmm, okay, the old crap does not want to be compiled with gcc 4 ...
# urpmi gcc3.3 $ CC=gcc-3.3.6 make $ ./mksquashfs /tmp/directory /tmp/dir.sqsh # dd if=/tmp/dir.sqsh of=/dev/sdb1After plugging it into the router,
kernel: SQUASHFS: Mounting a different endian SQUASHFS filesystem on sda1shows up in the logs. Okay, time to try
$ ./mksquashfs /tmp/directory /tmp/dir.sqsh -be # dd if=/tmp/dir.sqsh of=/dev/sdb1and I am getting one error message less! But I still see an ugly
kernel: SQUASHFS error: lzma_fs error while decompressing! kernel: SQUASHFS error: Unable to read cache block [4bea97:7ae] kernel: SQUASHFS error: Unable to read inode [4bea97:7ae] kernel: SQUASHFS error: Root inode create failed" and it does not get mounted.Googling reveals three links that do not help much. But since decompression is mentioned ... let's try to turn off compression ... :
$ ./mksquashfs /tmp/opends/src /tmp/dir.sqsh -be -noI -noD -noF # dd if=/tmp/dir.sqsh of=/dev/sdb1and voila, it gets mounted!
kernel: usb 1-1: new high speed USB device using address 7 kernel: scsi5 : SCSI emulation for USB Mass Storage devices kernel: Vendor: USB 2.0 Model: Flash Disk Rev: 0.00 kernel: Type: Direct-Access ANSI SCSI revision: 02 kernel: SCSI device sda: 2047999 512-byte hdwr sectors (1049 MB) kernel: sda: assuming Write Enabled kernel: sda: assuming drive cache: write through kernel: sda1 sda2 kernel: Attached scsi removable disk sda at scsi5, channel 0, id 0, lun 0 kernel: Attached scsi generic sg0 at scsi5, channel 0, id 0, lun 0, type 0 kernel: USB Mass Storage device found at 7 syslog: mkdir -p /var/usb/usb_1 syslog: mount /dev/sda1 /var/usb/usb_1Next time I'll try to get a jabber server running, time to go sleep now. Customizing Asus AM200g - V. firmware modification Customizing Asus AM200g - IV. jabberd configuration Customizing Asus AM200g - III. jabberd and vim Customizing Asus AM200g - II. Preparing the environment