My Life as a ¡Penguinista!
Jonathan Yavner
Last update: 28 July 2003

For other pages like this one, see

You are visitor

Threads through this narrative:

The Hardware

Tux with Thinkpad IBM ThinkPad 600E laptop computer
IBM 02K6505 Li-ion battery for Ultra-Slim Bay

Netgear MA401RA Wi-Fi transceiver card

Netgear CG814M Wi-Fi access point/router/switch/firewall/cable modem

Hewlett-Packard LaserJet IIIp monochrome laser printer

Canon i550 color bubble-jet printer

System Configuration

Penguinista penguin A Penguinista should strive to keep his system in good operating condition at all times, to avoid embarrassment when a Linux newbie happens by for a demo. The rule "Keep It Simple, Stupid!" is good, but it shouldn't stop you from using fancy graphics. The rule "If it ain't broke, don't fix it!" is good, but anything that doesn't work the way you want it to can be considered "broken". It's best to concentrate on fixing one problem while putting up with the others--avoid simultaneous (destabilizing) changes all over the system. Keep your eyes on the prize and don't sweat the small stuff too much.=

Currently, I'm trying to keep things simple by sticking to the standard RedHat 8 RPM's as much as possible. I like to do risky things as root, which means I sometimes have to do a full reinstall. Every nonstandard RPM is an extra step in the restore-from-backup process.

Extra Driver Modules:

Standard RPM's that I've removed:

System components added as RPM's:

Since there are 10 GB of disk space to find uses for, I've loaded the entire archive of RedHat 8.0 RPM's (1.7 GB).  To rerun the package-selection GUI without inserting the CD-ROM's, use
·     redhat-cdinstall-helper --mountpoint=/RedHat-CD --cdtree=/RedHat-CD
where "/RedHat-CD" is the directory with the copy of everything from the CD-ROM's.  Be sure to copy the hidden file ".discinfo"!
System components added via .tar.gz files:

Printing Issues

Tux-with-printer RedHat 8 prefers LPRng, but I switched to CUPS because the Canon i550 drivers work with it.  I like CUPS better anyway.  That http://localhost:631 web interface is snazzy.

I created two printer queues, plus a class containing them which is the default printer.  Normally both print queues are set to "stop printing" and "reject jobs".  To print, I first tell the selected printer to accept jobs and then invoke "print" in the application.  Then I walk over to the selected printer, transfer its cable from its regular computer to my laptop, and tell the print queue to begin printing.

HP LaserJet IIIp:

Canon i550:

System Backups

Why bother with backups on a home computer?

