diff --git a/README.md b/README.md new file mode 100644 index 0000000..e44a878 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# slim + +Turning containers into bootable VMs + +## Example - Minimal Alpine Busybox + +```sh +# Build the container +podman build ./example/alpine -t slim-alpine + +# Make the container bootable by extracing initrd and vmlinuz (initial ramdisk and kernel) +slim build slim-alpine + +# Boot the image using QEMU, `./example/alpine/init` will drop you into an interactive shell. +slim run slim-alpine + +# Cleanup +slim image rm slim-alpine +podman image rm slim-alpine +``` diff --git a/example/alpine/Containerfile b/example/alpine/Containerfile new file mode 100644 index 0000000..a9a7f20 --- /dev/null +++ b/example/alpine/Containerfile @@ -0,0 +1,7 @@ +FROM alpine:latest +RUN mkdir -p /lib/apk/db /run +RUN apk add --no-cache --initdb linux-virt busybox util-linux +RUN cp /boot/vmlinuz-virt /vmlinuz && echo "Welcome to slim!" > /etc/motd +COPY init /init +RUN chmod +x /init + diff --git a/example/alpine/init b/example/alpine/init new file mode 100644 index 0000000..b652ec5 --- /dev/null +++ b/example/alpine/init @@ -0,0 +1,28 @@ +#!/bin/sh + +# Mount special filesystems +mkdir -p /dev /proc /sys +[ -c /dev/console ] || mknod -m 600 /dev/console c 5 1 +mount -t proc proc /proc +mount -t sysfs sysfs /sys +mount -t devtmpfs dev /dev + +# Networking +echo slim > /proc/sys/kernel/hostname +modprobe virtio_net +ip link set lo up 2>/dev/null +ip link set eth0 up 2>/dev/null +udhcpc -i eth0 -f -q # Get DHCP lease + +echo +echo 'Welcome to slim!' +echo + +# Run interactive shell +/bin/sh /dev/console 2>&1 + +poweroff -f +while true; do + sleep 1 + poweroff -f +done