From 80e86f4ec0944be84e9a78b74ee8ac39b2cabbdd Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Tue, 23 Apr 2019 19:39:21 +0200 Subject: [PATCH 1/7] first commit --- unikernel-demo/Makefile | 6 ++++++ unikernel-demo/README.md | 1 + unikernel-demo/fs1.c | 25 +++++++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 unikernel-demo/Makefile create mode 100644 unikernel-demo/README.md create mode 100644 unikernel-demo/fs1.c diff --git a/unikernel-demo/Makefile b/unikernel-demo/Makefile new file mode 100644 index 00000000..324dca0b --- /dev/null +++ b/unikernel-demo/Makefile @@ -0,0 +1,6 @@ +export ukl-obj-m := fs1.o + +all: + $(MAKE) -C ../whiterose/ UKL=$(PWD) bzImage +qemu: + qemu-system-x86_64 -enable-kvm -m 1G -s -kernel ../whiterose/arch/x86/boot/bzImage -append "console=ttyS0 ukl quiet" -nographic diff --git a/unikernel-demo/README.md b/unikernel-demo/README.md new file mode 100644 index 00000000..ede7ed8f --- /dev/null +++ b/unikernel-demo/README.md @@ -0,0 +1 @@ +# unikernel-demo diff --git a/unikernel-demo/fs1.c b/unikernel-demo/fs1.c new file mode 100644 index 00000000..6f0a7a52 --- /dev/null +++ b/unikernel-demo/fs1.c @@ -0,0 +1,25 @@ +#include +#include + +#ifndef USERSPACE +# define main ukl_main +#endif + +int main(void) { + char buf[256] = { 0 }; + int fd = open("/etc/passwd", O_RDONLY); + ssize_t ret; + + if (fd == -1) + return 1; + + while ((ret = read(fd, buf, sizeof(buf)))) + { + buf[ret] = 0; + write(1, buf, ret); + } + + close(fd); + + return 0; +} From df34cecb169af3e366ab56047f717c10e9ca4de4 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Tue, 23 Apr 2019 19:49:13 +0200 Subject: [PATCH 2/7] readme --- unikernel-demo/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/unikernel-demo/README.md b/unikernel-demo/README.md index ede7ed8f..fffdaf9f 100644 --- a/unikernel-demo/README.md +++ b/unikernel-demo/README.md @@ -1 +1,12 @@ # unikernel-demo + +### setup + +``` +mkdir unikernel && cd unikernel +git clone https://github.com/ne02ptzero/whiterose +(cd whiterose && make defconfig) +git clone https://github.com/jzck/unikernel-demo +cd unikernel-demo +make && make run +``` From 69b2dc41d7a0e473008cb30f4f09d17ef7942ecf Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Tue, 23 Apr 2019 22:05:13 +0200 Subject: [PATCH 3/7] network1 --- unikernel-demo/Makefile | 6 ---- unikernel-demo/fs1/Makefile | 9 +++++ unikernel-demo/{fs1.c => fs1/main.c} | 0 unikernel-demo/network1/Makefile | 26 +++++++++++++++ unikernel-demo/network1/main.c | 49 ++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 6 deletions(-) delete mode 100644 unikernel-demo/Makefile create mode 100644 unikernel-demo/fs1/Makefile rename unikernel-demo/{fs1.c => fs1/main.c} (100%) create mode 100644 unikernel-demo/network1/Makefile create mode 100644 unikernel-demo/network1/main.c diff --git a/unikernel-demo/Makefile b/unikernel-demo/Makefile deleted file mode 100644 index 324dca0b..00000000 --- a/unikernel-demo/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -export ukl-obj-m := fs1.o - -all: - $(MAKE) -C ../whiterose/ UKL=$(PWD) bzImage -qemu: - qemu-system-x86_64 -enable-kvm -m 1G -s -kernel ../whiterose/arch/x86/boot/bzImage -append "console=ttyS0 ukl quiet" -nographic diff --git a/unikernel-demo/fs1/Makefile b/unikernel-demo/fs1/Makefile new file mode 100644 index 00000000..37dc06db --- /dev/null +++ b/unikernel-demo/fs1/Makefile @@ -0,0 +1,9 @@ +export ukl-obj-m := main.o + +all: + $(MAKE) -C ../../whiterose/ UKL=$(PWD) bzImage + +qemu: + qemu-system-x86_64 -enable-kvm -s -m 1G -nographic -cpu host\ + -kernel ../whiterose/arch/x86/boot/bzImage\ + -append "console=ttyS0 ukl quiet"\ diff --git a/unikernel-demo/fs1.c b/unikernel-demo/fs1/main.c similarity index 100% rename from unikernel-demo/fs1.c rename to unikernel-demo/fs1/main.c diff --git a/unikernel-demo/network1/Makefile b/unikernel-demo/network1/Makefile new file mode 100644 index 00000000..4e60eb44 --- /dev/null +++ b/unikernel-demo/network1/Makefile @@ -0,0 +1,26 @@ +PACKAGES = bash coreutils iputils net-tools strace util-linux iproute pciutils +TARGET = min-initrd.d +SMD = supermin.d +bzImage = ../../whiterose/x86/boot/bzImage + +export ukl-obj-m := main.o + +all: $(target)/root + $(MAKE) -C ../../whiterose/ UKL=$(PWD) bzImage + +supermin.d/packages: + supermin --prepare $(PACKAGES) -o $(SMD) + +supermin.d/init.tar.gz: init + tar zcf $@ $^ + +$(TARGET)/root: supermin.d/packages supermin.d/init.tar.gz + supermin --build -v -v -v --size 8G --if-newer --format ext2 supermin.d -o ${@D} + +qemu: + qemu-system-x86_64 -enable-kvm -s -m 1G -nographic -cpu host\ + -kernel $(bzImage)\ + -initrd min-initrd.d/initrd\ + -hda min-initrd.d/root\ + -append "console=ttyS0 ukl quiet"\ + --device virtio-net,netdev=usernet -netdev user,id=usernet,hostfwd=tcp::5555-:5555 diff --git a/unikernel-demo/network1/main.c b/unikernel-demo/network1/main.c new file mode 100644 index 00000000..a1d2a9cf --- /dev/null +++ b/unikernel-demo/network1/main.c @@ -0,0 +1,49 @@ +// https://github.com/mafintosh/echo-servers.c/blob/master/tcp-echo-server.c + +#include +#include +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 1024 + +int main(int argc, char *argv[]) { + + int port = 5555; + + int server_fd, client_fd, err; + struct sockaddr_in server, client; + char buf[BUFFER_SIZE]; + + server_fd = socket(AF_INET, SOCK_STREAM, 0); // ukl_socket + + server.sin_family = AF_INET; + server.sin_port = __builtin_bswap16 (port); + server.sin_addr.s_addr = (uint32_t) 0x00000000; + + int opt_val = 1; + setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val); // ukl_ + + err = bind(server_fd, (struct sockaddr *) &server, sizeof(server)); + + err = listen(server_fd, 128); + + while (1) { + socklen_t client_len = sizeof(client); + client_fd = accept(server_fd, (struct sockaddr *) &client, &client_len); // ukl_accept + + while (1) { + int read = recv(client_fd, buf, BUFFER_SIZE, 0); // (recvfrom, fd, buf, len, flags, NULL, NULL); + + if (!read) break; + + err = send(client_fd, buf, read, 0); // (sendto, fd, buf, len, flags, NULL, 0); + + } + } + + return 0; +} From 4cf27f5081eb9e9ec2ac41af06d7b1bd3c8022c9 Mon Sep 17 00:00:00 2001 From: Louis Solofrizzo Date: Wed, 24 Apr 2019 08:31:17 +0200 Subject: [PATCH 4/7] build: New makefiles and stdio example Signed-off-by: Louis Solofrizzo --- unikernel-demo/.gitignore | 3 +++ unikernel-demo/Makefile | 17 +++++++++++++++ unikernel-demo/README.md | 29 +++++++++++++++++++++++--- unikernel-demo/fs1/Makefile | 9 -------- unikernel-demo/fs1/stdio/Makefile | 3 +++ unikernel-demo/fs1/stdio/main.c | 26 +++++++++++++++++++++++ unikernel-demo/fs1/unistd/Makefile | 3 +++ unikernel-demo/fs1/{ => unistd}/main.c | 0 8 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 unikernel-demo/.gitignore create mode 100644 unikernel-demo/Makefile delete mode 100644 unikernel-demo/fs1/Makefile create mode 100644 unikernel-demo/fs1/stdio/Makefile create mode 100644 unikernel-demo/fs1/stdio/main.c create mode 100644 unikernel-demo/fs1/unistd/Makefile rename unikernel-demo/fs1/{ => unistd}/main.c (100%) diff --git a/unikernel-demo/.gitignore b/unikernel-demo/.gitignore new file mode 100644 index 00000000..31d45ec5 --- /dev/null +++ b/unikernel-demo/.gitignore @@ -0,0 +1,3 @@ +*.cmd +*.img +*.o diff --git a/unikernel-demo/Makefile b/unikernel-demo/Makefile new file mode 100644 index 00000000..395f9324 --- /dev/null +++ b/unikernel-demo/Makefile @@ -0,0 +1,17 @@ +all: + $(MAKE) -C ../../../whiterose/ UKL=$(CURDIR) bzImage + +../../disk.img: + qemu-img create ../../disk.img 0g + mkfs.ext2 ../../disk.img + mkdir tmp_mnt + sudo mount -o loop ../../disk.img tmp_mnt + sudo debootstrap --arch amd64 jessie tmp_mnt + sudo umount tmp_mnt + rmdir tmp_mnt + +qemu: ../../disk.img + qemu-system-x86_64 -enable-kvm -s -m 1G -nographic -cpu host\ + -kernel ../../../whiterose/arch/x86/boot/bzImage\ + -append "console=ttyS0 ukl quiet root=/dev/sda"\ + -hda ../../disk.img diff --git a/unikernel-demo/README.md b/unikernel-demo/README.md index fffdaf9f..0f5e9dfe 100644 --- a/unikernel-demo/README.md +++ b/unikernel-demo/README.md @@ -2,11 +2,34 @@ ### setup +##### Requirements +- qemu +- debootstrap + +##### Clone & Configure the kernel ``` -mkdir unikernel && cd unikernel git clone https://github.com/ne02ptzero/whiterose -(cd whiterose && make defconfig) +cd whiterose && make defconfig +``` + +It will apply the default of the linux kernel, with UKL support. If you're +trying to run this on exotic hardware, now is a good time to change the +configuration. As long as you keep `CONFIG_UKL_LINUX` to `true`, you should be +fine. + +##### Clone && Running the examples +``` git clone https://github.com/jzck/unikernel-demo cd unikernel-demo -make && make run +``` + +Each example come with a Makefile. For example, if you want to run the unistd +example, simply do: +``` +make -C fs1/unistd all qemu +``` + +Or stdio: +``` +make -C fs1/stdio all qemu ``` diff --git a/unikernel-demo/fs1/Makefile b/unikernel-demo/fs1/Makefile deleted file mode 100644 index 37dc06db..00000000 --- a/unikernel-demo/fs1/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -export ukl-obj-m := main.o - -all: - $(MAKE) -C ../../whiterose/ UKL=$(PWD) bzImage - -qemu: - qemu-system-x86_64 -enable-kvm -s -m 1G -nographic -cpu host\ - -kernel ../whiterose/arch/x86/boot/bzImage\ - -append "console=ttyS0 ukl quiet"\ diff --git a/unikernel-demo/fs1/stdio/Makefile b/unikernel-demo/fs1/stdio/Makefile new file mode 100644 index 00000000..ecd636b7 --- /dev/null +++ b/unikernel-demo/fs1/stdio/Makefile @@ -0,0 +1,3 @@ +export ukl-obj-m := main.o + +include ../../Makefile diff --git a/unikernel-demo/fs1/stdio/main.c b/unikernel-demo/fs1/stdio/main.c new file mode 100644 index 00000000..cee94583 --- /dev/null +++ b/unikernel-demo/fs1/stdio/main.c @@ -0,0 +1,26 @@ +#include + +#include +#include + +#ifndef USERSPACE +#define main ukl_main +#endif + +int main(void) { + FILE *f = fopen("/etc/passwd", "r"); + ssize_t ret; + char buf[256] = { 0 }; + + if (f == NULL) + { + fputs("Cannot open /etc/passwd\n", stderr); + return 1; + } + + while ((ret = fread(buf, 1, sizeof(buf), f))) + fwrite(buf, ret, 1, stdout); + + fclose(f); + return 0; +} diff --git a/unikernel-demo/fs1/unistd/Makefile b/unikernel-demo/fs1/unistd/Makefile new file mode 100644 index 00000000..ecd636b7 --- /dev/null +++ b/unikernel-demo/fs1/unistd/Makefile @@ -0,0 +1,3 @@ +export ukl-obj-m := main.o + +include ../../Makefile diff --git a/unikernel-demo/fs1/main.c b/unikernel-demo/fs1/unistd/main.c similarity index 100% rename from unikernel-demo/fs1/main.c rename to unikernel-demo/fs1/unistd/main.c From e7c0133eacc76daaddb67e40432b110d7384e929 Mon Sep 17 00:00:00 2001 From: Louis Solofrizzo Date: Wed, 24 Apr 2019 12:08:25 +0200 Subject: [PATCH 5/7] io1: Add printf examples Signed-off-by: Louis Solofrizzo --- unikernel-demo/io1/printf/Makefile | 3 +++ unikernel-demo/io1/printf/main.c | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 unikernel-demo/io1/printf/Makefile create mode 100644 unikernel-demo/io1/printf/main.c diff --git a/unikernel-demo/io1/printf/Makefile b/unikernel-demo/io1/printf/Makefile new file mode 100644 index 00000000..ecd636b7 --- /dev/null +++ b/unikernel-demo/io1/printf/Makefile @@ -0,0 +1,3 @@ +export ukl-obj-m := main.o + +include ../../Makefile diff --git a/unikernel-demo/io1/printf/main.c b/unikernel-demo/io1/printf/main.c new file mode 100644 index 00000000..ea0d990c --- /dev/null +++ b/unikernel-demo/io1/printf/main.c @@ -0,0 +1,25 @@ +#include + +#ifndef USERSPACE +#define main ukl_main +#endif + +typedef struct { + char a; + char *b; + int c; +} test_t; + +int main(void) { + char str[250]; + test_t test = { + .a = 'a', + .b = "Hello!", + .c = 10 + }; + + printf("a = %c, b = %s, c = %d\n", test.a, test.b, test.c); + snprintf(str, sizeof(str), "a = %c, b = %s, c = %d\n", test.a, test.b, test.c); + puts(str); + return 0; +} From 021914386e15371a7f5a37eb5aa57b1843e7c6ff Mon Sep 17 00:00:00 2001 From: Louis Solofrizzo Date: Thu, 25 Apr 2019 09:35:10 +0200 Subject: [PATCH 6/7] Makefile: Enable ukl-hybrid mode by default for examples See https://github.com/Ne02ptzero/whiterose/commit/b4d6cab6f65c5d03420d428b549be0a6c9c55d58 for more information Signed-off-by: Louis Solofrizzo --- unikernel-demo/Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/unikernel-demo/Makefile b/unikernel-demo/Makefile index 395f9324..6257935c 100644 --- a/unikernel-demo/Makefile +++ b/unikernel-demo/Makefile @@ -11,6 +11,12 @@ all: rmdir tmp_mnt qemu: ../../disk.img + qemu-system-x86_64 -enable-kvm -s -m 1G -nographic -cpu host\ + -kernel ../../../whiterose/arch/x86/boot/bzImage\ + -append "console=ttyS0 ukl-hybrid quiet root=/dev/sda"\ + -hda ../../disk.img + +qemu-ukl: ../../disk.img qemu-system-x86_64 -enable-kvm -s -m 1G -nographic -cpu host\ -kernel ../../../whiterose/arch/x86/boot/bzImage\ -append "console=ttyS0 ukl quiet root=/dev/sda"\ From 6a1c3734e644abab6f3f57917ab9d51b9188d197 Mon Sep 17 00:00:00 2001 From: Louis Solofrizzo Date: Thu, 25 Apr 2019 11:30:39 +0200 Subject: [PATCH 7/7] fs: Add stat example Signed-off-by: Louis Solofrizzo --- unikernel-demo/fs1/stat/Makefile | 3 +++ unikernel-demo/fs1/stat/main.c | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 unikernel-demo/fs1/stat/Makefile create mode 100644 unikernel-demo/fs1/stat/main.c diff --git a/unikernel-demo/fs1/stat/Makefile b/unikernel-demo/fs1/stat/Makefile new file mode 100644 index 00000000..ecd636b7 --- /dev/null +++ b/unikernel-demo/fs1/stat/Makefile @@ -0,0 +1,3 @@ +export ukl-obj-m := main.o + +include ../../Makefile diff --git a/unikernel-demo/fs1/stat/main.c b/unikernel-demo/fs1/stat/main.c new file mode 100644 index 00000000..abb3da10 --- /dev/null +++ b/unikernel-demo/fs1/stat/main.c @@ -0,0 +1,20 @@ +#include +#include + +#ifndef USERSPACE +#define main ukl_main +#endif + +int main(void) +{ + struct stat st = { 0 }; + + if (stat("/etc/passwd", &st) != 0) + { + fprintf(stderr, "Cannot stat() /etc/passwd\n"); + return 1; + } + + printf("Size of /etc/passwd: %zu bytes\n", st.st_size); + return 0; +}