[HN Gopher] WebAssembly (WASM) arch support for the Linux kernel
       ___________________________________________________________________
        
       WebAssembly (WASM) arch support for the Linux kernel
        
       Demos at: https://joelseverin.github.io/linux-wasm/
        
       Author : marcodiego
       Score  : 204 points
       Date   : 2025-11-01 16:39 UTC (2 days ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | westurner wrote:
       | How does this compare to the c2w container2wasm approach?
       | 
       | container2wasm/container2wasm:
       | https://github.com/container2wasm/container2wasm :
       | 
       | > _container2wasm is a container-to-wasm image converter that
       | enables to run the container on WASM._
       | 
       | > _Converts a container to WASM with emulation by Bochs (for
       | x86_64 containers), TinyEMU (for riscv64 containers) and QEMU._
       | 
       | > _Runs on WASI runtimes (e.g. wasmtime, wamr, wasmer, wasmedge,
       | wazero)_
       | 
       | > _Runs on browser_
       | 
       | > _x86_64, riscv64 or AArch64 containers are recommended._
       | 
       | /? container2wasm:
       | https://hn.algolia.com/?dateRange=all&page=0&prefix=false&qu...
       | 
       | ktock/vscode-container-wasm https://github.com/ktock/vscode-
       | container-wasm :
       | 
       | > _Containers on VSCode for the Web_ [ https://vscode.dev ]
       | 
       | ktock/vscode-container-wasm-gcc-example:
       | https://github.com/ktock/vscode-container-wasm-gcc-example
       | 
       | JupyterLite works without install on Chromebooks.
       | 
       | JupyterLite still lacks a Terminal e.g. with BusyBox Ash in WASM,
       | with a file system integrated with the Jupyter-xeus kernel file
       | system.
       | 
       | This appears to load much more quickly than other Linux and I
       | think even just bash in WASM demos I've seen.
        
         | mappu wrote:
         | That requires an ISA emulation layer, this new implementation
         | doesn't - here, every binary is compiled as wasm, and every
         | child process runs as a new Wasm WebWorker, and the Kernel ABI
         | is exposed as Wasm export functions.
         | 
         | Removing the ISA translation layer has the potential to be
         | massively faster for full-system environments. At the expense
         | of maybe some new bugs.
         | 
         | The performance should ultimately be similar to compiling your
         | userspace application directly as Wasm, but you now get to take
         | advantage of the full kernel ABI instead of just the minimal
         | shims that Emscripten give you / whatever DOM glue you create
         | yourself.
        
           | westurner wrote:
           | One less layer of translation!
           | 
           | Shouldn't browser tabs and/or origins get their own SELinux
           | contexts like all Android apps since Android 4.4, like
           | container-selinux and openshift's k8s?
           | https://news.ycombinator.com/item?id=45418918#45421242
           | 
           | uutils/coreutils, findutils, diffutils, and Toybox are
           | written in Rust which IIRC has a cleaner compile to WASM:
           | https://news.ycombinator.com/item?id=45495100
           | 
           | RustPython may for may not also have a faster loading time
           | than CPython compiled to WASM, though there are already some
           | patches to CPython for WASM.
           | 
           | Where are the tests for the post-patch bugs this finds? Are
           | they're expected behaviors that are not yet in tests which
           | specify?
        
       | evanjrowley wrote:
       | I hope the situation gets better for Firefox.
        
         | embedding-shape wrote:
         | What situation exactly? Tried the demo
         | (https://joelseverin.github.io/linux-wasm/), seems to run fine.
         | There isn't any benchmarking programs/scripts available inside
         | of it, so can't really give out any numbers, but it doesn't
         | seem to work worse than any other "Linux-in-a-browser-tab" I've
         | tried earlier. Using a 5950x with Firefox on Linux 6.17.6-2
         | FWIW.
        
           | evanjrowley wrote:
           | Sorry, I should have been more clear in my comment. I was
           | referring to the statement from the project about debug
           | capabilities:
           | 
           | > I recommend Chromium-based browsers over Firefox, as the
           | latter does not work very well when debugging Wasm projects
           | of this size.
        
       | utopiah wrote:
       | How does it compare to https://xrsh.isvery.ninja (ignoring the XR
       | aspect)?
        
       | shevy-java wrote:
       | Hopefully this will make WASM more popular. I tried to get into
       | it but lack of documentation was already one reason to not invest
       | too much; speed concerns mentioned by other bloggers also
       | amplified this issue recently. For some reason WebAssembly is not
       | really "breaking through" right now. Perhaps it is inertia,
       | perhaps another reason.
        
         | whizzter wrote:
         | Wasm is used in a lot of nooks and crannies, apart from games,
         | Figma already uses it in the core and Wasm-GC has just started
         | to become viable so we will se a lot of server-side languages
         | get better web support.
         | 
         | Using Wasm as an end-all system was never the main intention
         | even if we're heading that way now thanks to all the work
         | people has put in.
         | 
         | I'd say that it's probably used where it's made sense so far.
        
         | Ray20 wrote:
         | I hope so too. Websites that load runtimes for various
         | programming languages are too slim; they need to load the
         | entire operating system, otherwise why do we need all these
         | powerful home computers?.
        
           | charcircuit wrote:
           | There's already a problem of downloading 10s of megabytes of
           | web assembly. We don't need to download gigabytes for a
           | single page.
        
             | cogman10 wrote:
             | Yes, but then how else could I run a docker container in
             | the browser?
        
       | frizlab wrote:
       | killed by the fork bomb                   :(){ :|:& };:
        
         | Diederich wrote:
         | How did that look on the host system CPU/memory wise?
        
           | cogman10 wrote:
           | Mine jumped up to ~3gb and then the vm crashed. It happened
           | fast enough that I didn't really see the CPU spike too much.
           | Firefox FTR
        
       | iberator wrote:
       | What's the point ?! It's insane. Who on earth would use that?
        
         | afavour wrote:
         | I don't think it's _that_ big a stretch of the imagination to
         | see how this could be used in smaller pieces than the entirety
         | of Linux.
        
           | trollbridge wrote:
           | Yeah. Basically any code you can run on Linux you can now run
           | on a browser with a lot less work.
        
             | lxgr wrote:
             | Realistically, with quite a bit more work (compared to e.g.
             | v86), but at much higher performance.
        
             | kbelder wrote:
             | Like Lynx?
        
         | iamnothere wrote:
         | I can think of a few uses quite easily:
         | 
         | - Testing a distro or specific software without downloading it
         | 
         | - Educational use (teaching Linux basics on Chromebooks etc)
         | 
         | - Bypassing restrictions on installing certain software
        
           | MBCook wrote:
           | Ah, thank you!
           | 
           | I think this is really cool but I was struggling to think of
           | a way it could be useful. Your last two suggestions seem
           | especially pertinent.
        
         | MomsAVoxell wrote:
         | These questions are the number two most important questions to
         | ask, in software. The sanity/insanity part is not so relevant,
         | but it is necessary to point out that, pretty much a huge
         | percentage of software any of us uses on a daily basis, started
         | off with someone having a random insanity, answering those two
         | questions with a working binary, and thus setting the idea
         | towards becoming normal and thus sane.
         | 
         | Soon enough, WASM may just well be the #1 platform upon which
         | to run a Linux on a Desktop ..
        
         | tracker1 wrote:
         | Because someone can... While I don't see a practical use
         | myself, beyond educational or experimental, that doesn't mean
         | nobody else could, should or would.
         | 
         | In the end, it's kinda cool.
        
       | s-macke wrote:
       | That's fast. Buggy, but fast. I'm totally impressed! Especially
       | because I researched the necessary steps to do the same thing 10
       | years ago based on [0]. The patches required for this hack touch
       | LLVM, libc, Linux kernel, BusyBox, ... and total approximately
       | 15,000 lines of code.
       | 
       | I ran a small performance test with 'bc -lq' and compared with
       | [0]:                 scale=1000       4*a(1)
       | 
       | This WASM architecture compilation completely blows away my old
       | emulation setup, which only managed around 200 MIPS. Maybe this
       | approach can be generalized. Running a full Linux distribution at
       | near-native speed right in the browser would be awesome.
       | 
       | [0] https://github.com/s-macke/jor1k
        
         | Imustaskforhelp wrote:
         | Your project was also really nice to play around with. I think
         | it was one of the few which actually had an interesting idea
         | including (blink), (copy.sh)
         | 
         | I generally preferred copy.sh more to be really honest. I have
         | actually used it sometimes as a poor man's qemu. If I may ask,
         | what are your thoughts on copy.sh as I found that its
         | performance on busybox or (tinycore linux with gui) was so
         | brilliant (the only downside was that the internet speed was
         | abysmally slow, like for me really really slow.)
        
       | philipwhiuk wrote:
       | ~ # ping 8.8.8.8        PING 8.8.8.8 (8.8.8.8): 56 data bytes
       | ping: can't create raw socket: Function not implemented
       | [Runner sh (18823808)]: Wasm crash: RuntimeError: memory access
       | out of bounds
       | 
       | darn
        
         | kro wrote:
         | Afaik wasm cannot open network sockets.
         | 
         | The segfault is unfortunate though
        
           | s-macke wrote:
           | You can write a network device driver, which exports the
           | network packages into JavaScript. The author already wrote a
           | console device. So, not much of a deal.
           | 
           | https://github.com/joelseverin/linux-
           | wasm/blob/master/patche...
        
             | seanw265 wrote:
             | Doable for http and https, but if you're running it in a
             | browser environment, you'll eventually run into issues with
             | CORS and other protocols. To get around this you need a
             | proxy server running elsewhere that exposes the lower
             | layers of the network stack.
        
               | s-macke wrote:
               | This is exactly what [0] does. Try it out. If you know
               | the IP you can even log in to another open browser window
               | via telnet.
               | 
               | [0] https://github.com/s-macke/jor1k
        
               | seanw265 wrote:
               | Aha! Now I see I'm talking to the expert on the topic ;)
               | Thanks for the link. I'll check this out.
        
       | throwaway031125 wrote:
       | $ rm -rf /
       | 
       | and it's gone
        
         | s-macke wrote:
         | Not quite right. Try the following.                 echo *
         | cd /proc       echo *       while read line; do echo $line;
         | done < /proc/cpuinfo
         | 
         | The last line should work and print the entire file, but it
         | seems there's a bug.
        
           | throwaway031125 wrote:
           | Well, it should not surprise you that the virtual file
           | systems of the kernel remain.
        
         | lxgr wrote:
         | Only on 127.0.0.1.
        
           | throwaway031125 wrote:
           | Thank you, Captain Obvious.
        
       | edubart wrote:
       | This is cool because it avoids emulation. However I think it has
       | many shortcomings today which could all be solved by emulating a
       | real CPU architecture (e.g memory protection support, ecosystem
       | with tooling and Linux distributions).
       | 
       | By the way I have developed a similar project, WebCM, a RISC-V
       | emulator capable of running full Alpine Linux that can be
       | embedded in the Web browser and can reach up to 500 MIPS for some
       | users, which I think is pretty fast despite the emulation, you
       | can try at https://edubart.github.io/webcm/. Booting is also
       | fast, it always boots from scratch when you open the page, so you
       | can boot fast even with emulation.
        
       | lalitmaganti wrote:
       | Tried running:                 ~ # du -h        (...)
       | [Runner sh (2390656)]: Wasm crash: RuntimeError: operation does
       | not support unaligned accesses       [Main]: Stopping CPU 0
       | [Main]: Stopping CPU 1       [Main]: Stopping CPU 2       Kernel
       | panic - not syncing: Aiee, killing interrupt handler!
       | [Runner sh (2390656)]: Kernel panic: Aiee, killing interrupt
       | handle
       | 
       | > Due to a bug in LLVM's build system, building LLVM a second
       | time fails when building runtimes (complaining that clang fails
       | to build a simple test program). A workaround is to build it yet
       | again (it works each other time, i.e. the 1st, 3rd, 5th etc.
       | time).
       | 
       | I'm incredibly curious what this bug might be!
        
         | bionade24 wrote:
         | Unrelated to this issue but I've had a race condition with
         | Automake which while run oin 2-4 threads occured exactly every
         | 2nd run. With -j48 it was obvious it's a race condition. No
         | idea how cache invalidation works in the automake stack, but
         | that must have caused it to fail exactly 50% of the time.
        
         | moi2388 wrote:
         | I just yesterday read about obfuscated Trojan quines in
         | compilers, and a good test being building the compiler twice
         | and it being the same, and now I hear this.
         | 
         | Spooked me for a sec xD
        
       | seanw265 wrote:
       | Very cool! I'm curious as to how it compares with WASIX in terms
       | of both compatibility and performance.
       | 
       | Also tangentially related: I'd love to see a performant build of
       | Node.js compatible with this runtime (or really any flavor of
       | WASM), but I think you'd run into the same issues that I have
       | with WASIX. Namely build headaches, JIT, and wasm(-in-wasm)
       | support. I'd explore it myself but I've already sunk way more
       | time than is reasonable on that endeavor.
        
       | hardwaresofton wrote:
       | Could this work with https://github.com/webassembly/wasi-libc ?
       | 
       | It seems like OP put together their own musl-based libc which is
       | awesome, but being able to compile against WASI would open up a
       | lot of possibilities.
       | 
       | This also reminds me of the recent thread on user-mode linux --
       | how easy it would be to compile to WASM was definitely on my
       | mind.
        
       | u8080 wrote:
       | ~ # wget
       | 
       | [Runner sh (18815616)]: Wasm crash: RuntimeError: abort
       | 
       | Illegal instruction
        
       | koolala wrote:
       | This is crazy cool. 8,000 CPUs. I wonder if any types of programs
       | would ever make 10k tasks in their normal runtime behavior.
       | 
       | "One important difference is that there is no way to suspend
       | execution of a task. There is a way around this though: Linux
       | supports up to 8k CPUs (or possibly more...). We can just spin up
       | a new CPU dedicated to each user task (process/thread) and never
       | preempt it. Each task is backed by a Web Worker, which is in
       | practice backed by a thread in the host OS (through the
       | WebAssembly implementation). "
        
       | littlestymaar wrote:
       | The Gary Bernhardt prophecy is still alive.
       | 
       | (https://www.destroyallsoftware.com/talks/the-birth-and-death...)
        
       | Imustaskforhelp wrote:
       | This is such a brilliant thing.
       | 
       | I am not a person involved in building anything like this but I
       | am a person who frequently used copy.sh/v86 and was actually
       | building a tinycore fork which added jujutsu so that people can
       | run jujutsu to try it out in their browser. It was a project
       | which made me understand so much more about building linux from
       | scratch, what isos are, and everything.
       | 
       | One surprising thing was that I was able to make the iso actually
       | have jujutsu and it could run on something like qemu but not on
       | tinycore due to some minor issue
       | 
       | Basically I believe that some really interesting quick-tries of
       | some software can happen if we can have customized linux with our
       | apps directly in the browser
       | 
       | This is such an interesting project really and it feels very
       | snappy to me.
       | 
       | I have a quick suggestion as someone trying to make a custom iso
       | linux / binary apps just work on linux in browser: Can you
       | please, please, create a docker image where you can give static
       | applications as an input in the docker and it would automatically
       | generate the html page with wasm or the wasm output containing
       | that static application in the /usr/bin
       | 
       | You mention something like this this
       | 
       | docker run -it -name full-linux-wasm linux-wasm-contained:dev
       | /linux-wasm/linux-wasm.sh all
       | 
       | I haven't read the project more but I do find it incredibly
       | minimalist and I genuinely hope you can add the ability to add
       | static/hopefully some day glibc as well but I am mentioning it
       | because there are a lot of golang tools which are statically
       | linked and it would be so interesting to running them in browser
       | if possible via their binaries
       | 
       | Yes I know that they could probably run via compiling into wasm
       | itself but that just felt so much messy to me on how I could
       | provide other tools like busybox with it or how it would actually
       | feel like a linux environment to test it out as an example
       | 
       | I have to admit, your project is really really cool. Good luck on
       | this project! Starred, and have a nice day.
        
       | acdbddh wrote:
       | when docker ;)
        
       | nilslice wrote:
       | Very cool.
       | 
       | If anyone's curious to see what's packed in here at a glance:
       | https://modsurfer.dylibso.com/module?hash=3fa6b28252b0d72c82...
        
       ___________________________________________________________________
       (page generated 2025-11-03 23:00 UTC)