Netatalk bringt von Haus aus keine Verwaltungsoberfläche mit. Administriert wird über drei Hebel: die Konfigurationsdateien, die Dienststeuerung und eine Handvoll Kommandozeilenwerkzeuge. Welche davon überhaupt existieren, hängt allerdings von der Hauptversion ab — und zwar so drastisch, dass eine Anleitung für die eine Reihe auf der anderen komplett ins Leere läuft. Diese Referenz stellt beide nebeneinander: die 2.2er-Reihe, wie sie auf dem ODROID dieses Projekts läuft, und die aktuelle 4er-Reihe.

Erste Frage: welche Version?

Alles Weitere hängt an dieser Antwort. Der Daemon beantwortet sie selbst:

afpd -V 2>&1 | head -20

Das 2>&1 ist kein Zierrat — zumindest netatalk 2.2 schreibt die Versionsausgabe auf stderr, ein schlichtes afpd -V | head zeigt deshalb nichts. Die Ausgabe nennt neben der Version auch die einkompilierten AFP-Protokollversionen, ob DDP (AppleTalk) an Bord ist, welche CNID-Backends verfügbar sind und — am nützlichsten — die tatsächlich verwendeten Pfade der Konfigurationsdateien.

Ergänzend auf Debian/Ubuntu: dpkg -l | grep netatalk. Auf alten Systemen gibt es apt noch nicht; apt-cache policy netatalk tut es auch.

