mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
This commit is based on the s390-tools-1.39.0 version. Changes on top of s390-tools-1.39.0: - Add MIT license to all source files - Add LICENSE file - Transform REAMDE to README.md (markdown) - Add AUTHORS.md file - Add CONTRIBUTING.md file - Move changelog from README to CHANGELOG.md file Reviewed-by: Stefan Haberland <sth@linux.vnet.ibm.com> Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
208 lines
4.0 KiB
Bash
208 lines
4.0 KiB
Bash
#!/bin/bash
|
|
#
|
|
# zdev-root-update
|
|
# Ensure that the persistent root device configuration is put into effect.
|
|
# On typical distributions this requires a rebuild of the initial ram disk
|
|
# and the re-installation of the IPL record referencing the ram disk.
|
|
#
|
|
# Parameters:
|
|
# zdev-root-update <devtype> <devid> [<devtype2> <devid2>...]
|
|
#
|
|
# Where <devtype> is the device type as used by chzdev and <devid> is the
|
|
# ID of the root device.
|
|
#
|
|
|
|
TOOLNAME=$(basename $0)
|
|
ZIPLCONF=/etc/zipl.conf
|
|
|
|
# die MESSAGE
|
|
# Print MESSAGE on standard error and exit with exit code 1
|
|
die()
|
|
{
|
|
echo "$TOOLNAME: Error: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
# add LIST NEW DELIM
|
|
# Add NEW to DELIM-separated LIST.
|
|
add()
|
|
{
|
|
local LIST="$1"
|
|
local NEW="$2"
|
|
local DELIM="$3"
|
|
|
|
if [ -z "$LIST" ] ; then
|
|
echo "$NEW"
|
|
else
|
|
echo "$LIST$DELIM$NEW"
|
|
fi
|
|
}
|
|
|
|
# add LIST NEW DELIM
|
|
# Add NEW to DELIM-separated LIST unless it is already in list.
|
|
add_unique()
|
|
{
|
|
local LIST="$1"
|
|
local NEW="$2"
|
|
local DELIM="$3"
|
|
local ENTRY
|
|
local FOUND
|
|
local IFS="$DELIM"
|
|
|
|
FOUND=0
|
|
for ENTRY in $LIST ; do
|
|
if [ "$ENTRY" == "$NEW" ] ; then
|
|
FOUND=1
|
|
break
|
|
fi
|
|
done
|
|
if [ "$FOUND" -eq 0 ] ; then
|
|
LIST=$(add "$LIST" "$NEW" "$DELIM")
|
|
fi
|
|
|
|
echo "$LIST"
|
|
}
|
|
|
|
# process CMDLINE
|
|
# Apply root device settings from globals DASD ZFCP and CIOIGNORE to CMDLINE
|
|
process_cmdline()
|
|
{
|
|
local CMDLINE="$1"
|
|
local ENTRY
|
|
local NEW
|
|
local FOUND_DASD=0
|
|
local FOUND_ZFCP=0
|
|
local V
|
|
local X
|
|
|
|
for ENTRY in $CMDLINE ; do
|
|
K=${ENTRY%%=*}
|
|
case "$K" in
|
|
dasd)
|
|
if [ ! -z "$DASD" ] ; then
|
|
NEW=$(add "$NEW" "dasd=$DASD" " ")
|
|
FOUND_DASD=1
|
|
fi
|
|
;;
|
|
zfcp.device)
|
|
if [ ! -z "$ZFCP" ] ; then
|
|
NEW=$(add "$NEW" "zfcp.device=$ZFCP" " ")
|
|
FOUND_ZFCP=1
|
|
fi
|
|
;;
|
|
cio_ignore)
|
|
V=${ENTRY#*=}
|
|
for X in $CIOIGNORE ; do
|
|
V=$(add_unique "$V" "$X" ",")
|
|
done
|
|
NEW=$(add "$NEW" "cio_ignore=$V" " ")
|
|
;;
|
|
*)
|
|
NEW=$(add "$NEW" "$ENTRY" " ")
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ "$FOUND_DASD" -eq 0 -a ! -z "$DASD" ] ; then
|
|
NEW=$(add "$NEW" "dasd=$DASD" " ")
|
|
fi
|
|
if [ "$FOUND_ZFCP" -eq 0 -a ! -z "$ZFCP" ] ; then
|
|
NEW=$(add "$NEW" "zfcp.device=$ZFCP" " ")
|
|
fi
|
|
|
|
echo "$NEW"
|
|
}
|
|
|
|
# process_file FILENAME
|
|
# Apply root device settings from globals DASD ZFCP and CIOIGNORE to kernel
|
|
# command line found in file FILENAME
|
|
process_file()
|
|
{
|
|
local FILENAME=$1
|
|
local CMDLINE
|
|
|
|
CMDLINE=$(cat $FILENAME)
|
|
CMDLINE=$(process_cmdline "$CMDLINE")
|
|
if ! echo $CMDLINE > "$FILENAME" ; then
|
|
die "Could not write to $FILENAME"
|
|
fi
|
|
}
|
|
|
|
# Build dasd= zfcp.device= and cio_ignore= parameter values
|
|
DASD=
|
|
ZFCP=
|
|
CIOIGNORE=
|
|
while [ $# -gt 0 ] ; do
|
|
TYPE=$1
|
|
ID=$2
|
|
if [ -z "$TYPE" -o -z "$ID" ] ; then
|
|
die "Incomplete parameters: $*"
|
|
fi
|
|
case $TYPE in
|
|
dasd-*)
|
|
DASD=$(add "$DASD" "$ID" ",")
|
|
CIOIGNORE=$(add "$CIOIGNORE" "!$ID" " ")
|
|
;;
|
|
zfcp-lun)
|
|
if [ ! -z "$ZFCP" ] ; then
|
|
die "Too many zFCP SCSI devices used for root device"
|
|
fi
|
|
ZFCP=$(echo $ID | sed -e 's/:/,/g')
|
|
FCPDEV=$(echo $ID | cut -d: -f1)
|
|
CIOIGNORE=$(add "$CIOIGNORE" "!$FCPDEV" " ")
|
|
;;
|
|
*)
|
|
die "Unsupported root device type: $TYPE"
|
|
;;
|
|
esac
|
|
shift 2
|
|
done
|
|
|
|
if [ -z "$DASD" -a -z "$ZFCP" ] ; then
|
|
die "No root device specified"
|
|
fi
|
|
|
|
if [ ! -r "$ZIPLCONF" ] ; then
|
|
die "Could not read $ZIPLCONF"
|
|
fi
|
|
|
|
# Create new zipl.conf file
|
|
echo "Updating $ZIPLCONF"
|
|
TMPFILE=$(mktemp zdev-zipl.conf.XXX)
|
|
[ $? -ne 0 ] && die "Could not create temporary file"
|
|
while read LINE ; do
|
|
OKEY=${LINE%%=*}
|
|
KEY=$(echo $OKEY)
|
|
case "$KEY" in
|
|
parameters)
|
|
V=$(echo ${LINE#*=} | sed -e 's/^"//' -e 's/"$//')
|
|
V=$(process_cmdline "$V")
|
|
echo "$OKEY=\"$V\""
|
|
;;
|
|
parmfile)
|
|
V=$(echo ${LINE#*=} | sed -e 's/^"//' -e 's/"$//')
|
|
process_file "$V"
|
|
echo "$LINE"
|
|
;;
|
|
*)
|
|
echo "$LINE"
|
|
;;
|
|
esac
|
|
done < "$ZIPLCONF" >"$TMPFILE"
|
|
|
|
|
|
# Swap new and old zipl.conf file
|
|
if ! mv "$ZIPLCONF" "${ZIPLCONF}.old" ; then
|
|
die "Could not rename $ZIPLCONF to ${ZIPLCONF}.old"
|
|
fi
|
|
if ! mv $TMPFILE $ZIPLCONF ; then
|
|
die "Could not rename $TMPFILE to $ZIPCONF"
|
|
fi
|
|
rm -f "${ZIPLCONF}.old"
|
|
|
|
# Install IPL loader
|
|
echo "Installing IPL record"
|
|
if ! zipl --noninteractive ; then
|
|
die "Could not install IPL record"
|
|
fi
|