diff --git a/.gitignore b/.gitignore index fd37997ca..f8eeff2ed 100644 --- a/.gitignore +++ b/.gitignore @@ -6,11 +6,15 @@ /src/work/** /src/*.iso -/src/experimental/toybox/source/** -/src/experimental/toybox/work/** -/src/experimental/toybox/*.iso +/src/experimental/glibc-toybox/source/** +/src/experimental/glibc-toybox/work/** +/src/experimental/glibc-toybox/*.iso -/src/experimental/musl/source/** -/src/experimental/musl/work/** -/src/experimental/musl/*.iso +/src/experimental/musl-busybox/source/** +/src/experimental/musl-busybox/work/** +/src/experimental/musl-busybox/*.iso + +/src/experimental/musl-toybox/source/** +/src/experimental/musl-toybox/work/** +/src/experimental/musl-toybox/*.iso diff --git a/src/experimental/toybox/.config b/src/experimental/glibc-toybox/.config similarity index 100% rename from src/experimental/toybox/.config rename to src/experimental/glibc-toybox/.config diff --git a/src/experimental/toybox/0_prepare.sh b/src/experimental/glibc-toybox/0_prepare.sh similarity index 100% rename from src/experimental/toybox/0_prepare.sh rename to src/experimental/glibc-toybox/0_prepare.sh diff --git a/src/experimental/toybox/1_get_kernel.sh b/src/experimental/glibc-toybox/1_get_kernel.sh similarity index 100% rename from src/experimental/toybox/1_get_kernel.sh rename to src/experimental/glibc-toybox/1_get_kernel.sh diff --git a/src/experimental/toybox/2_build_kernel.sh b/src/experimental/glibc-toybox/2_build_kernel.sh similarity index 100% rename from src/experimental/toybox/2_build_kernel.sh rename to src/experimental/glibc-toybox/2_build_kernel.sh diff --git a/src/experimental/toybox/3_get_toybox.sh b/src/experimental/glibc-toybox/3_get_toybox.sh similarity index 100% rename from src/experimental/toybox/3_get_toybox.sh rename to src/experimental/glibc-toybox/3_get_toybox.sh diff --git a/src/experimental/toybox/4_build_toybox.sh b/src/experimental/glibc-toybox/4_build_toybox.sh similarity index 100% rename from src/experimental/toybox/4_build_toybox.sh rename to src/experimental/glibc-toybox/4_build_toybox.sh diff --git a/src/experimental/toybox/5_generate_rootfs.sh b/src/experimental/glibc-toybox/5_generate_rootfs.sh similarity index 100% rename from src/experimental/toybox/5_generate_rootfs.sh rename to src/experimental/glibc-toybox/5_generate_rootfs.sh diff --git a/src/experimental/toybox/6_pack_rootfs.sh b/src/experimental/glibc-toybox/6_pack_rootfs.sh similarity index 100% rename from src/experimental/toybox/6_pack_rootfs.sh rename to src/experimental/glibc-toybox/6_pack_rootfs.sh diff --git a/src/experimental/toybox/7_generate_iso.sh b/src/experimental/glibc-toybox/7_generate_iso.sh similarity index 100% rename from src/experimental/toybox/7_generate_iso.sh rename to src/experimental/glibc-toybox/7_generate_iso.sh diff --git a/src/experimental/toybox/build_minimal_linux_live.sh b/src/experimental/glibc-toybox/build_minimal_linux_live.sh similarity index 100% rename from src/experimental/toybox/build_minimal_linux_live.sh rename to src/experimental/glibc-toybox/build_minimal_linux_live.sh diff --git a/src/experimental/musl/qemu32.sh b/src/experimental/glibc-toybox/qemu32.sh similarity index 100% rename from src/experimental/musl/qemu32.sh rename to src/experimental/glibc-toybox/qemu32.sh diff --git a/src/experimental/musl/qemu64.sh b/src/experimental/glibc-toybox/qemu64.sh similarity index 100% rename from src/experimental/musl/qemu64.sh rename to src/experimental/glibc-toybox/qemu64.sh diff --git a/src/experimental/musl/.config b/src/experimental/musl-busybox/.config similarity index 100% rename from src/experimental/musl/.config rename to src/experimental/musl-busybox/.config diff --git a/src/experimental/musl/00_prepare.sh b/src/experimental/musl-busybox/00_prepare.sh similarity index 100% rename from src/experimental/musl/00_prepare.sh rename to src/experimental/musl-busybox/00_prepare.sh diff --git a/src/experimental/musl/01_get_kernel.sh b/src/experimental/musl-busybox/01_get_kernel.sh similarity index 100% rename from src/experimental/musl/01_get_kernel.sh rename to src/experimental/musl-busybox/01_get_kernel.sh diff --git a/src/experimental/musl/02_build_kernel.sh b/src/experimental/musl-busybox/02_build_kernel.sh similarity index 100% rename from src/experimental/musl/02_build_kernel.sh rename to src/experimental/musl-busybox/02_build_kernel.sh diff --git a/src/experimental/musl/03_get_musl.sh b/src/experimental/musl-busybox/03_get_musl.sh similarity index 100% rename from src/experimental/musl/03_get_musl.sh rename to src/experimental/musl-busybox/03_get_musl.sh diff --git a/src/experimental/musl/04_build_musl.sh b/src/experimental/musl-busybox/04_build_musl.sh similarity index 100% rename from src/experimental/musl/04_build_musl.sh rename to src/experimental/musl-busybox/04_build_musl.sh diff --git a/src/experimental/musl/05_prepare_musl.sh b/src/experimental/musl-busybox/05_prepare_musl.sh similarity index 100% rename from src/experimental/musl/05_prepare_musl.sh rename to src/experimental/musl-busybox/05_prepare_musl.sh diff --git a/src/experimental/musl/06_get_busybox.sh b/src/experimental/musl-busybox/06_get_busybox.sh similarity index 100% rename from src/experimental/musl/06_get_busybox.sh rename to src/experimental/musl-busybox/06_get_busybox.sh diff --git a/src/experimental/musl/07_build_busybox.sh b/src/experimental/musl-busybox/07_build_busybox.sh similarity index 100% rename from src/experimental/musl/07_build_busybox.sh rename to src/experimental/musl-busybox/07_build_busybox.sh diff --git a/src/experimental/musl/08_generate_rootfs.sh b/src/experimental/musl-busybox/08_generate_rootfs.sh similarity index 100% rename from src/experimental/musl/08_generate_rootfs.sh rename to src/experimental/musl-busybox/08_generate_rootfs.sh diff --git a/src/experimental/musl/09_pack_rootfs.sh b/src/experimental/musl-busybox/09_pack_rootfs.sh similarity index 100% rename from src/experimental/musl/09_pack_rootfs.sh rename to src/experimental/musl-busybox/09_pack_rootfs.sh diff --git a/src/experimental/musl/10_generate_iso.sh b/src/experimental/musl-busybox/10_generate_iso.sh similarity index 100% rename from src/experimental/musl/10_generate_iso.sh rename to src/experimental/musl-busybox/10_generate_iso.sh diff --git a/src/experimental/musl/build_minimal_linux_live.sh b/src/experimental/musl-busybox/build_minimal_linux_live.sh similarity index 100% rename from src/experimental/musl/build_minimal_linux_live.sh rename to src/experimental/musl-busybox/build_minimal_linux_live.sh diff --git a/src/experimental/toybox/qemu32.sh b/src/experimental/musl-busybox/qemu32.sh similarity index 100% rename from src/experimental/toybox/qemu32.sh rename to src/experimental/musl-busybox/qemu32.sh diff --git a/src/experimental/toybox/qemu64.sh b/src/experimental/musl-busybox/qemu64.sh similarity index 100% rename from src/experimental/toybox/qemu64.sh rename to src/experimental/musl-busybox/qemu64.sh diff --git a/src/experimental/musl-toybox/.config b/src/experimental/musl-toybox/.config new file mode 100644 index 000000000..55e6577ba --- /dev/null +++ b/src/experimental/musl-toybox/.config @@ -0,0 +1,18 @@ +# You can find the latest Linux kernel source bundles here: +# +# http://kernel.org +# +KERNEL_SOURCE_URL=https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.1.6.tar.xz + +# You can find the latest Musl source bundles here: +# +# http://musl-libc.org +# +MUSL_SOURCE_URL=http://musl-libc.org/releases/musl-1.1.11.tar.gz + +# You can find the latest ToyBox source bundles here: +# +# http://landley.net/toybox +# +TOYBOX_SOURCE_URL=http://landley.net/toybox/downloads/toybox-0.6.0.tar.gz + diff --git a/src/experimental/musl-toybox/00_prepare.sh b/src/experimental/musl-toybox/00_prepare.sh new file mode 100755 index 000000000..e539d7f3a --- /dev/null +++ b/src/experimental/musl-toybox/00_prepare.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +rm -rf work +mkdir work + +# -p stops errors if the directory already exists. +mkdir -p source + diff --git a/src/experimental/musl-toybox/01_get_kernel.sh b/src/experimental/musl-toybox/01_get_kernel.sh new file mode 100755 index 000000000..0754f9f75 --- /dev/null +++ b/src/experimental/musl-toybox/01_get_kernel.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +# Grab everything after the '=' character. +DOWNLOAD_URL=$(grep -i KERNEL_SOURCE_URL .config | cut -f2 -d'=') + +# Grab everything after the last '/' character. +ARCHIVE_FILE=${DOWNLOAD_URL##*/} + +cd source + +# Downloading kernel file. +# -c option allows the download to resume. +wget -c $DOWNLOAD_URL + +# Delete folder with previously extracted kernel. +rm -rf ../work/kernel +mkdir ../work/kernel + +# Extract kernel to folder 'work/kernel'. +# Full path will be something like 'work/kernel/linux-4.1.6'. +tar -xvf $ARCHIVE_FILE -C ../work/kernel + +cd .. + diff --git a/src/experimental/musl-toybox/02_build_kernel.sh b/src/experimental/musl-toybox/02_build_kernel.sh new file mode 100755 index 000000000..6651fbf19 --- /dev/null +++ b/src/experimental/musl-toybox/02_build_kernel.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +cd work/kernel + +# Change to the first directory ls finds, e.g. 'linux-3.18.6'. +cd $(ls -d *) + +# Cleans up the kernel sources, including configuration files. +make mrproper + +# Create a default configuration file for the kernel. +make defconfig + +# Changes the name of the system. +sed -i "s/.*CONFIG_DEFAULT_HOSTNAME.*/CONFIG_DEFAULT_HOSTNAME=\"minimal\"/" .config + +# Compile the kernel with optimization for "parallel jobs" = "number of processors". +# Good explanation of the different kernels: +# http://unix.stackexchange.com/questions/5518/what-is-the-difference-between-the-following-kernel-makefile-terms-vmlinux-vmlinux +make bzImage -j $(grep ^processor /proc/cpuinfo | wc -l) + +cd ../../.. + diff --git a/src/experimental/musl-toybox/03_get_musl.sh b/src/experimental/musl-toybox/03_get_musl.sh new file mode 100755 index 000000000..b68679278 --- /dev/null +++ b/src/experimental/musl-toybox/03_get_musl.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +# Grab everything after the '=' character +DOWNLOAD_URL=$(grep -i MUSL_SOURCE_URL .config | cut -f2 -d'=') + +# Grab everything after the last '/' character +ARCHIVE_FILE=${DOWNLOAD_URL##*/} + +cd source + +# Downloading musl file +# -c option allows the download to resume +wget -c $DOWNLOAD_URL + +# Delete folder with previously extracted musl +rm -rf ../work/musl +mkdir ../work/musl + +# Extract musl to folder 'work/musl' +# Full path will be something like 'work/musl/musl-1.1.11' +tar -xvf $ARCHIVE_FILE -C ../work/musl + +cd .. + diff --git a/src/experimental/musl-toybox/04_build_musl.sh b/src/experimental/musl-toybox/04_build_musl.sh new file mode 100755 index 000000000..4195f9666 --- /dev/null +++ b/src/experimental/musl-toybox/04_build_musl.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +cd work/musl + +# Change to the first directory ls finds, e.g. 'musl-1.1.11' +cd $(ls -d *) + +make distclean + +mkdir musl-installed +./configure --prefix=$(pwd)/musl-installed + +make -j $(grep ^processor /proc/cpuinfo | wc -l) + +make install -j $(grep ^processor /proc/cpuinfo | wc -l) + +cd ../../.. + diff --git a/src/experimental/musl-toybox/05_prepare_musl.sh b/src/experimental/musl-toybox/05_prepare_musl.sh new file mode 100755 index 000000000..08d053114 --- /dev/null +++ b/src/experimental/musl-toybox/05_prepare_musl.sh @@ -0,0 +1,65 @@ +#!/bin/sh + +cd work/kernel +cd $(ls -d *) +WORK_KERNEL_DIR=$(pwd) +cd ../../.. + +cd work/musl + +# Change to the first directory ls finds, e.g. 'musl-1.1.11' +cd $(ls -d *) + +cd musl-installed/bin + +unlink musl-cc +ln -s musl-gcc musl-cc + +unlink musl-ar +ln -s `which ar` musl-ar + +unlink musl-strip +ln -s `which strip` musl-strip + +cd ../include + +# +# Should work with headers from the newly downloaded kernel +# but it diesn't work. Damn!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +#unlink linux +#ln -s $WORK_KERNEL_DIR/include/linux linux +# +#unlink mtd +#ln -s $WORK_KERNEL_DIR/include/linux/mtd mtd +# +#unlink asm +#ln -s $WORK_KERNEL_DIR/include/uapi/asm-generic asm +# +#unlink asm-generic +#ln -s $WORK_KERNEL_DIR/include/uapi/asm-generic asm-generic +# +#unlink uapi +#ln -s $WORK_KERNEL_DIR/include/uapi uapi +# +#unlink uapi +#ln -s $WORK_KERNEL_DIR/include/uapi uapi + +unlink linux +ln -s /usr/include/linux linux + +unlink mtd +ln -s /usr/include/mtd mtd + +if [ -d /usr/include/asm ] +then + unlink asm + ln -s /usr/include/asm asm +else + unlink asm + ln -s /usr/include/asm-generic asm +fi + +unlink asm-generic +ln -s /usr/include/asm-generic asm-generic + diff --git a/src/experimental/musl-toybox/06_get_toybox.sh b/src/experimental/musl-toybox/06_get_toybox.sh new file mode 100755 index 000000000..0c2d1254e --- /dev/null +++ b/src/experimental/musl-toybox/06_get_toybox.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +# Grab everything after the '=' character. +DOWNLOAD_URL=$(grep -i TOYBOX_SOURCE_URL .config | cut -f2 -d'=') + +# Grab everything after the last '/' character. +ARCHIVE_FILE=${DOWNLOAD_URL##*/} + +cd source + +# Downloading ToyBox source. +# -c option allows the download to resume. +wget -c $DOWNLOAD_URL + +# Delete folder with previously extracted ToyBox. +rm -rf ../work/toybox +mkdir ../work/toybox + +# Extract toybox to folder 'toybox'. +# Full path will be something like 'work/toybox/toybox-0.6.0'. +tar -xvf $ARCHIVE_FILE -C ../work/toybox + +cd .. + diff --git a/src/experimental/musl-toybox/07_build_toybox.sh b/src/experimental/musl-toybox/07_build_toybox.sh new file mode 100755 index 000000000..933eca28a --- /dev/null +++ b/src/experimental/musl-toybox/07_build_toybox.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +cd work/musl +cd $(ls -d *) +cd musl-installed +cd bin +MUSL_BIN_DIR=$(pwd) +cd ../../../../.. +cd work/toybox + +# Change to the first directory ls finds, e.g. 'toybox-0.6.0' +cd $(ls -d *) + +PATH_BACKUP=$PATH +PATH=$MUSL_BIN_DIR:$PATH + +# Remove previously generated artefacts. +make distclean + +# Create a configuration file with all possible selections. +#make allyesconfig +make defconfig + +sed -i "s/.*CONFIG_DHCP.is.*/CONFIG_DHCP=y/" .config + +# Static linking and cross compiling. +export CFLAGS="-std=c99" +export LDFLAGS="--static" +export CROSS_COMPILE="musl-" + +# Compile ToyBox with optimization for "parallel jobs" = "number of processors". +make toybox -j $(grep ^processor /proc/cpuinfo | wc -l) + +# We no longer need flags for static linking and cross compiling. +unset CFLAGS +unset LDFLAGS +unset CROSS_COMPILE + +rm -rf rootfs +mkdir rootfs + +# Directory where ToyBox binary and symlink will be instaled. +export PREFIX=rootfs + +# Create the symlinks for toybox in single folder. +make install_flat + +# We no longer need this environment variable. +unset PREFIX + +PATH=$PATH_BACKUP + +cd ../../.. + diff --git a/src/experimental/musl-toybox/08_generate_rootfs.sh b/src/experimental/musl-toybox/08_generate_rootfs.sh new file mode 100755 index 000000000..1a4df1b37 --- /dev/null +++ b/src/experimental/musl-toybox/08_generate_rootfs.sh @@ -0,0 +1,70 @@ +#!/bin/sh + +cd work + +rm -rf rootfs +mkdir rootfs + +cd toybox +cd $(ls -d *) + +# Copy all toybox generated stuff to the location of our "initramfs/bin" folder. +cp -R rootfs ../../rootfs/bin +cd ../../rootfs + +# Create root FS folders +mkdir dev +mkdir etc +mkdir proc +mkdir root +mkdir src +mkdir sys +mkdir tmp + +# "1" means that only the owner of a file/directory (or root) can remove it. +chmod 1777 tmp + +cd etc + +# The file "/etc/welcome.txt" is displayed on every boot. +cat > welcome.txt << EOF + + ##################################### + # # + # Welcome to "Minimal Linux Live" # + # # + ##################################### + +EOF + +cd .. + +# For now we have simple console. +cat > init << EOF +#!/bin/sh +dmesg -n 1 + +mount -t devtmpfs none /dev +mount -t proc none /proc +mount -t sysfs none /sys + +ifconfig eth0 up +dhcp -i eth0 + +cat /etc/welcome.txt + +sh + +poweroff +EOF + +chmod +rx init + +# Copy all source files to "/src". Note that the scripts won't work there. +cp ../../*.sh src +cp ../../.config src +chmod +r src/*.sh +chmod +r src/.config + +cd ../.. + diff --git a/src/experimental/musl-toybox/09_pack_rootfs.sh b/src/experimental/musl-toybox/09_pack_rootfs.sh new file mode 100755 index 000000000..f9e16e523 --- /dev/null +++ b/src/experimental/musl-toybox/09_pack_rootfs.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +cd work + +# Remove the old initramfs archive if it exists. +rm -f rootfs.cpio.gz + +cd rootfs + +# Packs the current folder structure in "cpio.gz" archive. +find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz + +cd ../.. + diff --git a/src/experimental/musl-toybox/10_generate_iso.sh b/src/experimental/musl-toybox/10_generate_iso.sh new file mode 100755 index 000000000..38c951585 --- /dev/null +++ b/src/experimental/musl-toybox/10_generate_iso.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +rm -f minimal_linux_live.iso + +cd work/kernel +cd $(ls -d *) + +# Edit Makefile to look for genisoimage instead of mkisofs. This was added as a +# workaround for some "Debian" and "Arch Linux" distributions. In general this +# fix should be harmless. +sed -i 's/mkisofs/genisoimage/g' arch/x86/boot/Makefile + +# Generate the ISO image with optimization for "parallel jobs" = "number of processors" +make isoimage FDINITRD=../../rootfs.cpio.gz -j $(grep ^processor /proc/cpuinfo | wc -l) + +cp arch/x86/boot/image.iso ../../../minimal_linux_live.iso + +cd ../../.. + diff --git a/src/experimental/musl-toybox/build_minimal_linux_live.sh b/src/experimental/musl-toybox/build_minimal_linux_live.sh new file mode 100755 index 000000000..c9549c273 --- /dev/null +++ b/src/experimental/musl-toybox/build_minimal_linux_live.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +sh 0_prepare.sh +sh 1_get_kernel.sh +sh 2_build_kernel.sh +sh 3_get_toybox.sh +sh 4_build_toybox.sh +sh 5_generate_rootfs.sh +sh 6_pack_rootfs.sh +sh 7_generate_iso.sh diff --git a/src/experimental/musl-toybox/qemu32.sh b/src/experimental/musl-toybox/qemu32.sh new file mode 100755 index 000000000..2e4d546c4 --- /dev/null +++ b/src/experimental/musl-toybox/qemu32.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +qemu-system-i386 -cdrom minimal_linux_live.iso + diff --git a/src/experimental/musl-toybox/qemu64.sh b/src/experimental/musl-toybox/qemu64.sh new file mode 100755 index 000000000..8e5174a01 --- /dev/null +++ b/src/experimental/musl-toybox/qemu64.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +qemu-system-x86_64 -cdrom minimal_linux_live.iso +