Pekerjaan porting Tailscale ke Plan 9
(tailscale.com)- Dukungan Plan 9 yang bermula dari pengumuman April Mop berlanjut menjadi PR nyata serta perubahan kernel dan Go, dan per 2 April 2025 telah mencapai tahap di mana Tailscale berjalan di Plan 9
- Ini bukan sekadar masalah build
GOOS=plan9 GOARCH=386, melainkan lebih dulu mengungkap runtime crash dan masalah penanganan khusus di compiler pada port Go untuk Plan 9 - Perbaikan kernel Plan 9 serta runtime dan compiler Go oleh Russ Cox juga membereskan SSE, konteks floating point, waktu monotonik, DNS, dan masalah lingkungan pengembangan
- Tailscale memanfaatkan antarmuka berkas
/netmilik Plan 9 untuk memasang implementasi mirip TUN, routing, Tailscale SSH, MagicDNS, dan pengumpulan layanan, tetapi sebagian masih berupa implementasi sementara atau belum selesai - Cakupan verifikasi saat ini terutama pada 9legacy dan
GOARCH=386, sedangkan 9front, amd64, exit node, dan dukungan Gonet/netnsmasih memerlukan verifikasi tambahan atau desain ulang
Lelucon April Mop yang berujung menjadi porting nyata
- Tailscale mengumumkan dukungan Plan 9 pada 1 April 2025, lalu keesokan harinya memaparkan latar belakang bahwa pengumuman itu didasarkan pada pekerjaan porting yang benar-benar berfungsi
- Pekerjaan ini berlanjut ke Tailscale PR dan berbagai perubahan pada Plan 9 dan Go
- Pendekatan awal berangkat dari harapan bahwa dua biner Go milik Tailscale dapat dibangun cukup dengan
GOOS=plan9 GOARCH=386 go install ./cmd/tailscale{,d} - Pada percobaan pertama di Agustus 2023, sebagian build memang berhasil, tetapi saat dijalankan terjadi crash yang tidak normal
- Port Plan 9 di Go bukan first-class port, sehingga regresi dibiarkan begitu saja
- Ada kemungkinan Tailscale mendorong Go di Plan 9 lebih keras daripada penggunaan sebelumnya
- Porting sempat berhenti sepanjang 2024, lalu dilanjutkan lagi pada Maret 2025 bersama ide April Mop
Merapikan SSE dan dukungan Plan 9 di Go
- Instruksi SSE yang diperkenalkan pada Intel Pentium III tahun 1999 menjadi salah satu titik awal utama pekerjaan ini
- Compiler Go selama ini berusaha menghindari penggunaan SSE pada target Plan 9
- Karena kernel Plan 9 tidak menyimpan dan memulihkan register SSE di note handler
- Compiler Go tidak bisa mengetahui kode mana yang akan berjalan di dalam note handler, sehingga mencoba menonaktifkan SSE secara global
- Penanganan khusus ini sering rusak dan membuat banyak pengecualian
plan9tersebar di compiler
- Russ Cox memodifikasi kernel Plan 9 agar note handler menangani konteks floating point dan SIMD
- Di sisi 386 masuk perubahan sys/src/9: allow floating point in note handlers
- Pada kernel amd64 9k juga ditemukan masalah tambahan seperti aliasing status FP setelah fork, SIMD di note handler, dan hilangnya register pada
noted(NCONT)
- Di sisi Go, penghapusan penanganan khusus pembangkitan kode untuk Plan 9 membuat
tailscaledbisa berjalan lebih lama
IPC dan lingkungan pengembangan
- Setelah itu
tailscaledmulai crash karena kehabisan memori, bukan lagi karena kerusakan stack - Dalam percobaan porting Plan 9 sebelumnya, paket IPC
safesocketmilik Tailscale memiliki bug yang membuat goroutine dibuat tanpa henti - Masalah ini diselesaikan sementara dengan beralih memakai localhost TCP
- Ini memang kurang cocok dengan pendekatan Plan 9 bahwa “semuanya adalah berkas”, tetapi dipastikan layanan Plan 9 lain juga memakai localhost TCP
- Ke depannya, pendekatan yang lebih baik mungkin menggunakan paket srv9p yang dipindahkan Russ ke Go untuk menaruh LocalAPI di atasnya
- Implementasi saat ini juga belum bisa menambahkan autentikasi localhost seperti di platform lain, sehingga secara eksplisit dinyatakan tidak boleh dipakai pada mesin Plan 9 bersama
- Pengembangan awal dilakukan di VM berbasis image CD 9legacy, dan siklus mengunduh biner lewat HTTP lalu menjalankannya terasa lambat
- rsc/plan9 buatan Russ Cox menyertakan source Plan 9, biner prakompilasi, dan skrip
./boot/qemu- VM qemu melakukan boot tanpa disk dan memakai repositori Git yang disajikan server 9P localhost sebagai root filesystem
- Dengan berbagi filesystem antara mesin pengembang dan Plan 9, waktu iterasi turun dari hitungan menit menjadi hitungan detik
- qemu juga memakai virtio sehingga lebih cepat
Integrasi jaringan: TUN, routing, MagicDNS
- Tailscale yang pertama kali berfungsi berjalan dalam mode jaringan ruang pengguna yang tidak memakai stack jaringan kernel
- TCP, UDP, ICMP, dan lainnya ditangani melalui netstack milik gVisor
- Untuk mengakses tailnet dari mesin Plan 9, pengguna harus memakai proxy HTTP/SOCKS5 dari
tailscaled - Ini tidak ideal karena hampir tidak ada program Plan 9 yang memahami variabel lingkungan
HTTP_PROXYatauALL_PROXY
- Implementasi mirip TUN di Plan 9 sangat sederhana
- Buka
/net/ipifc/clonelalu baca nomor antarmuka baru - Tulis
"bind pkt\n"ke control fd, maka antarmuka baru seperti/net/ipifc/2/*akan muncul - Buka
/net/ipifc/2/datauntuk membaca dan menulis paket IP apa adanya - Tidak perlu ioctl terpisah atau framing berbasis panjang
- Buka
- Manipulasi tabel routing juga dilakukan melalui berkas
/net/iproute- Tulis
"tag tail\n"untuk menandai route yang ditambahkan setelahnya dengan tagtail - Tambahkan route dengan pesan seperti
"add 100.64.0.0 /106 100.102.103.104" - Karena bagian internal Plan 9 berpusat pada IPv6 dan memperlakukan IPv4 sebagai alamat IPv6 yang di-map, CGNAT
100.64.0.0/10dinyatakan seperti/106
- Tulis
- MagicDNS bertujuan memungkinkan peer diakses di Plan 9 dengan nama seperti
fooataufoo.tailnet-name.ts.net- Opsi seperti mencegat kueri
/net/dnsatau/net/csjuga sempat dibahas - Pada akhirnya Russ memodifikasi Plan 9 agar server DNS alternatif bisa ditetapkan untuk suffix DNS tertentu
- Masalah kueri DNS yang salah masuk negative cache juga diperbaiki
- Opsi seperti mencegat kueri
Tailscale SSH dan pengumpulan layanan
- Tailscale SSH adalah server SSH bawaan
tailscaledyang mengautentikasi identitas Tailscale yang dikenal melalui kunci WireGuard yang terkait dengan paket dan koneksi - Awalnya, shell Plan 9
/bin/rcdijalankan denganos/exec.Commanddan stdin/stdout dihubungkan- Shell memang berjalan, tetapi echo, navigasi, dan interrupt proses tidak berfungsi dengan benar
- Russ menambahkan contoh netshell ke 9fans/go
- Contoh ini sangat tidak aman dan lebih mirip server telnet, tetapi cukup memadai jika diletakkan di belakang Tailscale SSH
- Setelah itu menjadi lebih mudah mengambil isi
/dev/snarfPlan 9 melalui SSH, atau cross-compile pengujian Go dari laptop lalu menjalankannya via SSH
- Fitur opsional Tailscale berupa pengumpulan layanan juga ditinjau agar sesuai dengan Plan 9
- Ia menelusuri
/proc/NNN/fduntuk mencari proses yang membuka/net/tcp/clone - QID pada fd dicocokkan dengan
/net/tcp/NNN/{status,local}untuk mengetahui apakah ia sedang listening dan di port mana - Cara menghitung nomor TCP dari QID dianggap kurang memuaskan karena rentan terhadap perubahan implementasi kernel
- Ia menelusuri
Waktu, demo web, v86
- Ada kasus
tailscaledcrash karena gVisor netstack melaporkan waktu monotonik mundur ke belakang- Implementasi waktu Plan 9 di Go memakai wall time sebagai waktu monotonik
- Ketika ntpd memundurkan jam, asumsi netstack tentang waktu monotonik pun rusak
- Russ menambahkan waktu monotonik ke
/dev/bintimedi Plan 9 dan memodifikasi Go agar memakainya melalui perubahan ini - Untuk menjalankan Plan 9 di web digunakan v86
- v86 menjalankan sistem operasi 32-bit dalam WASM dan menyediakan berbagai metode jaringan
- Ini juga menjadi salah satu alasan fokus pada
GOARCH=386
- Awalnya, untuk mengirim frame Ethernet ke websocket relay, ditambahkan dukungan protokol wsproxy ke lingkungan simulasi jaringan Tailscale
- Ini berjalan di lingkungan pengujian terintegrasi yang meniru ARP, DHCP, DNS, NAT, control plane, DERP, dan lainnya dengan gVisor netstack
- Namun karena round-trip DHCP, jika relay jauh maka startup GUI Plan 9
riomenjadi lambat
- Setelah itu server WISP juga diimplementasikan, tetapi waktu tidak cukup untuk memproduksikannya sebelum rilis, sehingga dipublikasikan dengan pengaturan relay jaringan bawaan
copy.sh/v86 - Image disk berisi Tailscale dan Plan 9 berukuran 16MB, sedangkan biner Tailscale berukuran 23MB setelah diekstrak
- Karena itulah tahap “gunzip…” terlihat saat boot
- Image contoh disertakan dalam profil 9legacy milik
copy.sh/v86
Pekerjaan yang tersisa dan hasil nyata
- Saat ini porting Tailscale ke Plan 9 baru diuji pada 9legacy
- Fork utama Plan 9 mencakup 9legacy yang lebih minimal dan 9front yang telah dimodifikasi lebih jauh
- Sebagian patch yang ditulis Russ untuk 9legacy mungkin perlu dipindahkan ke 9front
- Dukungan 64-bit
GOARCH=amd64juga masih perlu diverifikasi - Dukungan exit node dan paket Go
net/netnsbelum diimplementasikan- Untuk itu mungkin diperlukan peninjauan ulang, misalnya dengan cara Tailscale menampilkan dirinya sebagai
/netterpisah di Plan 9
- Untuk itu mungkin diperlukan peninjauan ulang, misalnya dengan cara Tailscale menampilkan dirinya sebagai
- Pekerjaan ini juga meningkatkan dukungan Go untuk 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
- Secara khusus, penghapusan penanganan khusus Plan 9 di compiler Go membuat compiler lebih sederhana dan lebih mudah diperbaiki
- Saat demo v86 dipublikasikan, ada juga masalah keluaran teks VGA yang tampil seperti bahasa Belanda palsu akibat lelucon April Mop dari pembuat v86, tetapi itu bisa dihindari dengan argumen query
&nojoke
1 komentar
Komentar Hacker News
Kalau ada yang ingin ditanyakan, saya bisa menjawab
Saat ini beberapa orang sedang membicarakan ini di https://meet.google.com/qre-gydb-mkv
Edit: setelah satu jam, semua orang sudah keluar
Tulisan blog 1 April sebelumnya ada di https://tailscale.com/blog/tailscale-enterprise-plan-9-suppo...
Russ Cox benar-benar legendaris karena membawa lelucon ini sampai sejauh itu
Di milis 9fans, ada postingan seperti ini untuk April Mop
Isinya, biaya pemeliharaan arsitektur komputer yang belum matang seperti mips, 386, arm, arm64, dan amd64 terlalu besar, sehingga mereka memutuskan fokus pada arsitektur yang lebih matang dan stabil
Sasarannya adalah power64 dan itanium, jadi semua arsitektur selain power64 dan itanium akan dibekukan, diarsipkan, dan dinaikkan statusnya menjadi akhir masa pakai
Tanpa bercanda, saya benar-benar berharap ada versi enterprise Plan 9
Belakangan ini sebagian besar skrip saya ditulis dengan
rc, dan karena kami memakai nix serta bisa menariknya otomatis dengan dirnev, rekan-rekan kerja masih memakluminya; sejauh ini cukup bagusrcitu, daripada apakah mereka bisa menjalankannyarcadalah ini[1]:“Prinsip terpenting dalam desain rc adalah bahwa ia bukan pemroses makro. Input tidak pernah dipindai lebih dari sekali oleh kode analisis leksikal dan sintaksis”
Dulu di sebuah perusahaan Unix tempat saya bekerja, skrip shell yang sedang berjalan diubah, sehingga sebagian besar disk kerja terhapus. Untungnya kami menyimpan backup harian di tape; itu kira-kira 17 tahun lalu
[1] https://www.scs.stanford.edu/nyu/04fa/sched/readings/rc.pdf
Kalau melewatkan tulisan pertama dan hanya ingin mencobanya sendiri, ini berjalan di image v86 berikut:
https://copy.sh/v86/?profile=custom&m=768&vram=16&hda.url=ht...
Di dalam VM, kamu bisa menjalankan
tailscaleddantailscale. Karena ketersediaan proxy terbatas, mungkin butuh beberapa waktu sampai menjadi onlineEdit: alt berfungsi sebagai tombol ketiga. Untuk membuka terminal, tahan alt lalu klik kanan, pilih new, lepaskan alt, lalu seret dengan klik kanan untuk mengatur ukuran jendela terminal
Webinar sedang berlangsung (Google Meet) https://ftp.plan9.ts.net/webinar
Saya suka premis leluconnya, tapi semakin panjang penjelasannya, mendadak rasanya jadi muram
Terlalu banyak yang rusak dan kompleksitasnya juga terlalu besar. Pada akhirnya untuk apa, membuat satu tunnel jaringan? Kalau pekerjaan tambahan ini sendiri adalah leluconnya, mungkin akan lucu
Saya rasa saya bisa mengobrol berjam-jam dengan rsc, rob pike, dan bradfitz, terutama soal Plan 9. Tentu saja itu akan benar-benar membuang-buang waktu mereka
Sistem operasi itu benar-benar memikat
Saya ingat di awal karier, ada seorang ahli yang bekerja bersama saya duduk di sebelah saya, dengan sabar menunjukkan caranya dan menjawab pertanyaan sampai saya cukup paham. Rasanya seperti dibuat mampu berenang meski dilempar ke air dalam, dan dalam tiga jam saya seperti mendapat satu gelar sarjana untuk pengetahuan tertentu; itu salah satu pertumbuhan tercepat dalam karier saya
Saya tidak tahu C dan juga belum cukup tahu untuk memakai Plan 9 secara produktif, tetapi ada fitur-fitur keren dan berguna yang ingin saya ketahui dan pelajari lebih jauh, sekadar agar bisa merindukan hal-hal yang tidak ada di tiga sistem operasi utama saat ini
Kalau punya uang, saya ingin membeli waktu untuk berbicara langsung dengan ketiganya demi memperluas pengetahuan Go saya, dan juga membeli waktu rsc serta rob pike demi pemahaman Plan 9 yang selalu saya inginkan tetapi tidak pernah bisa saya dapatkan sendiri
Saya sangat suka Plan 9. Mengambil banyak prinsipnya untuk membuat sistem operasi saya sendiri adalah proyek pensiun sekaligus tujuan hidup saya
Edit: saya sudah mencadangkan nama proyek ini sebagai “chaos10”. Seperti SerenityOS, mungkin tidak akan ada rencana
Sama sekali tidak menyangka mereka sampai akan mem-patch kernel Plan 9 agar ini bisa berjalan