7a0a2dac1a
On some deployments install fails as we keep one FD open during install. This leads to hangs when Anaconda 'post' stage returns. On other deployments install fails as udev sometimes creates multiple links to the same devices in /dev/disk/by-path. We iterate through this list and, because they are not unique, we try to run flocks multiple times for the same device. Locking a device multiple times doesn't work, the second flock waits for first lock to release. This commit: o removes 'exec {stdout}>&1' from ks-functions.sh so it no longer opens FDs in 'post' stage. For the pre stage we open it only when needed; o makes sure that list of storage devices is unique; o increases timeout of udevadm settle from its default of 180s to 300s, the value used throughout Anaconda. This helps with slower hardware. Closes-Bug: 1889427 Change-Id: I348f10d96a78ea2c1c25fe6cf48462b0bc31fb84 Signed-off-by: Ovidiu Poncea <ovidiu.poncea@windriver.com>
156 lines
3.4 KiB
Bash
156 lines
3.4 KiB
Bash
# This file defines functions that can be used in %pre and %post kickstart sections, by including:
|
|
# . /tmp/ks-functions.sh
|
|
#
|
|
|
|
cat <<END_FUNCTIONS >/tmp/ks-functions.sh
|
|
#
|
|
# Copyright (c) xxxYEARxxx Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
function wlog()
|
|
{
|
|
[ -z "\$stdout" ] && stdout=1
|
|
local dt="\$(date "+%Y-%m-%d %H:%M:%S.%3N")"
|
|
echo "\$dt - \$1" >&\${stdout}
|
|
}
|
|
|
|
function get_by_path()
|
|
{
|
|
local disk=\$(cd /dev ; readlink -f \$1)
|
|
for p in /dev/disk/by-path/*; do
|
|
if [ "\$disk" = "\$(readlink -f \$p)" ]; then
|
|
echo \$p
|
|
return
|
|
fi
|
|
done
|
|
}
|
|
|
|
function get_disk()
|
|
{
|
|
echo \$(cd /dev ; readlink -f \$1)
|
|
}
|
|
|
|
function report_pre_failure_with_msg()
|
|
{
|
|
local msg=\$1
|
|
echo -e '\n\nInstallation failed.\n'
|
|
echo "\$msg"
|
|
|
|
exit 1
|
|
}
|
|
|
|
function report_post_failure_with_msg()
|
|
{
|
|
local msg=\$1
|
|
cat <<EOF >> /etc/motd
|
|
|
|
Installation failed.
|
|
\$msg
|
|
|
|
EOF
|
|
echo "\$msg" >/etc/platform/installation_failed
|
|
|
|
echo -e '\n\nInstallation failed.\n'
|
|
echo "\$msg"
|
|
|
|
exit 1
|
|
}
|
|
|
|
function report_post_failure_with_logfile()
|
|
{
|
|
local logfile=\$1
|
|
cat <<EOF >> /etc/motd
|
|
|
|
Installation failed.
|
|
Please see \$logfile for details of failure
|
|
|
|
EOF
|
|
echo \$logfile >/etc/platform/installation_failed
|
|
|
|
echo -e '\n\nInstallation failed.\n'
|
|
cat \$logfile
|
|
|
|
exit 1
|
|
}
|
|
|
|
function get_http_port()
|
|
{
|
|
echo \$(cat /proc/cmdline |xargs -n1 echo |grep '^inst.repo=' | sed -r 's#^[^/]*://[^/]*:([0-9]*)/.*#\1#')
|
|
}
|
|
|
|
function get_disk_dev()
|
|
{
|
|
local disk
|
|
# Detect HDD
|
|
for blk_dev in vda vdb sda sdb dda ddb hda hdb; do
|
|
if [ -d /sys/block/\$blk_dev ]; then
|
|
disk=\$(ls -l /sys/block/\$blk_dev | grep -v usb | head -n1 | sed 's/^.*\([vsdh]d[a-z]\+\).*$/\1/');
|
|
if [ -n \$disk ]; then
|
|
echo \$disk
|
|
return
|
|
fi
|
|
fi
|
|
done
|
|
for blk_dev in nvme0n1 nvme1n1; do
|
|
if [ -d /sys/block/\$blk_dev ]; then
|
|
disk=\$(ls -l /sys/block/\$blk_dev | grep -v usb | head -n1 | sed 's/^.*\(nvme[01]n1\).*$/\1/');
|
|
if [ -n \$disk ]; then
|
|
echo \$disk
|
|
return
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
function exec_no_fds()
|
|
{
|
|
# Close open FDs when executing commands that complain about leaked FDs.
|
|
local fds=\$1
|
|
local cmd=\$2
|
|
local retries=\$3
|
|
local interval=\$4
|
|
local ret_code=0
|
|
local ret_stdout=""
|
|
for fd in \$fds
|
|
do
|
|
local cmd="\$cmd \$fd>&-"
|
|
done
|
|
if [ -z "\$retries" ]; then
|
|
#wlog "Running command: '\$cmd'."
|
|
eval "\$cmd"
|
|
else
|
|
ret_stdout=\$(exec_retry "\$retries" "\$interval" "\$cmd")
|
|
ret_code=\$?
|
|
echo "\${ret_stdout}"
|
|
return \${ret_code}
|
|
fi
|
|
}
|
|
|
|
function exec_retry()
|
|
{
|
|
local retries=\$1
|
|
local interval=\$2
|
|
local cmd=\$3
|
|
let -i retry_count=1
|
|
local ret_code=0
|
|
local ret_stdout=""
|
|
cmd="\$cmd" # 2>&\$stdout"
|
|
while [ \$retry_count -le \$retries ]; do
|
|
#wlog "Running command: '\$cmd'."
|
|
ret_stdout=\$(eval \$cmd)
|
|
ret_code=\$?
|
|
[ \$ret_code -eq 0 ] && break
|
|
wlog "Error running command '\${cmd}'. Try \${retry_count} of \${retries} at \${interval}s."
|
|
wlog "ret_code: \${ret_code}, stdout: '\${ret_stdout}'."
|
|
sleep \$interval
|
|
let retry_count++
|
|
done
|
|
echo "\${ret_stdout}"
|
|
return \${ret_code}
|
|
}
|
|
|
|
END_FUNCTIONS
|
|
|