<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Aptos;
        panose-1:2 11 0 4 2 2 2 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:12.0pt;
        font-family:"Aptos",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Aptos",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="en-SE" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US">Thank you for your comprehensive answer and your time. I have a good understanding.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US">/proc/net/unix with xattr sounds like a good idea. I guess one caveat is that it won’t show the activatable varlinks.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US">Maybe we are talking about 2 kinds of discovery, one of them is the service discovery and the other one is the interface discovery (registry of which services implement
 what interface). Maybe the service discovery can happen on the file system level (any file in /run/varlink folder is a varlink service which should reply to Describe interface). I don’t think having a process to resolve the good name to socket makes sense
 for something this simple. <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US">Maybe the interface discovery should happen on the interested services address space. For example, an API that watches and traverses through the service discovery folder
 and asks each varlink about their interfaces to create a registry. The interface discovery curious service pays the price of keeping a registry. Maybe the API can be part of the sd-varlink in libsystemd.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US">Umut<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="color:black">From:
</span></b><span style="color:black">Lennart Poettering <lennart@poettering.net><br>
<b>Date: </b>Thursday, 28 November 2024 at 10:39<br>
<b>To: </b>Umut Tezduyar Lindskog <Umut.Tezduyar@axis.com><br>
<b>Cc: </b>systemd-devel@lists.freedesktop.org <systemd-devel@lists.freedesktop.org><br>
<b>Subject: </b>Re: [systemd-devel] systemd and varlink<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">On Mi, 27.11.24 19:01, Umut Tezduyar Lindskog (Umut.Tezduyar@axis.com) wrote:<br>
<br>
> Hello systemd,<br>
><br>
> We are closely observing the varlink development and excited about<br>
> it. Our guys who were at the all systems go conference mentioned<br>
> that the Resolver is not part of the systemd family. Ref: Resolver<br>
> (<a href="https://varlink.org/">https://varlink.org/</a>) . What is the upstream’s thoughts regarding<br>
> service discovery?<br>
<br>
So right now in systemd if you want to talk to a service, you just<br>
need to know the socket you have to talk to. Sockets are typically<br>
AF_UNIX sockets in the file system, hence you have pretty expressive<br>
identifiers: file system paths. For example you need to know that<br>
hostnamed's socket is /run/systemd/io.systemd.Hostname, and then you<br>
can for example issue a command like the following from the command<br>
line:<br>
<br>
   varlinkctl introspect /run/systemd/io.systemd.Hostname<br>
<br>
or call a method:<br>
<br>
   varlinkctl call /run/systemd/io.systemd.Hostname io.systemd.Hostname.Describe '{}'<br>
<br>
if we'd implement Varlink service discovery this would allow two<br>
things:<br>
<br>
1. It would allow you to fire off varlink calls without specifying a<br>
   socket at all, you could then do something like this:<br>
<br>
   varlinkctl call - io.systemd.Hostname.Describe '{}'<br>
<br>
   or so (this is purely hypothetical, this is not implemented after<br>
   all). And then it would be able to use service discovery to find<br>
   the right socket to talk to. Which is great, because it means<br>
   everything can be figured out from the fully qualified method name<br>
   already, which would make varlink even nicer to use I guess than<br>
   D-Bus, because having a single identifier for a method instead of<br>
   the complexity that D-Bus brings for this (i.e. to invoke a method<br>
   on dbus you need to know which bus, which service name, which<br>
   object path, which interface, which member name, i.e. a quintuplet<br>
   of information instead of just a single identifier).<br>
<br>
2. In theory, you could get a somewhat comprehensive list of all<br>
   relevant sockets. So in a way it would be a bit like "cat<br>
   /proc/net/unix" but only showing sockets that you can actually talk<br>
   Varlink on. Kinda. More or less.<br>
<br>
Now, in systemd we currently haven#t bothered with implementing the<br>
service discovery part of Varlink for a variety of reasons:<br>
<br>
1. We want to use Varlink during earliest boot already, that's one of<br>
   the fundamental goals we had with all this. i.e. before we start<br>
   any services, but the service discovery daemon of course would be a<br>
   service, hence we'd be back in that world where we are in dbus<br>
   where dbus must be up for us to do IPC, which is not an<br>
   improvement.<br>
<br>
2. One of the first places we used Varlink was the userdb stuff,<br>
   i.e. this stuff: <a href="https://systemd.io/USER_GROUP_API/">https://systemd.io/USER_GROUP_API/</a> – But for that<br>
   the concept implies you have a multitude of services all<br>
   implementing the very same interfaces, so that multiple subsystems<br>
   can provide user records to the system. But that conceptually<br>
   doesn't really fit into the varlink service discovery model, which<br>
   assumes services are singletons: each interface has exactly one<br>
   service that implements it. It after all translates one interface<br>
   name into exactly one socket address.<br>
<br>
3. In the Linux world things are often split up between per-system and<br>
   per-user services, and we'd thus need two resolvers, and thus you'd<br>
   probably not really get away with only needing to specify a single<br>
   fully qualified name to invoke a method, you'd also need to<br>
   specifiy a scope after all, hence the gain is not as big as one<br>
   might think.<br>
<br>
4. The service discovery part is a bit underspecified, i.e. the<br>
   address format is not part of the spec. Neither is the address the<br>
   resolver listens on specified.<br>
<br>
Or to summarize: I think the service discovery is not really necessary<br>
for our usecase, and it probably needs more love and spec'ing out to be<br>
truly useful.<br>
<br>
I am not ruling out implementing this eventually. But I think for now<br>
we are fine with expecting specification of both a socket path and a<br>
fully qualified method name for doing method calls.<br>
<br>
Something I'd really love to see if we some day could teach varlinkctl<br>
to actually enumerate /proc/net/unix and then filter out sockets that<br>
aren't Varlink. We could for example use xattrs on the entrypoint<br>
inode for that: i.e. unix sockets in the fs that have the<br>
"user.varlink" xattr set to "1" would be discoverable as Varlink<br>
sockets. That would be super nice, because we'd use basic OS concepts<br>
only, and it would just work, and would be extensible to other<br>
protocols too. Alas – the Linux kernel VFS currently hard refuses<br>
setting user.* xattrs on socket inodes. It's an artificial limitation<br>
afaics, so I have hopes this is eventually lifted in the kernel, but<br>
right now, it's there.<br>
<br>
> >From the NEWS:<br>
><br>
> “systemd-machined gained a pretty complete set of Varlink APIs<br>
> exposing its functionality. This is an alternative to the<br>
> pre-existing D-Bus interface.”<br>
><br>
> For example, how can systemd-machined be discovered?<br>
<br>
machined's varlink socket is /run/systemd/machine/io.systemd.Machine,<br>
and this is even documented in its man page. Use "varlinkctl<br>
introspect /run/systemd/machine/io.systemd.Machine" to see what it offers.<br>
<br>
> If the varlink interface is an alternative to the D-Bus, how is the<br>
> authorization handled?<br>
<br>
Authorization in Varlink is two-fold:<br>
<br>
1. There's file ownership + ACLs on the socket entrypoint inode.<br>
<br>
2. And there's polkit, just like for dbus. systemd authenticates<br>
   varlink client with polkit in various places. Right now this means<br>
   talking D-Bus for this, but hopefully polkit one day learns varlink<br>
   too, so that we can avoid this. But this should be invisble to<br>
   clients, thankfully. (This implies that in systemd during early<br>
   boot, until D-Bus + polkit are accessible no polkit authentication<br>
   can take place, which hence means systemd-provided varlink services<br>
   only allow root to access them then – which should be fine however,<br>
   given that regular users should not be able to log in that early<br>
   anyway.)<br>
<br>
> The JSON transcoding is great for debugging but it is consuming CPU<br>
> cycles in production, especially important for constraint<br>
> devices. Has there been any discussion on using alternative<br>
> transcoding but switching to JSON with monitor connections.<br>
<br>
Uh. That's made up, sorry. for large data, yes it can be slower than<br>
binary marshallings, but for smaller data (which varlink traffic is)<br>
this is barely measurable.<br>
<br>
The marshalling thing is often brought up by D-Bus apologists, but<br>
it's a bogus argument. The fact that JSON demarshalling is a bit<br>
slower than binary encodings is absolutely dwarfed by the slowness<br>
that D-Bus brings with it because it forces so many roundtrips and a<br>
single data pipe through the broker process. Roundtrips kill your<br>
performance, JSON marshalling is entirely irrelevant for that.<br>
<br>
People have done profiling on this. For example zbus' Zeeshan Ali<br>
posted about this on Mastodon some time ago, where he compared zbus<br>
and varlink demarshalling and indeed noticed that for small messages<br>
it's impossible to measure the marshalling difference between varlink<br>
and dbus, but the roundtrip diff very much is.<br>
<br>
Lennart<br>
<br>
--<br>
Lennart Poettering, Berlin<o:p></o:p></span></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>