flowchart TD
    A["afpd -V"] --> B{Hauptversion?}
    B -->|"1.x / 2.x"| C["afpd.conf + AppleVolumes.default
AppleTalk an Bord"] B -->|"3.0 bis 3.2"| D["afp.conf
kein AppleTalk"] B -->|"ab 4.0"| E["afp.conf
AppleTalk optional zurück"]

Der Bruch bei 3.0 — und die Rolle rückwärts bei 4.0

Netatalk 3.0 hat 2012 zwei Dinge auf einmal getan: die vielen Konfigurationsdateien in eine einzige INI-Datei zusammengefasst und den kompletten AppleTalk-Unterbau entfernt. Mit ihm verschwanden die Daemons atalkd, papd, timelord und a2boot samt Werkzeugkasten sowie die alten AFP-Versionen 1.1 bis 2.1 — also genau das, was ein Mac mit System 6 oder 7 braucht.

Netatalk 4.0 hat diese Entscheidung im September 2024 teilweise zurückgenommen. Erklärtes Ziel der 4er-Reihe ist eine einzige Suite, die vom Apple //e bis zum aktuellen macOS bedient. AppleTalk ist dabei nicht automatisch aktiv, sondern muss zweifach freigeschaltet werden: das Paket mit -Dwith-appletalk=true gebaut und in der afp.conf die Option appletalk = yes gesetzt. Der atalkd wird dann vor dem netatalk-Dienst gestartet, sonst steht die Transportschicht beim Start des Fileservers nicht bereit.

Praktische Konsequenz: Wer auf 2.2 sitzt und AppleTalk nutzt, ist nicht auf einer Sackgasse — der Weg nach 4.x existiert wieder. Er führt allerdings über eine vollständige Neuformulierung der Konfiguration.

ReiheKonfigurationAppleTalkDienststeuerung
1.x / 2.xafpd.conf, AppleVolumes.default, netatalk.confeingebaut (atalkd, papd, timelord, a2boot)Daemons einzeln per Initskript
3.0 bis 3.2afp.conf (INI)vollständig entferntnetatalk als Service-Controller
ab 4.0afp.conf (INI)optional wieder verfügbaratalkd, danach netatalk

Konfiguration in der 2.2er-Reihe

DateiZuständig für
/etc/netatalk/afpd.confServeroptionen: UAM-Liste, Gastkonto, Transport, Logging
/etc/netatalk/AppleVolumes.defaultVolumes, eine Zeile je Freigabe
/etc/netatalk/AppleVolumes.systemEndung zu Type/Creator für Classic-Clients
/etc/netatalk/atalkd.confAppleTalk: Interfaces, Netznummern, Zonen
/etc/netatalk/papd.confDruckerwarteschlangen über PAP
/etc/default/netatalkwelche Daemons das Initskript überhaupt startet

Ein Volume ist hier eine Zeile aus Pfad, Name und optionalen Feldern:

/srv/AppleShare AppleShare allow:@staff options:upriv,usedots

Der lohnendste Fallstrick dieser Reihe: Wenn im Prozessbaum Startparameter auftauchen, die aus /etc/default/netatalk stammen, heißt das nicht, dass sie gewinnen. Die Gegenprobe mit asip-status.pl gegen den eigenen Server zeigt, was der Daemon tatsächlich anbietet — und dort setzen sich die Angaben aus afpd.conf durch. Wer den Gastzugang abschalten will, muss deshalb dort ansetzen. Der ausführliche Nachweis steht im Projektlog zu diesem Server.

Konfiguration ab 3.0

Eine Datei im INI-Stil, ähnlich der smb.conf von Samba: /etc/netatalk/afp.conf (in manchen Paketen direkt /etc/afp.conf). Der Abschnitt [Global] trägt die Servereinstellungen, [Homes] die Heimatverzeichnisse, jeder andere Abschnittsname ist ein Volume. Verschachtelte Volumes sind nicht erlaubt und werden beim Start mit einer Warnung übersprungen.

[Global]
log level = default:info
log file = /var/log/netatalk.log
hosts allow = 192.168.1.0/24
appletalk = yes

[Homes]
basedir regex = /home

[Daten]
path = /srv/daten
valid users = @staff

[TimeMachine]
path = /srv/tm
time machine = yes
vol size limit = 1000000

Die Typ/Creator-Zuordnungen leben getrennt in der extmap.conf und sind dort — anders als in 2.x — standardmäßig auskommentiert.

Wo die alten Dateien geblieben sind

2.xab 3.0
afpd.confin afp.conf aufgegangen
AppleVolumes.defaultin afp.conf aufgegangen
AppleVolumes.systemextmap.conf
afp_ldap.confin afp.conf aufgegangen
netatalk.conf bzw. /etc/default/netatalkentfallen, Daemons steuert netatalk(8)
~/.AppleVolumesentfallen

Umbenannte Optionen, Auswahl

Fast alle Optionsnamen haben sich geändert. Die Sammelstelle ist die Upgrading-Seite des Handbuchs; die Kandidaten, die am häufigsten stolpern lassen:

altneuAnmerkung
-uamlistuam listStandard ist heute nur noch uams_dhx2.so
-ddpappletalkin 4.0.0 eingeführt, Standard no
AFPD_MAX_CLIENTSmax connectionsStandard von 20 auf 200 gestiegen
allow: / deny:valid users / invalid userspro Volume
options:tmtime machinepro Volume
options:uprivunix privseit 3.0 standardmäßig an
dbpath:vol dbpathCNID-Datenbanken liegen jetzt zentral unter /var/lib
-setuploglog level und log filegetrennte Optionen
zeroconf nameserver nameseit 4.2.0, gilt nun auch für Classic-Clients

Der TCP-Transport lässt sich ab 3.0 nicht mehr abschalten — -notcp und -transall haben keine Entsprechung mehr. Wer AFP über TCP auf einem reinen AppleTalk-Server loswerden will, braucht dort einen Paketfilter statt einer Option.

Dienste steuern

Ab 3.0 gibt es einen Service-Controller: der Daemon netatalk startet und überwacht afpd und cnid_metad. Verwaltet wird also genau eine Unit:

systemctl restart netatalk
systemctl status netatalk
journalctl -u netatalk -f

Ist AppleTalk im Spiel, kommt atalkd als eigener Dienst davor. In 2.x steuert stattdessen /etc/default/netatalk über die Schalter AFPD_RUN, CNID_METAD_RUN, ATALKD_RUN, PAPD_RUN, TIMELORD_RUN und A2BOOT_RUN, welche Daemons das Initskript hochfährt.

Eine Regel gilt über alle Versionen: einzelne afpd-Prozesse niemals mit SIGKILL beenden. Das kann die CNID-Datenbank in einem inkonsistenten Zustand zurücklassen. Sauber ist SIGTERM; an den Elternprozess gesendet, reicht das Signal an alle Kinder durch. Für das Neuladen der Konfiguration unter Beibehaltung offener Sitzungen ist kill -HUP vorgesehen.

Werkzeugkasten

WerkzeugZweckVerfügbar
asip-statusfragt den Server über AFP ab: Servername, angebotene AFP-Versionen, UAMs, Flags — die verlässlichste Kontrolle, was wirklich aktiv istalle Reihen, in 2.x als asip-status.pl
afpstatsverbundene Sitzungen und Laufzeitstatistikenab 3.0; bis 4.4 über D-Bus, ab 4.5 über einen Unix-Socket
macusersVorgänger von afpstats, listet angemeldete Benutzer2.x
dbdCNID-Datenbank prüfen, reparieren, konvertierenalle Reihen
afppasswdPasswortdatei für das RandNum-Verfahrenalle Reihen
addump / apple_dumpAppleDouble-Metadaten einer Datei anzeigenalle Reihen
nbplkupNBP-Namensauflösung: wer meldet sich im AppleTalk-Netz an2.x und ab 4.0
aechoPing über AppleTalk2.x und ab 4.0
getzonesvorhandene AppleTalk-Zonen abfragen2.x und ab 4.0
pap, papstatusDruckaufträge und Druckerstatus über PAP2.x und ab 4.0
macipgwMacIP-Gateway: TCP/IP für LocalTalk-Macsab 4.0
fce_listenDateisystem-Ereignisse mitlesen, gut zum Debuggenab 3.0
afp_lantest, afp_speedtestDurchsatz- und Verhaltensmessung gegen den eigenen Serverab 3.0

CNID-Backends

Die CNID-Datenbank bildet Apples File-IDs auf Unix-Dateien ab; ist sie beschädigt, verhält sich der Finder unerklärlich. Verfügbar sind je nach Bau: dbd (Berkeley DB, jahrzehntelang Standard, inzwischen als veraltet markiert), sqlite (seit 4.3, ohne externen Daemon), mysql (für große Installationen mit eigener Datenbank) sowie in 2.x zusätzlich last und tdb. Welche Ihr Build kennt, zeigt wieder afpd -V.

Ein wichtiger Ortswechsel: In 2.x lagen die Datenbanken im jeweiligen Volume-Verzeichnis, seit 3.0 zentral unter dem Zustandsverzeichnis des Systems, üblicherweise /var/lib/netatalk/CNID. Wer nach dem Upgrade alte .AppleDB-Ordner im Volume findet, sieht Reste.

Reparatur eines Volumes im laufenden Betrieb vermeiden; sauber ist Dienst stoppen, dann:

dbd -r /srv/daten

Weboberfläche

Es gibt ein offizielles Webmin-Modul. Es liest und schreibt direkt die afp.conf; nach jeder Änderung muss der Dienst neu geladen werden. Seit 4.0 wird es mit Netatalk zusammen ausgeliefert, für 3.x lässt es sich aus dem eigenen Repository nachinstallieren.

Die Einschränkung ist offensichtlich: Ohne afp.conf kein Modul. Für einen 2.2er-Server gibt es kein fertiges Frontend — das ist der Grund, warum in diesem Projekt ein eigenes CGI-Werkzeug entstanden ist, das die zeilenweise AppleVolumes.default bearbeitet und dabei mit einem Netscape Navigator 3 als Client auskommt.

NAS-Distributionen bringen eigene Oberflächen mit, die ihrerseits nur eine Teilmenge der Optionen abdecken und den Rest über ein Freitextfeld in die Konfiguration durchreichen.

Sicherheit im Blick behalten

Drei Punkte, die bei alten Installationen regelmäßig offenstehen:

  • Gastzugang. Taucht in der asip-status-Ausgabe unter den UAMs No User Authent auf, kann jeder ohne Anmeldung mounten. Zugriffslisten pro Volume sind dann Zäune mit offenem Tor daneben.
  • CVE-2018-1160. Netatalk vor 3.1.12 hat einen Out-of-bounds-Write im DSI-Pfad, ausnutzbar ohne Authentifizierung, mit Root-Rechten, CVSS 9.8. Betroffen ist AFP über TCP — auf reinen AppleTalk-Servern liegt der verwundbare Pfad brach, offen steht der Socket trotzdem.
  • Herkunft einschränken. hosts allow in der afp.conf beziehungsweise TCP-Wrapper in 2.x kosten nichts und begrenzen den Schaden.

Merksätze

  • Zuerst die Version klären, dann die Anleitung suchen — nicht umgekehrt.
  • afpd -V schreibt auf stderr.
  • In 2.2 gewinnt afpd.conf gegen /etc/default/netatalk.
  • asip-status sagt, was der Server anbietet; der Prozessbaum sagt nur, womit er gestartet wurde.
  • SIGTERM, nie SIGKILL.

Quellen

  1. Netatalk Manual — Configuration: https://netatalk.io/manual/en/Configuration.html
  2. Netatalk Manual — Upgrading (Stand 4.5.1): https://netatalk.io/manual/en/Upgrading.html
  3. Netatalk Release Notes 4.0.0: https://netatalk.io/4.0/ReleaseNotes4.0.0
  4. afpd(8) Manpage: https://netatalk.io/manual/en/afpd.8.html
  5. afp.conf(5) Manpage: https://netatalk.io/manual/en/afp.conf.5.html
  6. Netatalk Webmin-Modul: https://github.com/Netatalk/netatalk-webmin