This post was written in 2007. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
Apple added native SMB-based Time Machine support in macOS High Sierra (2017) and deprecated AFP in Big Sur (2020). Today any NAS with a plain Samba share works out of the box — no Netatalk, Avahi or marker files needed. Time Capsule was discontinued in 2018.
Ingredients: Debian, Netatalk, Avahi, some trickery.
You can safely ignore the “.passwd” stuff, because afpd uses PAM for user authentication.
Hint: Disable the atalk protocol handlers in /etc/default/netatalk for a faster startup:
# Set which daemons to run (papd is dependent upon atalkd):
ATALKD_RUN=no # appletalk protocol
PAPD_RUN=no # printer sharing daemon (printers are soooo '90s)
CNID_METAD_RUN=yes # don't remember but is needed, rtfm!
AFPD_RUN=yes # you will always need this
TIMELORD_RUN=no # my time lord's name is <a href="http://openntpd.org">openntpd</a>
A2BOOT_RUN=no # boot? nah! :P
Step 2: Create a share for time machine backup data, by adding e.g.¶
# path name perms charset
/some/where/tm "Time Machine" allow:vjt volcharset:"UTF8"
Download the avahi service file, put it into /etc/avahi/services and reload avahi with /etc/init.d/avahi-daemon reload (sorry, original links are broken).
You need two files on your afp network share: .com.apple.timemachine.supported and a dot-file named with your en0 MAC address. To create it, the easier way is to attach an USB/Firewire disk, rename it with the name of the intended network share (specified in the AppleVolumes file) and enable time machine on it.
This post was written in 2003. It's preserved here for historical purposes — the technical details may no longer be accurate.
So I just tagged 0.2.8 and I think this thing is getting close to usable.
Quick recap for those who don’t know: Sux Services are IRC services I’m writing from scratch in C for the Azzurra IRC Network. The idea is: multithreaded, modular, SQL backend instead of flat files, and not a complete mess to maintain. We’ll see about that last part.
What works right now: NickServ does registration, identification, password change, ghost kill. ChanServ has channel registration, access lists (CF/SOP/AOP/VOP/AKICK) with masks support, and it actually enforces access on join. MemoServ sends and reads memos, notifies you on connect if you have new ones. OperServ has AKILL, server MAP, STATS. There’s even a RootServ for the really scary stuff.
The whole thing connects to a Bahamut IRCd, negotiates the server link, syncs all users and channels, and then the five service agents boot up as virtual users. Modules are compiled as .so files and loaded at runtime via GLib’s GModule. If I want to reload NickServ I just unload and reload the module, no restart needed. Pretty cool.
I’m testing it with netxplode which is a perl script that spawns 100 IRC clients and hammers services with random commands – IDENTIFY, INFO, REGISTER, JOIN, you name it. Basically 100 bots going completely nuts on NickServ and ChanServ at the same time. Found a lot of bugs this way. Also found an SQL injection in the nickname handling last week which was fun. Fixed now, we use sql_printf() to escape everything, but yeah, that could have been bad.