[Libguestfs] Provide NBD via Browser over Websockets

Eric Wheeler nbd at lists.ewheeler.net
Fri May 29 20:52:36 UTC 2020


On Fri, 29 May 2020, Richard W.M. Jones wrote:
> Going back to the original email from 2018:
> 
> > It might be neat to attach ISOs to KVM guests via websockets.�  Basically
> > the�  browser would be the NBD "server" and an NBD client would run on the
> > hypervisor, then use `virsh change-media vm1 hdc --insert /dev/nbd0` could
> > use an ISO from my desk to boot from.
> > 
> > Here's an HTML5 open file example:
> > https://stackoverflow.com/questions/3582671/how-to-open-a-local-disk-file-with-javascript
> > 
> > and the NBD protocol looks simple enough to implement in javascript:
> > https://stackoverflow.com/questions/17295140/where-is-the-network-block-device-format-describled
> 
> So I think what you mean here is that in a browser you'd open a local
> (eg) ISO, and then that ISO could be shared with a remote VM.  The
> browser runs a Javascript NBD server.  The remote VM is qemu.  Between
> the two is a WebSocket.
> 
> I've seen this being done with an HP blade server of some kind and
> IIRC the client side used a Java applet.  No idea what the protocol
> was but likely something proprietary.  It was nevertheless a useful
> feature, eg to boot the server from an install CD that you have
> locally.
> 
> I guess the problem is two-fold:
> 
> (1) You need to write an NBD server in Javascript.  Not especially
> difficult, particularly if you avoid any complicated features, and I
> guess you only need read support.
> 
> (2) You need to persuade qemu's NBD client to read from a WebSocket.
> I didn't really know anything about WebSockets until today but it
> seems as if they are a full-duplex protocol layered on top of HTTP [a].
> Is there a WebSocket proxy that turns WS into plain TCP (a bit like
> stunnel)?  Google suggests [b].

Correct, I've used websockify before for proxying port 5900 to a websocket 
and then use it with noVNC.


--
Eric Wheeler



> [a] https://en.wikipedia.org/wiki/WebSocket#Protocol_handshake
> [b] https://github.com/novnc/websockify
> 
> ...
> 
> > When qemu is running headless using a VNC or Spice display we can access 
> > the display of https+websockets using things like noVNC---which is out of 
> > scope to this converstation---but I'm just saying that such an existing 
> > web front-end for the display could be extended to have an "Insert CDROM" 
> > button and use the javascript file IO for the user to reference a local 
> > file and pass it to qemu over nbd, perhaps via nbdkit.
> 
> I'm not sure how nbdkit would be involved, unless it was compiled
> to WASM or something like that.
> 
> But the plan above sounds feasible, albeit a chunk of work.
> 
> Rich.
> 
> -- 
> Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
> Read my programming and virtualization blog: http://rwmj.wordpress.com
> virt-p2v converts physical machines to virtual machines.  Boot with a
> live CD or over the network (PXE) and turn machines into KVM guests.
> http://libguestfs.org/virt-v2v
> 
> 


More information about the Libguestfs mailing list