#!/bin/sh VERSION=@VERSION@ sysconfdir=@sysconfdir@ datadir=@datadir@ config="$sysconfdir"/mkinitfs.conf init="$datadir"/initramfs-init fstab="$datadir"/fstab passwd="$datadir"/passwd group="$datadir"/group startdir=$PWD feature_files() { local suffix="$1" local dir="$features_dir" local glob file for f in $features; do if [ ! -f "$dir/$f.$suffix" ]; then continue fi for glob in $(sed 's:^/\+::' "$dir/$f.$suffix"); do for file in $glob; do if [ -d $file ]; then find $file -type f else echo $file fi done done done } initfs_base() { local i= dirs= glob= file= for i in dev proc sys sbin bin .modloop lib/modules media/cdrom \ etc/apk media/floppy media/usb newroot; do dirs="$dirs $tmpdir/$i" done mkdir -p $dirs local oldpwd="$PWD" cd "${basedir:-/}" for file in $(feature_files files); do echo "${file#/}" done | cpio -pdm "$tmpdir" # copy init cd $startdir install -m755 "$init" "$tmpdir"/init || return 1 for i in "$fstab" "$passwd" "$group"; do install -Dm644 "$i" "$tmpdir"/etc/${i##*/} || return 1 done cd "$oldpwd" } find_kmod_deps() { awk -v prepend="/lib/modules/$kernel/" -v modulesdep="$basedir/lib/modules/$kernel/modules.dep" ' function recursedeps(k, j, dep) { if (k in visited) return; visited[k] = 1; split(deps[k], dep, " "); for (j in dep) recursedeps(dep[j]); print(prepend k); } BEGIN { if (modulesdep == "") modulesdep="modules.dep"; FS = ": "; while ( (getline < modulesdep) > 0) { if (substr($0,1,1) == "/") { gsub(prepend, "", $1); gsub(prepend, "", $2); } deps[$1] = $2; } } { mod[$0] = 1; } END { for (i in mod) recursedeps(i); }' } find_kmods() { local oldpwd="$PWD" cd "$kerneldir" || return 1 for file in $(feature_files modules); do if ! [ -e ${file} ]; then echo "$file: No such file or directory" >&2 continue fi echo $file done | find_kmod_deps cd "$oldpwd" } initfs_kmods() { local glob= file= files= dirs= rm -rf "$tmpdir"/lib/modules # make sure we have modules.dep if ! [ -f "$kerneldir"/modules.dep ]; then depmod -b "${basedir:-/}" $kernel fi files=$(find_kmods) local oldpwd="$PWD" cd ${basedir:-/} for file in $files; do echo "${file#/}" done | cpio -pdm "$tmpdir" depmod $kernel -b "$tmpdir" cd "$oldpwd" } initfs_apk_keys() { mkdir -p "$tmpdir"/etc/apk/keys cp "$basedir"/etc/apk/keys/* "$tmpdir"/etc/apk/keys/ } initfs_cpio() { if [ -n "$list_sources" ]; then (cd "$tmpdir" && find . ) return fi rm -f $outfile umask 0022 (cd "$tmpdir" && find . | cpio -o -H newc | gzip) > $outfile } usage() { cat < initramfs: creating $outfile" fi initfs_base || exit 1 initfs_kmods || exit 1 initfs_apk_keys || exit 1 initfs_cpio || exit 1 # cleanup if [ -z "$keeptmp" ]; then [ -d "$tmpdir" ] && rm -rf "$tmpdir" fi