Setting up a Linksys WUSB54GC WLAN adapter in Ubuntu

My Ubuntu box has always been networked via Ethernet, but lately I’ve been toying with the idea of moving the box and/or the wireless hardware to different rooms. Before doing that, I’d need to get it on the network via wireless.

I happened to have a Linksys WUSB54GC USB wireless adapter so I plugged it in and hoped that Ubuntu would magically discover it and set everything up for me. No such luck. The adapter was detected and I even ended up with new wireless interfaces – wlan0 and wmaster0, which seemed to be using the rt73usb kernel module. I attempted to configure them, but things just weren’t working. For one thing, when I did ifup on them, they attempted to get an address via DHCP, but they could not get one. I also noticed that when I tried to use iwlist to list the available channels, it came back saying that 0 channels were available.

I did a search and came upon this page. This page walks you through downloading the source code for a ralink-rt73 kernel module and building it with module-assistant. The page also provides a link to a .deb package that installs all the udev voodoo to recognize the adapter and load the kernel module. When everything is done and working, you plug in the adapter and an interface called rasusb0 is automatically created. The only problem I had was that I had to unload the rt73usb kernel module and then reinsert the adapter to get the kernel module to load and to get the rausb0 interface to be created. Once, I had the rasusb0 interface, it was pretty easy to set it up to get the wireless working. I entered the SSID and WEP key in the Ubuntu “Networking” panel and then went to the command-line to do a few finishing touches:

$ sudo iwconfig rausb0 channel 2
$ sudo ifdown eth0
$ sudo ifup rausb0
$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=3.54 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.65 ms

Voila!

Definitely not plug and play but not as hellish as I had imagined.

Getting good performance out of USB hard drives in Linux

I recently bought two Western Digital MyBook 500 GB external USB 2.0 hard drives to house our CD collection ripped to FLAC. As they will be storing relatively small numbers of very large files, I opted to use a filesystem with a large blocksize and few inodes:

# mkfs.ext3 -T largefile4 /dev/sde1
# mkfs.ext3 -T largefile4 /dev/sdf1

Keep in mind, however, that the resulting filesystem has a fairly small number of inodes so if you start copying lots of small files to the filesystem, it will quickly become full even though a simple df might report tons of free blocks (df -i will give you information about inodes). Of course, you could get around this by tarring and bzipping directories with lots of files.

I noticed a problem, however. While rsyncing data from one drive to another, I noticed abysmal transfer speeds, on the order of 400 KB/sec. Not good. My first instinct was to check that I plugged the drives into USB 2.0 ports and not USB 1.1 ports. Nope – I had the right ports. So I looked at hdparm but that is ATA-specific. There is a sdparm utility for SCSI devices, but it doesn’t seem to have much support for USB and Firewire. Eventually, I found this Linux USB FAQ, which talked about the max_sectors setting. I did:

# echo 1024 > /sys/block/sde/device/max_sectors
# echo 1024 > /sys/block/sdf/device/max_sectors

This increased max_sectors from 240 to 1024 (it wouldn’t go any higher than 1024) and now rsyncs were transferring on the order of 15 MB/sec. Quite an improvement from 400 KB/sec to 15 MB/sec.

This is on an Ubuntu system with the 2.6.17-11-386 kernel. YMMV, but this worked like a charm for me.