On 03/03/16 at 12:21pm, Xunlei Pang wrote:
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.
Yes, /etc/resolv.conf will be re-generated after booting. For production
environment, it is more convenience to use script to append manual DNS.
>
>> 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
If then, this block may be resident in else branch?
Thanks
Minfei