Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by osener on Tuesday March 29, 2022 @08:08AM
(#30841453)
There's a fantastic episode of Signals & Threads podcast about MirageOS's roots, Xen Hypervisor and more with Anil Madhavapeddy as the guest. I found it very thought provoking: https://signalsandthreads.com/what-is-an-operating-system/
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by lokedhs on Tuesday March 29, 2022 @08:46AM
(#30841780)
MirageOS is really interested when combined with Qubes OS. I've started looking at MirageOS, and since I use Qubes, being able to run things directly on Xen right next to my regular VM's is really neat.
There are also projects to replace sys-firewall with a MirageOS unikernel instead. That's something that seems very interesting.
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by laurensr on Tuesday March 29, 2022 @06:51AM
(#30840967)
This name is associated with a lot of nostalgia for me, as it is the same name as the shell launcher for Texas Instruments' TI-83/84 graphing calculators.
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by mindwok on Tuesday March 29, 2022 @06:13AM
(#30840740)
This project mentions it’s based on the Xen hypervisor and uses EC2 as an example for running it, but haven’t AWS now moved to their own KVM based hypervisor? Would this still work?
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by mwcampbell on Tuesday March 29, 2022 @10:54AM
(#30843355)
> - SPT (seccomp, no hardware virtualization)
To be clear, this means running an ordinary Linux binary, right?
I'm curious about the remaining advantages in practice of running multiple processes on a shared kernel rather than using hardware virtualization. I guess the main one is more efficient resource pooling, particularly memory and the page cache. I understand the primary advantage of virtualization is a smaller attack surface.
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by cestith on Tuesday March 29, 2022 @02:48PM
(#30846761)
One of the stated advantages various places of having a unikernel build as a regular ELF binary on Linux or BSD (including the semi-BSD macOS) is that you can use it as your instrumented debug build very easily. Yes, you can instrument your app heavily. You can have console output. You can log to a mounted volume, to an object store, or to a remote log server with rsyslog or something like Elastic. But with an ELF binary on an OS you can strace, dtrace, fence it, run it under gdb or another debugger, instrument the OS under it, or whatever. Then the same source code builds essentially the same program to run right on KVM or Xen with no OS under it for security and efficiency.
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by onebot on Tuesday March 29, 2022 @06:07AM
(#30840710)
I am fascinated by Unikernels. But how do they deal with things that need to fork or run multiple processes? Aren't they restricted to single processes?
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by avsm on Tuesday March 29, 2022 @08:28AM
(#30841609)
This all started because we wanted to _get away_ from the need to fork or run multiple processes, since that's so hard in a variety of hardware architectures (like mobile or embedded).
It took a little longer than I'd planned, but thanks to the hard work of so many MirageOS contributors, now's a pretty good time to glue back personal containers and self-hosted data management infrastructure again! Unikernel-based messaging has really come together in the past couple of years: https://tarides.com/blog/2022-03-08-secure-virtual-messages-...
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by hannesm on Tuesday March 29, 2022 @07:54AM
(#30841367)
We use asynchronous tasks in MirageOS (cooperative multitasking) using lwt http://ocsigen.org/lwt/latest/manual/manual, so you can serve multiple network connections at the same time.
Since there are no processes, there's no concept of "fork", but indeed you can run multiple tasks at the same time (using the same address space). Why again would you need multiple processes? Since the programming language OCaml has a semantics and is memory-safe, there's no strong reason for isolation at execution time (apart from the C bits, which we try to keep to a minimum and compile with runtime safety flags (red-zone for stack protection, mapping execute-only (seems to only reliably work on OpenBSD), etc.)).
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by gpderetta on Tuesday March 29, 2022 @09:57AM
(#30842585)
What about multiprocessing? I assume that MirageOS can take advantage of multiple cores (or do you need separate instances per core?). In this case is the system still shared memory?
Also I would say there are reasons for isolation beyond memory safety.
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by hannesm on Tuesday March 29, 2022 @10:58AM
(#30843421)
MirageOS is - similar to the latest OCaml release - only using a single CPU core. You can run multiple unikernels, one on each core. If doing that, you can use Xen vchan (shared memory), or TCP for marshalling.
> Also I would say there are reasons for isolation beyond memory safety.
Would you mind to elaborate which reasons you are thinking of?
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by gpderetta on Wednesday March 30, 2022 @10:37AM
(#30855798)
> MirageOS is - similar to the latest OCaml release - only using a single CPU core.
Thanks. Is that going to change now that OCaml is finally getting proper multicore support?
>> Also I would say there are reasons for isolation beyond memory safety.
>Would you mind to elaborate which reasons you are thinking of?
Memory safety in a sense protects the integrity of the 'runtime', but only partially help to protect business level integrity. A task might still tricked (by mistake or malice) to access objects it is not supposed to. I'm sure that OCaml has enough abstractions to help prevent that, but full isolation of tasks is a blunt and effective tool.
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by 0xbkt on Tuesday March 29, 2022 @06:44PM
(#30849300)
> only using a single CPU core
How does it go when you deploy a unikernel on EC2 (or on any IaaS where the hypervisor is managed unlike bare-metal) with multiple cores? Is there a way to start a unikernel per core on a single instance, or are you bound to use single core instance types only?
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by avsm on Tuesday March 29, 2022 @08:24AM
(#30841580)
Just substitute 'microservice' with 'unikernel' and you do broadly the same things. There's a prometheus library that you link with the MirageOS unikernel and it exports using that: https://github.com/mirage/prometheus
No FAQ for this sort of thing yet, but we should start assembling one sometime soon. Questions like this very welcome on the discussion forums: https://discuss.ocaml.org/t/ann-mirageos-4-0/9598 to help us get started.
Re:MirageOS 4.0 – Self-managed internet infrastructure with ...
by rwmj on Tuesday March 29, 2022 @11:19AM
(#30843749)
Unikernel Linux (UKL - https://github.com/unikernellinux) actually does allow you to fork. The main unikernel program runs in kernel space linked to Linux, and after a fork you get a new, regular userspace process.
There are also projects to replace sys-firewall with a MirageOS unikernel instead. That's something that seems very interesting.
To be clear, this means running an ordinary Linux binary, right?
I'm curious about the remaining advantages in practice of running multiple processes on a shared kernel rather than using hardware virtualization. I guess the main one is more efficient resource pooling, particularly memory and the page cache. I understand the primary advantage of virtualization is a smaller attack surface.
The attack surface is different, you may be interested in https://archive.fosdem.org/2019/schedule/event/solo5_unikern... and/or https://archive.fosdem.org/2019/schedule/event/solo5_unikern... :)
TL;DR: hardware virtualization is pushing trust into hardware -- but can you trust the hardware implementation (to isolate memory)?
Other researchers also share the dislike of fork... https://www.microsoft.com/en-us/research/uploads/prod/2019/0...
A 2010 paper where I sketched out some of the early ideas around "multiscale" is here: https://anil.recoil.org/papers/2010-bcs-visions.pdf
It took a little longer than I'd planned, but thanks to the hard work of so many MirageOS contributors, now's a pretty good time to glue back personal containers and self-hosted data management infrastructure again! Unikernel-based messaging has really come together in the past couple of years: https://tarides.com/blog/2022-03-08-secure-virtual-messages-...
Since there are no processes, there's no concept of "fork", but indeed you can run multiple tasks at the same time (using the same address space). Why again would you need multiple processes? Since the programming language OCaml has a semantics and is memory-safe, there's no strong reason for isolation at execution time (apart from the C bits, which we try to keep to a minimum and compile with runtime safety flags (red-zone for stack protection, mapping execute-only (seems to only reliably work on OpenBSD), etc.)).
Also I would say there are reasons for isolation beyond memory safety.
> Also I would say there are reasons for isolation beyond memory safety.
Would you mind to elaborate which reasons you are thinking of?
Thanks. Is that going to change now that OCaml is finally getting proper multicore support?
>> Also I would say there are reasons for isolation beyond memory safety. >Would you mind to elaborate which reasons you are thinking of?
Memory safety in a sense protects the integrity of the 'runtime', but only partially help to protect business level integrity. A task might still tricked (by mistake or malice) to access objects it is not supposed to. I'm sure that OCaml has enough abstractions to help prevent that, but full isolation of tasks is a blunt and effective tool.
How does it go when you deploy a unikernel on EC2 (or on any IaaS where the hypervisor is managed unlike bare-metal) with multiple cores? Is there a way to start a unikernel per core on a single instance, or are you bound to use single core instance types only?
Do you have a concept of logging daemon? How would I run prometheus exporter-like things?
Is there a FAQ where questions along these lines are answered?
No FAQ for this sort of thing yet, but we should start assembling one sometime soon. Questions like this very welcome on the discussion forums: https://discuss.ocaml.org/t/ann-mirageos-4-0/9598 to help us get started.
There's a nice collection of unikernels over at: https://github.com/roburio/unikernels and https://github.com/tarides/unikernels for various infrastructure pieces (like https, smtp, dns, ip filters, etc) that are good to crib from for your own infrastructure.
https://www.infoq.com/news/2021/10/ocaml-5-multicore/
For example, they show how you can host a static site. Great, but can I run my Flask API?
If you want a POSIX unikernel have a look at Unikraft.