高级

本章汇集了面向高级用户的功能界面——偶尔才会用到、而不是每天都用的那些。内容包括:用 回退主目录… 把机器的主目录回退到较早的一次开机;内置的 ext4 文件浏览器,无需启动虚拟机即可直接在 Mac 上打开机器的磁盘镜像;原生的文件系统检查;以及几项底层配置默认值。

机器(在设置编辑器中称为工作区)把数据保存在两个 Linux ext4 磁盘镜像中:系统磁盘和主目录镜像。本章的所有内容都假定你已熟悉机器和资源设置中描述的存储模型。

回退机器的主目录

每当机器成功启动,Bromure 都会为其主目录镜像创建一个写时复制的检查点——也就是存放你的项目检出、点文件、.ssh、shell 历史和代理状态的 /home/ubuntu。检查点按阶梯方式保留:最近几次开机,然后一周内每天一个,再然后一个月内每周一个。只有当当前主目录与它们产生差异时,才会真正占用磁盘空间。

回退主目录… 是日常使用它们的方式:

  1. 在侧边栏中打开 虚拟机,点按该机器所在行上的 ⋯ 按钮。
  2. 选择 回退主目录…。随即打开一个标题为 回退“‹机器›”的主目录 的表单:“每个时间点都是该次开机开始时的主目录。下次启动会从你选择的时间点开机;当前的主目录会保留为一个新的时间点,因此可以在这里撤销。”
  3. 在列表中选择一个时间点。每一行显示日期和时间、距今多久,以及该检查点在磁盘上的大小。
  4. 点按 回退。
回退“Web app”的主目录表单,说明每个时间点都是该次开机开始时的主目录,并显示消息“还没有回滚点——这台机器每次启动时都会创建一个”,以及取消和回退按钮

完成后,表单显示“完成——“‹机器›”下次启动将从它在 ‹日期› 的主目录开机。”其他一切都不会改变:系统磁盘、机器的设置及其凭据都保持原样。

须知:

  • 机器必须处于关机状态。 主目录镜像会被整体替换,因此不能处于使用中。机器运行时,表单会显示“机器正在运行——使用中的主目录无法替换。请先将其关机。”并提供 关机 按钮;在机器关机之前,回退 始终处于停用状态。
  • 回退可以撤销。 替换之前,当前的主目录会成为同一列表顶部的一个新回滚点。要撤销,再次打开 回退主目录… 并选择它即可。
  • 还没有时间点。 从未开机或刚刚创建的机器会显示“还没有回滚点——这台机器每次启动时都会创建一个。”
  • 较旧的机器。 仍把主目录放在 Mac 上某个文件夹中的机器(旧版的共享文件夹主目录)没有可回退的镜像;表单会显示“这台机器把主目录放在 Mac 上,而不是镜像中——没有可回退的内容。”请先在 资源 面板中升级其存储。
  • 远程机器。 在富客户端的镜像窗口中,回退主目录… 的工作方式相同,作用于服务器上的检查点。

其他存储操作

机器的 资源 面板(⋯ › 编辑… › 资源)保留了较旧的、按层划分的操作。机器的窗口打开时,这些操作会被停用(“请先关闭会话窗口。”):

按钮层作用
恢复主文件夹…主目录(ext4)与 回退主目录… 相同的回滚,以带有时间点弹出列表的警告框呈现:恢复 / 取消。会先为当前主目录创建检查点。
清除主目录…主目录清除 /home/ubuntu 下的一切——项目克隆、shell 历史、缓存、机器的 SSH 密钥对。由 Bromure 管理的文件(.bashrc、.gitconfig、CLI 配置)会在下次启动时根据机器的设置重建。
重置为基础…系统磁盘从基础镜像重新克隆系统磁盘。用 apt 安装的任何内容,以及 /etc、/var、/usr、/opt 下的更改都会丢失;主目录会保留。

机器的 ⋯ 菜单中也有 重置磁盘,即同样的系统磁盘重置。完整面板参见资源设置。

ext4 文件浏览器

macOS 没有原生的 ext4 支持,因此通常查看机器磁盘镜像内部内容的唯一方法就是启动虚拟机。Bromure 用自己无依赖的 ext4 读写器避开了这一点:它直接解析磁盘上的格式,并向你展示目录树。

工作区 › 打开 ext4 文件… 可以在一个类似 Finder 的窗口中打开任意 ext4(也支持 ext2 或 ext3).img——无论是原始文件系统还是 MBR/GPT 分区磁盘。无需挂载、无需启动虚拟机,也不需要任何提升的权限。

