1 poin oleh GN⁺ 2023-10-24 | 1 komentar | Bagikan ke WhatsApp
  • Di Hackweek 22 SUSE, dibuat POC unikernel yang menjalankan modul WebAssembly, dan proses implementasinya dirangkum dalam beberapa bagian
  • Untuk mem-porting aplikasi umum langsung ke unikernel, dependensinya juga harus cocok, tetapi platform WebAssembly memiliki batas fungsi yang perlu disediakan runtime yang lebih jelas
  • Aplikasi Spiderlightning hanya membutuhkan fungsi seperti Key/Value, dan meskipun host mengimplementasikannya dengan Redis atau Azure Cosmos DB, modul .wasm yang sama tidak perlu mengetahui perbedaannya
  • Fondasinya adalah unikernel Rust RustyHermit, dan karena Wasmtime serta Wasmer tidak bisa dibangun, dipilih wasmi, runtime murni Rust
  • Untuk menyesuaikan Component Model dan WIT, dukungan wasmi ditambahkan ke wit-bindgen, lalu fungsi Key/Value di sisi host di-scaffold untuk menjalankan keyvalue-demo

Proyek Hackweek dan tujuan

  • Selama Hackweek 22 SUSE, dikerjakan proyek membangun unikernel yang menjalankan WebAssembly
  • Karena seluruh proses implementasi terlalu panjang untuk dimuat dalam satu tulisan, isinya dibagi menjadi beberapa artikel, dan tulisan ini adalah bagian pertama
  • Kode POC dipublikasikan di lokasi terpisah, tetapi URL tautan sebenarnya tidak ada di isi yang disediakan

