尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

hcsshim中的LCOW原理剖析:如何在Windows上运行Linux容器?

hcsshim中的LCOW原理剖析:如何在Windows上运行Linux容器? hcsshim中的LCOW原理剖析如何在Windows上运行Linux容器【免费下载链接】hcsshimWindows - Host Compute Service Shim项目地址: https://gitcode.com/gh_mirrors/hc/hcsshim提到 Windows 上运行 Linux 容器很多人第一时间会想到 WSL2但真正支撑 Kubernetes、containerd 在生产环境跑 Linux 负载的是微软开源的hcsshimHost Compute Service Shim项目。它用 Go 语言封装了 Windows 的 Host Compute ServiceHCS实现了LCOWLinux Containers on Windows方案通过一个轻量级 Linux 虚拟机Utility VM来托管原生 Linux 容器让开发者无需改造镜像即可在 Windows 服务器上运行 Linux 容器。本文就带你从零剖析 hcsshim 中 LCOW 的完整原理与启动流程。为什么需要 LCOWWindows 上跑 Linux 容器的三种思路Windows 容器生态里有三种运行 Linux 负载的方式理解它们的区别是读懂 LCOW 的第一步进程隔离Process Isolation容器与宿主机共享内核Linux 容器无法直接使用这种方式因为内核不同。Hyper-V 隔离的 Windows 容器WCOW容器跑在 Windows 虚拟机里适合 Windows 镜像。LCOWLinux Containers on Windows容器跑在一个精简的 Linux 虚拟机里这就是 hcsshim 的核心战场。✅LCOW 的最大优势是镜像兼容你可以直接使用 Docker Hub 上所有标准的 Linux 镜像无需任何改动。微软甚至为此专门定制了一个极小的 Linux 发行版initrd kernel只用来承载容器运行时。hcsshim 到底是什么一张全景图看懂它的角色hcsshim 的定位是**HCS 的 Go 语言接口层**它位于 containerd / Docker 与 Windows 底层服务之间扮演三重角色HCS 客户端把容器的创建、启动、停止等请求翻译成 JSON 文档交给 Windows 的 Host Compute Service 去操作虚拟机。HNS 客户端通过 Host Network Service 管理虚拟网络见hns.go、hcn.go等文件。Guest Compute ServiceGCS宿主端与虚拟机内部的 GCS 代理通过 HvSocket 通信转发启动容器、执行进程等 RPC 请求。项目结构上宿主侧代码大多在internal/hcs/、internal/uvm/、internal/hcsoci/等目录而运行在 Linux 虚拟机内部的来宾代理则集中在internal/guest/与cmd/gcs/。一句话总结宿主侧 hcsshim 负责造 VM、挂磁盘、发指令来宾侧 GCS 负责在 Linux 里拉起容器。LCOW 核心架构Utility VM GCS 双引擎LCOW 架构的核心是Utility VM简称 UVM一个专门为容器准备的迷你 Linux 虚拟机。它与普通 VM 的区别在于极简内核启动参数经过裁剪默认从kernel与initrd引导支持 KernelDirect 直启跳过 UEFI。单一用途只运行 GCS 代理进程由宿主通过 HvSocketHyper-V Socket下发命令。随用随建一个 Pod 对应一个 UVMPod 内所有容器共享这个 VMV2 shim 还支持多个 Pod 共享一个 UVM。创建 UVM 的入口是internal/uvm/create_lcow.go中的CreateLCOW()。它会根据OptionsLCOW配置内核文件、initrd、VPMem 数量、机密计算选项等生成一份符合hcsschema.ComputeSystem结构的 JSON 文档再提交给 HCS 的扁平 C API。值得留意的是当启用 AMD SEV-SNP 机密计算时代码会走独立的makeLCOWSecurityDoc路径使用 dm-verity 校验根文件系统完整性。LCOW 容器启动全流程一次完整的接力赛一个 Linux 容器在 hcsshim 中启动大致经历以下六个阶段① 创建 Utility VM宿主调用CreateLCOWHCS 拉起精简 Linux VM内核启动后执行 initinit 的默认命令行就是启动 GCS 代理。② 建立 HvSocket 通道宿主侧internal/gcs/bridge.go实现了一个基于 HvSocket 的 RPC 桥负责与来宾 GCS 建立双向通信维护请求 ID、超时与迁移恢复逻辑。③ 准备 rootfs 层容器镜像是分层 VHD 文件宿主把各层通过 VPMem 或 SCSI 挂进 UVMscratch 磁盘默认为 20GB 的 ext4见internal/lcow/scratch.go的DefaultScratchSizeGB作为可写层。④ 下发 OCI 规范internal/hcsoci/hcsdoc_lcow.go会把 OCI runtime spec 做Linux 化处理清掉 Windows 相关字段、hook 在宿主侧执行、cgroups 由 GCS 自行管理。⑤ 来宾侧启动容器GCS 收到启动容器请求后在 UVM 内完成 overlay 合并调用 runc 等运行时拉起容器进程。⑥ 进程与 IO 桥接容器的 stdin/stdout/stderr 通过 HvSocket 转发回宿主最终呈现给 containerd 客户端。镜像层与 scratch 磁盘VPMem 与 SCSI 的完美配合LCOW 中最精妙的部分是镜像层的挂载策略实现在internal/layers/lcow.go的MountLCOWLayers()中每个只读层是一个layer.vhd可写层是sandbox.vhdx。挂载时优先使用 VPMem虚拟持久内存因为它吞吐高、延迟低当 VPMem 设备用尽或文件过大时自动回退到SCSI 热插拔。所有层挂载完成后调用CombineLayersLCOW在 UVM 内做 overlay 合并生成最终的 rootfs。scratch 磁盘的创建则体现了宿主 来宾协作的典型模式internal/lcow/scratch.go宿主先创建空 VHDX把它作为 SCSI 磁盘热插到 UVM然后让来宾执行mkfs.ext4格式化最后再热拔出并缓存下次创建时直接复制缓存文件速度飞快。深入来宾侧GCS 如何在 Linux 里跑容器GCSGuest Compute Service是整个 LCOW 架构的另一半大脑代码位于internal/guest/。它运行在 UVM 内部职责包括接收宿主 RPC通过 HvSocket 桥接层处理创建容器、启动进程、读取统计等请求internal/gcs/container.go、process.go。管理 cgroups在精简 Linux 中为每个容器维护独立的 cgroup 层级实现 CPU、内存隔离。管理存储处理internal/guest/storage/下的各种挂载场景overlayfs、plan9、vSMB 共享等。上报事件把容器退出、OOM 等事件通过 HvSocket 通知宿主。想自己编译这个来宾代理只需GOOSlinux go build ./cmd/gcs再配合Makefile就能把它打包进 rootfs 和 initrd。从 shim 到 KubernetesLCOW 的完整落地形态在 containerd 生态中LCOW 通过runtime v2 shim落地hcsshim 提供了两条实现路径V1 单体 shimcmd/containerd-shim-runhcs-v1一个二进制同时处理 LCOW、Hyper-V WCOW 与进程隔离 WCOW逻辑集中但职责较重。V2 专业 shimcmd/containerd-shim-lcow-v2遵循 containerd 的 Sandbox API Task API 拆分每个 shim 与 UVM 一一对应一个 UVM 还能承载多个 Pod资源利用率更高。平台要求 Windows Server 2025build 26100及以上。在 Kubernetes 的 CRI 视角下带io.kubernetes.cri.container-type: sandbox注解的 pause 容器会触发 UVM 创建普通工作负载容器则通过sandbox-id关联进同一个 UVM——这就是一个 Pod 一个 VM模型在 hcsshim 里的具体实现。常见问题与性能优化建议启动慢怎么办scratch 磁盘有缓存机制首次格式化后会自动缓存层挂载优先用 VPMem 也能显著降低 IO 延迟。层挂载失败检查 VPMem 数量与单层大小限制必要时增大VPMemDeviceCount代码会自动回退 SCSI。机密计算场景AMD SEV-SNP 路径使用单独的启动文档与 dm-verity 校验相关开关都在CreateLCOW的选项中配置。调试利器internal/shimdiag/提供了诊断服务可以查看 shim 内 UVM 与任务状态。写在最后hcsshim 的 LCOW 实现本质上回答了一个问题如何用最小的代价让 Windows 与 Linux 容器生态在 Hyper-V 隔离层之上共存。通过宿主 HCS 管虚拟机、来宾 GCS 管容器的双引擎设计它把 Linux 内核隔离、镜像兼容、Windows 管理能力三者完美统一。无论是研究容器底层实现还是排查 Windows 容器生产问题internal/uvm/、internal/lcow/、internal/gcs/和cmd/这几个目录都是你最好的教材。如果你准备深入源码建议从internal/uvm/create_lcow.go的启动文档生成逻辑读起顺着一条创建容器的完整调用链走下去你会对整座冰山有全新的认识。【免费下载链接】hcsshimWindows - Host Compute Service Shim项目地址: https://gitcode.com/gh_mirrors/hc/hcsshim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表