使 Plan 9 的 listen 适应 GNU Guix

这是将 Plan 9 优雅的网络服务管理设计适配到 Linux 环境(聚焦 Guix 系统发行版)的全面内容,主要观点、关键信息和重要细节如下:

  • 引言:Plan 9 用listen软件启动网络服务,其设计相比 Linux 现有方式有三方面优势,本文描述将其适配到 Linux 和 Guix 系统的努力,listen已在the-dam.org上使用,提供了echofingergit服务的访问方式。
  • 贡献

    • listen:可下载的listenbash 脚本及相关操作,如创建用户和组、设置目录权限等。
    • f29p:从头开发的 Golang 9P2000.L FUSE 客户端,用于在容器中挂载 9P 服务器。
    • os/listen:对操作系统的深度修改的操作函数,使安装listen更简单。
    • fingerd:与listen配合的网络透明finger实现。
  • 术语表:明确了namespace(进程对文件系统的视图)、Guix(包管理器和操作系统)、service(UNIX 背景下的后台进程及listen管理的网络服务等)在文中的含义,避免歧义。
  • 操作系统配置函数listen需要对操作系统进行一系列修改,如安装相关软件、创建用户和目录、设置权限等,使用 Guix System 的声明式配置机制更简单安全,其基于有向无环图机制扩展。
  • 精细的端口访问控制 APIlisten通过将端口与文件名等同,利用 UNIX 的文件访问控制 API 实现 per-user、per-port、per-program 的端口分配,避免了 Linux 传统的粗粒度端口权限划分问题。
  • 网络服务脚本:以echofingergit服务为例,展示listen如何在受限的命名空间中运行网络服务脚本,包括访问外部数据(通过挂载 9P 服务器)、使用自定义软件(通过 Guix 配置文件)等,还介绍了服务脚本的容器化隔离、数据传递方式等。
  • listen的工作原理listen通过遍历/srv/listen/下的tcpXXX文件来启动服务,利用inotify监控目录变化,为服务创建隔离容器,设置服务的配置和日志等,通过socat进行数据转发。listen以低权限用户运行,服务脚本在容器中运行,以增加安全性。
  • 替代方案

    • Plan 9 的listen和 Inferno 的svc:其模式可借鉴到 Linux,如使用命名空间脚本、简单脚本、处理身份验证等,但需解决 Linux 中相关机制的缺乏问题。
    • (x)inetd:曾用于启动网络服务,但已过时,存在一些与listen相比的缺点,如配置文件权限、服务进程视图等。
    • Authbind:允许基于用户和端口进行特权端口访问,但与listen的功能和实现方式不同。
    • Systemd:可运行临时服务,但会带来其他系统管理方面的问题。
  • 进一步工作和立场

    • 实现容器内非特权的 9P 挂载。
    • 移植/net以避免混合能力和 Linux 命名空间。
    • 移植 OpenBSD 的pledge到 bash 以加强命名空间控制。
    • 收紧可执行包装器以提高安全性。
    • 关注新协议的listen服务。
    • 解决防止资源耗尽的问题。
    • 摒弃端口号,采用更优的协议设计。
  • 结论:此工作如漏水的大坝,未能完全适配历史遗留问题。
  • 变更日志:<2024-04-12 Fri>认识到其他 9P 客户端/服务器组合在容器内可工作。
  • 参考文献:列出了文中引用的相关文献。
阅读 26
0 条评论