Files for Rust for Linux Workshop at the Chemnitzer Linux Tage 2024. The slides are located under slides/SLIDES.md.
You will find the solution for the workshop task in linux/samples/rust/rust_chrdev_solution.rs
Directory structure
├── build -- Temporary build directory
│ ├── bzImage -- The kernel
│ ├── initramfs -- Our minimal RootFS directory
│ └── initramfs.cpio -- The packed minimal RootFS
├── docker
│ └── Dockerfile -- Container specification of the build environment
├── linux -- Linux kernel sources
├── linux-config -- Kernel configs
├── rust-module -- Rust kernel module template
└── scripts -- Some useful scripts to build the project
Install the required tools
# Debian/Ubuntu
apt-get install git podman qemu-system-x86Clone the repository
git clone --depth 1 --recurse-submodules --shallow-submodules https://github.com/aboehm/clt2024-rust-kernel-module.git
The environment require podman/buildah or docker. The scripts will check which one installed.
It's optional to build the build environment container. You can pull it from docker hub instead.
To build the container with all required tools run
./scripts/build-builder
# Enforce to use buildah
DOCKER_BIN=buildah ./scripts/build-builder
# Enforce to use docker
DOCKER_BIN=docker ./scripts/build-builderTo enter the build environment run
./scripts/enter-build-env
# Enforce to use podman
DOCKER_BIN=podman ./scripts/enter-build-env
# Enforce to use docker
DOCKER_BIN=docker ./scripts/enter-build-envCopy the prepared kernel config from linux-config/v6.7-rust-clt24 to linux/.config.
After you can modify the configuration.
make LLVM=1 menuconfigStart the build process
# Build the kernel and modules
make -j`nproc` LLVM=1 all
# Install the module into
make LLVM=1 INSTALL_MOD_PATH=<path to initramfs> modules_install
After some minutes the should be store under arch/x86/boot/bzImage.
You can run the kernel with QEMU
qemu-system-x86_64 --kernel arch/x86/boot/bzImageThere're several helper scripts to run some required commands.
Build the kernel and modules and install the modules into initramfs
./scripts/build-kernelGenerate a new initramfs image
./scripts/gen-initramfsRun the built kernel with initramfs
./scripts/run-kernelYou get a serial console on the terminal and can load the module.
All these commands can be run at once with
./scripts/dev-cycleWhen using docker without the provided scripts file will be created or written as root. Change the user by running
sudo chown -R $(id -u):$(id -g) .Remove the already build kernel under build/bzImage.
Files in the initramfs directory will overwritten but not deleted. Delete all files of build/initramfs.
Maybe some build commands were executed without LLVM=1. Copy the configuration again and run make LLVM=1 menuconfig again to select your module. Ensure you add the LLVM parameter to each call of make.