mirror of
https://github.com/systemd/systemd.git
synced 2024-10-30 23:21:22 +03:00
d271c5d345
"BOOT" is misleading, because it sounds like this refers to /boot or $BOOT, when in fact it refers to some subdirectory. Those variable names are purely interal, so we can change them. $BOOT_DIR_ABS was used in NEWS, but it should not be (because it is an internal detail), so the old NEWS entry is reworded to use "entry directory".
129 lines
3.5 KiB
Bash
129 lines
3.5 KiB
Bash
#!/bin/bash
|
|
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
|
# ex: ts=8 sw=4 sts=4 et filetype=sh
|
|
|
|
COMMAND="$1"
|
|
KERNEL_VERSION="$2"
|
|
ENTRY_DIR_ABS="$3"
|
|
KERNEL_IMAGE="$4"
|
|
INITRD_OPTIONS_START="5"
|
|
|
|
if ! [[ $KERNEL_INSTALL_MACHINE_ID ]]; then
|
|
exit 0
|
|
fi
|
|
|
|
if ! [[ -d "$ENTRY_DIR_ABS" ]]; then
|
|
exit 0
|
|
fi
|
|
|
|
MACHINE_ID=$KERNEL_INSTALL_MACHINE_ID
|
|
|
|
ENTRY_DIR="/$MACHINE_ID/$KERNEL_VERSION"
|
|
BOOT_ROOT=${ENTRY_DIR_ABS%$ENTRY_DIR}
|
|
|
|
if [[ $COMMAND == remove ]]; then
|
|
rm -f "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf"
|
|
rm -f "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION+"*".conf"
|
|
exit 0
|
|
fi
|
|
|
|
if ! [[ $COMMAND == add ]]; then
|
|
exit 1
|
|
fi
|
|
|
|
if ! [[ $KERNEL_IMAGE ]]; then
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -f /etc/os-release ]]; then
|
|
. /etc/os-release
|
|
elif [[ -f /usr/lib/os-release ]]; then
|
|
. /usr/lib/os-release
|
|
fi
|
|
|
|
if ! [[ $PRETTY_NAME ]]; then
|
|
PRETTY_NAME="Linux $KERNEL_VERSION"
|
|
fi
|
|
|
|
declare -a BOOT_OPTIONS
|
|
|
|
if [[ -f /etc/kernel/cmdline ]]; then
|
|
read -r -d '' -a BOOT_OPTIONS < /etc/kernel/cmdline
|
|
fi
|
|
|
|
if ! [[ ${BOOT_OPTIONS[*]} ]]; then
|
|
read -r -d '' -a line < /proc/cmdline
|
|
for i in "${line[@]}"; do
|
|
[[ "${i#initrd=*}" != "$i" ]] && continue
|
|
BOOT_OPTIONS+=("$i")
|
|
done
|
|
fi
|
|
|
|
if ! [[ ${BOOT_OPTIONS[*]} ]]; then
|
|
echo "Could not determine the kernel command line parameters." >&2
|
|
echo "Please specify the kernel command line in /etc/kernel/cmdline!" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -f /etc/kernel/tries ]]; then
|
|
read -r TRIES </etc/kernel/tries
|
|
if ! [[ "$TRIES" =~ ^[0-9]+$ ]] ; then
|
|
echo "/etc/kernel/tries does not contain an integer." >&2
|
|
exit 1
|
|
fi
|
|
LOADER_ENTRY="$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION+$TRIES.conf"
|
|
else
|
|
LOADER_ENTRY="$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf"
|
|
fi
|
|
|
|
cp "$KERNEL_IMAGE" "$ENTRY_DIR_ABS/linux" &&
|
|
chown root:root "$ENTRY_DIR_ABS/linux" &&
|
|
chmod 0644 "$ENTRY_DIR_ABS/linux" || {
|
|
echo "Could not copy '$KERNEL_IMAGE to '$ENTRY_DIR_ABS/linux'." >&2
|
|
exit 1
|
|
}
|
|
|
|
INITRD_OPTIONS=( "${@:${INITRD_OPTIONS_START}}" )
|
|
|
|
for initrd in "${INITRD_OPTIONS[@]}"; do
|
|
if [[ -f "${initrd}" ]]; then
|
|
initrd_basename="$(basename ${initrd})"
|
|
[ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && \
|
|
echo "Installing $ENTRY_DIR_ABS/${initrd_basename}"
|
|
cp "${initrd}" "$ENTRY_DIR_ABS/${initrd_basename}" &&
|
|
chown root:root "$ENTRY_DIR_ABS/${initrd_basename}" &&
|
|
chmod 0644 "$ENTRY_DIR_ABS/${initrd_basename}" || {
|
|
echo "Could not copy '${initrd}' to '$ENTRY_DIR_ABS/${initrd_basename}'." >&2
|
|
exit 1
|
|
}
|
|
fi
|
|
done
|
|
|
|
# If no initrd option is supplied, fallback to "initrd" which is
|
|
# the name used by dracut when generating it in its kernel-install hook
|
|
[[ ${#INITRD_OPTIONS[@]} == 0 ]] && INITRD_OPTIONS=( initrd )
|
|
|
|
mkdir -p "${LOADER_ENTRY%/*}" || {
|
|
echo "Could not create loader entry directory '${LOADER_ENTRY%/*}'." >&2
|
|
exit 1
|
|
}
|
|
|
|
[ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && \
|
|
echo "Creating $LOADER_ENTRY"
|
|
{
|
|
echo "title $PRETTY_NAME"
|
|
echo "version $KERNEL_VERSION"
|
|
echo "machine-id $MACHINE_ID"
|
|
echo "options ${BOOT_OPTIONS[*]}"
|
|
echo "linux $ENTRY_DIR/linux"
|
|
for initrd in "${INITRD_OPTIONS[@]}"; do
|
|
[[ -f $ENTRY_DIR_ABS/$(basename ${initrd}) ]] && \
|
|
echo "initrd $ENTRY_DIR/$(basename ${initrd})"
|
|
done
|
|
:
|
|
} > "$LOADER_ENTRY" || {
|
|
echo "Could not create loader entry '$LOADER_ENTRY'." >&2
|
|
exit 1
|
|
}
|
|
exit 0
|