On 03/03/2016 at 11:40 AM, Minfei Huang wrote:
On 03/03/16 at 10:49am, Xunlei Pang wrote:
> Currently kdump uses dracut's "nameserver=" command to hande DNS,
handle
> it is acquired both from ifcfg files and "/etc/resolv.conf".
>
> This is improper for dhcp cases, as "/etc/resolv.conf" is generated
> by dhcp, the proper logic should be:
> 1) For static cases, DNS can be acquired from corresponding ifcfg file.
> 2) For dhcp cases, DNS is normally generated by dhcp, but extra DNS
> can still be specified in the ifcfg files mannually.
> 3) For special user-assigned DNS not specified in any ifcfg file, we can
> pass it to dracut via "nameserver=".
This patch may cause a regression, since kdump doesn't take care of
/etc/resolv.conf. Kdump kernel cann't get proper DNS, if it is appended
manually in /etc/resolv.conf.
https://bugzilla.redhat.com/show_bug.cgi?id=1196085
IIRC(I will double check that) I've tested the case that adding manually a
DNS entry into /etc/resolv.conf, after reboot the manually added entry will
be cleaned up by the system using that in the ifcfg files.
> This patch improves the logic using the following "ip=" command format
> provided by dracut:
>
ip=<client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>:
>
<interface>:{none|off|dhcp|on|any|dhcp6|auto6|ibft}[:[<dns1>][:<dns2>]]
>
> Signed-off-by: Xunlei Pang <xlpang(a)redhat.com>
> ---
> dracut-module-setup.sh | 46 ++++++++++++++++++++++++----------------------
> 1 file changed, 24 insertions(+), 22 deletions(-)
>
> diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
> index 4cd7107..a18fdc0 100755
> --- a/dracut-module-setup.sh
> +++ b/dracut-module-setup.sh
> @@ -63,26 +63,19 @@ kdump_is_vlan() {
> }
>
> # $1: netdev name
> -kdump_setup_dns() {
> - local _nameserver _dns
> - local _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"
> +# return pattern ":<dns1>[<:dns2>]" if not ""
> +kdump_get_dns_from_ifcfg() {
> + local _dns
>
> - while read content;
> - do
> - _nameserver=$(echo $content | grep ^nameserver)
> - [ -z "$_nameserver" ] && continue
> + unset DNS1 DNS2
> + if [ -e /etc/sysconfig/network-scripts/ifcfg-$1 ]; then
> + . /etc/sysconfig/network-scripts/ifcfg-$1
> + fi
>
> - _dns=$(echo $_nameserver | cut -d' ' -f2)
> - [ -z "$_dns" ] && continue
> + [ -n "$DNS1" ] && _dns=${_dns}:$(echo $DNS1)
> + [ -n "$DNS2" ] && _dns=${_dns}:$(echo $DNS2)
>
> - if [ ! -f $_dnsfile ] || [ ! $(cat $_dnsfile | grep -q $_dns) ]; then
> - echo "nameserver=$_dns" >> "$_dnsfile"
> - fi
> - done < "/etc/resolv.conf"
> + echo -n "${_dns}" | cut -d':' -f1,2,3
Do we need to consider the case of IPv6 DNS?
> }
>
> #$1: netdev name
> @@ -254,22 +247,27 @@ kdump_setup_znet() {
> # Setup dracut to bringup a given network interface
> kdump_setup_netdev() {
> local _netdev=$1 _srcaddr=$2
> - local _static _proto _ip_conf _ip_opts _ifname_opts
> + local _static _proto _ip_conf _ip_opts _ifname_opts _ifcfg_dns
> + local _global_dnsfile=${initdir}/etc/cmdline.d/42dns.conf
>
> if [ "$(uname -m)" = "s390x" ]; then
> kdump_setup_znet $_netdev
> fi
>
> - _netmac=$(kdump_get_mac_addr $_netdev)
> + # Using below "ip=" command format provided by dracut:
> + #
ip=<client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>:
> + #
<interface>:{none|off|dhcp|on|any|dhcp6|auto6|ibft}[:[<dns1>][:<dns2>]]
> _static=$(kdump_static_ip $_netdev $_srcaddr)
> if [ -n "$_static" ]; then
> _proto=none
> else
> _proto=dhcp
> + _static=":::::"
Is this $_static necessary if the mode is dhcp, since there is no
assignment for _static previously?
> fi
>
> + _ifcfg_dns=$(kdump_get_dns_from_ifcfg $_netdev)
> _ip_conf="${initdir}/etc/cmdline.d/40ip.conf"
> - _ip_opts=" ip=${_static}$(kdump_setup_ifname $_netdev):${_proto}"
> + _ip_opts=" ip=${_static}$(kdump_setup_ifname
$_netdev):${_proto}${_ifcfg_dns}"
>
> # dracut doesn't allow duplicated configuration for same NIC, even
they're exactly the same.
> # so we have to avoid adding duplicates
> @@ -278,6 +276,12 @@ kdump_setup_netdev() {
> if [ ! -f $_ip_conf ] || ! grep -q $_ip_opts $_ip_conf &&\
> ! grep -q "ip=[^[:space:]]*$_netdev" /proc/cmdline; then
> echo "$_ip_opts" >> $_ip_conf
> + # In case of no DNS specified by iscsi.
> + if [ -n "${_ifcfg_dns}" ]; then
> + _ifcfg_dns=${_ifcfg_dns##:}
> + echo "nameserver=${_ifcfg_dns%%:*}" >>
${_global_dnsfile}
> + [ "${_ifcfg_dns}" = "${_ifcfg_dns%%:*}" ] || echo
"nameserver=${_ifcfg_dns##*:}" >> ${_global_dnsfile}
> + fi
I have a trouble understand why there is extra dns config for iSCSI?
If there is already an "ip=" command with no DNS specified, then we will lose
the
DNS information collected in the 2nd "ip=" which is acquired from ifcfg file
Regards,
Xunlei
Thanks
Minfei