在Linux 7.1合并窗口期的首日,首批获准合并的拉取请求中包含了Christian Brauner提交的多个VFS相关补丁。其中合并的代码实现了对套接字上user.*扩展属性的支持。
这项套接字扩展属性功能尤其受到GNOME和systemd开发者的期待,这是他们推动更广泛采用Varlink作为进程间通信(IPC)机制的重要一环。套接字上的user.*扩展属性对Linux容器使用场景也大有裨益。
Brauner在拉取请求中精辟总结了新功能:
"重构简单扩展属性机制并支持套接字上的user.*扩展属性。本次重构了simple_xattr基础架构,新增了对套接字上user.*扩展属性的支持。 ... 基于此基础架构,本系列补丁实现了套接字上的user.*扩展属性支持。基于路径的AF_UNIX套接字可从底层文件系统(如tmpfs)继承扩展属性支持,但sockfs中的套接字——包括通过socket()创建的所有套接字及抽象命名空间AF_UNIX套接字——此前完全不具备扩展属性支持。
我们重构了xattr_permission()检查机制,以允许在S_IFSOCK索引节点上使用user.*扩展属性。Sockfs套接字为每个索引节点设置了128个扩展属性数量上限和128KB总值的容量限制,这与kernfs现行限制保持一致。
实际需求来自多个方面。systemd和GNOME正在扩大Varlink作为IPC机制的应用范围。对于D-Bus,存在诸如dbus-monitor这类可观测系统级IPC流量的工具,但这仅因D-Bus具有中央代理机制才得以实现。Varlink没有代理机制,目前无法识别哪些套接字使用Varlink协议。通过套接字上的user.*扩展属性,服务可为其套接字标记所使用的IPC协议(例如user.varlink=1),eBPF程序随后便能选择性捕获这些套接字的流量。结合这些扩展属性标签,通过netlink枚举绑定套接字为发现所有Varlink IPC入口点提供了调试和自省的新途径。
同样地,systemd-journald希望在/dev/log套接字上使用扩展属性进行协议协商,以表明是否支持RFC 5424结构化syslog,或是否仅应使用传统的RFC 3164格式。
在容器环境中,这些标签尤为实用,因为高权限或更复杂的套接字识别方案往往不可用。
本系列补丁配备了全面的自测用例,涵盖基于路径的AF_UNIX套接字、sockfs套接字操作、单索引节点限制强制执行,以及跨多地址族(AF_INET、AF_INET6、AF_NETLINK、AF_PACKET)的扩展属性操作。"
Linus Torvalds已将这项套接字用户扩展属性支持合并至Linux 7.1版本周期,且未收到任何异议。