注意: 镜像默认以只读方式打开——即使某个虚拟机仍然连接着该磁盘也是安全的。编辑是一个单独且需明确解锁的步骤(参见 编辑镜像)。

可以打开的内容

机器位于 ~/Library/Application Support/BromureAC/profiles/<uuid>/ 下。其中有两个镜像值得浏览,外加它们的回滚检查点:

镜像浏览器显示的内容工具栏信息行显示
disk.imgUbuntu 系统根目录——/etc、/var、/usr、/opt 等。该磁盘采用 GPT 布局(一个 EFI 分区外加 ext4 根分区);浏览器会自动定位 ext4 根分区。partition @…MiB
home.img客户机的 /home/ubuntu,直接位于文件系统根目录——包括点文件、项目检出、.ssh、shell 历史,以及 Bromure 自己的文件夹 .bromure/。raw
checkpoints/<ts>.img每次开机时创建的 disk.img 检查点。partition @…MiB
checkpoints/home/<ts>.img每次开机时创建的 home.img 检查点——也就是 回退主目录… 列出的时间点。raw

主目录镜像之所以如此,是因为客户机在开机时会把它挂载覆盖在 /home/ubuntu 上,因此镜像自身的根目录就是那个主目录。Kubernetes 节点、镜像仓库和消息连接器则把它们的磁盘放在 kube/<id>/nodes/<uuid>/ 下,打开方式相同。

打开镜像

  1. 选择 工作区 › 打开 ext4 文件…。
  2. 出现一个标题为 打开 ext4 磁盘镜像 的打开面板——“选择一个 ext4 .img 磁盘镜像(原始或分区)。”——起始位置为 ~/Library/Application Support/BromureAC。进入某台机器的 profiles/<uuid>/ 文件夹,选择 disk.img、home.img,或 checkpoints/ 下的某个文件。
  3. 浏览器在一个标题为 ext4 — «filename» 的窗口中打开,显示文件系统根目录。

工具栏的信息行概括了该卷:其标签、总大小、文件系统是以原始形式还是在分区偏移处找到的,以及其状态——clean、not cleanly unmounted 或 journal needs recovery。每个镜像对应一个窗口;重新打开一个已打开的镜像只会让其窗口获得焦点。

浏览、预览与提取

主视图是一个三列表格——名称、大小 和 类型——目录排在最前。类型区分文件夹、文件和符号链接,以及特殊的 Unix 节点类型(字符设备、块设备、FIFO、套接字)。

  • 浏览——双击文件夹进入;单击工具栏的 向上 箭头返回。面包屑显示当前路径。
  • 预览——双击文件,或右键单击并选择 预览。文本文件渲染为文本;二进制文件渲染为十六进制转储。无论哪种方式,预览都限制在前 1 MiB,页脚会报告在文件的总字节数中显示了多少。符号链接会预览为其目标路径。
  • 提取——右键单击文件并选择 提取…,通过一个存储面板将其完整内容写入你的 Mac。这是你最常使用的只读路径。

编辑镜像

编辑被刻意置于一道门槛之后。单击工具栏中的 启用编辑…;警告框 要启用此磁盘镜像的编辑吗? 会提示:

仅编辑其工作区虚拟机已停止的镜像。向正在运行的虚拟机所打开的磁盘写入会将其损坏。

单击 启用编辑 后,镜像会以读写方式重新打开,工具栏中带有一个橙色的 编辑 标记。此时文件的上下文菜单会新增 替换…:选择一个宿主机文件,用其内容就地覆盖所选文件。编辑器会重新计算 inode 的校验和,因此结果保持一致。

警告: 替换仅限就地进行。新内容必须能容纳在文件已分配的块中——较大的文件会被拒绝并提示 该文件将需要扩大(扩大、创建和删除文件的功能未启用)。内联数据文件无法编辑。当日志需要恢复时写入会被拒绝——请先运行 fsck(见下文)。并且切勿编辑正在运行的虚拟机所连接的镜像。

检查和修复磁盘

