minimal-arm-linux/manual-linux.sh
2023-11-15 14:04:11 -05:00

149 lines
4.4 KiB
Bash
Executable File

#!/bin/bash
# Script create the simplest linux distro ever
set -e
set -u
OUTDIR=/tmp/aeld
KERNEL_REPO=git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
KERNEL_VERSION=v6.1.14
BUSYBOX_VERSION=1_33_1
# FINDER_APP_DIR=$(realpath $(dirname $0))
ARCH=arm64
CROSS_COMPILE=aarch64-none-linux-gnu-
if [ $# -lt 1 ]
then
echo "Using default directory ${OUTDIR} for output"
else
OUTDIR=$1
echo "Using passed directory ${OUTDIR} for output"
fi
mkdir -p ${OUTDIR}
cd "$OUTDIR"
if [ ! -d "${OUTDIR}/linux-stable" ]; then
#Clone only if the repository does not exist.
echo "CLONING GIT LINUX STABLE VERSION ${KERNEL_VERSION} IN ${OUTDIR}"
git clone ${KERNEL_REPO} --depth 1 --single-branch --branch ${KERNEL_VERSION}
fi
if [ ! -e ${OUTDIR}/linux-stable/arch/${ARCH}/boot/Image ]; then
cd linux-stable
echo "Checking out version ${KERNEL_VERSION}"
git checkout ${KERNEL_VERSION}
# https://unix.stackexchange.com/questions/657882/how-do-i-cross-compile-the-linux-kernel
#make ARCH="$ARCH" CROSS_COMPILE="$CROSS_COMPILE" menuconfig
#make ARCH="$ARCH" CROSS_COMPILE="$CROSS_COMPILE" config
# use default config
# make ARCH="$ARCH" CROSS_COMPILE="$CROSS_COMPILE" defconfig
# make ARCH="$ARCH" CROSS_COMPILE="$CROSS_COMPILE"
# (deepclean) the kernal Biuld tree - remove any existing configuration
make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} mrproper
# configure our virt device we simulate in qemu
echo "(configure our virt)"
make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} defconfig
# biuld a kernel image for booting with qemu
echo "biuld a kernel image for booting with qemu"
make -j4 ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} all
# build any kernel modules
echo "build any kernel modules"
make ARCH=arm64 CROSS_COMPILE=${CROSS_COMPILE} modules
# build the device tree
make ARCH=arm64 CROSS_COMPILE=${CROSS_COMPILE} dtbs
fi
echo "Adding the Image in outdir"
cp ${OUTDIR}/linux-stable/arch/${ARCH}/boot/Image ${OUTDIR}
echo "Creating the staging directory for the root filesystem"
cd "$OUTDIR"
if [ -d "${OUTDIR}/rootfs" ]
then
echo "Deleting rootfs directory at ${OUTDIR}/rootfs and starting over"
sudo rm -rf ${OUTDIR}/rootfs
fi
# TODO: Create necessary base directories
mkdir rootfs/
mkdir rootfs/bin
mkdir rootfs/dev
mkdir rootfs/etc
mkdir rootfs/home
mkdir rootfs/lib
mkdir rootfs/lib/modules
mkdir rootfs/lib64
mkdir rootfs/lib64/modules
mkdir rootfs/proc
mkdir rootfs/sys
mkdir rootfs/sbin
mkdir rootfs/tmp
mkdir rootfs/usr
mkdir rootfs/usr/lib
mkdir rootfs/usr/bin
mkdir rootfs/usr/sbin
mkdir rootfs/var
mkdir rootfs/var/log
cd "$OUTDIR"
if [ ! -d "${OUTDIR}/busybox" ]
then
git clone git://busybox.net/busybox.git
cd busybox
git checkout ${BUSYBOX_VERSION}
# TODO: Configure busybox
# https://busybox.net/FAQ.html#configure
make ARCH="$ARCH" CROSS_COMPILE="$CROSS_COMPILE" defconfig
else
cd busybox
fi
# TODO: Make and install busybox
make ARCH="$ARCH" CROSS_COMPILE="$CROSS_COMPILE"
make ARCH="$ARCH" CROSS_COMPILE="$CROSS_COMPILE" CONFIG_PREFIX="${OUTDIR}/rootfs" install
cd ..
pwd
echo "Library dependencies"
${CROSS_COMPILE}readelf -a ${OUTDIR}/rootfs/bin/busybox | grep "program interpreter"
${CROSS_COMPILE}readelf -a ${OUTDIR}/rootfs/bin/busybox | grep "Shared library"
# TODO: Add library dependencies to rootfs
CROSS_COMPILE_PATH=$(${CROSS_COMPILE}gcc --print-sysroot)
cp "${CROSS_COMPILE_PATH}"/lib/ld-linux-aarch64.so.1 "${OUTDIR}"/rootfs/lib
cp "${CROSS_COMPILE_PATH}"/lib64/libm.so.6 "${OUTDIR}"/rootfs/lib64
cp "${CROSS_COMPILE_PATH}"/lib64/libresolv.so.2 "${OUTDIR}"/rootfs/lib64
cp "${CROSS_COMPILE_PATH}"/lib64/libc.so.6 "${OUTDIR}"/rootfs/lib64
# TODO: Make device nodes
cd "$OUTDIR/rootfs"
sudo mknod -m 666 dev/null c 1 3
sudo mknod -m 600 dev/console c 5 1
# TODO: Copy scripts and executables to a directory
# on the target rootfs
# embedded apps and ohter installs can go here?
# cd "$FINDER_APP_DIR"
# make clean
# make ARCH="$ARCH" CROSS_COMPILE="$CROSS_COMPILE"
# cp writer ${OUTDIR}/rootfs/home
# cp finder.sh ${OUTDIR}/rootfs/home
# cp finder-test.sh ${OUTDIR}/rootfs/home
# cp writer.sh ${OUTDIR}/rootfs/home
# mkdir ${OUTDIR}/rootfs/home/conf
# cp -r conf/. ${OUTDIR}/rootfs/home/conf
# cp autorun-qemu.sh ${OUTDIR}/rootfs/home
# TODO: Chown the root directory
cd "$OUTDIR/rootfs"
sudo chown -R root:root *
# TODO: Create initramfs.cpio.gz
find . | cpio -H newc -ov --owner root:root > ${OUTDIR}/initramfs.cpio
cd "$OUTDIR"
gzip -f initramfs.cpio