Once upon a time, not long ago, I changed something or other and rebooted--and got no sound when I logged in.  File ~/.xsession-errors said it couldn't start ESD because the named pipe already existed in /tmp.  "That's strange," I thought, "why doesn't it clear /tmp on boot like SunOS does?"  So I added a command to /etc/rc.local to clear /tmp and rebooted.  Oops!  Rc.local runs too late to just clear /tmp, because X11 has already started and put its pipes there.  So I changed the command to delete all files over 1 day old and tried again.  Now obviously I wasn't thinking clearly (there's already a cron job to delete old /tmp files), so I just wrote the same sort of command I always write:
·     find . -mtime +1 -print | xargs rm
Unfortunately, this command doesn't delete all temp files over 1 day old; it deletes all files over a day old!  During the reboot, I got a message like "/boot: Directory not empty".  So I hit the power switch, which saved my personal data files, but meanwhile the core system files had been deleted, along with their directories.  On the next boot, I got a "grub>" prompt.

GNU and Tux as superheroes, protected by the GPL So now what do I do? I reached for my FSF membership card, which is also a bootable CD-ROM that runs LNX-BBC. The power of GNU will save me! Unfortunately, the power of GNU can't help unless the user has a clue, and I didn't know anything about Grub. Anyway, LNX-BBC works just fine. It auto-recognizes my hardware (even the MA401) and comes with X11 and a serviceable web-browser, so I could go out on the web and search for knowledge. Not bad for a tax-deductible card that fits in my wallet and promotes Programmer's Freedom! Next.

It seemed that I needed to restore the /boot/grub directory and reset the disk's MBR to point to it, but there were several partitions that had grub directories--which one should I use?  I tried them all, but none worked.  Eventually, I tried "setup (hd0,3)" or some such thing, which overwrote the extended partition and deleted what was left of the OS.  What a nice thing to happen on Father's Day on a machine whose hostname is "Daddy"!  Taking a deep breath, I declared the system a total loss.

Thankfully I had replaced the /root directory with a soft link to /home/root, which is on a primary partition and was not destroyed.  I fired up ftp and transferred my files to the Windows machine.  (I use EFTP3 because it's fairly simple, lives in the System Tray, and can support my 2-hard-drive configuration).  I put the RedHat distro into the CD-ROM drive, guessed which packages to install, and started afresh.  As days passed, I would remember a customization I had done and figure out how to do it again.  It took over a week to get everything working again.  To avoid having to go through this again, I would either have to be very careful with root logins or I would need a solid backup system.  I decided to make the backup system a top priority.

My backup system

I wanted a backup system that would skip over the gigabytes of static data on my system, and would transfer the files over FTP to my Windows machine. Seems simple enough, but I couldn't find a canned package that did this, so I wrote my own: ftpdump (argument is dump level, 0 by default). It's not big, but I'm rather proud of it, since it was so much work to get it right. Perhaps I should publish it someplace.

The basic backup app is dump, because it supports the "nodump" flag provided by the ext2/ext3 filesystems. I can mark all the RPM-derived files with "nodump" and then dump won't bother backing them up, since a full reinstall will recreate those files anyway. This trims gigabytes from the backup process!

Since dump does not directly support FTP, I use lftp as the transport agent. It's better than the ftp program because you can specify everything on the command line, instead of having to generate a script file and then execute that. Unfortunately, the "put" command in lftp does not accept "-" to take the data from stdin, so I have to create a named pipe to connect dump and lftp.

Next problem: if lftp starts too soon, it will read from a pipe that no process has opened for writing, so it will just send an empty file. How to tell when dump has started its output phase and is waiting for lftp to start? After trying a bunch of things that didn't work, I now use pstree and wait for dump to start a second thread.

Although there are 3.7 GB of data in the directory tree, a full backup takes less than ten minutes over a wireless link. How do I do it?

Going to town with the "nodump" flag

The nodumprpm script marks all non-config files of an installed RPM with "nodump". After installing a new RPM, I use this script to remove its files from the to-be-backed-up list. Note that it must avoid marking directory files, because "nodump" on a directory prevents backup for all the files it contains. Let me add my voice to the crowd of people who've called this a misfeature! To begin with, I used "nodumprpm -a" to mark all RPM-derived files for no backup.

The nodumptgz script marks all files that came from a .tar.gz archive with "nodump". The script is simpler because there is less to say about tgz files. The script would be trivial if it didn't have to avoid setting "nodump" on directories.

What about other files that don't need backing up, such as those created by 'make install'? Periodically, I use finddumpables to find files that are not marked with "nodump", and manually use chattr +d on them if appropriate. I currently have only 385 files to back up. This script needs more work; it barfs on files whose names contain spaces.

I should also mention findchgnodump, which finds files that have "nodump" but have been modified within the last <arg> days. Such files are worrisome because perhaps they really should be backed up. If you use a text editor on a file that has "nodump", the output file will usually lose this flag, but if a program calls open(...,O_TRUNC ) to replace a file, the "nodump" flag will remain! Next.

How to restore from backup

This should work, but doesn't:
·     bash% lftp -u backup -e "cat e:/Daddy/backup-level0-date_; quit" \
·             | restore -if -

I guess lftp's "cat" command does CR/LF conversion and corrupts this binary file?  Anyway, this works;
·     bash% cd /tmp
·     bash% lftp -u backup -e "get e:/Daddy/backup-level0-date_; quit"
·     bash% restore -if backup-level0-date_home
Of course, this depends on being able to fit a full backup of the root partition inside the /tmp partition, but it works for me!

Another approach that works is to create a file ~/.netrc containing my username and password, then write a script:
·     # Call this file /tmp/ftp.script
·     ftp <<END
·     get e:/Daddy/backup-level0-date_  -
·     END

then invoke
·      bash% . /tmp/ftp.script | restore -if -

If for some reason I just want to restore a few files to a hosed system without reinstalling, the lftp and restore commands will work under LNX-BBC (and presumably under the "Rescue" mode of the RedHat CD-ROM).


Choosing an email reader

There are so many email readers available!  RedHat 8.0 comes with evolution, mozilla, balsa, and kmail, plus a bunch of text-mode readers.  Unfortunately, none of them quite fills the bill for me.

My requirements for an email reader aren't extreme:
1.     "Light" app that restarts quickly after being swapped out for awhile.
2.     Displays HTML-formatted mail;
3.     Sends HTML-formatted mail (I like bold and italic);
4.     Shows hyperlinked pages using mozilla;
5.     Imports old mail in "mbox" format;
6.     Can accept mail from multiple Unix mailboxes, to support procmail spam-filtering;

I'm considering downloading the latest balsa for RH8, since the docs make it look like the local-mailbox problem might be fixed.

Getting email from the ISP

fetchmail I use Fetchmail.  It was produced by Eric Raymond, author of The Cathedral and the Bazaar (just scroll past the change log to where he begins, "Linux is subversive.")

When I first set up fetchmail, it seemed very easy.  The next day I checked syslog to see how things were going, and noticed that my laptop had woken itself up from suspend every ten minutes to check for email!  Good thing it was on AC power...

Here is my version of /etc/sysconfig/apm-scripts/apmcontinue, which terminates fetchmail when the ThinkPad's lid is closed and (re)starts it on boot or lid-opening Next.  Because fetchmail is a lightweight process, starting and stopping it cause little disk activity.  This script was hard to write because error messages from apmcontinue commands are thrown away, but eventually I figured out that fetchmail needs $HOME to find its control file ~/.fetchmailrc; since apmcontinue is invoked by a daemon (apmd) it doesn't inherit this variable.

Filtering spam

I use SpamBouncer, by Catherine Hampton Last.   It's very good, but it's getting out of date (she hasn't released a new version since February) and a new release just came out in July 2003.  I'm so glad she wrote it; I've tried several times to figure out how to write procmail scripts and still can't get a handle on the syntax.  Too bad she's not accepting PayPal donations.

Here is my ~/.procmailrc file, based on the example that comes with SpamBouncer Next.  The spam goes to to ~/Incoming.spam, other mail to /var/spool/mail/root.  This way I don't get disturbed by "You have new mail" notices if it's only spam.

Because of the DNS relay problem (see CG814M above), I have to override the call to nslookup to use this blacklist script instead Next.  It uses a hard-coded IP address for a DNS server (and will break when/if my ISP moves its server!).  Another reason for this script: some of my ISP's mail servers have gotten themselves listed as spammers!  This script pretends they're not listed, to avoid classifying an email as spam just because of some random node it passed through during delivery.  (I can't switch ISP's; Comcast has a monopoly on cable-TV Internet services around here.)

If Procmail doesn't like your file permissions, it will silently ignore you.  (Fetchmail is also picky, but at least it tells you it wants 0710.)  Procmail requires 0644 on .procmailrc and 0755 on your home directory.

When my laptop arrived from, the mail server was set up to automatically invoke Procmail if a .procmail with suitable permissions is found, but this stopped working after the Grub fiasco.  Here is my copy of /etc/postfix/, with Procmail reenabled Last.  I don't understand how to set this up to forward all mail with @-signs in the addresses to for further delivery, so for now the Unix mail command sends mail only to root--I must use an email reader to send offsite mail.


Back in '94 I got a free copy of Quicken 4, which I used for nine years.  When Intuit offered a free upgrade to fix some Y2K glitches, I decided I'd rather live with the glitches--the newer version was so much slower!

Some people say that Quicken will run under wine, but I've never gotten anything to run under Wine.  I should look into that at some point.  In the meantime, I need a native-Linux accounting package.  For now, it seems GnuCash is the only serious contender.

GnuCash as provided by RedHat

gnucash-logo RH8 comes with GnuCash 1.6.6. Talk about slow! The startup splash screen takes 14 seconds, then it's another 40 seconds to load my 18½ MB of XML data. Opening any window leads to long pauses and lots of disk chatter. The GUI is nice, but the engine is overtaxed by my measly database with only 14,000 transactions. There are many bugs (the auto-completion often copies a random transaction instead of the most-recent one, the General Ledger refuses to show old entries, etc.). Missing features include audible feedback when a transaction is entered (my daughter needs that sound to tell her when to begin reading the next receipt to me).

Before the Grub fiasco, when I had thought that maybe the PostgreSQL backend would speed things up, I had downloaded gnucash-backend-postgres-1.8.1, which is part of RedHat 9. Of course it wanted me to download gnucash-1.8.1, which wanted the RH9 version of libc and a dozen other core components--so I downloaded them all, even though it gave the system a split personality (am I running RH8 or RH9?). And it worked! Well, it didn't crash, but it wasn't any faster, because the backend scans the entire database when opened. Yuck! This sloth will not attract any postulants to the Church of GNU! Next.

Latest GnuCash

So I tried again.  This time I downloaded GnuCash 1.8.4 from  They offer an RPM built for RH8.  Now the splash screen takes 20 seconds and the data-load is 50!  Saves are only 19 seconds, but the file is now 20 MB, mainly because each and every transaction now specifies that it is in US dollars, even though that is also specified as the default currency.

Most bugs are fixed.  Pauses and disk chatter during operations are noticably absent.  The main features still missing are the audible transaction-entry feedback and a way to search forward or backward through the current register, looking for a string.  I get occasional seg-faults in Guile, causing loss of all transactions since last save; this is not polished software!

The main thing that got worse is that importing QIF files from Quicken now takes hours instead of minutes.  I don't know why; it still shows the same set of possible duplicates.

What it ought to be

Using default values instead of explicit coding in every transaction would reduce file size (and loading time) by 30%!

GNU Emacs can load the 20 MB file in 10 seconds, mainly because it doesn't parse the data to produce cute totals by account.  Using "lazy font-lock" display attributes, Emacs could do in-place editing of XML while displaying it as general-ledger entries.  That would be a lot faster than starting up GnuCash to enter a few receipts!  It would be so cool.  Maybe I'll write that.  Do you scoff?  I could write that, really I could.  Someday, when I find some time, I'll write it, you'll see.  I'll create a new Free package, I'll release it to the world, then you'll see!  Oh, wait.  I already did that.  See next section.

My Contributions to Free Software

Meditating GNU Not much. I wrote SES over a year ago, but it's been stuck in the GNU Emacs release queue, apparently because the variable-width font and Unicode-support projects ahead of it have been so buggy. At least my piece is in line to become part of the cathedral! Last.

This space is blank for now.  Maybe I'll write another package so I can mention it here.

©2003 Jonathan Yavner.  Permission is granted to copy this entire page verbatim.

You've read the whole thing!  Thank you, thank you!  Please send me mail:

Hosting by WebRing.