#!/bin/sh set -e compressor="lz4 --best --favor-decSpeed -l" # generate a cpio entry for a command gen_cmd() { cmd=$1 cmdp="$(command -v "$cmd")" # builtin if [ "$cmd" = "$cmdp" ]; then return fi printf 'file %s %s 0755 0 0\n' "$cmdp" "$cmdp" ldd "$cmdp" | grep / | while read line; do tmp=${line% *} lib=/${tmp#*/} # don't bother with ld.so.conf printf 'file /lib64/%s %s 0755 0 0\n' "${lib##*/}" "$lib" done } # generate the main file list gen_cpio_list() { sed -e '/^#/d' cpio_list.txt gen_cmd e2fsck gen_cmd dropbear export LD_PRELOAD=libgcc_s.so.1 gen_cmd cryptsetup } # filter the list and insert parent directory entries gen_dir_ents() { while read type target args; do # re-print the original entry printf '%s %s %s\n' "$type" "$target" "$args" # print the necessary directory entries. duplicates will be # filtered by sort -u later while [ "${target%/*}" != '' ]; do target=${target%/*} printf 'dir %s 0755 0 0\n' "$target" done done } # filter the list and generate the make dependency file gen_depfile() { deps='cpio_list.txt make' while read type target source args; do # re-print the original entry printf '%s %s %s %s\n' "$type" "$target" "$source" "$args" # accumulate the dependencies in a list to avoid make bugs. # there will be no duplicates since the list was previously sorted if [ "$type" = file ]; then deps="$deps $source" # avoid "No rule to make target" when deps disappear echo "$source:" >&3 fi done echo "initramfs.img: $deps" >&3 } 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