Getting files to and from a PowerBook 3400c with hfsutils

PowerBook 3400c booting Mac OS 8.6

There are about a dozen ways to get files to and from an older Mac like my PowerBook 3400c, but right now (at least until I figure out a good way to get my NAS -> an AppleTalk server -> 3400c working), my preferred method is via a CF card—I pop the CF card into a CF-to-PCMCIA adapter, then insert that into one of my PowerBook 3400's PC card slots, and bingo: removable flash storage on a 1990s laptop!

I still have a few CF cards kicking around (I used them with my old Nikon D700 camera), and you can buy a 4GB SanDisk Ultra CF card new from Amazon still—albeit for the price of $35... Sometimes the smaller/older cards work better with old Macs, and most of the files I deal with are well under a few MB anyways.

But in my case, I had a specific task I wanted to accomplish. I wanted to restore my PowerBook 3400c to its original state using the restore CD it came with (with Mac OS 7.6), then upgrade it to 8.6, which I'm told about the most stable/flexible Mac OS version that runs on the PowerPC 603e CPU it ships with. After that, I needed to copy over some files, but without any networking or USB.

Mac OS 8.6 Upgrade

The first step was upgrading the 7.6 install to 8.6. (And luckily, the 7.6 restore went without a hitch, as the original 12x CD-ROM drive works a treat, and the original restore CD was in mint condition.)

To do that, I popped the CF card in my USB card reader, and plugged that into my modern Mac.

I downloaded the CD image from Macintosh Garden, unzipped it, then used Terminal to write the 8.6 CD to the CF card:

  1. Find the CF card with diskutil list (in my case, it was /dev/disk5, a 4 GB external drive)
  2. Write the toast file to the CF card: sudo dd if="/path/to/Mac OS 8.6.toast" of=/dev/disk5 bs=1M status=progress

Note the quotes ("") around the file path—if there are spaces in any part of it, make sure you put the whole path in quotes.

After a couple minutes, dd completed it's job, and I pulled the CF card.

I booted the PowerBook 3400c into 7.6, and inserted the CF card using my PCMCIA adapter, and it appeared as if it were the original "Mac OS 8.6" CD. I opened that, ran the installer, and waited for it to complete.

Copying files

To get other files onto the system, I formatted the CF card once the 8.6 upgrade was complete:

  1. Open Utilities > Drive Setup
  2. Select the CF card volume (e.g. 'Mac OS 8.6')
  3. Initialize it

Eject the CF card (by dragging it to the Trash, and waiting for the PCMCIA eject mechanism to pop it out), then plug it back into your newer Mac.

You'll get a 'Disk unreadable' message, just click Ignore.

Now, to copy any other files to/from the HFS-formatted drive, you'll need to install hfsutils. I should note the blog post that inspired this post was How to mount HFS Classic drives on MacOS Catalina and later from Matthew Hughes.

But make sure you have Homebrew installed, then install hfsutils:

brew install hfsutils

Now, run diskutil list again to see which disk is the CF card—hopefully it's the same as before, e.g. /dev/disk5. You can mount the drive using hmount, like so:

sudo hmount /dev/disk5

This won't mount it like a typical disk on the Mac, however—it's just mounted in the ether... you can only interact with the drive using hfsutils. And as a note, classic Mac OS used : instead of / to indicate directory traversal.

Note: If your drive has multiple partitions, you might need to just mount one of them—that's outside the purview of this blog post. I've only been testing with one partition!

For example:

  • To get a directory listing: sudo hls
  • To copy a folder from the drive to your Mac: `sudo hcopy -r ":Folder Name" ./
  • To copy a file from your Mac to the drive: `sudo hcopy -r ./filename.sit ":"

I found I didn't need to add the -r option for 'raw' file copies, as the default 'automatic' file detection worked, but it's fine to be explicit and specify it.

Once you're done copying the files, unmount the drive before disconnecting it:

sudo humount


Maybe an alternative approach would be to format the CF card in whatever flat/foreign filesystem like FAT and then make use of the AppleDouble format [1]?

The ditto(1) tool is suited for that and 'ditto --rsrc --noqtn --noacl src ... dst_directory' should do the job. And just checked, the Finder in most recent macOS does almost the same and on a flat filesystem like FAT32 in my case an ._ AppleDouble sibling has been created for every file after a simple Finder copy (though these files might be bloated with stuff like ACLs and quarantine info).

Though I don't remember whether the 8.6 Finder was already enabled to automagically reassemble such AppleDouble files on the fly or whether this only started with MacOS X later...

In 1994 RFC 1740 appeared to define handling of AppleSingle/AppleDouble via MIME/eMail and since 8.6 is younger...

[1]… -- I always thought all my early stuff has been backed up by the wayback machine but tk/netatalk/doc/Apple/v2/ is missing, maybe Apple lawyers intervened :(

Huh... worth looking at soon. I will also be setting up a netatalk server to serve up AFP to the PowerBook 3400c and a Power Mac G4 MDD soon—it would be good to dive into some of the weird format quirks. I noticed that some files still seem to be readable on the latest macOS versions, though HFS not at all (of course).

Netatalk should be the way to go for flawless interaction as long as macOS supports AFP (Apple announced it being deprecated already at the WWDC prior to 10.9 launch over a decade ago). Looking back it really amazes me with what we dealt back then (me being a member of a pretty small team releasing Netatalk 2.0 two decades ago. Reading my AppleTalk routing docs from back then feels really strange these days )

What a small world! And yes, the two computers I'm setting up are running 8.6 and 10.4, so both should be okay served by AFP. OS X had a very rocky relationship with NFS and somewhat SMB for years, so I've always stuck to AFP on the older Macs. It was only really 10.11 or 10.12 when the newer shares were reliable enough I trusted them :D

Even then... Samba throws me for some loops now and then.