#!/bin/sh if [ $(id -u) != 0 ]; then exec "${HOST_DIR}"/bin/fakeroot "$0" "$@" fi export PATH="${HOST_DIR}:${PATH}" TARGET_DIR=$1 WORKDIR=$(mktemp -d) OUTDIR="${WORKDIR}"/initramfs LIB_CACHE="${WORKDIR}"/libs.cache PKGDIR="${0%/*}" trap 'rm -rf "${WORKDIR}"' INT QUIT TERM EXIT cache_libs() { find \ "${TARGET_DIR}"/usr/lib \ "${TARGET_DIR}"/usr/lib64 \ \( -type f -o -type l \) \ -name '*.so*' \ | sed "s@${TARGET_DIR}@@" \ > "${LIB_CACHE}" } bin_install() { for arg; do arg=${arg#/} [ -e "${OUTDIR}/${arg}" ] && continue mkdir -p "${OUTDIR}/${arg%/*}" cp -a "${TARGET_DIR}/${arg}" "${OUTDIR}/${arg}" if [ -h "${TARGET_DIR}/${arg}" ]; then bin_install "$(realpath --relative-to "${TARGET_DIR}" "${TARGET_DIR}/${arg}")" elif [ -f "${TARGET_DIR}/${arg}" ]; then readelf --dynamic "${TARGET_DIR}/${arg}" \ | awk '$2=="(NEEDED)"{gsub(/\[|\]/,"",$5); print $5}' \ | while IFS= read -r lib; do path="$(grep "${lib}"'$' "${LIB_CACHE}")" if [ -z "${path}" ]; then printf 'ERROR could not resolve shared library %s\n' "${lib}" >&2 return 1 fi bin_install "${path}" done elif [ ! -e "${TARGET_DIR}/${arg}" ]; then printf 'ERROR could not find /%s to copy\n' "${arg}" >&2 return 1 fi done } mk_skel() { mkdir -p "${OUTDIR}"/dev mknod -m 0622 "${OUTDIR}"/dev/console c 5 1 mkdir -p \ "${OUTDIR}"/usr \ "${OUTDIR}"/usr/bin \ "${OUTDIR}"/usr/sbin \ "${OUTDIR}"/usr/lib ln -s usr/bin "${OUTDIR}"/bin ln -s usr/sbin "${OUTDIR}"/sbin ln -s usr/lib "${OUTDIR}"/lib if [ -h "${TARGET_DIR}"/usr/lib64 ]; then cp -P "${TARGET_DIR}"/usr/lib64 "${OUTDIR}"/usr fi if [ -h "${TARGET_DIR}"/lib64 ]; then cp -P "${TARGET_DIR}"/lib64 "${OUTDIR}" fi } rm -rf "${OUTDIR}" mk_skel || exit cache_libs || exit bin_install \ /bin/cat \ /bin/cp \ /bin/ls \ /bin/mkdir \ /bin/mount \ /bin/rm \ /bin/sh \ /bin/sort \ /bin/tail \ /bin/umount \ /usr/bin/btrfs \ /usr/bin/mkfs.btrfs \ /usr/bin/mountpoint \ /usr/bin/readlink \ /usr/sbin/blkid \ /usr/sbin/findfs \ /usr/sbin/partx \ /usr/sbin/sfdisk \ /usr/sbin/switch_root \ || exit if [ -e "${TARGET_DIR}"/usr/bin/setfiles ]; then bin_install /usr/bin/setfiles || exit fi install "${PKGDIR}"/initramfs/initramfs-init.sh "${OUTDIR}"/init || exit install "${PKGDIR}"/initramfs/init-storage.sh "${OUTDIR}"/usr/bin/init-storage || exit mkdir -p "${TARGET_DIR}"/boot (cd "${OUTDIR}" && find . -mindepth 1 \ | LC_ALL=C sort \ | cpio --reproducible --quiet -o -H newc \ | zstd \ ) > "${TARGET_DIR}"/boot/initramfs.img.zst