summaryrefslogtreecommitdiffstats
path: root/install.d/50-dracut.install
blob: 441414ac3259d7508651ca54e9ae02d46e7b67be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/bin/bash

COMMAND="$1"
KERNEL_VERSION="$2"
BOOT_DIR_ABS="$3"
KERNEL_IMAGE="$4"

# If KERNEL_INSTALL_MACHINE_ID is defined but empty, BOOT_DIR_ABS is a fake directory.
# So, let's skip to create initrd.
if ! [[ ${KERNEL_INSTALL_MACHINE_ID-x} ]]; then
    exit 0
fi

# Do not attempt to create initramfs if the supplied image is already a UKI
if [[ "$KERNEL_INSTALL_IMAGE_TYPE" = "uki" ]]; then
    exit 0
fi

# Mismatching the install layout and the --uefi/--no-uefi opts just creates a mess.
if [[ $KERNEL_INSTALL_LAYOUT == "uki" && -n $KERNEL_INSTALL_STAGING_AREA ]]; then
    BOOT_DIR_ABS="$KERNEL_INSTALL_STAGING_AREA"
    if [[ -z $KERNEL_INSTALL_UKI_GENERATOR || $KERNEL_INSTALL_UKI_GENERATOR == "dracut" ]]; then
        # No uki generator preference set or we have been chosen
        IMAGE="uki.efi"
        UEFI_OPTS="--uefi"
    elif [[ -z $KERNEL_INSTALL_INITRD_GENERATOR || $KERNEL_INSTALL_INITRD_GENERATOR == "dracut" ]]; then
        # We aren't the uki generator, but we have been requested to make the initrd
        IMAGE="initrd"
        UEFI_OPTS="--no-uefi"
    else
        exit 0
    fi
elif [[ $KERNEL_INSTALL_LAYOUT == "bls" && -n $KERNEL_INSTALL_STAGING_AREA ]]; then
    BOOT_DIR_ABS="$KERNEL_INSTALL_STAGING_AREA"
    if [[ -z $KERNEL_INSTALL_INITRD_GENERATOR || $KERNEL_INSTALL_INITRD_GENERATOR == "dracut" ]]; then
        IMAGE="initrd"
        UEFI_OPTS="--no-uefi"
    else
        exit 0
    fi
else
    # No layout information, use users --uefi/--no-uefi preference
    UEFI_OPTS=""
    if [[ -d $BOOT_DIR_ABS ]]; then
        IMAGE="initrd"
    else
        BOOT_DIR_ABS="/boot"
        IMAGE="initramfs-${KERNEL_VERSION}.img"
    fi
fi

ret=0

case "$COMMAND" in
    add)
        if [[ $IMAGE == "uki.efi" ]]; then
            IMAGE_PREGENERATED=${KERNEL_IMAGE%/*}/uki.efi
        else
            IMAGE_PREGENERATED=${KERNEL_IMAGE%/*}/initrd
        fi
        if [[ -f ${IMAGE_PREGENERATED} ]]; then
            # we found an initrd or uki.efi at the same place as the kernel
            # use this and don't generate a new one
            [[ $KERNEL_INSTALL_VERBOSE == 1 ]] && echo \
                "There is an ${IMAGE} image at the same place as the kernel, skipping generating a new one"
            cp --reflink=auto "$IMAGE_PREGENERATED" "$BOOT_DIR_ABS/$IMAGE" \
                && chown root:root "$BOOT_DIR_ABS/$IMAGE" \
                && chmod 0600 "$BOOT_DIR_ABS/$IMAGE" \
                && exit 0
        fi

        if [ -n "$KERNEL_INSTALL_CONF_ROOT" ]; then
            if [ -f "$KERNEL_INSTALL_CONF_ROOT/cmdline" ]; then
                read -r -d '' -a BOOT_OPTIONS < "$KERNEL_INSTALL_CONF_ROOT/cmdline"
            fi
        elif [[ -f /etc/kernel/cmdline ]]; then
            read -r -d '' -a BOOT_OPTIONS < /etc/kernel/cmdline
        elif [[ -f /usr/lib/kernel/cmdline ]]; then
            read -r -d '' -a BOOT_OPTIONS < /usr/lib/kernel/cmdline
        else
            declare -a BOOT_OPTIONS

            read -r -d '' -a line < /proc/cmdline
            for i in "${line[@]}"; do
                [[ ${i#initrd=*} != "$i" ]] && continue
                BOOT_OPTIONS+=("$i")
            done
        fi

        unset noimageifnotneeded

        for ((i = 0; i < "${#BOOT_OPTIONS[@]}"; i++)); do
            # shellcheck disable=SC1001
            if [[ ${BOOT_OPTIONS[$i]} == root\=PARTUUID\=* ]]; then
                noimageifnotneeded="yes"
                break
            fi
        done

        # shellcheck disable=SC2046
        dracut -f \
            ${noimageifnotneeded:+--noimageifnotneeded} \
            $([[ $KERNEL_INSTALL_VERBOSE == 1 ]] && echo --verbose) \
            $([[ -n $KERNEL_IMAGE ]] && echo --kernel-image "$KERNEL_IMAGE") \
            "$UEFI_OPTS" \
            --kver "$KERNEL_VERSION" \
            "$BOOT_DIR_ABS/$IMAGE"
        ret=$?
        ;;

    remove)
        rm -f -- "$BOOT_DIR_ABS/$IMAGE"
        ret=$?
        ;;
esac

exit $ret