File mkmoduleinitrd of Package initrd

#!/bin/bash
set -e

if [ "${1:0:1}" = '-' ]; then
	echo "Usage: $0 ROOT KERNELVERSION OUTPUT"
	exit 0
fi

root="${1:-/}"
kv="${2:-$(uname -r)}"
of="${3:-initrd-modules-"$kv"}"

if [ -z "$all_modules" ]; then
	# figure out modules automatically like /usr/lib/dracut/modules.d/90kernel-modules/module-setup.sh ?
	modules=(btrfs vfat overlay efivarfs virtio_blk qemu_fw_cfg)

	modules+=(dm-crypt essiv xts cryptd aes)

	while read -r key _colon value; do
		[ "$key" = "driver" ] || continue
		modules+=("$value")
	done < /proc/crypto
else
	while read -r m _rest; do
		modules+=("$m")
	done < /proc/modules
fi

tmpdir=$(mktemp -d -t mkinitrd.XXXXXX)
cleanup()
{
	rm -rf "$tmpdir"
}
trap cleanup EXIT

declare -A mods
todo=("${modules[@]}")
i=0
while [ "$i" -lt "${#todo[@]}" ]; do
	module="${todo[$i]}"
	: $((i++))
	[ -z "${mods[$module]}" ] || continue
	fn="$(/usr/sbin/modinfo -b "$root" -k "$kv" -F filename "$module" 2>/dev/null || :)"
	[ -n "$fn" -a "$fn" != "(builtin)" ] || continue
	mods["$module"]="${fn#"$root"}"
	IFS=, read -r -a d < <(/usr/sbin/modinfo -b "$root" -k "$kv" -F depends "$module" || :)
	for m in "${d[@]}"; do
		[ -z "${mods[$m]}" ] || continue
		todo+=("$m")
	done
done
for m in "${!mods[@]}"; do
	fn="${mods[$m]}"
	mkdir -p "$tmpdir/${fn%/*}"
	cp -a "$root$fn" "$tmpdir/$fn"
done
for i in builtin builtin.modinfo order; do
	cp -a "$root/usr/lib/modules/$kv/modules.$i" "$tmpdir/usr/lib/modules/$kv/modules.$i"
done
/usr/sbin/depmod -b "$tmpdir" "$kv"

for i in /etc/modprobe.conf /etc/modprobe.d /usr/lib/modprobe.d; do
	[ -e "$i" ] || continue
	mkdir -p "$tmpdir${i%/*}"
	cp -a "$i" "$tmpdir$i"
done

# XXX: should detect / automatically, independent of marker
if [ -e /etc/crypttab ]; then
	grep  x-initrd.attach /etc/crypttab > "$tmpdir/etc/crypttab"
fi

# TODO: fixup time stamps

(cd "$tmpdir" ; find -print0 | cpio --format newc --null -R root:root -o --quiet) | zstd -3 -T0 -q > "$of"
openSUSE Build Service is sponsored by