]> git.ipfire.org Git - thirdparty/dracut.git/blobdiff - mkinitrd-suse.sh
90multipath: Start daemon after udev settle
[thirdparty/dracut.git] / mkinitrd-suse.sh
index c2b314f15101249f8d90eb8fb794eab63e7c2777..d9de81b9825b9f267dc6cf12a33463d82935a474 100755 (executable)
@@ -104,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 ))
@@ -145,6 +145,33 @@ is_xen_kernel() {
     return
 }
 
+# kernel_image_gz_from_image() and kernel_version_from_image() are helpers
+# for arm* kernels which produce zImage files which cannot be read from
+# get_kernel_version -> get rid of this workaround if possible
+kernel_image_gz_from_image() {
+    local arch=$(uname -i)
+    local r=${1}.gz
+
+    # uImage kernels can't be extracted directly. Use the vmlinux.gz instead
+    r=${r//uImage/vmlinux}
+
+    # on ARM a zImage can't be extracted directly. Other platforms define it
+    # as a gzipped vmlinux file, but not ARM. So only on ARM, use vmlinux.gz.
+    if [[ $arch =~ arm ]] || [[ $arch =~ aarch ]]; then
+        r=${r//zImage/vmlinux}
+    fi
+
+    echo $r
+}
+
+kernel_version_from_image() {
+    local kernel_image="$1" kernel_image_gz=$(kernel_image_gz_from_image "$1")
+
+    if get_kernel_version "$kernel_image" 2>/dev/null; then
+        return
+    fi
+    get_kernel_version "$kernel_image_gz" 2>/dev/null
+}
 
 # Taken over from SUSE mkinitrd
 default_kernel_images() {
@@ -183,7 +210,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 \
@@ -209,11 +237,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
            ;;
        -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`