2011-08-01 09:19:24 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
2012-01-27 14:59:43 +00:00
|
|
|
. $dracutfunctions
|
2013-09-24 13:33:27 +00:00
|
|
|
. /lib/kdump/kdump-lib.sh
|
2012-01-27 14:59:43 +00:00
|
|
|
|
2015-02-12 06:40:27 +00:00
|
|
|
if ! [[ -d "${initdir}/tmp" ]]; then
|
|
|
|
mkdir -p "${initdir}/tmp"
|
|
|
|
fi
|
|
|
|
|
2011-08-01 09:19:24 +00:00
|
|
|
check() {
|
|
|
|
[[ $debug ]] && set -x
|
|
|
|
#kdumpctl sets this explicitly
|
|
|
|
if [ -z "$IN_KDUMP" ] || [ ! -f /etc/kdump.conf ]
|
|
|
|
then
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2012-01-27 14:59:43 +00:00
|
|
|
depends() {
|
2013-06-05 08:01:17 +00:00
|
|
|
local _dep="base shutdown"
|
|
|
|
|
2013-06-13 08:44:23 +00:00
|
|
|
if [ -d /sys/module/drm/drivers ]; then
|
|
|
|
_dep="$_dep drm"
|
|
|
|
fi
|
|
|
|
|
2014-04-02 08:33:47 +00:00
|
|
|
if [ is_generic_fence_kdump -o is_pcs_fence_kdump ]; then
|
2013-12-20 09:41:29 +00:00
|
|
|
_dep="$_dep network"
|
|
|
|
fi
|
|
|
|
|
2013-06-05 08:01:17 +00:00
|
|
|
echo $_dep
|
2012-01-27 14:59:43 +00:00
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2012-05-14 02:36:18 +00:00
|
|
|
kdump_to_udev_name() {
|
2013-03-05 08:07:39 +00:00
|
|
|
local dev="${1//\"/}"
|
2011-08-01 15:40:35 +00:00
|
|
|
|
|
|
|
case "$dev" in
|
|
|
|
UUID=*)
|
|
|
|
dev=`blkid -U "${dev#UUID=}"`
|
|
|
|
;;
|
|
|
|
LABEL=*)
|
|
|
|
dev=`blkid -L "${dev#LABEL=}"`
|
|
|
|
;;
|
|
|
|
esac
|
2012-09-20 03:03:14 +00:00
|
|
|
echo $(get_persistent_dev "$dev")
|
2011-08-01 15:40:35 +00:00
|
|
|
}
|
|
|
|
|
2012-05-14 02:36:18 +00:00
|
|
|
kdump_is_bridge() {
|
2012-01-27 14:59:43 +00:00
|
|
|
[ -d /sys/class/net/"$1"/bridge ]
|
|
|
|
}
|
|
|
|
|
2012-05-14 02:36:18 +00:00
|
|
|
kdump_is_bond() {
|
2012-01-27 14:59:43 +00:00
|
|
|
[ -d /sys/class/net/"$1"/bonding ]
|
2011-08-01 09:19:24 +00:00
|
|
|
}
|
|
|
|
|
2012-12-13 14:36:05 +00:00
|
|
|
kdump_is_team() {
|
|
|
|
[ -f /usr/bin/teamnl ] && teamnl $1 ports &> /dev/null
|
|
|
|
}
|
|
|
|
|
2012-06-10 10:24:36 +00:00
|
|
|
kdump_is_vlan() {
|
|
|
|
[ -f /proc/net/vlan/"$1" ]
|
|
|
|
}
|
|
|
|
|
2012-07-12 03:15:35 +00:00
|
|
|
# $1: netdev name
|
|
|
|
kdump_setup_dns() {
|
|
|
|
_dnsfile=${initdir}/etc/cmdline.d/42dns.conf
|
|
|
|
. /etc/sysconfig/network-scripts/ifcfg-$1
|
|
|
|
[ -n "$DNS1" ] && echo "nameserver=$DNS1" > "$_dnsfile"
|
|
|
|
[ -n "$DNS2" ] && echo "nameserver=$DNS2" >> "$_dnsfile"
|
|
|
|
}
|
|
|
|
|
2012-05-25 06:16:20 +00:00
|
|
|
#$1: netdev name
|
2014-05-27 14:45:40 +00:00
|
|
|
#$2: srcaddr
|
2012-05-25 06:16:20 +00:00
|
|
|
#if it use static ip echo it, or echo null
|
|
|
|
kdump_static_ip() {
|
2014-05-27 14:45:40 +00:00
|
|
|
local _netmask _gateway
|
|
|
|
local _netdev="$1" _srcaddr="$2"
|
|
|
|
local _ipaddr=$(ip addr show dev $_netdev permanent | \
|
|
|
|
awk "/ $_srcaddr\/.* $_netdev\$/{print \$2}")
|
|
|
|
if [ -n "$_ipaddr" ]; then
|
|
|
|
_netmask=$(ipcalc -m $_ipaddr | cut -d'=' -f2)
|
|
|
|
_gateway=$(ip route list dev $_netdev | awk '/^default /{print $3}')
|
|
|
|
echo -n "${_srcaddr}::${_gateway}:${_netmask}::"
|
2012-05-25 06:16:20 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2012-06-10 10:24:34 +00:00
|
|
|
kdump_get_mac_addr() {
|
2013-06-13 02:06:26 +00:00
|
|
|
cat /sys/class/net/$1/address
|
2012-06-10 10:24:34 +00:00
|
|
|
}
|
|
|
|
|
2012-12-13 14:36:05 +00:00
|
|
|
#Bonding or team master modifies the mac address
|
|
|
|
#of its slaves, we should use perm address
|
|
|
|
kdump_get_perm_addr() {
|
|
|
|
local addr=$(ethtool -P $1 | sed -e 's/Permanent address: //')
|
|
|
|
if [ -z "$addr" ] || [ "$addr" = "00:00:00:00:00:00" ]
|
|
|
|
then
|
|
|
|
derror "Can't get the permanent address of $1"
|
|
|
|
else
|
|
|
|
echo "$addr"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2012-06-10 10:24:34 +00:00
|
|
|
kdump_setup_bridge() {
|
|
|
|
local _netdev=$1
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
local _brif _dev _mac _kdumpdev
|
2012-06-10 10:24:34 +00:00
|
|
|
for _dev in `ls /sys/class/net/$_netdev/brif/`; do
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
_kdumpdev=$_dev
|
2013-04-08 10:02:21 +00:00
|
|
|
if kdump_is_bond "$_dev"; then
|
|
|
|
kdump_setup_bond "$_dev"
|
|
|
|
elif kdump_is_team "$_dev"; then
|
|
|
|
kdump_setup_team "$_dev"
|
|
|
|
elif kdump_is_vlan "$_dev"; then
|
|
|
|
kdump_setup_vlan "$_dev"
|
|
|
|
else
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
_mac=$(kdump_get_mac_addr $_dev)
|
|
|
|
_kdumpdev=$(kdump_setup_ifname $_dev)
|
|
|
|
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/41bridge.conf
|
2013-04-08 10:02:21 +00:00
|
|
|
fi
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
_brif+="$_kdumpdev,"
|
2012-06-10 10:24:34 +00:00
|
|
|
done
|
2013-06-13 02:06:28 +00:00
|
|
|
echo " bridge=$_netdev:$(echo $_brif | sed -e 's/,$//')" >> ${initdir}/etc/cmdline.d/41bridge.conf
|
2012-06-10 10:24:34 +00:00
|
|
|
}
|
|
|
|
|
2012-06-10 10:24:35 +00:00
|
|
|
kdump_setup_bond() {
|
|
|
|
local _netdev=$1
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
local _dev _mac _slaves _kdumpdev
|
2012-06-10 10:24:35 +00:00
|
|
|
for _dev in `cat /sys/class/net/$_netdev/bonding/slaves`; do
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
_mac=$(kdump_get_perm_addr $_dev)
|
|
|
|
_kdumpdev=$(kdump_setup_ifname $_dev)
|
|
|
|
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/42bond.conf
|
|
|
|
_slaves+="$_kdumpdev,"
|
2012-06-10 10:24:35 +00:00
|
|
|
done
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
echo -n " bond=$_netdev:$(echo $_slaves | sed 's/,$//')" >> ${initdir}/etc/cmdline.d/42bond.conf
|
2013-04-08 10:02:20 +00:00
|
|
|
# Get bond options specified in ifcfg
|
|
|
|
. /etc/sysconfig/network-scripts/ifcfg-$_netdev
|
|
|
|
bondoptions="$(echo :$BONDING_OPTS | sed 's/\s\+/,/')"
|
|
|
|
echo "$bondoptions" >> ${initdir}/etc/cmdline.d/42bond.conf
|
2012-06-10 10:24:35 +00:00
|
|
|
}
|
|
|
|
|
2012-12-13 14:36:05 +00:00
|
|
|
kdump_setup_team() {
|
|
|
|
local _netdev=$1
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
local _dev _mac _slaves _kdumpdev
|
2012-12-13 14:36:05 +00:00
|
|
|
for _dev in `teamnl $_netdev ports | awk -F':' '{print $2}'`; do
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
_mac=$(kdump_get_perm_addr $_dev)
|
|
|
|
_kdumpdev=$(kdump_setup_ifname $_dev)
|
|
|
|
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/44team.conf
|
|
|
|
_slaves+="$_kdumpdev,"
|
2012-12-13 14:36:05 +00:00
|
|
|
done
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
echo " team=$_netdev:$(echo $_slaves | sed -e 's/,$//')" >> ${initdir}/etc/cmdline.d/44team.conf
|
2012-12-13 14:36:05 +00:00
|
|
|
#Buggy version teamdctl outputs to stderr!
|
|
|
|
#Try to use the latest version of teamd.
|
2015-02-12 06:40:27 +00:00
|
|
|
teamdctl "$_netdev" config dump > ${initdir}/tmp/$$-$_netdev.conf
|
2012-12-13 14:36:05 +00:00
|
|
|
if [ $? -ne 0 ]
|
|
|
|
then
|
|
|
|
derror "teamdctl failed."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
inst_dir /etc/teamd
|
2015-02-12 06:40:27 +00:00
|
|
|
inst_simple ${initdir}/tmp/$$-$_netdev.conf "/etc/teamd/$_netdev.conf"
|
|
|
|
rm -f ${initdir}/tmp/$$-$_netdev.conf
|
2012-12-13 14:36:05 +00:00
|
|
|
}
|
|
|
|
|
2012-06-10 10:24:36 +00:00
|
|
|
kdump_setup_vlan() {
|
|
|
|
local _netdev=$1
|
|
|
|
local _phydev="$(awk '/^Device:/{print $2}' /proc/net/vlan/"$_netdev")"
|
|
|
|
local _netmac="$(kdump_get_mac_addr $_phydev)"
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
local _kdumpdev
|
2012-06-26 10:45:04 +00:00
|
|
|
|
|
|
|
#Just support vlan over bond, it is not easy
|
|
|
|
#to support all other complex setup
|
|
|
|
if kdump_is_bridge "$_phydev"; then
|
|
|
|
derror "Vlan over bridge is not supported!"
|
|
|
|
exit 1
|
2012-12-13 14:36:05 +00:00
|
|
|
elif kdump_is_team "$_phydev"; then
|
|
|
|
derror "Vlan over team is not supported!"
|
|
|
|
exit 1
|
2012-06-26 10:45:04 +00:00
|
|
|
elif kdump_is_bond "$_phydev"; then
|
|
|
|
kdump_setup_bond "$_phydev"
|
2014-07-22 07:54:14 +00:00
|
|
|
echo " vlan=$_netdev:$_phydev" > ${initdir}/etc/cmdline.d/43vlan.conf
|
2012-06-26 10:45:04 +00:00
|
|
|
else
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
_kdumpdev="$(kdump_setup_ifname $_phydev)"
|
|
|
|
echo " vlan=$_netdev:$_kdumpdev ifname=$_kdumpdev:$_netmac" > ${initdir}/etc/cmdline.d/43vlan.conf
|
2012-06-26 10:45:04 +00:00
|
|
|
fi
|
2012-06-10 10:24:36 +00:00
|
|
|
}
|
|
|
|
|
2012-06-22 06:50:40 +00:00
|
|
|
# setup s390 znet cmdline
|
|
|
|
# $1: netdev name
|
|
|
|
kdump_setup_znet() {
|
|
|
|
local _options=""
|
|
|
|
. /etc/sysconfig/network-scripts/ifcfg-$1
|
|
|
|
for i in $OPTIONS; do
|
|
|
|
_options=${_options},$i
|
|
|
|
done
|
|
|
|
echo rd.znet=${NETTYPE},${SUBCHANNELS}${_options} > ${initdir}/etc/cmdline.d/30znet.conf
|
|
|
|
}
|
|
|
|
|
2014-08-18 08:34:53 +00:00
|
|
|
get_routes() {
|
|
|
|
local _netdev="$1" _target="$2"
|
2014-12-05 06:46:15 +00:00
|
|
|
local _route _nexthop
|
2014-08-18 08:34:53 +00:00
|
|
|
|
|
|
|
_route=`/sbin/ip route get to $_target 2>&1`
|
2014-12-05 06:46:15 +00:00
|
|
|
#
|
|
|
|
# in the same subnet region, following is the route format
|
|
|
|
# _route='192.168.200.137 dev eth1 src 192.168.200.129
|
|
|
|
# cache '
|
|
|
|
#
|
|
|
|
# in the different subnet region, following is the route format
|
|
|
|
# _route='192.168.201.215 via 192.168.200.137 dev eth1 src 192.168.200.129
|
|
|
|
# cache '
|
|
|
|
#
|
|
|
|
if `echo $_route | grep -q "via"`; then
|
2014-08-18 08:34:53 +00:00
|
|
|
# route going to a different subnet via a router
|
2014-12-05 06:46:15 +00:00
|
|
|
_nexthop=`echo $_route | awk '{print $3}'`
|
2014-08-18 08:34:53 +00:00
|
|
|
fi
|
2014-12-05 06:46:15 +00:00
|
|
|
_netdev=$(kdump_setup_ifname $_netdev)
|
2014-08-18 08:34:53 +00:00
|
|
|
|
2014-12-05 06:46:15 +00:00
|
|
|
echo "rd.route=$_target:$_nexthop:$_netdev" >> ${initdir}/etc/cmdline.d/45route-static.conf
|
2014-08-18 08:34:53 +00:00
|
|
|
}
|
|
|
|
|
2012-05-22 21:34:02 +00:00
|
|
|
# Setup dracut to bringup a given network interface
|
|
|
|
kdump_setup_netdev() {
|
2014-08-18 08:34:53 +00:00
|
|
|
local _netdev=$1 _srcaddr=$2 _target=$3
|
2013-12-20 10:06:17 +00:00
|
|
|
local _static _proto _ip_conf _ip_opts _ifname_opts
|
2012-05-22 21:34:02 +00:00
|
|
|
|
2012-06-22 06:50:40 +00:00
|
|
|
if [ "$(uname -m)" = "s390x" ]; then
|
|
|
|
kdump_setup_znet $_netdev
|
|
|
|
fi
|
|
|
|
|
2013-06-13 02:06:27 +00:00
|
|
|
_netmac=$(kdump_get_mac_addr $_netdev)
|
2014-05-27 14:45:40 +00:00
|
|
|
_static=$(kdump_static_ip $_netdev $_srcaddr)
|
2012-05-25 06:16:20 +00:00
|
|
|
if [ -n "$_static" ]; then
|
|
|
|
_proto=none
|
|
|
|
else
|
|
|
|
_proto=dhcp
|
|
|
|
fi
|
|
|
|
|
2014-08-18 08:34:53 +00:00
|
|
|
get_routes $_netdev $_target
|
|
|
|
|
2013-12-20 10:06:17 +00:00
|
|
|
_ip_conf="${initdir}/etc/cmdline.d/40ip.conf"
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
_ip_opts=" ip=${_static}$(kdump_setup_ifname $_netdev):${_proto}"
|
2013-12-20 10:06:17 +00:00
|
|
|
|
|
|
|
# dracut doesn't allow duplicated configuration for same NIC, even they're exactly the same.
|
|
|
|
# so we have to avoid adding duplicates
|
2014-09-22 07:46:57 +00:00
|
|
|
# We should also check /proc/cmdline for existing ip=xx arg.
|
|
|
|
# For example, iscsi boot will specify ip=xxx arg in cmdline.
|
|
|
|
if [ ! -f $_ip_conf ] || ! grep -q $_ip_opts $_ip_conf &&\
|
|
|
|
! grep -q "ip=[^[:space:]]*$_netdev" /proc/cmdline; then
|
2013-12-20 10:06:17 +00:00
|
|
|
echo "$_ip_opts" >> $_ip_conf
|
|
|
|
fi
|
2012-05-22 21:34:02 +00:00
|
|
|
|
|
|
|
if kdump_is_bridge "$_netdev"; then
|
2012-06-10 10:24:34 +00:00
|
|
|
kdump_setup_bridge "$_netdev"
|
2012-05-22 21:34:02 +00:00
|
|
|
elif kdump_is_bond "$_netdev"; then
|
2012-06-10 10:24:35 +00:00
|
|
|
kdump_setup_bond "$_netdev"
|
2012-12-13 14:36:05 +00:00
|
|
|
elif kdump_is_team "$_netdev"; then
|
|
|
|
kdump_setup_team "$_netdev"
|
2012-06-10 10:24:36 +00:00
|
|
|
elif kdump_is_vlan "$_netdev"; then
|
|
|
|
kdump_setup_vlan "$_netdev"
|
2012-05-22 21:34:02 +00:00
|
|
|
else
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
_ifname_opts=" ifname=$(kdump_setup_ifname $_netdev):$(kdump_get_mac_addr $_netdev)"
|
2013-12-20 10:06:17 +00:00
|
|
|
echo "$_ifname_opts" >> $_ip_conf
|
2012-05-22 21:34:02 +00:00
|
|
|
fi
|
2012-07-12 03:15:35 +00:00
|
|
|
|
|
|
|
kdump_setup_dns "$_netdev"
|
2012-05-22 21:34:02 +00:00
|
|
|
}
|
|
|
|
|
2012-05-14 02:36:18 +00:00
|
|
|
#Function:kdump_install_net
|
|
|
|
#$1: config values of net line in kdump.conf
|
2014-05-27 14:45:40 +00:00
|
|
|
#$2: srcaddr of network device
|
2012-05-14 02:36:18 +00:00
|
|
|
kdump_install_net() {
|
2014-05-27 14:45:40 +00:00
|
|
|
local _server _netdev _srcaddr
|
2012-05-14 02:36:18 +00:00
|
|
|
local config_val="$1"
|
|
|
|
|
2012-12-13 06:17:26 +00:00
|
|
|
_server=`echo $config_val | sed 's/.*@//' | cut -d':' -f1`
|
2012-05-14 02:36:18 +00:00
|
|
|
|
|
|
|
_need_dns=`echo $_server|grep "[a-zA-Z]"`
|
|
|
|
[ -n "$_need_dns" ] && _server=`getent hosts $_server|cut -d' ' -f1`
|
2012-01-27 14:59:43 +00:00
|
|
|
|
2012-05-14 02:36:18 +00:00
|
|
|
_netdev=`/sbin/ip route get to $_server 2>&1`
|
|
|
|
[ $? != 0 ] && echo "Bad kdump location: $config_val" && exit 1
|
|
|
|
|
|
|
|
#the field in the ip output changes if we go to another subnet
|
|
|
|
if [ -n "`echo $_netdev | grep via`" ]
|
|
|
|
then
|
|
|
|
# we are going to a different subnet
|
2014-05-27 14:45:40 +00:00
|
|
|
_srcaddr=`echo $_netdev|awk '{print $7}'|head -n 1`
|
2012-05-14 02:36:18 +00:00
|
|
|
_netdev=`echo $_netdev|awk '{print $5;}'|head -n 1`
|
|
|
|
else
|
|
|
|
# we are on the same subnet
|
2014-05-27 14:45:40 +00:00
|
|
|
_srcaddr=`echo $_netdev|awk '{print $5}'|head -n 1`
|
2012-05-14 02:36:18 +00:00
|
|
|
_netdev=`echo $_netdev|awk '{print $3}'|head -n 1`
|
|
|
|
fi
|
|
|
|
|
2014-08-18 08:34:53 +00:00
|
|
|
kdump_setup_netdev "${_netdev}" "${_srcaddr}" "${_server}"
|
2013-12-20 09:41:29 +00:00
|
|
|
|
2012-12-13 05:47:56 +00:00
|
|
|
#save netdev used for kdump as cmdline
|
2013-12-20 09:41:29 +00:00
|
|
|
# Whoever calling kdump_install_net() is setting up the default gateway,
|
|
|
|
# ie. bootdev/kdumpnic. So don't override the setting if calling
|
|
|
|
# kdump_install_net() for another time. For example, after setting eth0 as
|
|
|
|
# the default gate way for network dump, eth1 in the fence kdump path will
|
|
|
|
# call kdump_install_net again and we don't want eth1 to be the default
|
|
|
|
# gateway.
|
|
|
|
if [ ! -f ${initdir}${initdir}/etc/cmdline.d/60kdumpnic.conf ] &&
|
|
|
|
[ ! -f ${initdir}/etc/cmdline.d/70bootdev.conf ]; then
|
dracut-module-setup: NIC renamed with prefix "kdump-" for native ethX
We met a problem that eth0 ends up being eth1 and eth1 being eth0
between 1st and 2nd kernel. Because we pass ifname=eth0:$mac to force
it's named eth0 and since "eth0"is already taken by the other NIC, udev
fails to bring up the NIC we want, thus kdump fails.
kernel assigned network interface names are not persistent. So if first
kernel is using kernel assigned interface names, then force it to use
"kdump-" prefixed names in second kernel.
For ethX, we put a prefix "kdump-" before it, so in 2nd kernel, ethX
will name to "kdump-ethX". So that we can avoid the naming conflict.
We only need to change the ethernet card name, that means, for bridge,
vlan, bond, team devices' names , we never prefix them. Because these
names are assigned when they're created by userspace.
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-21 07:10:05 +00:00
|
|
|
echo "kdumpnic=$(kdump_setup_ifname $_netdev)" > ${initdir}/etc/cmdline.d/60kdumpnic.conf
|
|
|
|
echo "bootdev=$(kdump_setup_ifname $_netdev)" > ${initdir}/etc/cmdline.d/70bootdev.conf
|
2013-12-20 09:41:29 +00:00
|
|
|
fi
|
2012-05-14 02:36:18 +00:00
|
|
|
}
|
|
|
|
|
2014-04-11 12:27:02 +00:00
|
|
|
default_dump_target_install_conf()
|
|
|
|
{
|
|
|
|
local _target _fstype
|
|
|
|
local _s _t
|
|
|
|
local _mntpoint
|
|
|
|
local _path _save_path
|
|
|
|
|
|
|
|
is_user_configured_dump_target && return
|
|
|
|
|
2014-12-18 06:07:48 +00:00
|
|
|
_save_path=$(get_option_value "path")
|
2014-04-11 12:27:02 +00:00
|
|
|
[ -z "$_save_path" ] && _save_path=$DEFAULT_PATH
|
|
|
|
|
|
|
|
_mntpoint=$(get_mntpoint_from_path $_save_path)
|
|
|
|
_target=$(get_target_from_path $_save_path)
|
|
|
|
if [ "$_mntpoint" != "/" ]; then
|
|
|
|
_fstype=$(get_fs_type_from_target $_target)
|
|
|
|
|
|
|
|
if $(is_fs_type_nfs $_fstype); then
|
|
|
|
kdump_install_net "$_target"
|
|
|
|
_fstype="nfs"
|
|
|
|
else
|
|
|
|
_target=$(kdump_to_udev_name $_target)
|
|
|
|
fi
|
|
|
|
|
2015-02-12 06:40:27 +00:00
|
|
|
echo "$_fstype $_target" >> ${initdir}/tmp/$$-kdump.conf
|
2014-04-11 12:27:02 +00:00
|
|
|
|
|
|
|
_path=${_save_path##"$_mntpoint"}
|
2014-12-31 02:48:59 +00:00
|
|
|
|
|
|
|
#erase the old path line, then insert the parsed path
|
2015-02-12 06:40:27 +00:00
|
|
|
sed -i "/^path/d" ${initdir}/tmp/$$-kdump.conf
|
|
|
|
echo "path $_path" >> ${initdir}/tmp/$$-kdump.conf
|
2014-04-11 12:27:02 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2012-05-14 02:36:18 +00:00
|
|
|
#install kdump.conf and what user specifies in kdump.conf
|
|
|
|
kdump_install_conf() {
|
2015-02-12 06:40:27 +00:00
|
|
|
sed -ne '/^#/!p' /etc/kdump.conf > ${initdir}/tmp/$$-kdump.conf
|
2012-05-14 02:36:18 +00:00
|
|
|
|
2011-08-01 16:33:14 +00:00
|
|
|
while read config_opt config_val;
|
|
|
|
do
|
2013-09-26 11:46:48 +00:00
|
|
|
# remove inline comments after the end of a directive.
|
|
|
|
config_val=$(strip_comments $config_val)
|
2011-08-01 16:33:14 +00:00
|
|
|
case "$config_opt" in
|
|
|
|
ext[234]|xfs|btrfs|minix|raw)
|
2015-02-12 06:40:27 +00:00
|
|
|
sed -i -e "s#^$config_opt[[:space:]]\+$config_val#$config_opt $(kdump_to_udev_name $config_val)#" ${initdir}/tmp/$$-kdump.conf
|
2012-01-27 14:59:43 +00:00
|
|
|
;;
|
2012-07-23 07:31:28 +00:00
|
|
|
ssh|nfs)
|
2012-05-14 02:36:18 +00:00
|
|
|
kdump_install_net "$config_val"
|
2011-08-01 16:33:14 +00:00
|
|
|
;;
|
2012-07-12 03:15:35 +00:00
|
|
|
kdump_pre|kdump_post|extra_bins)
|
2012-06-14 01:57:30 +00:00
|
|
|
dracut_install $config_val
|
|
|
|
;;
|
2012-07-12 03:15:35 +00:00
|
|
|
core_collector)
|
2013-05-28 09:53:59 +00:00
|
|
|
dracut_install "${config_val%%[[:blank:]]*}"
|
2012-07-12 03:15:35 +00:00
|
|
|
;;
|
2011-08-01 16:33:14 +00:00
|
|
|
esac
|
|
|
|
done < /etc/kdump.conf
|
|
|
|
|
2014-04-11 12:27:02 +00:00
|
|
|
default_dump_target_install_conf
|
|
|
|
|
2015-02-12 06:40:27 +00:00
|
|
|
kdump_configure_fence_kdump "${initdir}/tmp/$$-kdump.conf"
|
|
|
|
inst "${initdir}/tmp/$$-kdump.conf" "/etc/kdump.conf"
|
|
|
|
rm -f ${initdir}/tmp/$$-kdump.conf
|
2012-05-14 02:36:18 +00:00
|
|
|
}
|
|
|
|
|
2014-12-08 11:59:08 +00:00
|
|
|
# Default sysctl parameters should suffice for kdump kernel.
|
|
|
|
# Remove custom configurations sysctl.conf & sysctl.d/*
|
|
|
|
remove_sysctl_conf() {
|
|
|
|
|
|
|
|
# As custom configurations like vm.min_free_kbytes can lead
|
|
|
|
# to OOM issues in kdump kernel, avoid them
|
|
|
|
rm -f "${initdir}/etc/sysctl.conf"
|
|
|
|
rm -rf "${initdir}/etc/sysctl.d"
|
|
|
|
rm -rf "${initdir}/run/sysctl.d"
|
|
|
|
rm -rf "${initdir}/usr/lib/sysctl.d"
|
|
|
|
}
|
|
|
|
|
2012-05-25 14:40:25 +00:00
|
|
|
kdump_iscsi_get_rec_val() {
|
|
|
|
|
|
|
|
local result
|
|
|
|
|
|
|
|
# The open-iscsi 742 release changed to using flat files in
|
|
|
|
# /var/lib/iscsi.
|
|
|
|
|
|
|
|
result=$(/sbin/iscsiadm --show -m session -r ${1} | grep "^${2} = ")
|
|
|
|
result=${result##* = }
|
|
|
|
echo $result
|
|
|
|
}
|
|
|
|
|
|
|
|
kdump_get_iscsi_initiator() {
|
|
|
|
local _initiator
|
|
|
|
local initiator_conf="/etc/iscsi/initiatorname.iscsi"
|
|
|
|
|
|
|
|
[ -f "$initiator_conf" ] || return 1
|
|
|
|
|
|
|
|
while read _initiator; do
|
|
|
|
[ -z "${_initiator%%#*}" ] && continue # Skip comment lines
|
|
|
|
|
|
|
|
case $_initiator in
|
|
|
|
InitiatorName=*)
|
|
|
|
initiator=${_initiator#InitiatorName=}
|
|
|
|
echo "rd.iscsi.initiator=${initiator}"
|
|
|
|
return 0;;
|
|
|
|
*) ;;
|
|
|
|
esac
|
|
|
|
done < ${initiator_conf}
|
|
|
|
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
# No ibft handling yet.
|
|
|
|
kdump_setup_iscsi_device() {
|
|
|
|
local path=$1
|
|
|
|
local tgt_name; local tgt_ipaddr;
|
|
|
|
local username; local password; local userpwd_str;
|
|
|
|
local username_in; local password_in; local userpwd_in_str;
|
|
|
|
local netdev
|
2014-05-27 14:45:40 +00:00
|
|
|
local srcaddr
|
2012-05-25 14:40:25 +00:00
|
|
|
local idev
|
|
|
|
local netroot_str ; local initiator_str;
|
|
|
|
local netroot_conf="${initdir}/etc/cmdline.d/50iscsi.conf"
|
|
|
|
local initiator_conf="/etc/iscsi/initiatorname.iscsi"
|
|
|
|
|
|
|
|
dinfo "Found iscsi component $1"
|
|
|
|
|
|
|
|
# Check once before getting explicit values, so we can output a decent
|
|
|
|
# error message.
|
|
|
|
|
|
|
|
if ! /sbin/iscsiadm -m session -r ${path} >/dev/null ; then
|
|
|
|
derror "Unable to find iscsi record for $path"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
tgt_name=$(kdump_iscsi_get_rec_val ${path} "node.name")
|
|
|
|
tgt_ipaddr=$(kdump_iscsi_get_rec_val ${path} "node.conn\[0\].address")
|
|
|
|
|
|
|
|
# get and set username and password details
|
|
|
|
username=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.username")
|
|
|
|
[ "$username" == "<empty>" ] && username=""
|
|
|
|
password=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.password")
|
|
|
|
[ "$password" == "<empty>" ] && password=""
|
|
|
|
username_in=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.username_in")
|
|
|
|
[ -n "$username" ] && userpwd_str="$username:$password"
|
|
|
|
|
|
|
|
# get and set incoming username and password details
|
|
|
|
[ "$username_in" == "<empty>" ] && username_in=""
|
|
|
|
password_in=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.password_in")
|
|
|
|
[ "$password_in" == "<empty>" ] && password_in=""
|
|
|
|
|
|
|
|
[ -n "$username_in" ] && userpwd_in_str=":$username_in:$password_in"
|
|
|
|
|
|
|
|
netdev=$(/sbin/ip route get to ${tgt_ipaddr} | \
|
2014-05-27 14:45:40 +00:00
|
|
|
sed 's|.*dev \(.*\).*|\1|g')
|
|
|
|
srcaddr=$(echo $netdev | awk '{ print $3; exit }')
|
|
|
|
netdev=$(echo $netdev | awk '{ print $1; exit }')
|
2012-05-25 14:40:25 +00:00
|
|
|
|
2014-08-18 08:34:53 +00:00
|
|
|
kdump_setup_netdev $netdev $srcaddr $tgt_ipaddr
|
2012-05-25 14:40:25 +00:00
|
|
|
|
|
|
|
# prepare netroot= command line
|
|
|
|
# FIXME: IPV6 addresses require explicit [] around $tgt_ipaddr
|
|
|
|
# FIXME: Do we need to parse and set other parameters like protocol, port
|
|
|
|
# iscsi_iface_name, netdev_name, LUN etc.
|
|
|
|
|
|
|
|
netroot_str="netroot=iscsi:${userpwd_str}${userpwd_in_str}@$tgt_ipaddr::::$tgt_name"
|
|
|
|
|
|
|
|
[[ -f $netroot_conf ]] || touch $netroot_conf
|
|
|
|
|
|
|
|
# If netroot target does not exist already, append.
|
|
|
|
if ! grep -q $netroot_str $netroot_conf; then
|
|
|
|
echo $netroot_str >> $netroot_conf
|
|
|
|
dinfo "Appended $netroot_str to $netroot_conf"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Setup initator
|
|
|
|
initiator_str=$(kdump_get_iscsi_initiator)
|
|
|
|
[ $? -ne "0" ] && derror "Failed to get initiator name" && return 1
|
|
|
|
|
|
|
|
# If initiator details do not exist already, append.
|
|
|
|
if ! grep -q "$initiator_str" $netroot_conf; then
|
|
|
|
echo "$initiator_str" >> $netroot_conf
|
|
|
|
dinfo "Appended "$initiator_str" to $netroot_conf"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
kdump_check_iscsi_targets () {
|
|
|
|
# If our prerequisites are not met, fail anyways.
|
|
|
|
type -P iscsistart >/dev/null || return 1
|
|
|
|
|
|
|
|
kdump_check_setup_iscsi() (
|
|
|
|
local _dev
|
2012-08-28 03:02:42 +00:00
|
|
|
_dev=$1
|
2012-05-25 14:40:25 +00:00
|
|
|
|
|
|
|
[[ -L /sys/dev/block/$_dev ]] || return
|
|
|
|
cd "$(readlink -f /sys/dev/block/$_dev)"
|
|
|
|
until [[ -d sys || -d iscsi_session ]]; do
|
|
|
|
cd ..
|
|
|
|
done
|
|
|
|
[[ -d iscsi_session ]] && kdump_setup_iscsi_device "$PWD"
|
|
|
|
)
|
|
|
|
|
|
|
|
[[ $hostonly ]] || [[ $mount_needs ]] && {
|
2012-08-28 03:02:42 +00:00
|
|
|
for_each_host_dev_and_slaves_all kdump_check_setup_iscsi
|
2012-05-25 14:40:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-02 08:33:47 +00:00
|
|
|
# retrieves fence_kdump nodes from Pacemaker cluster configuration
|
|
|
|
get_pcs_fence_kdump_nodes() {
|
2013-12-20 09:41:29 +00:00
|
|
|
local nodes
|
|
|
|
|
|
|
|
# get cluster nodes from cluster cib, get interface and ip address
|
|
|
|
nodelist=`pcs cluster cib | xmllint --xpath "/cib/status/node_state/@uname" -`
|
|
|
|
|
|
|
|
# nodelist is formed as 'uname="node1" uname="node2" ... uname="nodeX"'
|
|
|
|
# we need to convert each to node1, node2 ... nodeX in each iteration
|
|
|
|
for node in ${nodelist}; do
|
|
|
|
# convert $node from 'uname="nodeX"' to 'nodeX'
|
|
|
|
eval $node
|
|
|
|
nodename=$uname
|
|
|
|
# Skip its own node name
|
2014-08-11 14:04:36 +00:00
|
|
|
if [ "$nodename" = `hostname` -o "$nodename" = `hostname -s` ]; then
|
2013-12-20 09:41:29 +00:00
|
|
|
continue
|
|
|
|
fi
|
|
|
|
nodes="$nodes $nodename"
|
2014-04-02 08:33:47 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
echo $nodes
|
|
|
|
}
|
|
|
|
|
|
|
|
# retrieves fence_kdump args from config file
|
|
|
|
get_pcs_fence_kdump_args() {
|
|
|
|
if [ -f $FENCE_KDUMP_CONFIG_FILE ]; then
|
|
|
|
. $FENCE_KDUMP_CONFIG_FILE
|
|
|
|
echo $FENCE_KDUMP_OPTS
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
# setup fence_kdump in cluster
|
|
|
|
# setup proper network and install needed files
|
|
|
|
kdump_configure_fence_kdump () {
|
|
|
|
local kdump_cfg_file=$1
|
|
|
|
local nodes
|
|
|
|
local args
|
|
|
|
|
|
|
|
if is_generic_fence_kdump; then
|
|
|
|
nodes=$(get_option_value "fence_kdump_nodes")
|
|
|
|
|
|
|
|
elif is_pcs_fence_kdump; then
|
|
|
|
nodes=$(get_pcs_fence_kdump_nodes)
|
|
|
|
|
|
|
|
# set appropriate options in kdump.conf
|
|
|
|
echo "fence_kdump_nodes $nodes" >> ${kdump_cfg_file}
|
|
|
|
|
|
|
|
args=$(get_pcs_fence_kdump_args)
|
|
|
|
if [ -n "$args" ]; then
|
|
|
|
echo "fence_kdump_args $args" >> ${kdump_cfg_file}
|
|
|
|
fi
|
|
|
|
|
|
|
|
else
|
|
|
|
# fence_kdump not configured
|
|
|
|
return 1
|
|
|
|
fi
|
2013-12-20 09:41:29 +00:00
|
|
|
|
2014-04-02 08:33:47 +00:00
|
|
|
# setup network for each node
|
|
|
|
for node in ${nodes}; do
|
|
|
|
kdump_install_net $node
|
2013-12-20 09:41:29 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
dracut_install $FENCE_KDUMP_SEND
|
|
|
|
}
|
|
|
|
|
2014-01-29 08:24:33 +00:00
|
|
|
# Install a random seed used to feed /dev/urandom
|
|
|
|
# By the time kdump service starts, /dev/uramdom is already fed by systemd
|
|
|
|
kdump_install_random_seed() {
|
|
|
|
local poolsize=`cat /proc/sys/kernel/random/poolsize`
|
|
|
|
|
|
|
|
if [ ! -d ${initdir}/var/lib/ ]; then
|
|
|
|
mkdir -p ${initdir}/var/lib/
|
|
|
|
fi
|
|
|
|
|
|
|
|
dd if=/dev/urandom of=${initdir}/var/lib/random-seed \
|
|
|
|
bs=$poolsize count=1 2> /dev/null
|
|
|
|
}
|
|
|
|
|
2012-05-14 02:36:18 +00:00
|
|
|
install() {
|
|
|
|
kdump_install_conf
|
2014-12-08 11:59:08 +00:00
|
|
|
remove_sysctl_conf
|
2013-08-02 06:52:32 +00:00
|
|
|
|
2012-11-14 05:58:37 +00:00
|
|
|
if is_ssh_dump_target; then
|
2014-01-29 08:24:33 +00:00
|
|
|
kdump_install_random_seed
|
2012-11-14 05:58:37 +00:00
|
|
|
fi
|
2013-08-02 06:22:22 +00:00
|
|
|
dracut_install -o /etc/adjtime /etc/localtime
|
2012-04-28 10:01:18 +00:00
|
|
|
inst "$moddir/monitor_dd_progress" "/kdumpscripts/monitor_dd_progress"
|
|
|
|
chmod +x ${initdir}/kdumpscripts/monitor_dd_progress
|
|
|
|
inst "/bin/dd" "/bin/dd"
|
|
|
|
inst "/bin/tail" "/bin/tail"
|
2011-08-01 09:19:24 +00:00
|
|
|
inst "/bin/date" "/bin/date"
|
|
|
|
inst "/bin/sync" "/bin/sync"
|
2012-02-22 03:16:09 +00:00
|
|
|
inst "/bin/cut" "/bin/cut"
|
2011-08-01 09:19:24 +00:00
|
|
|
inst "/sbin/makedumpfile" "/sbin/makedumpfile"
|
2013-05-13 03:13:27 +00:00
|
|
|
inst "/sbin/vmcore-dmesg" "/sbin/vmcore-dmesg"
|
2013-09-24 13:33:27 +00:00
|
|
|
inst "/lib/kdump/kdump-lib.sh" "/lib/kdump-lib.sh"
|
2014-05-08 11:37:14 +00:00
|
|
|
inst "/lib/kdump/kdump-lib-initramfs.sh" "/lib/kdump-lib-initramfs.sh"
|
2014-05-08 11:37:16 +00:00
|
|
|
inst "$moddir/kdump.sh" "/usr/bin/kdump.sh"
|
|
|
|
inst "$moddir/kdump-capture.service" "$systemdsystemunitdir/kdump-capture.service"
|
|
|
|
ln_r "$systemdsystemunitdir/kdump-capture.service" "$systemdsystemunitdir/initrd.target.wants/kdump-capture.service"
|
Introduce kdump error handling service
Now upon failure kdump script might not be called at all and it might
not be able to execute default action. It results in a hang.
Because we disable emergency shell and rely on kdump.sh being invoked
through dracut-pre-pivot hook. But it might happen that we never call
into dracut-pre-pivot hook because certain systemd targets could not
reach due to failure in their dependencies. In those cases error
handling code does not run and system hangs. For example:
sysroot-var-crash.mount --> initrd-root-fs.target --> initrd.target \
--> dracut-pre-pivot.service --> kdump.sh
If /sysroot/var/crash mount fails, initrd-root-fs.target will not be
reached. And then initrd.target will not be reached,
dracut-pre-pivot.service wouldn't run. Finally kdump.sh wouldn't run.
To solve this problem, we need to separate the error handling code from
dracut-pre-pivot hook, and every time when a failure shows up, the
separated code can be called by the emergency service.
By default systemd provides an emergency service which will drop us into
shell every time upon a critical failure. It's very convenient for us to
re-use the framework of systemd emergency, because we don't have to
touch the other parts of systemd. We can use our own script instead of
the default one.
This new scheme will overwrite emergency shell and replace with kdump
error handling code. And this code will do the error handling as needed.
Now, we will not rely on dracut-pre-pivot hook running always. Instead
whenever error happens and it is serious enough that emergency shell
needed to run, now kdump error handler will run.
dracut-emergency is also replaced by kdump error handler and it's
enabled again all the way down. So all the failure (including systemd
and dracut) in 2nd kernel could be captured, and trigger kdump error
handler.
dracut-initqueue is a special case, which calls "systemctl start
emergency" directly, not via "OnFailure=emergency". In case of failure,
emergency is started, but not in a isolation mode, which means
dracut-initqueue is still running. On the other hand, emergency will
call dracut-initqueue again when default action is dump_to_rootfs.
systemd would block on the last dracut-initqueue, waiting for the first
instance to exit, which leaves us hang. It looks like the following:
dracut-initqueue (running)
--> call dracut-emergency:
--> dracut-emergency (running)
--> kdump-error-handler.sh (running)
--> call dracut-initqueue:
--> blocking and waiting for the original instance to exit.
To fix this, I'd like to introduce a wrapper emergency service. This
emegency service will replace both the systemd and dracut emergency. And
this service does nothing but to isolate to real kdump error handler
service:
dracut-initqueue (running)
--> call dracut-emergency:
--> dracut-emergency isolate to kdump-error-handler.service
--> dracut-emergency and dracut-initqueue will both be stopped
and kdump-error-handler.service will run kdump-error-handler.sh.
In a normal failure case, this still works:
foo.service fails
--> trigger emergency.service
--> emergency.service isolates to kdump-error-handler.service
--> kdump-error-handler.service will run kdump-error-handler.sh
Signed-off-by: WANG Chao <chaowang@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Acked-by: Dave Young <dyoung@redhat.com>
2014-05-08 11:37:15 +00:00
|
|
|
inst "$moddir/kdump-error-handler.sh" "/usr/bin/kdump-error-handler.sh"
|
|
|
|
inst "$moddir/kdump-error-handler.service" "$systemdsystemunitdir/kdump-error-handler.service"
|
|
|
|
# Replace existing emergency service
|
|
|
|
cp "$moddir/kdump-emergency.service" "$initdir/$systemdsystemunitdir/emergency.service"
|
|
|
|
# Also redirect dracut-emergency to kdump error handler
|
|
|
|
ln_r "$systemdsystemunitdir/emergency.service" "$systemdsystemunitdir/dracut-emergency.service"
|
2012-05-25 14:40:25 +00:00
|
|
|
|
|
|
|
# Check for all the devices and if any device is iscsi, bring up iscsi
|
|
|
|
# target. Ideally all this should be pushed into dracut iscsi module
|
|
|
|
# at some point of time.
|
|
|
|
kdump_check_iscsi_targets
|
2011-08-01 09:19:24 +00:00
|
|
|
}
|
2014-01-23 06:09:46 +00:00
|
|
|
|
|
|
|
installkernel() {
|
|
|
|
wdt=$(lsmod|cut -f1 -d' '|grep "wdt$")
|
|
|
|
if [ -n "$wdt" ]; then
|
|
|
|
[ "$wdt" = "iTCO_wdt" ] && instmods lpc_ich
|
2014-02-28 08:25:36 +00:00
|
|
|
instmods $wdt
|
2014-01-23 06:09:46 +00:00
|
|
|
fi
|
|
|
|
}
|