avahi-resolve 无法解析本地计算机上的服务

avahi-resolve 无法解析本地计算机上的服务

我正在尝试设置 newtek NDI 以在本地网络上进行视频流传输。NDI 使用 mDNS 进行服务发现,如所述这里。我已经在 Windows 机器和 iOS 设备上运行了 NDI 服务,并且我正在尝试在 Linux 机器(Slackware 15.0)上运行另一项服务,其中所有设备都在同一个 LAN 上。路由器(RT-AX88U)的域名配置为“本地”。Linux 机器上没有配置防火墙规则:

root@thinkpad-x1:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

从 Windows 机器(其中 mDNS 通过 bonjour 处理)我可以看到所有三个设备上运行的 NDI 服务,并且可以毫无问题地连接到所有设备(例如通过带有 obs-ndi 插件的 OBS、通过 NDI studio 监视器等)。从 Linux 机器上,只能发现在 Windows 和 iOS 设备上运行的 NDI 服务:

root@thinkpad-x1:~# avahi-browse _ndi._tcp
+  wlan0 IPv6 OLAF (Olaf)                                   _ndi._tcp            local
+  wlan0 IPv4 OLAF (Olaf)                                   _ndi._tcp            local
+  wlan0 IPv4 MD1UMUTC (OBS)                                _ndi._tcp            local

所以问题就在这里——我需要从机器本身发现(并连接到)在 Linux 机器上运行的 NDI 服务。以下是 avahi 配置文件

/etc/avahi/avahi-daemon.conf:

root@thinkpad-x1:~# cat /etc/avahi/avahi-daemon.conf

[server]
host-name=thinkpad-x1
domain-name=local
#browse-domains=0pointer.de, zeroconf.org
use-ipv4=yes
use-ipv6=yes
ratelimit-interval-usec=1000000
ratelimit-burst=1000

[wide-area]
enable-wide-area=yes

[publish]
#disable-publishing=no
#disable-user-service-publishing=no
#add-service-cookie=no
#publish-addresses=yes
publish-hinfo=no
publish-workstation=yes
#publish-domain=yes

/etc/nsswitch.conf:

root@thinkpad-x1:~# cat /etc/nsswitch.conf

passwd:         compat
group:          compat

#hosts:         files dns
hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname
networks:       files

services:       files
protocols:      files
rpc:            files
ethers:         files
netmasks:       files
netgroup:       files
bootparams:     files

automount:      files
aliases:        files

/etc/mdns.allow:

root@thinkpad-x1:~# cat /etc/mdns.allow

.local.
.local

所以问题是如何配置 avahi-daemon 来发现在本地主机上运行的服务?

答案1

事实证明,slackware 中的 avahi-0.8 已经过时,并且没有任何补丁。我最终使用以下脚本构建了 avahi ubuntu 版本:

git clone https://git.launchpad.net/ubuntu/+source/avahi
cd avahi

PRGNAM=avahi
VERSION=${VERSION:-0.8}
BUILD=${BUILD:-3}
TAG=${TAG:-_SBo}

if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) ARCH=i586 ;;
    arm*) ARCH=arm ;;
       *) ARCH=$( uname -m ) ;;
  esac
fi

CWD=$(pwd)
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

if [ "${ARCH}" = "i586" ]; then
  SLKCFLAGS="-O2 -march=i586 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi

# chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
  -o -perm 511 \) -exec chmod 755 {} \; -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
 -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;

# !! files copied from original slackbuild at https://slackbuilds.org/slackbuilds/15.0/network/avahi.tar.gz 
#cat ../../avahi/build-db > service-type-database/build-db
cat ../../avahi/bssh.1 > man/bssh.1
cat ../../avahi/avahi-discover.1 > man/avahi-discover.1

#chmod 0755 service-type-database/build-db

for i in `cat ./debian/patches/series`; do git apply ./debian/patches/$i; done;

./bootstrap.sh

CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
  --prefix=/usr \
  --libdir=/usr/lib${LIBDIRSUFFIX} \
  --sysconfdir=/etc \
  --localstatedir=/var \
  --mandir=/usr/man \
  --docdir=/usr/doc/$PRGNAM-$VERSION \
  --with-systemdsystemunitdir=no \
  --enable-tests \
  --disable-static \
  --enable-compat-libdns_sd \
  --enable-python-dbus \
  --enable-glib \
  --enable-dbus \
  --enable-python \
  --enable-gtk \
  --enable-gtk3 \
  --enable-qt5 \
  --disable-qt4 \
  --disable-qt3 \
  --enable-core-docs \
  --with-dbus-sys=/usr/share/dbus-1/system.d \
  --with-avahi-user=avahi \
  --with-avahi-group=avahi \
  --with-avahi-priv-access-group=netdev \
  --with-distro=slackware \
  --program-prefix= \
  --program-suffix= \
  --build=$ARCH-slackware-linux --disable-mono

make
make install DESTDIR=$PKG

find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \
  | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true

find $PKG/usr/man -type f -exec gzip -9 {} \;
for i in $(find $PKG/usr/man -type l); do ln -s $(readlink $i).gz $i.gz; rm $i; done

mv $PKG/etc/rc.d/rc.avahidaemon $PKG/etc/rc.d/rc.avahidaemon.new
mv $PKG/etc/rc.d/rc.avahidnsconfd $PKG/etc/rc.d/rc.avahidnsconfd.new
mv $PKG/etc/avahi/avahi-daemon.conf $PKG/etc/avahi/avahi-daemon.conf.new

mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a LICENSE docs/* $PKG/usr/doc/$PRGNAM-$VERSION
# cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild

#mkdir -p $PKG/install
#cat $CWD/slack-desc > $PKG/install/slack-desc
#cat $CWD/doinst.sh  > $PKG/install/doinst.sh

cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}

使用修补版本后,本地机器的主机名和本地服务均能得到解决,没有任何问题。

相关内容