]> git.ipfire.org Git - thirdparty/dracut.git/blobdiff - mkinitrd-dracut.sh
dracut_mkdir(): create parent directories as needed.
[thirdparty/dracut.git] / mkinitrd-dracut.sh
index d8e92f3c1b18ef5dbb4478311349fdd8b9e52157..82d90684eddf337a692b0471b2b1fb2884482ad1 100755 (executable)
@@ -2,6 +2,9 @@
 kver=$(uname -r)
 
 boot_dir="/boot"
+quiet=0
+host_only=0
+force=0
 
 error() { echo "$@" >&2; }
 
@@ -45,6 +48,68 @@ read_arg() {
     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 $?
@@ -58,11 +123,11 @@ while (($# > 0)); do
             echo "mkinitrd: dracut compatibility wrapper"
             exit 0;;
         -v|--verbose) dracut_args="${dracut_args} -v";;
-        -f|--force) dracut_args="${dracut_args} -f";;
+        -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;;
@@ -89,6 +154,8 @@ while (($# > 0)); do
         --looppath*) ;;
         --dsdt*) ;;
         --bootchart) ;;
+       -s) ;;
+       --quiet|-q) quiet=1;;
        -b) read_arg boot_dir "$@" || shift $?
            if [ ! -d $boot_dir ];then
                error "Boot directory $boot_dir does not exist"
@@ -100,6 +167,8 @@ while (($# > 0)); do
            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
@@ -117,12 +186,17 @@ while (($# > 0)); do
     shift
 done
 
-[[ $targets && $kernels ]] || usage
+[[ $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 [[ $img_vers ]];then
@@ -132,9 +206,21 @@ for ((i=0 ; $i<${#targets[@]} ; i++)); do
     fi
     kernel="${kernels[$i]}"
 
-    if [[ $basicmodules ]]; then
-        dracut $dracut_args --add-drivers "$basicmodules" "$target" "$kernel"
+    # 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
-        dracut $dracut_args "$target" "$kernel"
+       if [[ $basicmodules ]]; then
+            dracut $dracut_args --add-drivers "$basicmodules" "$target" \
+               "$kernel"
+       else
+            dracut $dracut_args "$target" "$kernel"
+       fi
     fi
 done