CentOS7 hostnamectl set-hostname 与 /etc/resolv.conf 混淆

CentOS7 hostnamectl set-hostname 与 /etc/resolv.conf 混淆

CentOS7。网络一切正常。

# cat /etc/resolv.conf 
nameserver 192.168.1.1

然后我决定更改主机名。

# hostnamectl set-hostname host.domain
# reboot
# cat /etc/resolv.conf 
# Generated by NetworkManager
search domain


# No nameservers found; try putting DNS servers into your
# ifcfg files in /etc/sysconfig/network-scripts like so:
#
# DNS1=xxx.xxx.xxx.xxx
# DNS2=xxx.xxx.xxx.xxx
# DOMAIN=lab.foo.com bar.foo.com

为什么会hostnamectl set-hostname弄乱我的/etc/resolv.conf

答案1

只是重申一下,作为官方答案,MikeA 在问题评论中所说的话:

它不一定是 dhcpclient,但可能是 NetworkManager。如果您在同一个文件中指定 DNS1、DNS2 和 DOMAIN,它应该为您创建正确的 /etc/resolv/conf。

如果此文件中没有 DNS1、DNS2 和 DOMAIN,则需要手动将正确的行添加到 /etc/resolv.conf(即搜索和名称服务器) - MikeA

我遵循了他的评论并取得了成功(更多详细信息请参阅下文)。

NetworkManager(CentOS 7 - 当前方式)

  1. 将以下行添加到/etc/sysconfig/network-scripts/ifcfg-<inf> DNS1=8.8.8.8 DNS2=8.8.4.4 DOMAIN=mydomain.com
  2. 重启


“静态”resolv.conf(旧方法)

  1. PEERDNS=no/etc/sysconfig/network-scripts/ifcfg-<inf>
  2. 手动添加正确的行/etc/resolv.conf(即搜索、名称服务器)(这本质上是



更多信息和细节


我由于网络错误而提出这个问题。

服务器是运行在KVM环境下的CentOS 7虚拟机。

操作系统是通过 SolusVM 控制面板模板安装的。

安装 CentOS 7 后,我采用了两种方法之一来更改主机名,但我不记得是哪一种:

  • hostname myserver.mydomain.com;或者
  • 使用 SolusVM 控制面板的主机名选项卡

我相当确定,我只做了后者,因为我有一个 init GIT 提交,它显示hostnameresolv.conf使用旧主机名,但hosts有一个带有静态 IP 和新主机名/域的条目。请参阅下文了解差异。

似乎由于某种原因,这一更改并未持续存在,当虚拟机通过 SolusVM(或 KVM 管理器)挂起并导致重新启动时,主机名被恢复为原始名称systemd

然后我发现在 CentOS 7 中主机名应该使用hostnamectl set-hostname myserver.mydomain.com. [1]

执行此操作并重新启动后,我发现我没有 DNS 解析,例如nslookup google.comping google.com导致 DNS/无解析错误。

似乎通过 SolusVM CentOS 7 安装模板设置的任何 DNS 配置都被 NetworkManager 删除了,尽管我不能确定是谁/什么导致了这些更改,但从 GIT 中可以清楚地看出所做的更改到/etc/hostname/etc/resolv.conf/etc/machine-info在运行hostnamectl ...命令后立即(再次参见下面的差异)。

以下是我为任何处于类似情况的人执行的具体步骤,用于故障排除或作为一个明确的示例:

目标:更新主机名.域名 (fqdn)

(明确:myOLDhostname.myOLDdomain.com -> myNEWhostname.myNEWdomain.com)

  1. 初始状态:

    • hostname:myOLDhostname.myOLDdomain.com
    • resolv.conf
      # Generated by NetworkManager search myOLDdomain.com nameserver 8.8.8.8 nameserver 8.8.4.4
    • machine-info:(/dev/null即不存在)
  2. 运行命令hostnamectl set-hostname myNEWhostname.myNEWdomain

  3. 重启。重新启动后,我重新 ssh 回到虚拟机。
  4. 尝试nslookup google.com, ping google.com, 得到如下错误:ping: unknown host google.com
  5. cat /etc/resolv.conf现在显示:
    # Generated by NetworkManager
    search myNEWdomain.com


    # No nameservers found; try putting DNS servers into your
    # ifcfg files in /etc/sysconfig/network-scripts like so:
    # DNS1=xxx.xxx.xxx.xxx
    # DNS2=xxx.xxx.xxx.xxx
    # DOMAIN=lab.foo.com bar.foo.com
  6. 搜索后,我发现/etc/sysconfig/network-scripts/ifcfg-eth0没有DNS1DNS1、 和DOMAIN条目,这nameserver导致/etc/resolv.conf.
  7. 我通过以下方式附加以下内容sudoedit /etc/sysconfig/network-scripts/ifcfg-eth0
    DNS1=8.8.8.8
    DNS2=8.8.4.4
    DOMAIN=myNEWdomain.com
  8. 我再次运行命令hostnamectl set-hostname myNEWhostname.myNEWdomain
  9. 但是我还是没有DNS,nslookup还是ping失败。
  10. 我尝试按照建议重新启动 NetworkManagersystemctl restart NetworkManager.service
  11. 仍然没有 DNS,所以我运行命令reboot
  12. 重新启动后,我再次通过 ssh 登录,一切正常。ping并且nslookp都成功了。
  13. 现在,我检查cat /etc/resolv.conf并查看包含的nameserver条目:
    # Generated by NetworkManager
    search myNEWdomain.com
    nameserver 8.8.4.4
    nameserver 8.8.8.8

对于 GIT,我使用etckeeper(实质上管理 中的 GIT 存储库),它显示了初始配置,并且明确地,在运行命令之前/etc,网络相关文件没有任何其他更改。/etc/{hostname,resolv.conf,hosts}hostnamectl

答案2

您可以通过在主要部分中resolv.conf添加片段来告诉 Networkmanager 不要更改:nodns/etc/NetworkManager/conf.d/nodns.conf

[main]
dns=none

(别忘了systemctl restart NetworkManager

相关内容