s390utils/s390-tools-add-zipl-switch-...

301 lines
8.3 KiB
Diff

From 24369c7677048518858dfbc6d5e609f64a42eff6 Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
Date: Wed, 2 May 2018 12:27:05 +0200
Subject: [PATCH] scripts: Add script to switch zipl config to a
BootLoaderSpec setup
Add a zipl-switch-to-blscfg script that can be used to switch the zipl
configuration in a system to use the BootLoaderSpec (BLS) config files
to define the IPL sections instead of having them defined in zipl.conf.
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
---
scripts/Makefile | 4 +-
scripts/zipl-switch-to-blscfg | 207 ++++++++++++++++++++++++++++++++
scripts/zipl-switch-to-blscfg.1 | 45 +++++++
3 files changed, 254 insertions(+), 2 deletions(-)
create mode 100755 scripts/zipl-switch-to-blscfg
create mode 100644 scripts/zipl-switch-to-blscfg.1
diff --git a/scripts/Makefile b/scripts/Makefile
index dc5b0f0dbe7..1a33e319693 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -1,7 +1,7 @@
include ../common.mak
-SCRIPTS = dbginfo.sh zfcpdbf scsi_logging_level
-MAN_PAGES = dbginfo.sh.1 zfcpdbf.1
+SCRIPTS = dbginfo.sh zfcpdbf zipl-switch-to-blscfg scsi_logging_level
+MAN_PAGES = dbginfo.sh.1 zfcpdbf.1 zipl-switch-to-blscfg.1
all:
diff --git a/scripts/zipl-switch-to-blscfg b/scripts/zipl-switch-to-blscfg
new file mode 100755
index 00000000000..871935c783f
--- /dev/null
+++ b/scripts/zipl-switch-to-blscfg
@@ -0,0 +1,207 @@
+#!/bin/bash
+#
+# zipl-switch-to-blscfg - Switch zipl to use BootLoaderSpec configuration
+#
+# Copyright 2018 Red Hat, Inc.
+#
+# s390-tools is free software; you can redistribute it and/or modify
+# it under the terms of the MIT license. See LICENSE for details.
+#
+
+readonly SCRIPTNAME="${0##*/}"
+
+declare -A zipl_to_bls
+zipl_to_bls["image"]="linux"
+zipl_to_bls["ramdisk"]="initrd"
+zipl_to_bls["parameters"]="options"
+
+print_error() {
+ echo "$1" >&2
+ exit 1
+}
+
+function on_exit() {
+ if ! rm -rf $TMP; then
+ echo "Delete temporary files failed!" >&2
+ exit 1
+ fi
+}
+
+if ! TMP="$(mktemp -d)"; then
+ print_error "Creating a temporary dir for config files failed!"
+fi
+
+trap 'on_exit' EXIT
+
+print_version() {
+ cat <<EOF
+${SCRIPTNAME}: version %S390_TOOLS_VERSION%
+Copyright Red Hat, Inc. 2018
+EOF
+}
+
+print_usage()
+{
+ print_version
+
+ cat <<EOF
+
+Usage: ${SCRIPTNAME} [OPTIONS]
+
+Switches the zipl boot-loader configuration to use BootLoaderSpec files.
+
+Options:
+
+ -h, --help print this help and exit
+ -v, --version print version information and exit
+ --backup-suffix=SUFFIX suffix used for backup files, defaults to .bak
+ --bls-directory=DIR path to generate BLS files, defaults to /boot/loader/entries
+ --config-file=FILE path to zipl configuration file, defaults to /etc/zipl.conf
+ --ignore-default ignore the default option from the zipl configuration file
+ --use-version-name use the section kernel version as the BLS file name
+
+EOF
+}
+
+OPTS="$(getopt -o hv --long help,version,backup-suffix:,bls-directory:,config-file:,\
+ignore-default,use-version-name -n \'$SCRIPTNAME\' -- "$@")"
+eval set -- "$OPTS"
+
+BACKUP_SUFFIX=.bak
+BLS_DIR="/boot/loader/entries"
+CMDLINE_LINUX_DEBUG=" systemd.log_level=debug systemd.log_target=kmsg"
+LINUX_DEBUG_VERSION_POSTFIX="_with_debugging"
+LINUX_DEBUG_TITLE_POSTFIX=" with debugging"
+CONFIG="/etc/zipl.conf"
+
+while [ ${#} -gt 0 ]; do
+ case "$1" in
+ --help|-h)
+ print_usage
+ exit 0
+ ;;
+ --version|-v)
+ print_version
+ exit 0
+ ;;
+ --backup-suffix)
+ BACKUP_SUFFIX=${2}
+ shift
+ ;;
+ --bls-directory)
+ BLS_DIR=${2}
+ shift
+ ;;
+ --config-file)
+ CONFIG=${2}
+ shift
+ ;;
+ --ignore-default)
+ ignore_default=true
+ ;;
+ --use-version-name)
+ version_name=true
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ echo >&2
+ echo "${SCRIPTNAME}: invalid option \"${1}\"" >&2
+ echo "Try '${SCRIPTNAME} --help' for more information" >&2
+ echo >&2
+ exit 1
+ ;;
+ esac
+ shift
+done
+
+TMP_CONFIG="${TMP}/${CONFIG##*/}"
+
+[[ -d "$BLS_DIR" ]] || mkdir -m 0700 -p "$BLS_DIR"
+
+if [ -f /etc/machine-id ]; then
+ read MACHINE_ID < /etc/machine-id
+ MACHINE_ID=${MACHINE_ID}-
+fi
+
+count=0
+OUTPUT=""
+TARGET=""
+while IFS='= ' read key val; do
+ # for BLS the default kernel is always the latest one
+ if [[ $key == \#* ]] || [[ $key == "default" && $ignore_default == true ]]; then
+ continue
+ fi
+
+ # remove spaces
+ key="$(echo $key | sed -e 's/^[ \t"]*//;s/[ \t"]*$//')"
+
+ if [[ $key = \[*] ]]; then
+ if [[ $key == "[defaultboot]" ]]; then
+ OUTPUT=${TMP_CONFIG}
+ echo $key >> ${OUTPUT}
+ else
+ key="${key%\]}"
+ key="${key#\[}"
+ OUTPUT=${BLS_DIR}/${MACHINE_ID}${key}.conf
+ if [ -f "${OUTPUT}" ]; then
+ print_error "BLS file ${OUTPUT} already exists"
+ fi
+ fi
+ elif [[ $val ]]; then
+ val="$(echo $val | sed -e 's/^[ \t"]*//;s/[ \t"]*$//')"
+ if [[ $key == "target" ]]; then
+ if [ -z ${TARGET} ]; then
+ echo $key=$val >> ${TMP_CONFIG}
+ TARGET=$val
+ else if [ "${TARGET}" != "${val}" ]; then
+ print_error "BLS is only supported if all sections have the same target"
+ fi
+ fi
+ else
+ if [ -n "${zipl_to_bls[$key]}" ]; then
+ if [[ $key = "image" ]]; then
+ if [[ $val = *"vmlinuz-"* ]]; then
+ version="${val##*/vmlinuz-}"
+ else
+ version="${val##*/}"
+ fi
+ echo "version $version" >> ${OUTPUT}
+ if [[ $version = *"rescue"* ]]; then
+ FILENAME=${BLS_DIR}/${MACHINE_ID}0-rescue.conf
+ else
+ FILENAME=${BLS_DIR}/${MACHINE_ID}${version}.conf
+ fi
+
+ if [[ ${OUTPUT} != ${FILENAME} && $version_name == true ]]; then
+ mv ${OUTPUT} ${FILENAME}
+ if [ ! $? -eq 0 ]; then
+ print_error "Creating BLS file ${FILENAME} failed"
+ fi
+ OUTPUT=${FILENAME}
+ fi
+ fi
+
+ echo "${zipl_to_bls[$key]} ${val}" >> ${OUTPUT}
+ else
+ echo $key=$val >> ${TMP_CONFIG}
+ fi
+ fi
+ fi
+done < "${CONFIG}"
+
+if [ -f "${CONFIG}${BACKUP_SUFFIX}" ]; then
+ print_error "Backup file ${CONFIG}${BACKUP_SUFFIX} already exists"
+fi
+
+cp -af "${CONFIG}" "${CONFIG}${BACKUP_SUFFIX}"
+mv "${TMP_CONFIG}" "${CONFIG}"
+
+zipl > /dev/null
+if [ ! $? -eq 0 ]; then
+ mv "${CONFIG}${BACKUP_SUFFIX}" "${CONFIG}"
+fi
+
+exit 0
diff --git a/scripts/zipl-switch-to-blscfg.1 b/scripts/zipl-switch-to-blscfg.1
new file mode 100644
index 00000000000..6bd14d00d14
--- /dev/null
+++ b/scripts/zipl-switch-to-blscfg.1
@@ -0,0 +1,45 @@
+.TH ZIPL-SWITCH-TO-BLSCFG 1 "April 2018" "s390-tools"
+
+.SH NAME
+zipl-switch-to-blscfg \- Switch zipl to use BootLoaderSpec configuration
+
+.SH SYNOPSIS
+.br
+\fBzipl-switch-to-blscfg\fP [OPTIONS]
+.br
+\fBzipl-switch-to-blscfg\fP {\-h|\-v}
+
+.SH DESCRIPTION
+This script switches the zipl boot-loader configuration to use BootLoaderSpec files
+to define IPL sections. For each Linux kernel defined in the zipl.conf config file,
+a BLS fragment is generated in the BLS directory specified. Also, the zipl.conf is
+modified it only contains global configurations, all IPL sections comes from BLS.
+
+.SH OPTIONS
+.TP
+\fB\-h\fP, \fB\-\-help\fP
+Print this help and exit
+
+.TP
+\fB\-v\fP, \fB\-\-version\fP
+Print version information and exit
+
+.TP
+\fB\-\-backup-suffix <SUFFIX>\fP
+The suffix used for backup files, defaults to .bak.
+
+.TP
+\fB\-\-bls-directory <DIRECTORY>\fP
+The DIRECTORY where the BLS fragments will be generated. The directory is created if it doesn't exists, by default /boot/loader/entries is used.
+
+.TP
+\fB\-\-config-file <FILE>\fP
+The FILE used for zipl configuration file, defaults to /etc/zipl.conf.
+
+.TP
+\fB\-\-ignore-default\fP
+Ignore the default option from the zipl configuration file
+
+.TP
+\fB\-\-use-version-name\fP
+Use the section kernel version as the BLS file name
--
2.17.0