Build a basic Linux kernel and ramdisk that can start in QEMU.

This commit is contained in:
Adam Wick
2020-12-30 10:50:16 -08:00
commit 1838e73db3
7 changed files with 1801 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
old/
tmp/
artifacts/

24
docker/Dockerfile.kernel Normal file
View File

@@ -0,0 +1,24 @@
FROM fedora:latest
ENV KERNEL_VERSION=5.10.3
RUN dnf install -y \
bc \
bison \
clang \
cpio \
curl \
diffutils \
elfutils-libelf-devel \
findutils \
flex \
hostname \
make \
ncurses-devel \
patch \
xz
RUN mkdir -p /build/ramfs
RUN curl https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-${KERNEL_VERSION}.tar.xz | tar xJC /build
RUN mv /build/linux* /build/kernel
COPY buildramfs.sh /build/ramfs/buildramfs.sh
COPY lam.config /build/kernel/.config

40
docker/buildramfs.sh Executable file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
ARCH="x86_64"
BB_VER="1.31.0"
# Dirs
mkdir -p root
cd root
mkdir -p bin dev etc lib mnt proc sbin sys tmp var
cd -
# Utils
if [ ! -f "root/bin/busybox" ]; then
curl -L "https://www.busybox.net/downloads/binaries/${BB_VER}-defconfig-multiarch-musl/busybox-${ARCH}" >root/bin/busybox
fi
cd root/bin
chmod +x busybox
ln -s busybox mount
ln -s busybox sh
cd -
# Init process
cat >>root/init << EOF
#!/bin/busybox sh
/bin/busybox --install -s /bin
mount -t devtmpfs devtmpfs /dev
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs tmpfs /tmp
setsid cttyhack sh
exec /bin/sh
EOF
chmod +x root/init
# initramfs creation
cd root
find . | cpio -ov --format=newc | gzip -9 >../initramfs
cd -

1717
docker/lam.config Normal file

File diff suppressed because it is too large Load Diff

4
scripts/build-kernel.sh Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
mkdir -p artifacts/kernel
docker run --rm -v "$(pwd)/artifacts/kernel:/build/artifacts" lam-kernel bash -c "make -j2 -C /build/kernel && cp /build/kernel/arch/x86/boot/bzImage /build/artifacts/"

4
scripts/build-ramfs.sh Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
mkdir -p artifacts/ramdisk
docker run --rm -v "$(pwd)/artifacts/ramdisk:/build/artifacts" lam-kernel bash -c "cd /build/ramfs && ./buildramfs.sh && cp initramfs /build/artifacts/initramfs.cpio.gz"

9
scripts/run.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/sh
qemu-system-x86_64 \
-kernel artifacts/kernel/bzImage \
-initrd artifacts/ramdisk/initramfs.cpio.gz \
-nographic \
-serial mon:stdio \
-no-reboot \
-append "console=ttyS0"