]> git.ipfire.org Git - thirdparty/dracut.git/blobdiff - mkinitrd-suse.sh
network-manager: remove useless use of basename
[thirdparty/dracut.git] / mkinitrd-suse.sh
index d20270a662a68fc92feee3c9c93eb86dba6c40c0..fd852e7177451b52750da35a98bce5683802b376 100755 (executable)
@@ -1,8 +1,6 @@
 #!/bin/bash --norc
-# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
-# ex: ts=8 sw=4 sts=4 et filetype=sh
 #
-# mkinitrd compability wrapper for SUSE.
+# mkinitrd compatibility wrapper for SUSE.
 #
 # Copyright (c) 2013 SUSE Linux Products GmbH. All rights reserved.
 #
@@ -22,8 +20,6 @@
 
 boot_dir="/boot"
 quiet=0
-host_only=1
-force=0
 logfile=/var/log/YaST2/mkinitrd.log
 dracut_cmd=dracut
 
@@ -66,14 +62,11 @@ usage () {
     $cmd "                             /etc/sysconfig/kernel."
     $cmd "     -d root_device          Root device. Defaults to the device from"
     $cmd "                             which / is mounted. Overrides the rootdev"
-    $cmd "                             enviroment variable if set."
+    $cmd "                             environment variable if set."
     $cmd "     -j device               Journal device"
     $cmd "     -D interface            Run dhcp on the specified interface."
     $cmd "     -I interface            Configure the specified interface statically."
-    $cmd "     -a acpi_dsdt            Attach compiled ACPI DSDT (Differentiated"
-    $cmd "                             System Description Table) to initrd. This"
-    $cmd "                             replaces the DSDT of the BIOS. Defaults to"
-    $cmd "                             the ACPI_DSDT variable in /etc/sysconfig/kernel."
+    $cmd "     -a acpi_dsdt            Obsolete, do not use."
     $cmd "     -s size                 Add splash animation and bootscreen to initrd."
 
     [[ $1 = '-n' ]] && exit 0
@@ -111,7 +104,7 @@ calc_netmask() {
     local prefix=$1
 
     [ -z "$prefix" ] && return
-    mask=$(echo "(2 ^ 32) - (2 ^ $prefix)" | bc -l)
+    mask=$(( 0xffffffff << (32 - $prefix) ))
     byte1=$(( mask >> 24 ))
     byte2=$(( mask >> 16 ))
     byte3=$(( mask >> 8 ))
@@ -152,6 +145,19 @@ is_xen_kernel() {
     return
 }
 
+kernel_version_from_image() {
+    local dir="${1%/*}/"
+    [[ "$dir" != "$1" ]] || dir=""
+    local kernel_image="$1" kernel_image_gz="${dir}vmlinux-${1#*-}.gz"
+    echo kernel_image_gz="'$kernel_image_gz'" >&2
+
+    if get_kernel_version "$kernel_image" 2>/dev/null; then
+        return
+    fi
+
+    # As a last resort, try vmlinux-$version.gz, which might be around
+    get_kernel_version "$kernel_image_gz" 2>/dev/null
+}
 
 # Taken over from SUSE mkinitrd
 default_kernel_images() {
@@ -171,7 +177,7 @@ default_kernel_images() {
         arm*)
             regex='[uz]Image'
             ;;
-        aarch64)
+        aarch64|riscv64)
             regex='Image'
             ;;
         *)  regex='vmlinu.'
@@ -190,7 +196,8 @@ default_kernel_images() {
 
         [ -L "$boot_dir/$kernel_image" ] && continue
         [ "${kernel_image%%.gz}" != "$kernel_image" ] && continue
-        kernel_version=$(/usr/bin/get_kernel_version \
+
+        kernel_version=$(kernel_version_from_image \
                          $boot_dir/$kernel_image 2> /dev/null)
         initrd_image=$(echo $kernel_image | sed -e "s|${regex}|initrd|")
         if [ "$kernel_image" != "$initrd_image" -a \
@@ -206,8 +213,6 @@ default_kernel_images() {
     for initrd_image in $initrd_images;do
        targets="$targets $initrd_image"
     done
-    host_only=1
-    force=1
 }
 
 while (($# > 0)); do
@@ -218,13 +223,13 @@ while (($# > 0)); do
        -k) # Would be nice to get a list of images here
            read_arg kernel_images "$@" || shift $?
            for kernel_image in $kernel_images;do
+               [ -L "/boot/$kernel_image" ] && kernel_image="$(readlink "/boot/$kernel_image")"
                kernels="$kernels ${kernel_image#*-}"
            done
-           host_only=1
-           force=1
            ;;
        -i) read_arg initrd_images "$@" || shift $?
            for initrd_image in $initrd_images;do
+               [ -L "/boot/$initrd_image" ] && initrd_image="$(readlink "/boot/$initrd_image")"
                # Check if the initrd_image contains a path.
                # if not, then add the default boot_dir
                dname=`dirname $initrd_image`
@@ -246,7 +251,7 @@ while (($# > 0)); do
            ;;
        -M) read_arg map_file "$@" || shift $?
            ;;
-       -A) host_only=0;;
+       -A) dracut_args="${dracut_args} --no-host-only";;
        -B) skip_update_bootloader=1;;
         -v|--verbose) dracut_args="${dracut_args} -v";;
        -L) logfile=;;
@@ -263,7 +268,7 @@ while (($# > 0)); do
            dracut_cmdline="${dracut_cmdline} ip=$(ipconfig $static_if)":
            ;;
        -a) read_arg acpi_dsdt "$@" || shift $?
-           echo "mkinitrd: custom DSDT not yet supported"
+           echo "Obsolete -a param, use acpi_table_dir= and acpi_override= variables in /etc/dracut.conf.d/"
            exit 1
            ;;
        -s) read_arg boot_splash "$@" || shift $?
@@ -277,7 +282,6 @@ while (($# > 0)); do
         --version|-R)
             echo "mkinitrd: dracut compatibility wrapper"
             exit 0;;
-        --force) force=1;;
        --quiet|-q) quiet=1;;
         *)  if [[ ! $targets ]]; then
             targets=$1
