#!/bin/bash echo_blue() { echo -e "\033[34m$1\033[0m" } echo_yellow() { echo -e "\033[0;33m$1\033[0m" } echo_red() { echo -e "\033[0;31m$1\033[0m" } create_dirs() { rm -rf "$ROOT" 2>/dev/null mkdir -p "$ROOT" "${ROOT}/usr/bin/" mkdir -p ${ROOT}/usr/bin mkdir -p ${ROOT}/usr/lib ln -s usr/bin ${ROOT}/bin ln -s usr/bin ${ROOT}/sbin ln -s usr/lib ${ROOT}/lib ln -s usr/lib ${ROOT}/lib64 ln -s lib ${ROOT}/usr/lib64 ln -s bin ${ROOT}/usr/sbin } # Installs a library. Expects absolute path. install_dep() { local lib="$1" [[ -f "$lib" ]] || { echo "Did not find library at path: $lib" exit 1 } [[ -f "${ROOT}${lib}" ]] || { mkdir -p $(dirname "${ROOT}${lib}") echo_blue "Adding dependency: $lib" cp "$lib" "${ROOT}${lib}" } } # Expects to receive the absolute path as the full argument. # Use `which binary_name` if it's in your path. # Installs to /usr/bin install_binary() { local binary="$1" lib='' [[ -f "$binary" ]] || { echo_red "Did not find binary at path: $binary" exit 1 } echo_blue "Adding binary: $binary" cp "$binary" "${ROOT}/usr/bin/" ldd_deps="$(ldd "$binary")" if [[ $ldd_deps == *"not a dynamic executable"* ]]; then return 0 fi while read -r lib; do install_dep "$lib" done <<< "$( echo "$ldd_deps" | grep -F ' => ' | awk '{ print $3 }' )" } install_busybox() { echo_blue "Installing busybox..." [[ -f "$BUSYBOX_PATH" ]] || { echo_red "Did not find busybox at $BUSYBOX_PATH" echo_red "Please compile or download busybox. You can also change the path." exit 1 } install_binary "$BUSYBOX_PATH" || return 1 for applet in $($BUSYBOX_PATH --list); do ln -s busybox "${ROOT}/usr/bin/$applet" done } install_init_script() { cp ../init.sh ${ROOT}/init cp ../init_functions.sh ${ROOT}/ } install_module() { local module="$1" depends='' dep='' filename='' filename="$( modinfo -k $KERNEL $module | grep '^filename:' | awk '{ print $2 }' )" [[ "$filename" == "(builtin)" ]] && { echo_yellow "Module $module is builtin. Installation not needed." return 0 } install_dep "$filename" echo "insmod $filename" >> "${ROOT}/load_modules.sh" depends="$(modinfo -k $KERNEL $module | grep '^depends:' | awk '{ print $2 }' | sed 's/,/\n/g')" while read -r dep; do [[ -z $dep ]] && continue install_module "$dep" done <<< "$( echo "$depends" )" } create_archive() { local archive="detee-$(hostnamectl hostname)-${KERNEL}.cpio.gz" echo_blue "Creating archive $archive" echo $archive > .archive_name my_location="$(pwd)" cd ${ROOT} find . | cpio -o -H newc | gzip > "${my_location}/detee-$(hostnamectl hostname)-${KERNEL}.cpio.gz" cd $my_location }