#!/bin/bash --norc
kver=$(uname -r)
+boot_dir="/boot"
+quiet=0
+host_only=0
+force=0
+
error() { echo "$@" >&2; }
usage () {
# $1 = arg name
# $2 = arg value
# $3 = arg parameter
- local rematch='^[^=]*=(.*)$'
+ param="$1"
+ local rematch='^[^=]*=(.*)$' result
if [[ $2 =~ $rematch ]]; then
- read "$1" <<< "${BASH_REMATCH[1]}"
- elif [[ $3 != -* ]]; then
- # Only read next arg if it not an arg itself.
- read "$1" <<< "$3"
- # There is no way to shift our callers args, so
- # return 1 to indicate they should do it instead.
- return 1
+ read "$param" <<< "${BASH_REMATCH[1]}"
+ else
+ for ((i=3; $i <= $#; i++)); do
+ # Only read next arg if it not an arg itself.
+ if [[ ${@:$i:1} = -* ]];then
+ break
+ fi
+ result="$result ${@:$i:1}"
+ # There is no way to shift our callers args, so
+ # return "no of args" to indicate they should do it instead.
+ done
+ read "$1" <<< "$result"
+ return $(($i - 3))
fi
}
+# Taken over from SUSE mkinitrd
+default_kernel_images() {
+ local regex kernel_image kernel_version version_version initrd_image
+ local qf='%{NAME}-%{VERSION}-%{RELEASE}\n'
+
+ case "${DRACUT_ARCH:-$(uname -m)}" in
+ s390|s390x)
+ regex='image'
+ ;;
+ ppc|ppc64)
+ regex='vmlinux'
+ ;;
+ i386|x86_64)
+ regex='vmlinuz'
+ ;;
+ arm*)
+ regex='[uz]Image'
+ ;;
+ aarch64|riscv64)
+ regex='Image'
+ ;;
+ *) regex='vmlinu.'
+ ;;
+ esac
+
+ # user mode linux
+ if grep -q UML /proc/cpuinfo; then
+ regex='linux'
+ fi
+
+ kernel_images=""
+ initrd_images=""
+ for kernel_image in $(ls $boot_dir \
+ | sed -ne "\|^$regex\(-[0-9.]\+-[0-9]\+-[a-z0-9]\+$\)\?|p" \
+ | grep -v kdump$ ) ; do
+
+ # Note that we cannot check the RPM database here -- this
+ # script is itself called from within the binary kernel
+ # packages, and rpm does not allow recursive calls.
+
+ [ -L "$boot_dir/$kernel_image" ] && continue
+ [ "${kernel_image%%.gz}" != "$kernel_image" ] && continue
+ kernel_version=$(/usr/bin/get_kernel_version \
+ $boot_dir/$kernel_image 2> /dev/null)
+ initrd_image=$(echo $kernel_image | sed -e "s|${regex}|initrd|")
+ if [ "$kernel_image" != "$initrd_image" -a \
+ -n "$kernel_version" -a \
+ -d "/lib/modules/$kernel_version" ]; then
+ kernel_images="$kernel_images $boot_dir/$kernel_image"
+ initrd_images="$initrd_images $boot_dir/$initrd_image"
+ fi
+ done
+ for kernel_image in $kernel_images;do
+ kernels="$kernels ${kernel_image#*-}"
+ done
+ for initrd_image in $initrd_images;do
+ targets="$targets $initrd_image"
+ done
+ host_only=1
+ force=1
+}
+
while (($# > 0)); do
case ${1%%=*} in
- --with-usb) read_arg usbmodule "$@" || shift
+ --with-usb) read_arg usbmodule "$@" || shift $?
basicmodules="$basicmodules ${usbmodule:-usb-storage}"
unset usbmodule;;
- --with-avail) read_arg modname "$@" || shift
+ --with-avail) read_arg modname "$@" || shift $?
basicmodules="$basicmodules $modname";;
- --with) read_arg modname "$@" || shift
+ --with) read_arg modname "$@" || shift $?
basicmodules="$basicmodules $modname";;
--version)
echo "mkinitrd: dracut compatibility wrapper"
exit 0;;
-v|--verbose) dracut_args="${dracut_args} -v";;
- -f|--force) dracut_args="${dracut_args} -f";;
- --preload) read_arg modname "$@" || shift
+ -f|--force) force=1;;
+ --preload) read_arg modname "$@" || shift $?
basicmodules="$basicmodules $modname";;
--image-version) img_vers=yes;;
- --rootfs) read_arg rootfs "$@" || shift
+ --rootfs|-d) read_arg rootfs "$@" || shift $?
dracut_args="${dracut_args} --filesystems $rootfs";;
--nocompress) dracut_args="$dracut_args --no-compress";;
--help) usage -n;;
--looppath*) ;;
--dsdt*) ;;
--bootchart) ;;
- *) if [[ ! $target ]]; then
- target=$1
- elif [[ ! $kernel ]]; then
- kernel=$1
+ -s) ;;
+ --quiet|-q) quiet=1;;
+ -b) read_arg boot_dir "$@" || shift $?
+ if [ ! -d $boot_dir ];then
+ error "Boot directory $boot_dir does not exist"
+ exit 1
+ fi
+ ;;
+ -k) # Would be nice to get a list of images here
+ read_arg kernel_images "$@" || shift $?
+ for kernel_image in $kernel_images;do
+ kernels="$kernels ${kernel_image#*-}"
+ done
+ host_only=1
+ force=1
+ ;;
+ -i) read_arg initrd_images "$@" || shift $?
+ for initrd_image in $initrd_images;do
+ targets="$targets $boot_dir/$initrd_image"
+ done
+ ;;
+ *) if [[ ! $targets ]]; then
+ targets=$1
+ elif [[ ! $kernels ]]; then
+ kernels=$1
else
usage
fi;;
shift
done
-[[ $target && $kernel ]] || usage
-[[ $img_vers ]] && target="$target-$kernel"
+[[ $targets && $kernels ]] || default_kernel_images
+[[ $targets && $kernels ]] || (error "No kernel found in $boot_dir" && usage)
+
+# We can have several targets/kernels, transform the list to an array
+targets=( $targets )
+[[ $kernels ]] && kernels=( $kernels )
+
+[[ $host_only == 1 ]] && dracut_args="${dracut_args} -H"
+[[ $force == 1 ]] && dracut_args="${dracut_args} -f"
+
+echo "Creating: target|kernel|dracut args|basicmodules "
+for ((i=0 ; $i<${#targets[@]} ; i++)); do
-if [[ $basicmodules ]]; then
- dracut $dracut_args --add-drivers "$basicmodules" "$target" "$kernel"
-else
- dracut $dracut_args "$target" "$kernel"
-fi
+ if [[ $img_vers ]];then
+ target="${targets[$i]}-${kernels[$i]}"
+ else
+ target="${targets[$i]}"
+ fi
+ kernel="${kernels[$i]}"
+
+ # Duplicate code: No way found how to redirect output based on $quiet
+ if [[ $quiet == 1 ]];then
+ echo "$target|$kernel|$dracut_args|$basicmodules"
+ if [[ $basicmodules ]]; then
+ dracut $dracut_args --add-drivers "$basicmodules" "$target" \
+ "$kernel" &>/dev/null
+ else
+ dracut $dracut_args "$target" "$kernel" &>/dev/null
+ fi
+ else
+ if [[ $basicmodules ]]; then
+ dracut $dracut_args --add-drivers "$basicmodules" "$target" \
+ "$kernel"
+ else
+ dracut $dracut_args "$target" "$kernel"
+ fi
+ fi
+done