- April Fools की घोषणा से शुरू हुआ Plan 9 सपोर्ट असली PR और kernel·Go संशोधनों तक पहुँचा, और 2 अप्रैल 2025 तक Tailscale Plan 9 पर चलने की स्थिति में आ गया
- यह सिर्फ
GOOS=plan9 GOARCH=386बिल्ड की समस्या नहीं थी; Go के Plan 9 पोर्ट में पहले runtime crash और compiler special-casing की दिक्कतें सामने आईं - Russ Cox के Plan 9 kernel और Go runtime·compiler संशोधनों से SSE, floating-point context, monotonic time, DNS और development environment से जुड़ी समस्याएँ साथ में सुलझीं
- Tailscale ने Plan 9 के
/netfile interface का उपयोग कर TUN-जैसा implementation, routing, Tailscale SSH, MagicDNS और service collection जोड़ा, लेकिन कुछ हिस्से अभी अस्थायी implementation हैं या अधूरे हैं - मौजूदा validation दायरा मुख्य रूप से 9legacy और
GOARCH=386तक सीमित है; 9front·amd64·exit node·Gonet/netnsसपोर्ट के लिए अतिरिक्त validation या redesign की ज़रूरत है
April Fools का मज़ाक असली पोर्टिंग में बदला
- Tailscale ने 1 अप्रैल 2025 को Plan 9 सपोर्ट की घोषणा की, और अगले दिन बताया कि यह घोषणा वास्तव में काम करने वाली पोर्टिंग पर आधारित थी
- यह काम Tailscale PR और Plan 9·Go के कई संशोधनों तक पहुँचा
- शुरुआती सोच यह थी कि Tailscale की दो Go binaries को
GOOS=plan9 GOARCH=386 go install ./cmd/tailscale{,d}से बिल्ड करना काफी होगा - अगस्त 2023 की पहली कोशिश में कुछ बिल्ड आगे बढ़े, लेकिन रनटाइम के दौरान असामान्य crash हुआ
- Go का Plan 9 पोर्ट first-class port नहीं था, इसलिए regressions बिना ठीक हुए पड़े थे
- यह भी संभव है कि Tailscale ने Plan 9 पर Go को पहले से अधिक कठिन तरीके से उपयोग किया हो
- पोर्टिंग 2024 भर रुकी रही, फिर मार्च 2025 में April Fools आइडिया के साथ दोबारा शुरू हुई
SSE और Go का Plan 9 सपोर्ट व्यवस्थित करना
- 1999 में Intel Pentium III में आया SSE instruction set इस काम की एक प्रमुख शुरुआती वजह बना
- Go compiler Plan 9 target पर SSE के उपयोग से बचने की कोशिश करता था
- क्योंकि Plan 9 kernel note handler में SSE registers को save·restore नहीं करता था
- Go compiler यह नहीं जान सकता था कि कौन-सा code note handler के अंदर चलेगा, इसलिए वह SSE को globally disable करना चाहता था
- यह special handling अक्सर टूट जाती थी और compiler में जगह-जगह
plan9exceptions बढ़ गए थे
- Russ Cox ने Plan 9 kernel को note handler में floating-point·SIMD context संभालने लायक बदला
- 386 पक्ष में sys/src/9: allow floating point in note handlers संशोधन जोड़ा गया
- amd64 9k kernel में fork के बाद FP state aliasing, note handler में SIMD,
noted(NCONT)register loss जैसी अतिरिक्त समस्याएँ मिलीं
- Go की तरफ Plan 9 code generation special-casing हटाने का काम हुआ, जिससे
tailscaledअधिक देर तक चल सका
IPC और development environment
- इसके बाद
tailscaledstack corruption की जगह out-of-memory के कारण crash होने लगा - Plan 9 पर पहले की पोर्टिंग कोशिश में Tailscale के
safesocketIPC package में अनंत goroutines बनाने वाला bug था - फिलहाल localhost TCP इस्तेमाल करने से यह समस्या हल हुई
- यह Plan 9 के “everything is a file” तरीके से कम मेल खाता है, लेकिन यह पुष्टि हुई कि अन्य Plan 9 services भी localhost TCP इस्तेमाल करती हैं
- आगे चलकर Russ द्वारा Go में पोर्ट किया गया srv9p package उपयोग कर LocalAPI बनाना बेहतर हो सकता है
- मौजूदा implementation अन्य platforms की तरह localhost authentication नहीं जोड़ पाता, इसलिए साझा Plan 9 मशीनों पर इसका उपयोग न करने की चेतावनी दी गई है
- शुरुआती development 9legacy CD image आधारित VM में हुआ, और binaries को HTTP से डाउनलोड कर चलाने की दोहराव वाली प्रक्रिया धीमी थी
- Russ Cox का rsc/plan9 Plan 9 source, precompiled binaries और
./boot/qemuscript शामिल करता है- qemu VM बिना डिस्क के boot करता है, और localhost 9P server द्वारा दिए गए Git repository को root filesystem की तरह उपयोग करता है
- development machine और Plan 9 filesystem साझा होने से iteration time मिनटों से घटकर सेकंडों में आ गया
- qemu ने virtio भी इस्तेमाल किया, जिससे गति और बढ़ी
नेटवर्क integration: TUN, routing, MagicDNS
- शुरुआत में चलने वाला Tailscale userspace networking मोड में था, जो kernel network stack का उपयोग नहीं करता था
- TCP, UDP, ICMP आदि gVisor के netstack से संभाले जाते थे
- Plan 9 मशीन से tailnet तक पहुँचने के लिए
tailscaledके HTTP/SOCKS5 proxy का उपयोग करना पड़ता था - Plan 9 के बहुत कम programs
HTTP_PROXYयाALL_PROXYenvironment variables समझते हैं, इसलिए यह आदर्श नहीं था
- Plan 9 का TUN-जैसा implementation बेहद सरल था
/net/ipifc/cloneखोलकर नया interface number पढ़ा जाता है- control fd पर
"bind pkt\n"लिखने से/net/ipifc/2/*जैसा नया interface बनता है /net/ipifc/2/dataखोलकर IP packets को सीधे पढ़ा और लिखा जाता है- अलग ioctl या length framing की ज़रूरत नहीं पड़ती
- routing table manipulation भी
/net/iproutefile के माध्यम से होती है"tag tail\n"लिखकर बाद में जोड़े जाने वाले routes परtailtag लगाया जाता है"add 100.64.0.0 /106 100.102.103.104"जैसे संदेश से route जोड़ा जाता है- क्योंकि Plan 9 अंदरूनी तौर पर IPv6-केंद्रित है और IPv4 को IPv4-mapped IPv6 address की तरह संभालता है, इसलिए CGNAT
100.64.0.0/10को/106की तरह दिखाया जाता है
- MagicDNS का मकसद Plan 9 में peers को
fooयाfoo.tailnet-name.ts.netजैसे नामों से एक्सेस योग्य बनाना था/net/dnsया/net/csqueries intercept करने के विकल्प पर भी चर्चा हुई- अंततः Russ ने Plan 9 में संशोधन किया ताकि खास DNS suffix के लिए वैकल्पिक DNS server निर्दिष्ट किया जा सके
- DNS queries के गलत negative cache होने की समस्या भी ठीक की गई
Tailscale SSH और service collection
- Tailscale SSH,
tailscaledमें built-in SSH server है, जो packet से जुड़ी WireGuard key के आधार पर ज्ञात Tailscale identity से authentication करता है - शुरुआत में Plan 9 shell
/bin/rcकोos/exec.Commandसे चलाकर stdin/stdout जोड़ा गया- shell चल गया, लेकिन echo, navigation और process interrupt जैसी चीज़ें ठीक से काम नहीं कर रही थीं
- Russ ने netshell example को 9fans/go में जोड़ा
- यह example एक बहुत असुरक्षित telnet server के काफ़ी करीब था, लेकिन Tailscale SSH के पीछे उपयोग के लिए पर्याप्त था
- इसके बाद SSH से Plan 9 के
/dev/snarfकी सामग्री लाना, या laptop पर Go tests cross-compile करके SSH से चलाना आसान हो गया
- Tailscale की optional service collection सुविधा की भी Plan 9 के हिसाब से समीक्षा की गई
/proc/NNN/fdको traverse करके/net/tcp/cloneखोलने वाली processes खोजी गईं- fd के QID को
/net/tcp/NNN/{status,local}से मिलाकर listening स्थिति और port की पहचान की गई - QID से TCP number निकालने का तरीका kernel implementation बदलने पर टूट सकता है, इसलिए यह एक कमज़ोर हिस्सा बना हुआ है
समय, वेब डेमो, v86
- कुछ मामलों में gVisor netstack ने report किया कि monotonic time पीछे चला गया है, जिसके कारण
tailscaledcrash हुआ- Go के Plan 9 time implementation में monotonic time के रूप में wall time का उपयोग हो रहा था
- जब ntpd घड़ी को पीछे समायोजित करता, तो netstack की monotonic time संबंधी धारणा टूट जाती
- Russ ने Plan 9 के
/dev/bintimeमें monotonic time जोड़ा और Go को उसका उपयोग करने के लिए संशोधित किया - वेब पर Plan 9 चलाने के लिए v86 का उपयोग किया गया
- v86 WASM के जरिए 32-bit operating systems चलाता है और कई networking तरीके उपलब्ध कराता है
- यही
GOARCH=386पर ध्यान देने की एक वजह भी थी
- शुरुआत में Ethernet frames को websocket relay के जरिए भेजने के लिए Tailscale के network simulation environment में wsproxy protocol support जोड़ा गया
- यह ARP, DHCP, DNS, NAT, control plane, DERP आदि को gVisor netstack के साथ emulate करने वाले integration test environment में काम करता था
- लेकिन DHCP round-trip के कारण relay दूर होने पर Plan 9 GUI
rioकी शुरुआत धीमी हो जाती थी
- बाद में WISP server भी implement किया गया, लेकिन production-ready बनाने से पहले समय कम पड़ गया, इसलिए copy.sh/v86 की default network relay setting के साथ रिलीज़ किया गया
- Tailscale और Plan 9 वाला disk image 16MB का था, जबकि Tailscale binary unzip होने के बाद 23MB की थी
- boot के समय “gunzip…” चरण दिखने का कारण यही है
- example image
copy.sh/v86की 9legacy profile में शामिल है
बचे हुए काम और वास्तविक उपलब्धियाँ
- फिलहाल Tailscale का Plan 9 पोर्ट केवल 9legacy पर टेस्ट किया गया है
- Plan 9 के प्रमुख forks में न्यूनतम बदलाव वाला 9legacy और अधिक संशोधित 9front शामिल हैं
- Russ ने 9legacy के लिए जो कुछ patches लिखे, उन्हें 9front पर पोर्ट करने की ज़रूरत पड़ सकती है
GOARCH=amd6464-bit सपोर्ट को भी अभी validate करना बाकी है- exit node सपोर्ट और Go
net/netnspackage सपोर्ट अभी implement नहीं किए गए हैं- इसके लिए Plan 9 पर Tailscale को अलग
/netके रूप में प्रस्तुत करने जैसी दिशा में दोबारा सोचने की ज़रूरत हो सकती है
- इसके लिए Plan 9 पर Tailscale को अलग
- इस काम से Go का Plan 9 सपोर्ट भी बेहतर हुआ
- cmd/compile: use FMA on plan9, and drop UseFMA
- runtime: remove nextSampleNoFP from plan9
- cmd/compile, runtime: remove plan9 special case avoiding SSE
- net: fix parsing of interfaces on plan9 without associated devices
- os: guarantee min buffer size for ReadFile reads on /proc-like files
- net: unblock UDP Reads upon Close on plan9, add test
- runtime: fix plan9 monotonic time, crypto randomness
- खास तौर पर Go compiler से Plan 9 special-casing हटने से compiler अधिक सरल और maintain करना आसान हो गया
- v86 demo जारी होने के समय v86 लेखक के April Fools मज़ाक के कारण VGA text output नकली Dutch जैसी दिख रही थी, लेकिन
&nojokequery argument से इससे बचा जा सकता था
1 टिप्पणियां
Hacker News की राय
अगर कुछ पूछना हो तो मैं जवाब दे सकता हूँ
अभी कुछ लोग https://meet.google.com/qre-gydb-mkv पर इसी बारे में बात कर रहे हैं
एडिट: एक घंटा बीतने के बाद सब जा चुके हैं
पिछली 1 अप्रैल की ब्लॉग पोस्ट https://tailscale.com/blog/tailscale-enterprise-plan-9-suppo... थी
Russ Cox ने इस मजाक को आखिर तक निभाया, यह सच में legendary है
9fans सूची में April Fools के लिए ऐसा कुछ पोस्ट हुआ था
उसमें कहा गया था कि mips, 386, arm, arm64, amd64 जैसी अपरिपक्व computer architectures को maintain करने की लागत बहुत ज्यादा है, इसलिए वे ज्यादा परिपक्व और स्थिर architectures पर ध्यान केंद्रित करेंगे
वे हैं power64 और itanium, और इसलिए power64 और itanium को छोड़कर बाकी सभी architectures को freeze और preserve किया जाएगा और end-of-life में promote कर दिया जाएगा
मजाक नहीं, सच में काश Plan 9 enterprise version होता
इन दिनों मैं अपनी ज्यादातर scripts
rcमें लिख रहा हूँ, और क्योंकि हम nix इस्तेमाल करते हैं और dirnev से इसे अपने आप खींच सकते हैं, सहकर्मी इसे सहन कर रहे हैं; अनुभव काफी अच्छा रहाrcscripts चला पाएंगे या नहीं, बल्कि यह कि क्या वे उन्हें पढ़ और modify कर पाएंगेrcका एक फायदा यह है[1]:“rc के design में सबसे महत्वपूर्ण सिद्धांत यह है कि यह macro processor नहीं है। input को lexical और syntactic analysis code में कभी भी एक बार से ज्यादा scan नहीं किया जाता”
पहले जिस Unix कंपनी में काम करता था, वहाँ running shell script modify हो जाने के कारण working disk का ज्यादातर हिस्सा मिट गया था। शुक्र है कि daily backups tape पर रखे थे, और यह करीब 17 साल पहले की बात है
[1] https://www.scs.stanford.edu/nyu/04fa/sched/readings/rc.pdf
अगर पहली पोस्ट छूट गई हो और बस खुद test करके देखना चाहते हों, तो यह v86 image में चलता है:
https://copy.sh/v86/?profile=custom&m=768&vram=16&hda.url=ht...
VM के अंदर
tailscaledऔरtailscaleशुरू कर सकते हैं। proxy availability सीमित है, इसलिए online होने में थोड़ा समय लग सकता हैएडिट: alt तीसरे button की तरह काम करता है। terminal शुरू करने के लिए alt दबाए रखते हुए right click करें, new चुनें, alt छोड़ें और right-click drag करके terminal window का size adjust करें
webinar चल रहा है (Google Meet) https://ftp.plan9.ts.net/webinar
मजाक का premise पसंद आया था, लेकिन explanation जितनी लंबी होती गई, अचानक उदासी-सी होने लगी
बहुत कुछ टूटा हुआ है और complexity भी बहुत ज्यादा है। आखिर किसलिए—एक network tunnel बनाने के लिए? अगर यह extra work ही मजाक होता तो मजा आता
rsc, rob pike, bradfitz के साथ खासकर Plan 9 पर घंटों बैठकर बात कर सकता हूँ। बेशक इससे उनका समय पूरी तरह बर्बाद होगा
वह operating system सच में fascinating है
career की शुरुआत में एक expert साथ काम करते थे; वे मेरे पास बैठकर धैर्य से तरीका दिखाते और सवालों के जवाब देते, जब तक मैं ठीक से समझ न जाऊँ। यह ऐसा था जैसे गहरे पानी में डालकर भी तैरना सिखा दिया जाए, और तीन घंटे में किसी खास विषय में bachelor’s degree मिल गई हो—मेरे career की सबसे तेज growth में से एक
मुझे C भी नहीं आती और Plan 9 को productively इस्तेमाल करने जितना भी नहीं जानता, लेकिन इसमें कुछ शानदार और उपयोगी features हैं जिन्हें और जानना-सीखना चाहता हूँ, कम से कम इसलिए कि आज के मुख्य तीन operating systems में उनकी कमी महसूस कर सकूँ
अगर पैसे होते, तो Go की समझ बढ़ाने के लिए उन तीनों से सीधे बात करने का समय खरीदता, और Plan 9 को समझने के लिए—जिसकी हमेशा इच्छा रही पर खुद हासिल नहीं कर पाया—rsc और rob pike का समय भी खरीदना चाहता
Plan 9 मुझे सच में बहुत पसंद है। उसके कई principles लेकर अपना operating system बनाना मेरा retirement project और जीवन का लक्ष्य है
एडिट: इस project का नाम “chaos10” reserve कर लिया है। SerenityOS की तरह कोई plan नहीं होगा
मुझे बिल्कुल उम्मीद नहीं थी कि इसे चलाने के लिए Plan 9 kernel तक patch करना पड़ेगा