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 (т.е. search и nameserver) - 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(например, поиск, сервер имен) (Это по сути то, как



Дополнительная информация и подробности


Я пришел к этому вопросу в результате сетевой ошибки.

Сервер — это виртуальная машина CentOS 7, работающая в среде KVM.

Установка ОС производилась через шаблон панели управления SolusVM.

После установки CentOS 7 я использовал один из двух способов изменить имя хоста, но не помню какой:

  • hostname myserver.mydomain.com; или
  • Использована вкладка Hostname панели управления SolusVM

Я почти уверен, что я сделал только последнее, так как у меня есть init GIT-коммит, который показывает hostnameи resolv.confиспользует старое имя хоста, но hostsимеет одну запись со статическим IP и новым именем хоста/доменом. Смотрите ниже различия.

Похоже, это изменение не сохранилось по той или иной причине: когда виртуальная машина была приостановлена ​​через SolusVM (или менеджер KVM), что привело к перезагрузке, имя хоста было возвращено к исходному с помощью systemd.

Затем я обнаружил, что в CentOS 7 имя хоста должно быть установлено с помощью hostnamectl set-hostname myserver.mydomain.com. [1]

После этого и перезагрузки я обнаружил, что у меня нет разрешения DNS, что nslookup google.comпривело ping google.comк ошибкам DNS / отсутствия разрешения.

Похоже, что любая конфигурация DNS, которая могла быть установлена ​​через шаблон установки SolusVM CentOS 7, была стерта NetworkManager, хотя я не могу точно сказать, кто/что вызвало изменения, но из GIT определенно ясно, что изменения были внесены в /etc/hostname, /etc/resolv.confи /etc/machine-infoсразу после запуска hostnamectl ...команды (опять же, см. различия ниже).

Вот точные шаги, которые я выполнил для тех, кто оказался в похожей ситуации, для устранения неполадок или в качестве наглядного примера:

Цель: обновить hostname.domainname (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что не имеет записей DNS1, DNS1, и 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. Я пытаюсь перезапустить NetworkManager, как рекомендуется.systemctl 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

Вы можете указать Networkmanager не вносить изменения, resolv.confдобавив nodnsфрагмент в основной раздел /etc/NetworkManager/conf.d/nodns.conf:

[main]
dns=none

(не забудьте systemctl restart NetworkManager)

Связанный контент