Как предотвратить добавление Avahi -2 к имени хоста

Часто (возможно, в 80% случаев), когда я перезагружаю машину, на которой работает Avahi, она начинает использовать machinename-2.local как это имя хоста. Все машины в моей сети имеют уникальные имена хостов, поэтому нет коллизий.

Как я могу предотвратить добавление авахи -2 к именам хостов?

(Это оказывается невероятно трудной вещью для Google для...)

5 ответов

У меня такая же проблема на Raspberry Pi. Пока не появится лучшее решение, я добавил запись в crontab для ежедневного запуска этого сценария.

      #!/bin/bash

writelog()
{
echo $(date) >> /home/pi/avahirestart.log
}
aname=$(avahi-resolve -a $(hostname -I|cut -d' ' -f1)|cut -f2)
if [[ "$aname" = *"-2"* ]];then
sudo service avahi-daemon restart
writelog
fi
if [[ "$aname" = *"-3"* ]];then
sudo service avahi-daemon restart
writelog
fi

Это также относится и к компьютерам с OS X.

Если имя хоста уже используется в сети, оно увеличивает счетчик, чтобы снова сделать имена уникальными. Я подозреваю, что у рассматриваемой машины могут быть две сетевые карты для одной и той же сети (кабельная и беспроводная) или что у вас работает Bonjour Proxy (который может быть вам неизвестен), который помогает спящим машинам, удерживая их имя хоста активным. Чтобы быть более уверенным, вы можете описать свою сеть лучше.

В моем случае это вызвано Plex Media Server внутри док-контейнера, который запускает свой собственный avahi-демон. Я использую этот образ докера: https://hub.docker.com/r/linuxserver/plex/

Количество увеличивалось очень часто, без необходимости перезапуска.

После остановки док-контейнера и перезапуска avahi-daemon.service номера исчезли.

Вот прослушиватель dbus на основе событий, который ищет изменения имени хоста avahi и пытается удалить-2суффикс. Он запускается при запуске как служба systemd (суть включает пример юнит-файла службы). Я запускаю его на сервере Debian, хотя любой дистрибутив, в котором есть dbus, подойдет.

Преимущество этого подхода заключается в том, что сценарий не полагается на опрос, поэтому при изменении имени хоста оно будет быстро изменено обратно.

      import dbus, avahi
from dbus.mainloop.glib import DBusGMainLoop
from gi.repository import GLib
import time

class Runner():
    def __init__(self, avahi_server):
        self.avahi_server = avahi_server

    def on_state_change(self, state, error):
        if state == avahi.SERVER_COLLISION:
            print(f"[state: collision] collided, waiting 5s...")
            time.sleep(5)

        elif state == avahi.SERVER_RUNNING:
            hostname = self.avahi_server.GetHostName()
            print(f"[state: running] hostname changed: {hostname}")
            if hostname.endswith("-2"):
                hostname = str(hostname)[0:-2]
                print(f"removing `-2` suffix: {hostname}")
                self.avahi_server.SetHostName(hostname)

def main():
    DBusGMainLoop(set_as_default=True)
    bus = dbus.SystemBus()
    object  = bus.get_object("org.freedesktop.Avahi","/")
    avahi_server = dbus.Interface(object, 'org.freedesktop.Avahi.Server')
    runner = Runner(avahi_server)
    avahi_server.connect_to_signal('StateChanged', runner.on_state_change)
    print("Starting main loop")
    loop = GLib.MainLoop()
    loop.run()

if __name__ == '__main__':
    main()

https://gist.github.com/dymk/d06425d932c96916f27eed9bfc5bb7cc

См. раздел 4.7 «Изменение имени хоста с добавлением возрастающих номеров» в Avahi . Здесь говорится, что это известная ошибка в Avahi. Одним из обходных путей является отключение IPv6 на локальном маршрутизаторе. Я попробовал, и в моей сети это сработало. Я некоторое время боролся с Raspberry pi 4. Я не знаю, почему я не видел этой проблемы на других Писах.

Другие вопросы по тегам