Skip to content

snacsnoc/snacklinux

Repository files navigation

logoSnackLinux

alt text

💻 SnackLinux is an ultra minimal Linux distribution

🔧 Utilizing a recent 6.x kernel with BusyBox, musl and Bash

🔸 Built from scratch with a footprint of less than 20MB

📁 Bash-based package manager fbpkg

📦 x86 has 31 packages, including a working gcc toolchain and other GNU utilities

🔋 arm64 support

🐳 (in-progress) Docker support

Visit snacklinux.geekness.eu for downloads, wiki and more information about SnackLinux.


Intro


SnackLinux runs a barebone kernel with downloadable extra kernel modules.

The philosophy is to create a completely hackable Linux system using standard GNU utilities, controlled by makefiles. The system installs to a local directory, anything in there is included in the final build. Imagine Linux From Scratch but with a lot less features. If you've ever wanted to build your own Linux distribution in 30 minutes, this is the project you're after.

Initially the project was created to run on old 486 CPUs with the latest software, so SnackLinux is optimized for size and low RAM. The x86 bootable ISO is 7MB in size!

Archtechtures supported:

  • arm64 (current, works)
  • i486 (current, works)
  • amd64/x86_64 (old, but works with effort)

Getting started


You can use prebuilt ISOs or compile from source. See Getting started to download ISOs and a quick start guide.

Compiling SnackLinux from source


Build system

  • Linux is preferable to build with

Debian

apt-get install build-essential git libgmp-dev libmpc-dev flex bison bc 

Optional:

apt-get install genisoimage #used for generating x86 ISO images

Mac OS*

  • Mac OS is incredibly difficult to get working alone to build the kernel, otherwise cross-compiling packages works
  • An alternative to a tradtional VM is to use something like krunvm

gcc

arch -arm64 brew install gcc@12

If you have an alternate version of gcc installed, create symlinks:

cd /opt/homebrew/bin
ln -s gcc-12 gcc 
ln -s g++-12 g++

Toolchain

Build your own

Compile your own toolchain with musl-cross-make

git clone https://github.com/richfelker/musl-cross-make.git

arm64

TARGET=aarch64-linux-musl make
TARGET=aarch64-linux-musl make install

x86

TARGET=i486-linux-musl make
TARGET=i486-linux-musl make install

TODO:x86_64

Toolchain installs to output/

Add the toolchain to your shell's PATH:

export PATH=$PATH:/path/musl-cross-make/output/bin

Building SnackLinux

After our toolchain is built, we can build SnackLinux which includes the kernel and user utilities.

Environment vars

JOBS Set number of parallel jobs to create, defaults to 8 Example: export JOBS=12

ROOTFS_PATH Path to SnackLinux root filesystem, defaults to /opt/snacklinux_rootfs

Architechtures

TARGET=aarch64
TARGET=i486
TARGET=x86_64

Defaults to i486

Example, building for arm64:

export TARGET=aarch64 JOBS=4

Versions

See defs.sh for defined kernel and package versions

Getting started

  • Download source tars and link

bash ./download_prereq.sh

  • Create target install directory mkdir /opt/snacklinux_rootfs

  • Compile the kernel

make kernel
  • Build musl, Bash and BusyBox
make system
  • Install to /opt/snacklinux_rootfs directory
make install

Next step: booting

Compile individual packages

You can alternatively build the individual software and install at your will.

Linux

make kernel

musl

make musl

BusyBox

make busybox

Bash

make bash

Binutils (optional)

make binutils

Syslinux

make syslinux

Python (experimental)

make python

If you would also like to install binutils, use:

make binutils-install

stripping symbols

This target strips all debug symbols files matching LSB executable, shared object or ar archive

make strip-fs

additional packages

See building packages

Booting

Prerequisites:

Base files (/etc)

git clone https://github.com/snacsnoc/snacklinux-base.git
cp -R snacklinux-base/rootfs/* /opt/snacklinux_rootfs/

Create /dev files and required directories

Run as root:

bash ./tools/create_dev.sh

fbpkg (package manager)

git clone https://github.com/snacsnoc/fbpkg.git
cp fbpkg/src/fbpkg /opt/snacklinux_rootfs/usr/bin

Booting

ISO (x86)

Run make iso to generate a bootable ISO. The output ISO will be in iso/

Run make iso-with-kernel to generate a bootable ISO with the kernel in /boot. The output ISO will be in iso/

Note: you do not have to have the toolchain to create the ISO

qemu

Create a gzipped rootfs by running:

cd /opt/snacklinux_rootfs/; find . -print | cpio -o -H newc --quiet | gzip -6 > ~/rootfs.gz 

Then boot in qemu:

arm64:

Linux:

qemu-system-aarch64 -M virt,highmem=off -kernel linux/arch/arm64/boot/Image -initrd rootfs.gz -append "root=/dev/ram" -m 256 -serial stdio -boot menu=off -cpu max -nodefaults -boot d -device virtio-gpu-pci -device virtio-keyboard-pci,id=kbd0,serial=virtio-keyboard

Mac OS (Apple Silicon):

qemu-system-aarch64 -M virt,highmem=off -kernel Image -initrd rootfs.gz -append "root=/dev/ram" -m 128  -boot menu=off -cpu max -nodefaults -boot d -bios "/opt/homebrew/Cellar/qemu/7.1.0/share/qemu/edk2-aarch64-code.fd" -device virtio-gpu-pci  -device virtio-keyboard-pci,id=kbd0,serial=virtio-keyboard -accel hvf 

Run a VNC server with qemu: -vnc 12.34.56.78:0

x86:

qemu-system-i386 -cpu 486-v1 -m 256 -kernel bzImage -initrd rootfs.gz -append "root=/dev/ram rdinit=/sbin/init"

x86_64:

qemu-system-x86_64 -m 256 -kernel bzImage -initrd rootfs.gz -append "root=/dev/ram rdinit=/sbin/init"

Packages

Read the Packages page for building packages. For SnackLinux's package manager fbpkg, see here.

Hacking

Edit anything in /opt/snacklinux_rootfs, it is the root filesystem. The kernel can also be recompiled to fit your needs.

The boot/isolinux directory is where ISOLINUX resides, edit the menu to adjust to your needs.

Contributing

SnackLinux is a personal project, but I welcome contributions from the community. If you have ideas, feedback, or code changes that can improve SnackLinux, your input is valued.

Thanks

Mike Chirico for http://souptonuts.sourceforge.net/cdrom.htm

Tiny Core Linux distribution for inspiration and documentation http://tinycorelinux.net

Gregor Richards for the many Musl compiler scripts https://github.com/GregorR

Linux From Scratch for excellent documentation http://www.linuxfromscratch.org/

The Arch Linux wiki https://wiki.archlinux.org/

Rich Felker for creating musl-cross-make and make building so easy https://github.com/richfelker/musl-cross-make

Here are links to the software used in SnackLinux:

syslinux

linux

busybox

bash

fbpkg

binutils

musl

Resources

http://port70.net/~nsz/32_dynlink.html https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html