Hacker News 中文摘要

RSS订阅

可查询的可执行文件 -- Queryable Executables

文章提出将可执行文件本身设计为SQLite数据库的SELF格式,不仅简化了二进制工具链,还能让运行中的程序在同一文件中读写自身状态,从而替代传统文件系统中的多个目录。

正文

好的,这是根据您的要求,对原文进行的中文重述,保留了核心细节并删减了与主题无关的内容。


标题:真正可查询的可执行文件

核心观点: 将可执行文件本身设计成一个SQLite数据库,这一理念不仅简化了程序的分发,更开创性地让运行中的程序能够将自身状态(如访问日志、用户数据)以事务方式写回同一个文件,从而彻底消除了对传统文件系统(如/var、/tmp)的依赖。

具体实现与示例:

  1. 概念回顾(SELF格式): 程序本身就是一个SQLite数据库。通过binfmt_misc机制,系统可以调用一个自定义解释器,读取数据库segments表中的行并跳转到入口点执行。这使得所有二进制工具的操作都可以转化为SQL查询。

  2. 关键突破: 既然可执行文件是可写的数据库,那么正在运行的程序能否用它来存储状态?答案是肯定的。这催生了self-httpd——一个概念验证型Web服务器。

  3. self-httpd 示例:

    • 单一文件: 整个服务器就是一个SQLite数据库文件。它包含了程序代码、网站内容、路由规则以及所有访问者的日志。
    • 状态自存储: 所有状态(如按钮点击次数、页面访问记录)都实时更新在同一个SQLite文件中。
    • 操作演示: 通过sqlite3 server命令可以直接查询服务器内部的运行数据,例如SELECT count(*) FROM presses可以查看按钮被按下的次数。
  4. 技术原理:

    • 访问自身: 程序通过argv[0]获取自身文件的路径,并打开它作为一个SQLite数据库进行读写。所有写入的数据在程序下次启动时依然存在。
    • 构建过程: 先编译出普通的ELF文件,然后通过elf2self工具将其转换为SELF格式。之后,通过标准的SQL DDL语句(如CREATE TABLE)和INSERT语句来添加应用数据和网站内容。
  5. 强大特性:

    • 事务性热更新: 可以在服务器运行时,通过sqlite3直接UPDATE数据库中的路由表来修改网站内容,无需重启或重新部署。ROLLBACK可以撤销更改。
    • 利用现有工具: 可以直接使用sqldiff来对比两个版本的程序文件,精确了解部署带来的变化。也可以利用SQLite的FTS5全文搜索功能,为网站内容建立索引。
    • 简化部署: 部署就像scp一个文件一样简单。数据迁移可以通过INSERT ... SELECT语句在两个数据库文件之间完成,确保访问日志等数据在新旧版本间无缝迁移。

总结与展望:

这种“真正可查询的可执行文件”(Actually Queryable Executable)理念,将程序从传统的“字节布局”规范重新定义为“数据库”,使得许多沿用数十年的复杂工具和流程变得不再必要。程序即数据库,数据库即程序。作者认为,这仅仅触及了可能性的表面,并期待看到更多基于此理念的有趣应用。

评论

根据评论内容,总结如下:

主要观点与论据:

  1. 创意与创新性(高度认可)

    • 评论1(stephenlf):“Fantastic ideas. The SQL Injection to ACE pipeline is incredible.”
    • 评论10(rao-v):“This is deranged, and perilously close to dumb, which makes it one of the best things I’ve seen on hacker news this year.”
    • 评论7(viveknathani_):“extremely creative stuff!”
  2. 技术实现与潜在应用(积极探讨)

    • 评论2(drdexebtjl)提出通过挂载命名空间和虚拟文件系统,使SQLite数据库支持文件访问,无需修改源码。
    • 评论6(yjftsjthsd-h)认为可将程序文本存储在数据库中,实现多架构二进制文件:“SELECT text FROM executable WHERE arch = $(uname -m)”。
    • 评论11(Tepix)询问能否让Web服务器从网络接收代码段并自更新(如插件上传)。
  3. 安全性与风险(谨慎态度)

    • 评论8(vlovich123)指出:“creates a huge potential security vulnerability where it’s a lot easier to trick the application into mutating itself”,并担忧多用户场景下每个用户需独立副本。
    • 评论4(jdub)强调:“I would never, ever, ever allow an internet-facing service binary to be self-writable.”
  4. 历史类比与哲学思考(中立)

    • 评论5(notaharvardmba)类比OS/400库:“everything is an object, libraries are basically like DB tables”。
    • 评论13(JaumeGreen)认为类似Lisp、Smalltalk程序镜像:“Everything old is new again.”
    • 评论12(quink)提及MUMPS的“globals”和^rOBJ。
  5. 实用性与部署挑战(混合观点)

    • 评论6(yjftsjthsd-h)偏好只读二进制文件+可写状态目录,但承认项目“coolest, most fun thing”。
    • 评论4(jdub)提出零停机升级方案(SIGHUP、fork+exec),但需解决数据迁移问题。

平衡性总结:
评论高度认可项目的创意和技术突破(如SQL注入到ACE管道、多架构支持),但普遍担忧安全风险(自修改二进制、多用户隔离)和部署复杂性(升级流程、权限管理)。部分评论将其与历史系统(OS/400、Smalltalk)类比,认为这是旧理念的新生。整体呈现“惊艳但需谨慎”的基调。