/etc/NetworkManager/dispatcher.d/ 脚本用于处理 resolvconf -u

/etc/NetworkManager/dispatcher.d/ 脚本用于处理 resolvconf -u

有两种方法networkmanager

  • 更新/etc/resolv.conf
  • /etc/resolv.conf根本不更新

这两种解决方案都不适合我,因为在我这边我需要/etc/resolv.conf由 来处理resolvconf,以便可以随时使用 来再生resolvconf -u

我需要的是能够/etc/NetworkManager/dispatcher.d/与 正确协同工作的脚本resolvconf

然而,我却无法找到适合这个我认为非常基本的标准案例的脚本。

那么,是否有任何标准解决方案(请在此提供脚本的重要部分)或者每个人每次真的都需要重新发明轮子?

笔记:

显然有一些东西,但这似乎不能正常工作。

就我而言dnsmasq,我有 VPN 以及更多,所有这些都与 DNS 有关。

但是resolvconf -u无法/etc/resolv.conf正确再生,所以默认设置显然缺少了一些东西。

更详细地说:

  • /etc/NetworkManager/dispatcher.d/01ifupdown调用run-parts /etc/network/if-up.d
  • /etc/network/if-up.d/000resolvconf然后检查$IF_DNS_NAMESERVER但不提供这些,而是​​设置(根据手册)$IF_DNS_NAMESERVERSnetworkmanagerIP4_NAMESERVERS

因此,某处缺少一个环节。以下是在 中找到的内容的副本/etc/NetworkManager/dispatcher.d/01ifupdown

#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs ifupdown scripts when NetworkManager fiddles with interfaces.
# See NetworkManager(8) for further documentation of the dispatcher events.

if [ -z "$1" ]; then
    echo "$0: called with no interface" 1>&2
    exit 1;
fi

# Fake ifupdown environment
export IFACE="$1"
export LOGICAL="$1"
export ADDRFAM="NetworkManager"
export METHOD="NetworkManager"
export VERBOSITY="0"

# Run the right scripts
case "$2" in
    up|vpn-up)
    export MODE="start"
    export PHASE="post-up"
    exec run-parts /etc/network/if-up.d
    ;;
    down|vpn-down)
    export MODE="stop"
    export PHASE="post-down"
    exec run-parts /etc/network/if-post-down.d
    ;;
# pre-up/pre-down not implemented. See
# https://bugzilla.gnome.org/show_bug.cgi?id=387832
#    pre-up)
#   export MODE="start"
#   export PHASE="pre-up"
#   exec run-parts /etc/network/if-pre-up.d
#   ;;
#    pre-down)
#   export MODE="stop"
#   export PHASE="pre-down"
#   exec run-parts /etc/network/if-down.d
#   ;;
    hostname|dhcp4-change|dhcp6-change)
        # Do nothing
    ;;
    *)
    echo "$0: called with unknown action \`$2'" 1>&2
    exit 1
    ;;
esac

以下是/etc/network/if-up.d/000resolvconf

#!/bin/sh
#
# ifup hook script for resolvconf
#
# This file is part of the resolvconf package.
#

[ -x /sbin/resolvconf ] || exit 0

case "$ADDRFAM" in
  inet|inet6) : ;;
  *) exit 0 ;;
esac

R=""
if [ "$IF_DNS_DOMAIN" ] ; then
    R="${R}domain $IF_DNS_DOMAIN
"
fi
if [ "$IF_DNS_SEARCH" ] ; then
    R="${R}search $IF_DNS_SEARCH
"
fi
if [ "$IF_DNS_SORTLIST" ] ; then
    R="${R}sortlist $IF_DNS_SORTLIST
"
fi
for NS in $IF_DNS_NAMESERVER $IF_DNS_NAMESERVERS ; do
    R="${R}nameserver $NS
"
done

echo -n "$R" | /sbin/resolvconf -a "${IFACE}.${ADDRFAM}" || :

仅供参考,它来自 Ubuntu 14.04

答案1

脚本?NetworkManager 自 2008 年起就拥有本机 /bin/resolvconf 支持(版本 0.7.0)。您的发行版需要在编译时使用以下方法启用它./configure --with-resolvconf=…例如)。这里不需要单独的 dispatcher.d 脚本 – 您的发行版尝试将 NM 与 ifupdown 集成时,只需要一些脚本作为副作用。

如果它不适合您,请检查您的NetworkManager.conf手册页是否提及dnsrc-manager设置(它们因版本而异)。通常 resolvconf 默认工作,但您可能需要手动设置dns=defaultrc-manager=resolvconf两者兼而有之。

相关内容