
2026/09/13 8:43
TailTalk:Rust と Tokio を用いた現代的な非同期ユーザー空間 AppleTalk スタック
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
TailTalk は、Netatalk やカーネルドライバを使用せず、EtherTalk/LocalTalk(TashTalk)ネットワークを直接実装することで、Linux、macOS、Windows 向けのゼロ設定で完全にユーザースペース上動作する AppleTalk トールキットです。このツールは、同一マシン上に複数のインスタンスを実行してクラシックな Mac にファイルのコピーを行ったり、LaserWriters、ImageWriters、StyleWriters への印刷やこれらのデバイス向けの現代的非同期ソフトウェアの開発を可能にする、完全な Apple スタックを提供します。スタックには、ほぼ全ての LocalTalk ポート付き Mac と互換性のあるユーザ向け AFP サーバーが含まれており、リソースフォークを保持したまま Stuff-It アーカイブとフロッピーイメージをインポートできます。また、AirPrint/IPP を通じてプリンターの共有や、現代のプリンターをクラシックな Mac にブリッジする機能もサポートします。コアプロトコル(AARP、DDP、NBP、ATP、PAP、ASP、ADS、AFP)に対して完全非同期の API が提供されており、Unix/UDP ソケットおよび Protobuf ルーティング規則をサポートするインプロセスまたはデーモン(
tailtalkd)アーキテクチャを採用しています。Rust 1.90+ で構築され、cargo-packager を使用して Linux 向けに AppImage、macOS 向けにアプリバンドル、Windows 向けには MSVC、npcap SDK および NSIS ツールを利用したインストーラーとしてパッケージ化されています。TailTalk は設定を最小限にしたプラグ&プレイ動作を設計しています。TashTalk USB は Silicon Labs CP210x ブリッジ(VID 10c4、PID ea60)に依存しており、Linux では/dev/ttyUSB0用の udev ルールが必要ですが、macOS 11+ はこのチップをネイティブでサポートし、それ以前のバージョンでは VCP ドライバが必要です。EtherTalk は macOS において GUI にデフォルトでコンパイルされていますが、Linux/Windows では libpcap/npcap のオプトインが必要であり、macOS ユーザーは /dev/bpf* のルート制限を回避するために ChmodBPF を必要とする場合があります。現在、TailTalk はルーターレスな設定で動作しており(ルーターサポートは進行中ですがまだメインラインには取り込まれていません)、AsanteTalk に対するデフォルトは Phase 1 であり、EtherTalk Phase 2 パケットが検出されるまで維持されますが、この構成下で Mac がサーバーを発見すると AFP レスポンスが落ちることがあります。機能検証のための 4 つのデモプログラム(aep-echo、afp-server、nbp-lookup、pap-print)があり、テストには PowerBook G3、LaserWriter/StyleWriter/ImageWriter、Macintosh SE/30、Classic などの実際のハードウェアおよび現代的な Linux マシンも含まれています。進行中のプロトタイプである TailTalk は既知のギャップ(例:完全なルーターサポート)があり、GPL v3.0 ライセンスの下で提供されており、貢献はまず issues を通じて行うことを推奨し、検証済みのシステムは PR にリストされています。最新のリリースは https://github.com/FeralFirmware/TailTalk/releases/latest で入手可能です。本文
TailTalk プロジェクト概要
TailTalk は、Linux、macOS、Windows 上で EtherTalk または LocalTalk ネットワークを通じて完全なユーザースペース AppleTalk インプリメンテーションを構築するためのツールキットです。
- Netatalk やあらゆるカーネルドライバーへの依存性は一切ありません。
- ゼロから作成されたオリジナルプロジェクトです。
- 必要なものは以下の 2 点のみ:
- 生ソケットおよび/または TashTalk 互換のデバイス(LocalTalk の場合)
- 古き良きコンピュータとの対話のための「忍耐強さ」
TailTalk は完全な AppleTalk スタックを提供し、同一マシンの同時複数スタック動作も可能です。
開発経緯と目的
- 元々の目的:
- 古い Mac 間でのファイルコピーの実現
- LaserWriter、ImageWriter、ネットワーク StyleWriter へのプリント出力
- これらのハードウェアと、現代的な非同期ソフトウェアとの通信
- 現在のステータス:
- 現状はルートなしの設定での動作のみをサポート。
- ルーターが配置されたネットワークへの統合機能を開発中(今後メインラインコードに実装予定)。
設計思想
- スタックの各部分は、当時の Mac で動作するように設計され、「ゼロ・コンフィグ」を可能とする。
- 「プラグイン&ランニング」で手間なくすぐに利用できるよう心がけられています。
- 重要: 非常に進捗中のプロトタイプのため、バグや未実装の機能が存在します。
TailTalk GUI
TashTalk USB とともに使用されているユーザー向けアプリケーションです。LocalTalk ポートを搭載したほぼすべての Mac で動作する AFP サーバーを含みます。
- 共有機能: Stuff-It アーカイブやフロッピーディスクイメージをインポートし、共有パスにロード。リソースフォークを保持した状態でリモートクライアントから利用可能にします。
- プリンタ共有:
- LocalTalk 対応の LaserWriter、ImageWriter、StyleWriter を AirPrint / IPP プリンタとして共有
- 逆方向:現代的なプリンタをクラシック Mac に共有
- 入手方法: 最新リリースページ
特徴とアーキテクチャ
プロトコル対応
パケット解析器と完全に非同期の API を備えた、メインストリームの AppleTalk プロトコルのほとんどをカバーします。
- AARP: AppleTalk アドレス解決プロトコル
- DDP: データグラム配信プロトコル
- NBP: ネームバインディングプロトコル
- ATP: AppleTalk トランザクションプロトコル
- PAP: プリンターアクセスプロトコル
- ASP: AppleTalk セッションプロトコル
- AFP: AppleTai ファイルシステムプロトコル
- AppleTalk データストリームプロトコル
TashTalk 互換性
LocalTalk Mac との連携をサポート。
アーキテクチャ詳細
- AARP/DDP の下層部分はデフォルトでは同一プロセス内で動作。
- 共有デーモン
を介して動作させることも可能。tailtalkd- デーモンはインターフェースを管理し、複数のクライアントに対して以下の情報を提供:
- DDP ソケット
- アドレス解決
- ルーティングルール
- インターフェースは Unix ソケットまたは UDP ソケット上の protobuf プロトコル(
や純粋な C クライアントから利用可能)。TailTalk::builder().daemon_unix(..)
- デーモンはインターフェースを管理し、複数のクライアントに対して以下の情報を提供:
- 詳細は
を参照。docs/daemon-protocol.md
ビルド方法
前提条件
-
Rust
- Rust 1.90 以上が必要です。
- rustup.rs からインストールすると、OS および CPU アーキテクチャに合わせたコンパイラがデフォルトでインストールできます。
-
cargo-packager
- Linux (AppImage)、macOS (アプリバンドル)、Windows (インストーラー) を構築するために必要。
- インストールコマンド:
cargo install cargo-packager
-
Windows 専用設定
- Windows MSVC の前提条件をインストールしてください(rustup book を参照)。
- npcap SDK: マシン上のどこかに保存し、
環境変数を設定。LIB- 入手先:npcap.com
- 例:
C:\npcap-sdk-1.13\Lib\x64
ビルドの実行
前提条件が整った場合、リポジトリのルートディレクトリから以下のコマンドを実行します。
全ビルド(Linux / macOS / Windows バンドルを含む):
cargo packager --release -f [フォーマット] -p tailtalk-gui
TailTalk GUI のみを作成:
cargo build -p tailtalk-gui --release
OS 別のビルドコマンド
生成されたバンドルは
dist/ ディレクトリに配置されます。
-
# Linux (AppImage)
cargo packager --release -f appimage -p tailtalk-gui -
# macOS (アプリバンドル)
cargo packager --release -p tailtalk-gui -
# Windows (NSIS インストーラー)
cargo packager --release -f nsis -p tailtalk-gui
TashTalk USB
クイックスタートガイドは Setup.md を参照してください。
TashTalk USB は Silicon Labs CP210x USB-UART ブリッジ(VID 10c4, PID ea60)を使用しています。
Linux
cp210x カーネルモジュールはインストール済みである可能性がありますが、デフォルトではルートユーザのみがアクセス可能です。ユーザーにアクセス権を与えるには udev ルール を作成してください。
echo 'SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", TAG+="uaccess"' \ | sudo tee /etc/udev/rules.d/99-tashtalk-usb.rules sudo udevadm control --reload-rules && sudo udevadm trigger
- コマンド実行後に TashTalk USB デバイスを抜き挿し。
(または類似)として表示され、ルート権限なしでアクセス可能になります。/dev/ttyUSB0
Windows
- Silicon Labs から CP210x VCP Windows ドライバー をインストールしてください。
- npcap 1.88 を npcap.com からインストールしてください。
macOS
- macOS 11 以降: CP2102N USB チップのサポートは標準で含まれています。
- macOS 10.12 〜 10.15: Silicon Labs のドライバをインストールしてデバイスを認識させる必要があります。
EtherTalk
- macOS: デフォルトで GUI に組み込まれており、OS 同梱の
を使用。libpcap - Linux / Windows: オプトイン機能。
- インストール:
(Linux) または npcap SDK。libpcap-dev - ビルドコマンド:
cargo build -p tailtalk-gui --features ethertalk
- インストール:
macOS 特有の設定(ChmodBPF)
- パケットキャプチャおよび注釈は
を通じて行われますが、デフォルトではルートユーザのみアクセス可能。/dev/bpf* - 通常ユーザーで使用する場合: Wireshark のディスクイメージに含まれる
パッケージをインストールするか、以下のコマンドを実行してください。ChmodBPFbrew install --cask wireshark-chmodbpf - 仕組み:
グループの作成と BPF デバイスの割り当てaccess_bpf- ユーザーのグループ追加
- 重要: グループメンバーシップは新規ログインセッションからのみ適用されるため、ログアウトして再度ログインする必要があります。
- ChmodBPF が未インストールの場合: GUI はイーサネットインターフェースセレクターを非表示にし、失敗トランSPORT を提示しません。
既存のプログラム(デモ)
開発プロセスにおいて機能を検証するために作成されたデモプログラムです。これらは生ソケットを使用して完全なスタックのコピーを実行するため(EtherTalk が有効化されている場合)、以下のいずれかを必要とします。
- root ユーザとしての実行
- コンパイル済みのバイナリに対して
を適用するsetcap- macOS の場合は ChmodBPF を参照のこと。
注意: TashTalk だけの利用であれば、上記の権限処理は不要です。
| プログラム名 | 機能説明 |
|---|---|
| aep-echo | ターゲットアドレスへのエコーリクエストを送信し、応答時間を印刷する単純なプログラム |
| afp-server | AFP 1.0/1.1/2.0 と互換のサーバー。 開発途中ですが、クラシック Mac へのファイル操作やディレクトリブラウジングをサポート。 |
| nbp-lookup | 指定された文字列に基づいて NBP ルックアップを実行し結果を返す |
| pap-print | PAP プリンタ(LaserWriter)へ PostScript ファイルを送信。 ※4/600 PS と自家用機でのみテスト済み |
| tailtalkd | 物理的な AppleTalk インターフェースを所有する下層デーモン。 Unix/UDP ソケットを通じて DDP、アドレス解決、ルーティングを提供。 |
| tailtalk-gui | EtherTalk および LocalTalk(TashTalk を介して)経由でフォルダをボリュームとして共有するためのシンプル GUI |
テスト環境
単体テストに加え、実際のハードウェアを使用した検証が最良の方法です。以下のセットアップが使用されています。
- TailTalk を動作する Linux マシン
- Ethernet で動作する PowerBook G3 (Mac OS 9.2)
- AsanteTalk を介した LaserWriter 4/600 PS
- EtherTalk アダプターを介した Color StyleWriter 2200
- LocalTalk オプションカード装着の ImageWriter II
- AsanteTalk で動作する Macintosh SE/30 (System 7.1)
- AsanteTalk で動作する Macintosh Classic (System 6.0.8)
AsanteTalk の挙動
最初に通電すると、EtherTalk フェーズの選択前にイーサネット側で流入パケットを「聴」きます。
- フェーズ判定:
- EtherTalk フェーズ 2 のパケットが見られなければ、デフォルトでフェーズ 1 を選択します。
- TailTalk の対応状況:
- フェーズ 1 はサポートしています。
- LaserWriter や NBP および一部の基本的な操作では問題なく動作。
- AFP では機能しません。
- Mac が AFP TailTalk サーバーを発見しますが、応答が捨てられているように見えます(原因不明)。
コントリビュート
より包括的な AppleTalk インプリメンテーションへの成長を歓迎します。
- どのような貢献も歓迎いたします。
- 変更前に必ず Issue を開いて議論してください。
- Pull Request にて、その変更がどのシステムで検証されたかを明記してください。
- 本プロジェクトを通じて古いシステムの奇妙さが実感を伴って理解できました。
ライセンス
本プロジェクトは GNU General Public License v3.0 の下で提供されています。詳細は
LICENSE ファイルをご参照ください。