docker/transfused Docker Image
用于挂载osxfs文件系统的Linux辅助工具
osxfs
镜像概述和主要用途
osxfs 是一个 Linux 文件系统,专为解决 Docker for Mac 与其封装的 Linux 虚拟机(VM)之间的 -v 绑定挂载问题而设计。它提供 FUSE(用户空间文件系统)实现,支持容器中的 inotify 事件监听,并可副存储文件节点所有权元数据。这些特性通过支持使用 inotify 监听文件系统事件的 Linux 容器,以及允许 Docker for Mac 客户端以普通用户身份在 macOS 上运行,满足容器开发场景需求。
核心功能和特性
系统组件
osxfs 系统包含两个主要组件:
- transfused:Linux FUSE 协议代理,负责与 virtio vsocks 通信
- com.docker.osxfs:macOS 程序,运行 Linux FUSE 服务器
文件系统消息流程
从用户应用发起的文件系统操作,典型流程如下:
- Linux VFS 通过系统调用接收文件系统操作
- FUSE 驱动从 VFS 多路分解器被调用
- FUSE 通过预协商的
/dev/fuse文件描述符发送 FUSE 消息 - transfused 在代理线程中读取 FUSE 消息,并通过
AF_VSOCK套接字(virtio vsock)重传 - virtio vsock 将消息放入环形缓冲区等待传输
- virtio vsock 触发硬件故障以通知 hypervisor
- HyperKit 接收硬件故障并从队列中取出消息
- HyperKit 将消息转发至 UNIX 域套接字
- osxfs 从 UNIX 域套接字读取消息并解析
- osxfs 执行 macOS 文件系统操作以完成请求
- osxfs 构造包含请求错误或结果的数据包,并通过 UNIX 域套接字传输
- HyperKit 从 UNIX 域套接字读取响应
- HyperKit 将响应放入环形缓冲区
- HyperKit 在 Linux 中触发中断
- virtio vsock 接收中断并从队列中取出响应
- virtio vsock 通过
AF_VSOCK套接字将响应发送至 transfused - transfused 在独立线程中读取响应,缓冲至完整消息后写入
/dev/fuse文件描述符 - FUSE 接收响应并为阻塞的用户空间线程排队
- FUSE 中的用户空间线程解除阻塞,从队列中取出并解码响应
- 响应(必要时修改 VFS 状态)通过解除阻塞的系统调用返回至调用进程
上述流程延迟约为 100 微秒。
关键特性
- inotify 事件支持:允许容器内应用通过 inotify 监听文件系统事件
- 元数据管理:副存储文件节点所有权元数据,确保容器内文件权限与 macOS 主机协调
- 跨系统通信:基于 virtio vsock 和 HyperKit 实现 Linux VM 与 macOS 主机间的高效消息传输
- 动态挂载控制:内置服务器监听容器挂载/卸载请求,动态启用/禁用 FSEvents 监听器以触发 inotify 事件
使用场景和适用范围
适用场景
- Docker for Mac 用户需在 Linux 容器中使用 inotify 监听文件变更(如前端开发热重载、日志监控)
- 需确保容器内文件所有权元数据正确映射至 macOS 主机的场景(如多用户协作、权限敏感应用)
- 需在 macOS 上以普通用户身份运行 Docker for Mac 客户端,同时保持容器内文件系统操作兼容性
适用范围
仅适用于 Docker for Mac 环境,作为 Linux VM 与 macOS 主机间的绑定挂载中间层,不支持其他操作系统(如 Linux 或 Windows 主机)。
详细使用方法和配置说明
osxfs 作为 Docker for Mac 的内置组件,无需手动部署。用户通过 Docker 挂载命令间接使用其功能,主要通过配置挂载一致性模式优化性能。
一致性模式配置
Docker 引擎支持通过一致性标志(per-container-mount 级别)指定挂载一致性策略,osxfs 根据策略调整缓存行为以平衡性能与一致性。支持以下模式:
| 模式 | 说明 |
|---|---|
delegated | macOS 主机为文件系统状态权威源,容器内写入延迟同步至主机,性能最优 |
cached | 容器内读取使用缓存,写入立即同步至主机,平衡性能与一致性 |
strict | 完全同步,容器与主机文件系统状态严格一致,性能最低但一致性最高 |
使用示例:
通过 docker run 命令挂载目录时指定一致性模式:
bashdocker run --rm -v $(pwd):/app:delegated docker.xuanyuan.run/alpine sh -c "echo 'test' > /app/file.txt"
性能测量工具
osxfs 提供内置工具用于性能分析,帮助定位延迟瓶颈。
perfstat
记录 osxfs 与 transfused 间消息的单调时间延迟和类型,需通过 osxfs 二进制子命令调用。
使用示例:
测量 100,000 次 1KiB 块写入操作的性能:
bash# 假设 osxfs_ctl.native 路径为 Docker for Mac 内置路径 /Applications/Docker.app/Contents/Resources/bin/osxfs_ctl.native perfstat --export /Users perfstat-dd.dat -- docker run --rm -v $(pwd):/host -w /host alpine dd if=/dev/zero of=zeros bs=1024 count=100000
perfstat_analyze
解析 perfstat 生成的日志文件,输出性能摘要报告。
使用示例:
分析上述 perfstat-dd.dat 日志:
bash/Applications/Docker.app/Contents/Resources/bin/osxfs_ctl.native perfstat_analyze perfstat-dd.dat
典型输出:
Elapsed: 19.796321007s Messages: 100028 (0 trimmed, 2 with open transfused data) HyperKit CPU: 129.7% (25.67s) osxfs CPU: 52.7% (10.44s) Time in osxfs with 0 ops outstanding: 72.4% (14.327s) ... Message FUSE_WRITE received 100000 (100.0% txns 99.9% t) (50th/90th/98th/100th): 52.569us 65.289us 102us 6.972ms
ping 功能
通过向 osxfs 进程发送 SIGUSR2 信号,可触发 osxfs 与 transfused 间的基础 ping 测试,评估往返延迟。
性能优化
数据路径延迟优化
osxfs 性能瓶颈主要源于跨系统消息传输延迟,关键优化方向包括:
- Linux 内核调度:非 tickless 内核或单 vCPU 配置可能降低调度开销,减少延迟
- virtio vsock 改进:启用延迟信用更新(deferred credit updates)减少消息负载(参见 https://github.com/docker/hyperkit/pull/92)
- HyperKit 通信优化:替换 UNIX 域套接字为共享内存或 Mach 端口以降低 IPC 延迟
- osxfs 线程模型:减少基于 LWT(轻量级线程)的协作式多线程导致的系统调用开销
缓存策略
通过减少跨系统消息数量和路径长度提升性能,osxfs 利用 Linux VFS 缓存机制,结合一致性模式动态调整缓存行为:
- 目录项缓存(dcache):缓存目录结构,减少重复目录查询
- inode 属性缓存:缓存
stat元数据,降低元数据查询延迟 - 写回缓存:未来计划支持 per-node 写回缓存(当前 Linux FUSE 仅支持全局 mount 级配置)
缓存策略需根据一致性模式调整:delegated 模式启用最激进缓存,strict 模式禁用缓存以保证强一致性。
总结
osxfs 作为 Docker for Mac 的核心组件,通过 FUSE 协议代理和跨系统通信机制,解决了 Linux 容器与 macOS 主机间的绑定挂载兼容性问题,支持 inotify 事件和元数据管理。用户可通过调整一致性模式平衡性能与一致性,并使用 perfstat 工具分析和优化文件系统性能。
docker 命名空间的其他可用镜像:
docker/compose
docker/dockerfile
docker/ucp-auth
docker/desktop-stats
docker/desktop-kubernetes
docker/welcome-to-docker
镜像拉取方式
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
轩辕镜像加速拉取命令点我查看更多 transfused 镜像标签
DockerHub 原生拉取命令
用户好评
来自真实用户的反馈,见证轩辕镜像的优质服务