这是将 Plan 9 优雅的网络服务管理设计适配到 Linux 环境(聚焦 Guix 系统发行版)的全面内容,主要观点、关键信息和重要细节如下:
- 引言:Plan 9 用
listen软件启动网络服务,其设计相比 Linux 现有方式有三方面优势,本文描述将其适配到 Linux 和 Guix 系统的努力,listen已在the-dam.org上使用,提供了echo、finger和git服务的访问方式。 贡献:
listen:可下载的listenbash 脚本及相关操作,如创建用户和组、设置目录权限等。f29p:从头开发的 Golang 9P2000.L FUSE 客户端,用于在容器中挂载 9P 服务器。os/listen:对操作系统的深度修改的操作函数,使安装listen更简单。fingerd:与listen配合的网络透明finger实现。
- 术语表:明确了
namespace(进程对文件系统的视图)、Guix(包管理器和操作系统)、service(UNIX 背景下的后台进程及listen管理的网络服务等)在文中的含义,避免歧义。 - 操作系统配置函数:
listen需要对操作系统进行一系列修改,如安装相关软件、创建用户和目录、设置权限等,使用 Guix System 的声明式配置机制更简单安全,其基于有向无环图机制扩展。 - 精细的端口访问控制 API:
listen通过将端口与文件名等同,利用 UNIX 的文件访问控制 API 实现 per-user、per-port、per-program 的端口分配,避免了 Linux 传统的粗粒度端口权限划分问题。 - 网络服务脚本:以
echo、finger、git服务为例,展示listen如何在受限的命名空间中运行网络服务脚本,包括访问外部数据(通过挂载 9P 服务器)、使用自定义软件(通过 Guix 配置文件)等,还介绍了服务脚本的容器化隔离、数据传递方式等。 listen的工作原理:listen通过遍历/srv/listen/下的tcpXXX文件来启动服务,利用inotify监控目录变化,为服务创建隔离容器,设置服务的配置和日志等,通过socat进行数据转发。listen以低权限用户运行,服务脚本在容器中运行,以增加安全性。替代方案:
- Plan 9 的
listen和 Inferno 的svc:其模式可借鉴到 Linux,如使用命名空间脚本、简单脚本、处理身份验证等,但需解决 Linux 中相关机制的缺乏问题。 - (x)inetd:曾用于启动网络服务,但已过时,存在一些与
listen相比的缺点,如配置文件权限、服务进程视图等。 - Authbind:允许基于用户和端口进行特权端口访问,但与
listen的功能和实现方式不同。 - Systemd:可运行临时服务,但会带来其他系统管理方面的问题。
- Plan 9 的
进一步工作和立场:
- 实现容器内非特权的 9P 挂载。
- 移植
/net以避免混合能力和 Linux 命名空间。 - 移植 OpenBSD 的
pledge到 bash 以加强命名空间控制。 - 收紧可执行包装器以提高安全性。
- 关注新协议的
listen服务。 - 解决防止资源耗尽的问题。
- 摒弃端口号,采用更优的协议设计。
- 结论:此工作如漏水的大坝,未能完全适配历史遗留问题。
- 变更日志:<2024-04-12 Fri>认识到其他 9P 客户端/服务器组合在容器内可工作。
- 参考文献:列出了文中引用的相关文献。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。