[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [Libguestfs] Provide NBD via Browser over Websockets



I started writing an NBD server in rust as a learning project a while back, which I why I subscribed to the list.  I understand rust can be compiled into webassembly although it's not something I've done. If there were others also interested in doing that I'd be interested.  I haven't checked lately to see if there is a rust server published now, there may be.

Thanks,
Alex

On 2/06/20 8:04 am, Eric Wheeler wrote:
On Sat, 30 May 2020, Richard W.M. Jones wrote:
On Fri, May 29, 2020 at 09:08:29PM +0000, Eric Wheeler wrote:
On Fri, 29 May 2020, Richard W.M. Jones wrote:
On Fri, May 29, 2020 at 08:58:06AM -0500, Eric Blake wrote:
On 5/29/20 8:50 AM, Daniel P. Berrang�© wrote:

(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].

[a] https://en.wikipedia.org/wiki/WebSocket#Protocol_handshake
[b] https://github.com/novnc/websockify
qemu already knows how to connect as a client to websockets; Dan Berrange
knows more about that setup.  I suspect it would not be too difficult to
teach the qemu NBD client code to use a WebSocket instead of a Unix or TCP
socket as its data source.
Actually the inverse. The QIOChannelWebsocket impl is only the server
side of the problem, as used by QEMU's VNC server. We've never implemented
the client side. There is nothing especially stopping us doing that - just
needs someone motivated with time to work on it.
In the meantime, you may still be able to set up something like:

local machine:
iso -> NBD server -> Unix socket -> websockify -> WebSocket
I guess the idea is to have a zero-install solution for the browser.
As I said in the email earlier this is very common for IPMI-type
remote access to blade servers and in my experience is implemented
using a Java applet and a proprietary protocol terminated at the BMC
(which then emulates a virtual CDROM to the server).  There are some
HP blade servers on Red Hat's internal Beaker instance where you can
play with this.  For qemu we wouldn't need to invent a new protocol
when NBD is available and already implemented (albeit not yet on top
of WebSockets).

The NBD server must run inside the browser and therefore be either
written from scratch in Javascript, or an existing server
cross-compiled to WASM (if that is possible - I don't really know).
Interesting idea about WASM.  I'll see if I can build one of the simple
nbd servers that are around.  Not sure how to link it to the JS file IO,
however.
After reading a bit about compiling to WebSockets it sounds like you
can cross-compile a C program, but there's no library support at all.
IOW to port an existing server you'd have to implement enough of POSIX
to make it work.  nbdkit has a liberal license deliberately to make it
possible to chop it up and incorporate it into completely forked
codebases (nbdkit is a plot to make NBD more popular).

But since NBD is pretty simple, a fresh Javascript server might be
easier, especially if you stick to only implementing reads.
Good point, I'll wait on trying WASM.

If anyone plans to implement NBD in JS let me know, otherwise I'll
probably implement a stripped down verion to integrate as an nbdkit plugin
to avoid re-writing all the handshake and version bits.

--
Eric Wheeler

Rich.

--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top



Reply to: