[Vm-dev] Cog Rump Xen unikernel

Ben Coman btc at openinworld.com
Fri Dec 11 18:27:17 UTC 2015


I got curious about following up these two threads making Cog a unikernel...

Cog in the cloud
http://forum.world.st/Cog-in-the-cloud-td4796514.html

Hosting the Pharo VM on MirageOS
http://forum.world.st/Hosting-the-Pharo-VM-on-MirageOS-td4799424.html#none


One path forward is to use rumpkernel, which "provides a means to run
existing POSIX applications as unikernels on Xen"
https://blog.xenproject.org/2015/08/06/on-rump-kernels-and-the-rumprun-unikernel/

Deploying real-world software today as unikernels on Xen with Rumprun
http://events.linuxfoundation.org/sites/events/files/slides/xdps15-talk-final_0.pdf


So I thought I would try the "Building Rumprun Unikernels" tutorial here...
https://github.com/rumpkernel/wiki/wiki/Tutorial:-Building-Rumprun-Unikernels
which I report here in case it was interest.  The tutorial is based on
QEMU (and I think I saw a comment somewhere that Cog doesn't run so
well on QEMU and needs Bochs), so after that I adapted it from QEMU to
Xen.


64-BIT DEBIAN 8 JESSIE & XEN

So first I installed Debian 8 Jessie 64-bit on my new laptop
$ uname -a
>> ...x86_64

Then installed Xen and after a reboot could choose it from the boot menu.
$ apt-get update
$ apt get install xen-system-amd64 libxen-dev

REBOOTED

Tested manual selection from menu to boot into Xen dom0.
Checked Xen was operating with...
$ xl info


32-BIT DEBIAN 8 JESSIE & XEN

However later I hit some complications determining whether the rump
unikernel was being compiled 32-bit or 64-bit in order to mix in with
32-bit Pharo, so to simplify things I did a complete reinstall of my
system as 32-bit.
$ uname -a
>> ...686-pae

Then installed Xen again  Xen only has a 64-bit hypervisor, but this
was not immediately available under 32-bit OS.  I can't exactly
remember but I think I just needed to add multiarch before it would
find the Xen package.
$ apt-get update
$ apt-get install multiarch
$ apt get install xen-system-amd64 libxen-dev
Otherwise it may have needed something like "dpkg --add-architecture ..."

REBOOTED

First test, manually selected to boot into Xen dom0, after which as
root the following checked Xen was operating...
$ xl info

Then set it to automatically boot into Xen...
$ dpkg-divert --divert /etc/grub.d/08_linux_xen --rename
/etc/grub.d/20_linux_xen
$ update-grub
REBOOTED


====================================
DID THE QUICK START TUTORIAL
USING GENERIC HW ON QEMU

0. Installed support tools and libs

$ apt-get install build-essential git-core cmake

1. Built the rumprun platform

$ mkdir -p ~/Repos/rumprun-hw
$ cd ~/Repos/rumprun-hw
$ git clone http://repo.rumpkernel.org/rumprun
$ cd rumprun
$ git submodule update --init
$ CC=cc ./build-rr.sh hw
Took note of this output needed later...
>> toolchain tuple: i486-rumprun-netbsdelf
>> cc wrapper: i486-rumprun-netbsdelf-gcc

$ echo $(pwd)
    /Users/ben/Repos/rumpkernel-hw/rumprun
$ export PATH="${PATH}:$(pwd)/rumprun/bin"


2. Built a toy application

$ mkdir -p test
$ cd test
$ cat > helloer.c << EOF   ....
$ cc -o helloer helloer.c
$ i486-rumprun-netbsdelf-gcc -o helloer-rumprun helloer.c
$ rumprun-bake hw_generic helloer-rumprun.bin helloer-rumprun


3. Ran the toy application

$ su

$ rumprun qemu -i helloer-rumprun.bin

In another terminal, check its running
$ xl list
>> Name                                    ID  Mem  ...etc
>> Domain-0                              0    7583
>> rumprun-hellor-rumprun.bin  1        64

The app takes over the terminal its run from, so from another terminal...
$ xl destroy rumprun-hellor-rumprun.bin


====================================
ADAPTED THE QUICK START TUTORIAL
FOR XEN PARAVIRTUALIZATION

0. Started a new terminal to get an environment with a clean PATH

1. Built the rumprun platform

$ mkdir -p ~/Repos/rumprun-xen
$ cd ~/Repos/rumprun-xen
$ git clone http://repo.rumpkernel.org/rumprun
$ cd rumprun
$ git submodule update --init
$ CC=cc ./build-rr.sh xen   #<<<<
Took note of this output needed later...
>> toolchain tuple: i486-rumprun-netbsdelf
>> cc wrapper: i486-rumprun-netbsdelf-gcc

$ echo $(pwd)
    /Users/ben/Repos/rumpkernel-xen/rumprun
$ export PATH="${PATH}:$(pwd)/rumprun/bin"


2. Built a toy application

$ mkdir -p test
$ cd test
$ cat > helloer.c << EOF   ....
$ cc -o helloer helloer.c
$ i486-rumprun-netbsdelf-gcc -o helloer-rumprun helloer.c
$ rumprun-bake xen_pv helloer-rumprun.bin helloer-rumprun


3. Ran toy application

$ cd ..
$ su
$ export PATH="${PATH}:`pwd`/rumprun/bin
$ cd test
$ rumprun xen -i helloer-rumprun.bin
$ xl list
>> Name                                    ID  Mem  ...etc
>> Domain-0                              0    7583
>> rumprun-hellor-rumprun.bin  1        64

This took over that terminal, so from another terminal...
$ xl destroy rumprun-hellor-rumprun.bin


====================================
TRIED IT USING CMAKE

$ cat > CMakeLists.txt << EOF see this link for text...
https://github.com/rumpkernel/wiki/wiki/Tutorial:-Building-Rumprun-Unikernels

$ mkdir host_bld
$ cd host_bld
$ cmake -G "Unix Makefiles" ..
$ make
$ ./helloer

$ cd ..
$ mkdir rumprun_bld
$ cd rumprun_bld

Now with the given cmake line I got an error message:
   Could not find toolchain file:
../../rumprun/rumprun/share/x86_64-rumprun-netbsd-toolchain.cmake

$ find ../.. -name x86_64-rumprun-netbsd-toolchain.cmake
found it, so that the following worked...

$ cmake -G "Unix Makefiles"
-DCMAKE_TOOLCHAIN_FILE=../../rumprun/rumprun-x86_64/share/x86_64-rumprun-netbsd-toolchain.cmake
..
$ make
$ rumprun-bake xen_pv helloer.bin helloer
$ rumprun-bake hw_generic helloer.bin helloer
$ rumprun xen -i helloer.bin

Next I'll report on initial steps to get Cog working on Xen as a Rump
unikernel...

cheers -ben


More information about the Vm-dev mailing list