[功能请求] 支持不可寻址的文件描述符(例如 FIFO)用于快照内存输出

作者: kevin-oliveira-zocdoc创建于 2026年7月14日更新于 2026年9月14日
标签Type: EnhancementStatus: Awaiting author

□动机

将`mem file path'指向一个FIFO(名管),这样可以将快照内存流到另一个进程(如压缩、加密或上传)而无需首先在本地磁盘上着陆。

目前,由于 " src/vmm/src/vstate/memory.rs " 中的 " dump () " / " dump dirty () " 要求作者在写作前在 " src/vmm/src/vstate/vm.rs " 中执行 " Seek " 和 " snapshot memory to files " 。 两种操作在不可检索的文件描述符上都失败了("ESPIPE").

更糟糕的是,失败是沉默的——当mem file path'是FIFO时,CreateSnapshot' API无限期地挂起而不是返回错误。 求救电话中的`.unwrap()'引起恐慌或无法恢复的内部状态:

zz
fn turn <T: WriteVolatile + std::io: Seek > ( &self, writer: & mut T) - > result < (), 记忆错误 > {
自定义( I)
平面图(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
.try  for each (\( mem slot,已插入) {{
如果 ! 插出 {
let ilen = i64:try  from(mem slot.slic.len ()). unwrap ();
writer.seek (SeekFrom: Current (ilen)). unwrap (); // FIFO上恐慌
否则
作者. write all volatile( & mem slot.slice) ?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
Ok((()))
) (中文(简体) ).
.map err(记忆错误:写出记忆)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

□ 描述理想的解决办法

两个可分开的改进:

  1. 失败快: 如果 mem file path 不是一个正则文件( 或者如果 set len () / seed () 失败), 返回一个明显的 API 错误而不是挂起 。

  2. 支持非可种子 fd: 对于未插入的内存槽, 垃圾站( ) 使用 set( SeekFrom: Current(n)) 来跳过它们 。 在非可检索的fd上,这可以被写入n零字节所取代. set len () 在目标不是正则文件时可以跳过预分配 。

  3. diff-snapshot路径(dump dirty)有相同的模式——通过搜索跳过干净的页面,写出肮脏的页面,并且可以类似地被修改.

检查

  • 您是否为类似的请求搜索了鞭炮问题数据库 ?
  • 你读过所有现有的有关鞭炮的文件吗?
  • 你读过和理解了"鞭炮"的核心信条吗?

内容来源: firecracker-microvm/firecracker