Well, this isn't a porting of software, per se, but I was able to port a printing system for a manufacturing facility from ibm thinkcentre's running windows xp to dreamplugs running lenny.
The problem, primarily, was dust and heat, which thinkcentre's just don't handle that well. The facility has what we call "disposable tag printers" all over the palce, and they are basically the cheapest laser printers we can get our hands on, currently Samsung ML-2525's -- $57 and 24ppm. The cost of some kind of environmentally sealed enclosure for the printers in all their various places is just too high to justify, when we can replace the printers every 18 months for $57 (they usually last longer, in reality, but some fail faster than others. I think it depends on if the dust in that area is high or insane-high.)
So the problem in the mix was that the full-blown hard-drive-based PC's driving the printers just don't hold up. And they turn a lot of electricity into heat, for no more than they actually do.
(laser printers with ethernet built in are still pretty expensive, especially when you consider the fact that it might not even last 18 months out in the factory.)
It was a bit of a trick to get the ML-2525's to work properly on a dreamplug, or at least it was for me, as this was my first real "production" system running on linux. My total linux experience before this project was a single weekend a few years ago recovering a failed raid array.
Installing CUPS wasn't that big of a deal, but the ML-2525 drivers are in Splix, and Splix for the ARM wasn't something I could just apt-get. I managed to get the source, and a compiler, and all the pre-req's to compile Splix for the ARM. After that, it was just a matter of tweaking. (oh, and realizing that I can disable the jbig option, I couldn't find the right .h files to make that work and it didn't seem to matter that I disabled it)
So, the system prints to the printers by IP, and the DHCP server has reservations so the right printers in the right locations always get the right addresses-- this allows me to make every dreamplug connected to a printer to be exactly EXACTLY the same on the software side. In some places, there are a few printers next to each other, or next to other data collection bits, and it's all pretty low bandwidth on a GigE network, so I also set up bridging across eth0 and eth1 (no stp) on the dreamplugs so the ethernet connections can be chained. This seems to work well. It does take them a little longer to come on, but they're each plugged into their own UPS so 'restarting' is pretty rare.
One other little thing I ran into when cloning was the ethernet interfaces vanishing. A bit of research led me to /etc/udev/rules.d/70-persistent-net.rules, which has mac addresses in it. Deleting the file makes everything happy- it's correctly re-created on the next boot. But actually cloning the devices was dead simple- toss a microsd into an sd adapter, put that in the sd slot, and copy /dev/sda to /dev/sdb. Then it's just four screws and popping the copied-to microsd into the next dreamplug.
In a few cases, the "to" microsd was 1.8 gb instead of 2.0 and dd reported that it had run out of space, but in the end this didn't affect functionality or stability at all. I guess the partition table has the wrong end block (?) listed, but since I'm only using a few hundred MB it doesn't seem to matter. There's probably something I should do to make that "right" but if it ain't broke, don't fix it.
I was having a such a good time, I even got the source for "bar" and compiled that for ARM and incorporated it into a clone script, so that I could tell how far along the copy was. Sometimes it takes 7 minutes, and sometimes it takes 12 minutes. I think it has something to do with heat-- it seems to take longer when the adapter is hot, which I assume is a result of the dreamplug getting hot. But that's just a guess.
My next project is a system of distributed process/job notification display monitors- the monitors are already hung all over the shop floor in all the right places, and we've mocked up what kind of information they should show, but I'm hesitant to use thinkcentres for this, knowing that they're just going to get hot and dusty and crash. Originally, we were going to consolidate the PCs into air-conditioned and air-filtered places throughout the building (there are offices here and there) and run long vga cables (and the vga cables are ran in a lot of places!) but I really don't like the 100-foot vga runs. Nightmare waiting to happen there. It would be a *perfect* place to use a D2, but they aren't available and GlobalScaleTech isn't giving any guesses on when they'll be in the pipeline. I'd get 10 right now if they were available. The software-side is just a web browser running in kiosk-mode, so the platform (windows, linux, an ipad!) doesn't really matter, as long as I can run chrome.exe --kiosk, and as long as I can make every system exactly the same as the one next to it that does essentially the same thing. (again, the web server passes the full-screen content based on the requesting IP which is fixed to the a unit in a specific place)
So if anyone has any good ideas for that, let me know. I've seen small computers for this kind of thing in the $600 range, but frankly that's insane. We're not talking about 1080 full motion video, we're talking about large text on a 17" vga screen, that moves around just enough to prevent burn in!
Hope you enjoyed that. The clone script I use is below. Thanks!
[ -f /etc/udev/rules.d/70-persistent-net.rules ] && rm /etc/udev/rules.d/70-per$
dd if=/dev/sda bs=256 | bar --size 2.0g > /dev/sdb