Bromure 用自己内置的检查器来检查和修复 ext4 镜像——无需安装任何东西(macOS 不附带 e2fsprogs,Bromure 也不使用它)。你会在三个地方遇到它:

  • 开机时自动运行。 当机器因文件系统错误而停止开机时,其舞台会显示 磁盘错误——“系统磁盘未通过开机时的文件系统检查,开机无法继续。”——并提供 修复磁盘 和 重置系统磁盘…。修复磁盘 会停止虚拟机,对系统磁盘运行检查器,然后再次开机;不会删除任何内容。如果下次开机仍然失败,就应该重置。参见故障排除。
  • 在 ext4 浏览器中。 工具栏上的 运行 fsck… 按钮。
  • 在命令行中。 bromure-cli vm fsck <workspace> [--repair] [--home]——参见 CLI、API 与 MCP。

在浏览器中,运行 fsck… 会询问 要检查此镜像吗?——“如果文件系统日志是脏的,这会重放日志并校验元数据。工作区虚拟机必须已停止。这可能会修改镜像。”——并提供 运行 fsck 和 取消。结果显示在一个标题为 fsck.ext4 的表单中,完整输出上方有一行摘要:

摘要含义
“文件系统是干净的。”无需任何操作。
“文件系统已修复;现在是一致的。”日志已重放;镜像现在与客户机内核最后一次提交的内容完全相同。
“文件系统存在此检查器无法修复的错误。”损坏超出了未完成的日志。

随后镜像会重新打开,因此浏览器显示的是修复后的状态。

检查器能做什么、不能做什么:

  • 修复 会重放文件系统日志,并清除“需要恢复”标志。对于几乎所有损坏的 Bromure 磁盘来说,这就是全部:镜像变脏是因为虚拟机在写入途中被停止或崩溃,而不是数据老化。
  • 校验 始终检查超级块和组描述符的校验和,然后从根目录遍历整棵树,验证每个可达 inode 的校验和与 extent 树。它会报告发现的问题,但不会修补。
  • 对于检查器无法修复的损坏,真正的解决办法是在虚拟机中使用 Linux 自己的 e2fsck。客户机本来就会在每次开机时检查主目录镜像,而 Kubernetes 节点和镜像仓库会退而使用一台一次性机器,自动对它们的磁盘运行 e2fsck。至于工作区的系统磁盘,重置为基础… 会重新克隆它,并且不动主目录。

何时使用这些工具

  • 撤销对主目录的破坏——代理删错了文件夹,或者某个点文件的改动弄坏了你的 shell:用 回退主目录… 回到最后一次正常的开机。
  • 找回文件——从你不想启动的机器中,用 提取… 从 home.img 中取出尚未提交的更改或日志。
  • 检查检查点——在回退之前确认它包含你期望的内容:在 ext4 浏览器中从 checkpoints/home/ 打开它。
  • 抢救无法开机的机器——让 修复磁盘 重放日志;如果原因是某个有问题的配置文件,用浏览器就地替换它,然后运行 fsck。开机失败的诊断参见故障排除。

开发者默认值

有若干底层开关是从应用的 UserDefaults 域 io.bromure.agentic-coding 中读取的。在应用未运行时使用 defaults write 设置它们,然后重新启动:

键作用默认值
vm.homeImageGB新创建的 ext4 主目录镜像的表观(客户机可见)大小,单位为 GiB。宿主机文件是稀疏的,因此这不会在一开始占用任何空间。取值范围限制在 8–1024。旧版主目录迁移到它的第一个镜像时,至少会有 64。16
vm.mtu机器虚拟机主网卡的 MTU 限制值,每次启动时写入客户机。默认值 1280 对 VPN 安全(WireGuard、IKEv2 以及企业 PMTU 路径)。1280
terminal.allowGraphics重新启用来自客户机的终端内图像渲染(kitty 图形协议)。默认关闭,因为这意味着宿主机要解码客户机提供的图像字节——而同一通道也可能在终端上绘制伪造的 UI。只有在你希望代理内嵌渲染图像、并愿意承担该风险时才打开它。NO
ui.terminalBell允许终端响铃。默认关闭:代理在每一轮结束时都会响铃,而侧边栏的状态已经会告诉你。NO

例如,要让未来机器的主目录镜像显示为 128 GiB:

defaults write io.bromure.agentic-coding vm.homeImageGB -int 128

注意: vm.homeImageGB 仅影响更改之后创建的主目录镜像;现有镜像会保持原有大小。主目录镜像稍后可以扩大,但不能缩小。

提示: 对于真正一次性的工作,bromure-cli vm run --rm 会启动一个 Docker 风格的一次性工作区,其磁盘会在虚拟机停止时被删除——详见 CLI、API 与 MCP。

UserDefaults 键和环境变量的完整列表见附录。