Mengapa menggunakan unikernel bersama WebAssembly

  • Bagi pengembang aplikasi, porting ke unikernel adalah beban yang besar
    • Aplikasi dan semua dependensinya harus mendukung unikernel target
    • Patch mungkin diperlukan di seluruh stack aplikasi
  • Pemelihara unikernel juga harus menghabiskan banyak energi untuk membuat aplikasi arbitrer berjalan mulus
    • Karena sulit memprediksi primitive sistem apa yang akan digunakan aplikasi pengguna
  • Sebaliknya, jika menargetkan platform WebAssembly seperti Spin atau Spiderlightning, kumpulan fungsi yang harus disediakan runtime menjadi jelas
  • Dalam skenario Spiderlightning, aplikasi dapat meminta fungsi penyimpanan Key/Value dari runtime
    • Baik host mengimplementasikan fungsi tersebut dengan Redis maupun Azure Cosmos DB, hal itu transparan bagi aplikasi
    • Modul `.wasm`` yang sama dapat dijalankan di atas implementasi host yang berbeda

Arsitektur target

  • Jika aplikasi unikernel menjalankan modul WebAssembly dan mendukung kumpulan API Spiderlightning, aplikasi Spiderlightning yang sama dapat dijalankan baik di runtime slight biasa maupun di unikernel tersebut
  • Pengembang aplikasi tidak perlu melakukan pekerjaan tambahan, dan modul Wasm juga tidak perlu mengetahui di mana ia dijalankan
  • Kompleksitas memang terkonsentrasi pada pengembang unikernel, tetapi cakupan yang harus diimplementasikan jauh lebih jelas daripada “mendukung eksekusi semua aplikasi”

Implementasi berbasis RustyHermit

  • Dipilih RustyHermit sebagai fondasi
    • Ini adalah unikernel yang ditulis dengan Rust
    • Karena termasuk dalam Rust nightly, pengalaman pengembangannya mirip dengan menulis aplikasi Rust biasa
  • Build aplikasi RustyHermit relatif mudah dipahami
    • Dokumentasinya agak tersebar, tetapi berkualitas baik, dan contoh-contohnya sangat membantu
  • Tidak semua crate Rust bisa diharapkan berjalan apa adanya di RustyHermit, dan keterbatasan ini memengaruhi pengembangan POC

Memilih runtime WebAssembly

  • Wasmtime yang sebelumnya lebih disukai tidak bisa dibangun di atas RustyHermit
    • Banyak dependensinya mengharapkan libc atau pustaka tingkat rendah lainnya
  • wasmer juga memiliki masalah yang sama
  • WebAssembly Micro Runtime juga sempat dipertimbangkan, tetapi diputuskan untuk menggunakan runtime yang ditulis dalam Rust agar tetap mempertahankan “pengalaman RustyHermit yang sepenuhnya Rust”
  • Pada akhirnya dipilih wasmi, runtime WebAssembly murni Rust
    • Berjalan dengan baik di atas RustyHermit
    • Desainnya terinspirasi dari Wasmtime sehingga banyak pengetahuan yang sudah ada bisa digunakan kembali

WebAssembly Component Model dan WIT

  • Spiderlightning menggunakan proposal WebAssembly Component Model
    • Untuk menyediakan fungsi bagi guest WebAssembly
    • Untuk memungkinkan host mengonsumsi fungsi yang disediakan guest WebAssembly
  • Komunikasi antara host dan guest menggunakan tipe yang didefinisikan dengan Wasm Interface Type
  • Demo menggunakan Component Model dengan alur berikut
    • Guest meminta host untuk memulai server HTTP, lalu memberikan route HTTP yang akan didaftarkan serta nama fungsi handler internal
      • Menggunakan tipe http-server, dan guest memakai fungsi yang disediakan host
    • Host menangani permintaan HTTP yang masuk menggunakan informasi routing yang diberikan guest
      • HTTP handler adalah fungsi yang diekspos oleh guest WebAssembly
      • Server mengonsumsi fungsi yang disediakan guest dan berkomunikasi melalui tipe http-handler
    • Beberapa HTTP handler berinteraksi dengan penyimpanan Key/Value
      • Dalam kasus ini juga, guest menggunakan fungsi yang disediakan host dan didefinisikan dengan tipe keyvalue

Memperluas wit-bindgen dan menjalankan demo

  • Untuk setiap tipe WIT, dibutuhkan kode bergaya SDK di sisi guest dan kode implementasi di sisi host
  • wit-bindgen adalah alat CLI yang menghasilkan kode host/guest dari file .wit
  • Dalam POC ini, yang perlu diimplementasikan hanya antarmuka sisi host di dalam unikernel
  • Kode yang dihasilkan wit-bindgen menggunakan runtime WebAssembly untuk melakukan pekerjaan tingkat rendah
    • Kode yang dihasilkan bergantung pada bahasa pemrograman dan runtime WebAssembly sisi host
  • Karena wasmi tidak didukung oleh wit-bindgen, wit-bindgen diperluas agar bisa menangani wasmi
  • Setelah itu, kode sisi host untuk fungsi Key/Value di-scaffold dan implementasi trait host sederhana ditambahkan
    • Kode host saat itu berada pada tingkat mencetak informasi debug
  • Dalam keadaan ini, keyvalue-demo dari proyek Spiderlightning dapat dijalankan tanpa modifikasi

Pratinjau bagian berikutnya

  • Ada rekaman aplikasi unikernel yang menjalankan demo Spiderlightning http-server
  • Di bagian berikutnya akan dibahas Rust async, Redis, dan beberapa error yang aneh

1 komentar

 
GN⁺ 2023-10-24
Komentar Hacker News
  • Bukankah ini langsung mengingatkan pada https://www.destroyallsoftware.com/talks/the-birth-and-death...?

  • Kalau seseorang yang bukan hacker sistem operasi menginginkan unikernel, pendekatan paling utuh itu apa?
    Opsi yang terpikir: membuat aplikasi sebagai modul kernel Linux lalu menjalankannya di kernel biasa dan mengabaikan ruang pengguna; memangkas Linux habis-habisan lalu menempelkan kode sendiri; mulai dari proyek unikernel di GitHub; atau memangkas sistem operasi lain seperti FreeBSD
    Saya suka gambaran mesin x64 di VM yang terhubung ke kartu jaringan bertindak seperti sumber daya komputasi serbaguna, lalu data dikirim lewat jaringan untuk menetapkan pekerjaan. Karena lebih merepotkan daripada daemon ruang pengguna, nilainya belum terlalu besar, tetapi suatu saat kalau ada waktu saya penasaran sebaiknya mulai dari mana untuk hacking tingkat sistem operasi

    • RedHat sudah mengamati Linux-as-unikernel sejak 2018: https://research.redhat.com/blog/article/unikernel-linux-ukl...
      Unikernel Linux(UKL) berawal dari upaya memanfaatkan kemampuan konfigurasi Linux, dan menargetkan kernel yang mencakup mulai dari sistem operasi serbaguna hingga unikernel yang dikhususkan untuk aplikasi dan perangkat keras. Area terkait seperti io_uring dan eBPF juga disebutkan; io_uring menyebarkan biaya system call, sedangkan eBPF adalah cara lain untuk menjalankan kode di ruang kernel, meski terbatas
      Kode: https://github.com/unikernelLinux/ukl
      UKL adalah patch kecil untuk Linux dan glibc yang memungkinkan banyak program dibangun sebagai unikernel tanpa modifikasi. Program ditautkan dengan kernel Linux menjadi vmlinuz akhir, dijalankan di ruang kernel, bisa boot di bare metal atau VM, dan dapat memakai hampir semua fitur serta driver Linux
    • Jika berasumsi di keluarga Linux, pertama buat aplikasi yang dikompilasi statis, masukkan sebagai satu-satunya berkas di initramfs, cukup beri nama /init, lalu ikatkan ke kernel dan boot
      Dengan begitu aplikasi menjadi PID 1 dan pada dasarnya satu-satunya proses, dan selain beberapa thread kernel, Anda bisa melakukan apa pun yang diinginkan
    • Unikraft juga layak dicek: https://unikraft.org
      Mendukung berbagai bahasa dan aplikasi, x86/ARM64, QEMU/Firecracker, dan juga bisa menjalankan ELF yang dibangun di Linux sebagai unikernel: https://unikraft.org/guides/bincompat
      Discord ada di https://unikraft.org/discord
    • Ada MirageOS sebagai framework untuk OCaml: https://mirage.io/
      Jika ingin belajar OCaml dan juga menginginkan unikernel, ini jalur yang memungkinkan
    • Pada dasarnya ada tiga cara membuat unikernel: meminimalkan sistem operasi serbaguna yang sudah ada, melewati sistem operasi, atau membuat dari nol
      Detailnya bisa dilihat di dokumentasi Unikraft: https://unikraft.org/docs/concepts/design-principles#approac...
  • Proyek yang bagus. Saya suka WASM karena sejak awal dirancang dengan sandbox dan portabilitas dalam pikiran
    Saya berharap WASM muncul pada 1990-an alih-alih JavaScript, dan rasanya WASM akan melahap dunia. Hal yang paling saya harapkan adalah keberlanjutan. Saat ini ada banyak program yang tidak bisa lagi dijalankan, dengan game lama sebagai contoh utamanya. Spesifikasi yang sederhana lebih mungkin bertahan lama, jadi penambahan fitur baru agak membuat waswas, tetapi masa depan binary terlihat menarik

    • Sulit dipercaya mungkin, tetapi pada 1990-an browser web pada umumnya dianggap sebagai penjelajah dokumen hiperteks, bukan pengganti sistem operasi
      Ada alasan mengapa JS awalnya dibatasi untuk scripting dasar seperti handler klik atau validasi formulir. Ia berkembang menjadi sesuatu yang lain bukan hanya karena cacat desain JS, melainkan juga karena use case yang dipaksakan masuk. Menggunakan browser sebagai mekanisme pengiriman aplikasi semacam ini jauh dari apa yang dibayangkan Tim Berners-Lee atau Marc Andreesen
      Saat itu kubu “jaringan adalah komputer” menghadirkan thin X client untuk aplikasi yang lebih kaya: https://en.wikipedia.org/wiki/Network_Computer
      Perasaan saya terhadap WASM campur aduk. Saat ini ada tirai besar hype dan kebaruan yang menyelimutinya. Jika browser web hanya diperlakukan sebagai viewport untuk fantasi bahasa yang sedang disukai desainer UI dan developer, banyak hal buruk terjadi di area seperti aksesibilitas dan screen reader
      Arus yang memperlakukan WASM sebagai VM universal di luar browser juga jalur yang sudah pernah ditempuh 30 tahun lalu. Itulah yang dulu ingin dilakukan JVM, tetapi sekarang tampaknya tidak “keren”
    • Secara naif, saya berharap web terbelah menjadi aplikasi WASM bersandbox dan konten dokumen yang bahkan tidak membutuhkan JS
      Saya tidak begitu tahu seperti apa seharusnya wilayah tengah itu, atau mengapa kita harus menginginkannya. Namun secara realistis WASM akan melahap sampai konten dokumen, dan kalau begitu pemblokir iklan serta mode baca kemungkinan besar tamat
    • Menurut saya agar ini bisa berjalan, memang diperlukan JavaScript atau sesuatu yang mirip. Kalau tidak, ekosistemnya mungkin sudah terinfeksi sesuatu seperti Java
  • Saya sangat suka ini. Ada beberapa teknologi yang ditautkan yang belum pernah saya lihat, jadi semuanya saya bookmark
    Berikutnya saya ingin mencoba menyiapkan koneksi WireGuard di hypervisor. Pembentukan koneksinya bisa juga lewat sesuatu seperti Tailscale
    Dengan begitu, WebAssembly di mesin ini akan berbicara langsung dengan WebAssembly di mesin itu. Bukan model proses membuka koneksi TCP ke lokasi sembarang, melainkan struktur komunikasi berdasarkan konfigurasi dan izin yang diberikan

  • Agak terlambat, tapi apakah ada yang pernah mempertimbangkan menjalankan Zephyr sebagai unikernel? https://docs.zephyrproject.org/latest/boards/x86/acrn/doc/in...

  • Berapa lama lagi sampai hardware khusus WASM muncul?

    • Secara ketat, saya rasa tidak akan pernah. Dalam arti yang sangat sempit, WASM tidak dispesifikasikan cukup jauh untuk itu
      Namun sesuatu seperti “tampak luarnya wasm, tetapi sebenarnya ada RISC-V di bawahnya” mungkin bisa dibuat seseorang
    • Saya yakin pasti ada yang akan membuatnya. Dulu ada mesin Lisp dan CPU khusus JVM juga
      Namun menurut saya hardware semacam itu akan selalu berada di ceruk pasar. Karena menjalankan WASM di hardware umum siap pakai umumnya akan lebih cepat. WASM sendiri dirancang agar berjalan cepat di hardware siap pakai, dan skala ekonomi prosesor serbaguna jauh lebih baik
      International Conference on Functional Programming juga awalnya merupakan konferensi bernama Functional Programming and Computer Architecture, tetapi kemudian ditemukan cara untuk mengompilasi bahasa fungsional dengan evaluasi malas seperti Haskell secara efisien di hardware yang ada
      Mesin Lisp dan Java juga serupa. Salah satu alasan kita tidak lagi sering melihat hal semacam itu adalah karena teknologi compiler sudah mengejar
  • Apa use case unikernel dan WASM?

    • Soal WASM saya tidak akan berkomentar. Nanti rasanya saya akan masuk mode “anak-anak zaman sekarang itu...”
      Menurut saya nilai unikernel ada pada 1) performa: membuang yang tidak perlu dan menarik yang diperlukan ke “ring 0” untuk memeras beberapa siklus lagi, 2) penyederhanaan: kemungkinan mengurangi kompleksitas dengan membuang bagian yang tidak perlu, 3) keamanan: lagi-lagi kemungkinan mengubah attack surface dengan mengurangi hal yang tidak perlu
      Namun saya rasa ini bukan pendekatan yang cocok untuk penulisan microservice atau web app yang banyak dilakukan orang di forum ini. Penggunaannya lebih dekat ke pembuatan komponen infrastruktur seperti database dan load balancer
    • Micro VM bisa bersaing dengan container Linux untuk sebagian workload, dan punya keunggulan tidak mengekspos kernel Linux ke kode yang kurang tepercaya
      Karena itu, beberapa penyedia edge cloud mengonversi image Docker menjadi micro VM saat menjalankannya
      Namun WASM di dalam micro VM di edge mungkin sulit bersaing dengan WASM sandbox milik edge. Dari sudut pandang penyedia, yang terakhir kemungkinan lebih mudah ditambahi fungsi pembatas dan integrasi yang berguna
    • Sepertinya ini untuk memperluas tempat WASM bisa berjalan. Setelah browser dan container Docker, kini termasuk sistem operasi ringan yang bisa dipasang di perangkat embedded
  • Seperti yang sudah “diramalkan” lama lalu dalam Birth & Death of Javascript, suatu hari akan muncul unikernel yang menjalankan runtime garbage collection yang aman di ruang kernel, lalu dukungan pemetaan memori virtual bisa dihapus dari CPU agar menjadi lebih cepat—begitulah gambarannya.
    Pada 2014, penulis memperkirakan JS dan asm.js, tetapi sekarang WASM tampak seperti jalur itu. Menarik, haha
    https://www.destroyallsoftware.com/talks/the-birth-and-death...

    • Logika video itu adalah bahwa browser toh berupa satu proses, dan jika semuanya berjalan di proses itu, pemisahan semacam itu tidak diperlukan.
      Namun setelah itu kita belajar bahwa browser satu proses adalah mimpi buruk keamanan, dan browser masa kini tidak lagi satu proses demi sandboxing yang benar.
      Tetap menarik melihat seberapa dekat video itu dengan jawaban yang benar, dan dengan cara apa ia keliru.
    • Evolusi JavaScript/WASM mengalir dari desain untuk aplikasi yang berjalan di browser → menulis aplikasi desktop dan server → menulis sistem operasi atau kernel.
      Sulit menunjuknya secara persis, tetapi terasa familier di suatu tempat. Petunjuknya: yang itu juga dimulai dengan “J”.
    • JavaStation adalah komputer jaringan yang dikembangkan Sun Microsystems antara 1996 dan 2000, dengan tujuan hanya menjalankan aplikasi Java.
      https://en.wikipedia.org/wiki/JavaStation
    • Memori virtual dan paging bukan hanya untuk proteksi, keamanan, dan isolasi proses. Keduanya juga menyediakan sekumpulan abstraksi untuk penggunaan memori fisik secara efisien dan manajemen memori.
      Penggunaan virtual suatu proses bisa melebihi RSS walaupun bukan karena swapping, dan sistem operasi serta allocator bekerja bersama untuk menanganinya dengan cukup cerdas pada kasus umum.
      Jadi menghapusnya tidak otomatis berarti ada keuntungan performa. Apalagi jika masih melewati lapisan WASM VM yang cukup lambat.
      Untuk sebagian aplikasi, misalnya database, menjalankannya sebagai unikernel atau menempelkannya lebih dekat ke kernel agar mendapat akses langsung ke MMU bisa memberi keuntungan besar: https://github.com/tuhhosg/exmap & https://github.com/viktorleis/vmcache & https://www.cs.cit.tum.de/fileadmin/w00cfj/dis/_my_direct_up...
      Namun untuk aplikasi umum yang mengasumsikan standar POSIX atau mengandaikan lingkungan eksekusinya tampak seperti komputer umum modern, hal itu masih meragukan. Pada akhirnya, sepertinya banyak pekerjaan yang dulu dilakukan lapisan VMM akan ditulis ulang dalam kode pengguna.
    • Menghapus dukungan pemetaan memori virtual makin dipikir makin kurang masuk akal.
      Engine JS bergantung pada VMM, dan WASM juga demikian dalam berbagai cara. Hampir semua program nontrivial yang bukan embedded secara halus berasumsi adanya VMM. Terutama, sebagian teknologi VM di sekitar microVM juga memakai VMM, dan unikernel baru benar-benar bermakna ketika digunakan sebagai VM.