#!/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 _cp() { local i if [ -n "$list_sources" ]; then for i in "$@"; do echo "$basedir"/"$i" done return fi for i in "$@"; do local dest="$tmpdir"/${i%/*} mkdir -p "$dest" cp -flLpR "$basedir"/"$i" "$dest" 2>/dev/null || cp -pR "$basedir"/"$i" "$dest" done } feature_files() { local dir="$1" local glob file for f in $features; do if [ ! -f "$dir/$f" ]; then continue fi for glob in $(sed 's:^/\+::' "$dir/$f"); 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 [ -z "$list_sources" ] && mkdir -p $dirs cd "${basedir:-/}" for file in $(feature_files "$filelists_dir"); do _cp $file done # copy init if [ -z "$list_sources" ]; then 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 else echo "$init" echo "$fstab" echo "$passwd" echo "$group" fi } 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() { cd "$kerneldir" || return 1 for file in $(feature_files $modulelists_dir); do if ! [ -e ${file} ]; then echo "$file: No such file or directory" >&2 continue fi echo $file done | find_kmod_deps } initfs_kmods() { local glob= file= files= dirs= [ -z "$list_sources" ] && 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) for file in $files; do _cp $file done [ -z "$list_sources" ] && depmod $kernel -b "$tmpdir" } initfs_apk_keys() { [ -n "$list_sources" ] && return mkdir -p "$tmpdir"/etc/apk/keys cp "$basedir"/etc/apk/keys/* "$tmpdir"/etc/apk/keys/ } initfs_cpio() { [ -n "$list_sources" ] && return (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