- Avahi is a free Zero-configuration networking (zeroconf) implementation, including a system for multicast DNS/DNS-SD service discovery. It allows programs to publish and discover services and hosts running on a local network with no specific configuration. For example you can plug into a network and instantly find printers to print to, files to look at and people to talk to. It is licensed under the GNU Lesser General Public License (LGPL).
- 1 Installation
- 2 Using Avahi
- 2.1 Hostname resolution
- 2.2 File sharing
- 2.3 Link-Local (Bonjour/Zeroconf) chat
- 2.4 Airprint from Mobile Devices
- 2.5 Firewall
- 2.6 Obtaining IPv4LL IP address
- 2.7 Customizing Avahi
- 3 See also
Install the package.
You can manage the Avahi daemon with
avahi-daemon.service using systemd.
Avahi provides local hostname resolution using a "hostname.local" naming scheme. To enable it, install the
Then, edit the file
/etc/nsswitch.conf and change the line:
hosts: files dns myhostname
hosts: files mdns_minimal [NOTFOUND=return] dns myhostname
Additional info about mdns
mdns_minimal module handles queries for the
.local TLD only. Note the
[NOTFOUND=return], which specifies that if
mdns_minimal cannot find
*.local, it will not continue to search for it in
myhostname, etc. In case you have configured Avahi to use a different TLD, you should replace
mdns_minimal [NOTFOUND=return] with the full
mdns module. There also are IPv4-only and IPv6-only modules
Avahi includes several utilities which help you discover the services running on a network. For example, run
$ avahi-browse -alr
to discover services in your network.
The Avahi Zeroconf Browser (
avahi-discover – note that it needs avahi's optional dependencies and ) shows the various services on your network. You can also browse SSH and VNC Servers using
There's a good list of software with Avahi support at their website: http://avahi.org/wiki/Avah4users
If you have an NFS share set up, you can use Avahi to be able to automount them in Zeroconf-enabled browsers (such as Konqueror on KDE and Finder on OS X).
.service file in
/etc/avahi/services with the following contents:
<?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name replace-wildcards="yes">NFS Music Share on %h</name> <service> <type>_nfs._tcp</type> <port>2049</port> <txt-record>path=/data/shared/Music</txt-record> </service> </service-group>
The port is correct if you have insecure as an option in your
/etc/exports; otherwise, it needs to be changed (note that insecure is needed for OS X clients). The path is the path to your export, or a subdirectory of it. For some reason the automount functionality has been removed from Leopard, however a script is available. This was based upon this post.
With the Avahi daemon running on both the server and client, the file manager on the client should automatically find the server.
You can also auto-discover regular FTP servers, such as vsftpd. Install the this thread on ubuntuforums.org or
.service file in
/etc/avahi/services with the following contents:
<?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name>FTP file sharing</name> <service> <type>_ftp._tcp</type> <port>21</port> </service> </service-group>
When you are done, restart the
The FTP server should now be advertised by Avahi. You should now be able to find the FTP server from a file manager on another computer in your network. You might need to enable #Hostname resolution on the client.
Link-Local (Bonjour/Zeroconf) chat
Avahi can be used for bonjour protocol support under linux. Check Wikipedia:Comparison of instant messaging clients or List of applications#Instant messaging for a list of clients supporting the bonjour protocol.
Airprint from Mobile Devices
Avahi along with CUPS also provides the capability to print to just about any printer from airprint compatible mobile devices. In order to enable print capability from your device, simply create an avahi service file for your printer in /etc/avahi/services and restart avahi. An example of a generic services file for an HP-Laserjet printer would be similar to the following with the
note fields changed.
<?xml version="1.0" standalone='no'?><!--*-nxml-*--> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name>yourPrnterName</name> <service> <type>_ipp._tcp</type> <subtype>_universal._sub._ipp._tcp</subtype> <port>631</port> <txt-record>txtver=1</txt-record> <txt-record>qtotal=1</txt-record> <txt-record>rp=printers/yourPrnterName</txt-record> <txt-record>ty=yourPrnterName</txt-record> <txt-record>adminurl=http://184.108.40.206:631/printers/yourPrnterName</txt-record> <txt-record>note=Office Laserjet 4100n</txt-record> <txt-record>priority=0</txt-record> <txt-record>product=(GPL Ghostscript)</txt-record> <txt-record>printer-state=3</txt-record> <txt-record>printer-type=0x801046</txt-record> <txt-record>Transparent=T</txt-record> <txt-record>Binary=T</txt-record> <txt-record>Fax=F</txt-record> <txt-record>Color=T</txt-record> <txt-record>Duplex=T</txt-record> <txt-record>Staple=F</txt-record> <txt-record>Copies=T</txt-record> <txt-record>Collate=F</txt-record> <txt-record>Punch=F</txt-record> <txt-record>Bind=F</txt-record> <txt-record>Sort=F</txt-record> <txt-record>Scan=F</txt-record> <txt-record>pdl=application/octet-stream,application/pdf,application/postscript,image/jpeg,image/png,image/urf</txt-record> <txt-record>URF=W8,SRGB24,CP1,RS600</txt-record> </service> </service-group>
Alternatively, https://raw.github.com/tjfontaine/airprint-generate/master/airprint-generate.py can be used to generate Avahi service files. It depends on python2 and pycups. The script can be run using:
# python2 airprint-generate.py -d /etc/avahi/services
Be sure to open UDP port 5353 if you're using iptables:
# iptables -A INPUT -p udp -m udp --dport 5353 -j ACCEPT
If you're following the more-than-useful Simple stateful firewall format for your firewall:
# iptables -A UDP -p udp -m udp --dport 5353 -j ACCEPT
Obtaining IPv4LL IP address
By default, if you are getting IP using DHCP, you are using thepackage. It can attempt to obtain an IPv4LL address if it failed to get one via DHCP. By default this option is disabled. To enable it, comment noipv4ll string:
... #noipv4ll ...
# avahi-autoipd -D
Avahi advertises the services whose
*.service files are found in
/etc/avahi/services. If you want to advertise a service for which there is no
*.service file, it is very easy to create your own.
As an example, let's say you wanted to advertise a quote of the day (QOTD) service operating per RFC865 on TCP port 17 which you are running on your machine
The first thing to do is to determine the
man avahi.service indicates that the
type should be "the DNS-SD service type for this service. e.g. '_http._tcp'". Since the DNS-SD register was merged into the IANA register in 2010, we look for the service name on the IANA register or in
/etc/services file. The service name shown there is
qotd. Since we're running QOTD on tcp, we now know the service is
_qotd._tcp and the port (per IANA and RFC865) is 17.
qotd.service file is thus:
<?xml version="1.0" standalone='no'?><!--*-nxml-*--> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <!-- This file is part of avahi. avahi is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. avahi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with avahi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. --> <!-- See avahi.service(5) for more information about this configuration file --> <service-group> <name replace-wildcards="yes">%h</name> <service> <type>_qotd._tcp</type> <port>17</port> </service> </service-group>
For more complicated scenarios, such as advertising services running on a different server, DNS sub-types and so on, consult
Modifying the service-types database
As noted above, avahi comes with tools to browse advertised services. Both
avahi-discover use a database file to furnish descriptions of the relevant service. That database contains the names of many, but not all, services.
Sadly, it doesn't contain the QOTD service we just created. Thus
avahi-browse -a would show the following ugly entry
+ wlp2s0 IPv4 MyServer _qotd._tcp local
Getting the Sources
First, download the files
service-types files from the
service-type-database subdirectory in the the avahi github mirror to a build directory.
wget https://raw.githubusercontent.com/lathiat/avahi/master/service-type-database/build-db.in wget https://raw.githubusercontent.com/lathiat/avahi/master/service-type-database/service-types
Modify the Sources
Second, create the following script:
#!/bin/bash sed -e 's,@PYTHON\@,/usr/bin/python2.7,g' \ -e 's,@DBM\@,gdbm,g' < build-db.in > build-db chmod +x build-db
This mimics what the Makefile would do if one were building all of avahi. It creates a file named build-db.
$./whatever_you_named_the_script.sh $ ls build-db build-db.in service-types whatever_you_named_the_script.sh
Third, make the changes needed to add your new QOTD service to the
service-types file. This file has one entry per line, with the entries in the format
type:Human Readable Description. Note that the human readable description can contain spaces.
In our example, we add the following entry to the end of the file:
_qotd._tcp:Quote of the Day (QOTD) Server
Build and Install the New Database
Now run the
build-db python script (be sure to use python2 not python3). This will build the
service-types.db file. Check to make sure it's been built and use
gdbmtools to make sure the new database is loadable and contains the new entry:
$/usr/bin/python2.7 build-db $ls build-db build-db.in service-types service-types.db whatever_you_named_the_script.sh $gdbmtool service-types.db Welcome to the gdbm tool. Type ? for help. gdbmtool>fetch _qotd._tcp Quote of the Day (QOTD) Server gdbmtool>quit
Now copy the old database to a backup location, move the new database to the live directory and use
avahi-browse database dump command to make sure avahi sees the new entry:
$cp /usr/lib/avahi/service-types.db /backup-directory $sudo cp /build-directory/service-types.db /usr/lib/avahi/service-types.db $avahi-browse -b | grep QOTD Quote of the Day (QOTD) Server
The entry in
avahi-browse should now be:
+ wlp2s0 IPv4 MyServer Quote of the Day (QOTD) Server local