#!/bin/sh toppid=$$ die() { fmt=$1 shift printf "error building initramfs: $fmt\n" "$@" >&2 kill "$toppid" trap '' EXIT exit 1 } # generate a cpio entry for a command gen_cmd() { cmd=$1 cmdp="$(command -v "$cmd")" || die 'command not found: %s' "$cmd" # ignore builtins [ "$cmd" != "$cmdp" ] || return printf 'file %s %s 0755 0 0\n' "$cmdp" "$cmdp" ldd "$cmdp" | awk '/=>/ { print "file /lib64/" $1 " " $3 " 0755 0 0" }' } # generate the main file list gen_cpio_list() { sed -e '/^#/d' cpio_list.txt tr ' ' '\n' < modules.dep | sed -e "s/://;s:.*:file /lib/modules/$KERNVER/& /lib/modules/$KERNVER/& 0644 0 0:" gen_cmd e2fsck gen_cmd dropbear gen_cmd cryptsetup ldconfig -p | awk '$1 == "libgcc_s.so.1" && $2 ~ /x86-64/ { print "file " $4 " " $4 " 0755 0 0" }' } # filter the list and insert parent directory entries gen_dir_ents() { awk '{print; while (sub("/[^/]*$", "", $2) && $2) print "dir " $2 " 0755 0 0"; }' } # filter the list and generate the make dependency file gen_depfile() { awk -v f=/dev/fd/3 -v deps="cpio_list.txt make" ' { print } $1 == "file" { deps=deps " " $3; print $3 ":" > f } END { print "initramfs.img: " deps > f } ' } if ! [ -e cpio_list.txt ] || ! [ -e gen_init_cpio ]; then cd "${0%/*}" fi gen_cpio_list | gen_dir_ents | sort -u | gen_depfile 3>initramfs.d | ./gen_init_cpio -t 0 - | $COMPRESSOR > initramfs.img