@@ -291,15 +295,18 @@ while (($# > 0)); do
 done
 
 [[ $targets && $kernels ]] || default_kernel_images
-[[ $targets && $kernels ]] || (error "No kernel found in $boot_dir" && usage)
+if [[ ! $targets || ! $kernels ]];then
+    error "No kernel found in $boot_dir or bad modules dir in /lib/modules"
+    exit 1
+fi
 
 # We can have several targets/kernels, transform the list to an array
 targets=( $targets )
 [[ $kernels ]] && kernels=( $kernels )
 
 [[ $logfile ]]        && dracut_args="${dracut_args} --logfile $logfile"
-[[ $host_only == 1 ]] && dracut_args="${dracut_args} --hostonly"
-[[ $force == 1 ]]     && dracut_args="${dracut_args} --force"
+dracut_args="${dracut_args} --force"
+
 [[ $dracut_cmdline ]] && dracut_args="${dracut_args} --kernel-cmdline ${dracut_cmdline}"
 [ -z "$(type -p update-bootloader)" ] && skip_update_bootloader=1
 
@@ -308,11 +315,11 @@ if [ -f /etc/sysconfig/kernel ] ; then
     . /etc/sysconfig/kernel
 fi
 [[ $module_list ]] || module_list="${INITRD_MODULES}"
-basicmodules="$basicmodules ${module_list}"
 [[ $domu_module_list ]] || domu_module_list="${DOMU_INITRD_MODULES}"
-[[ $acpi_dsdt ]] || acpi_dsdt="${ACPI_DSDT}"
+shopt -s extglob
+
+failed=""
 
-echo "Creating: target|kernel|dracut args|basicmodules "
 for ((i=0 ; $i<${#targets[@]} ; i++)); do
 
     if [[ $img_vers ]];then
@@ -322,28 +329,38 @@ for ((i=0 ; $i<${#targets[@]} ; i++)); do
     fi
     kernel="${kernels[$i]}"
 
+    if is_xen_kernel $kernel $rootfs ; then
+       modules_all="${module_list} ${domu_module_list}"
+    else
+        modules_all="${module_list}"
+    fi
+
+    # Remove leading and trailing spaces needs (set above): shopt -s extglob
+    modules_all=${modules_all%%+([[:space:]])}
+    modules_all=${modules_all##+([[:space:]])}
+
+    echo "Creating initrd: $target"
+
     # Duplicate code: No way found how to redirect output based on $quiet
     if [[ $quiet == 1 ]];then
-       echo "$target|$kernel|$dracut_args|$basicmodules"
-       if is_xen_kernel $kernel $rootfs ; then
-           basicmodules="$basicmodules ${domu_module_list}"
-       fi
-       if [[ $basicmodules ]]; then
-            $dracut_cmd $dracut_args --add-drivers "$basicmodules" "$target" \
-               "$kernel" &>/dev/null
-       else
+        # Duplicate code: --force-drivers must not be called with empty string
+        # -> dracut bug workarounded ugly, because of complex whitespace
+        # expansion magics
+        if [ -n "${modules_all}" ];then
+            $dracut_cmd $dracut_args --force-drivers "${modules_all}" "$target" "$kernel" &>/dev/null
+            [ $? -ne 0 ] && failed="$failed $target"
+        else
             $dracut_cmd $dracut_args "$target" "$kernel" &>/dev/null
-       fi
+            [ $? -ne 0 ] && failed="$failed $target"
+        fi
     else
-       if is_xen_kernel $kernel $rootfs ; then
-           basicmodules="$basicmodules ${domu_module_list}"
-       fi
-       if [[ $basicmodules ]]; then
-            $dracut_cmd $dracut_args --add-drivers "$basicmodules" "$target" \
-               "$kernel"
-       else
+        if [ -n "${modules_all}" ];then
+            $dracut_cmd $dracut_args --force-drivers "${modules_all}" "$target" "$kernel"
+            [ $? -ne 0 ] && failed="$failed $target"
+        else
             $dracut_cmd $dracut_args "$target" "$kernel"
-       fi
+            [ $? -ne 0 ] && failed="$failed $target"
+        fi
     fi
 done
 
@@ -351,4 +368,12 @@ if [ "$skip_update_bootloader" ] ; then
     echo 2>&1 "Did not refresh the bootloader. You might need to refresh it manually."
 else
     update-bootloader --refresh
+    [ $? -ne 0 ] && echo "Updating bootloader failed" && exit 1
 fi
+
+if [ "$failed" != "" ]; then
+    echo "Generating $failed targets failed"
+    exit 1
+fi
+
+exit 0