WSL1 vs WSL2 深度对比

WSL1 vs WSL2 深度对比

对于需要用Windows办公的很多工程师而言,Windows Subsystem for Linux (WSL) 早已从最初的“玩具”蜕变为不可或缺的生产力工具。相信很多同学都知道WSL有两个版本,但多数同学并不清楚WSL1和WSL2的区别,咱们今天来介绍一下。

一、WSL到底做了什么?
很多人只在用 WSL,但并不清楚 WSL 真正的定位。WSL 的核心目标不是“模拟 Linux”,而是让你在 Windows 上以低成本获得一个可用的 Linux 用户态环境,并且让 Windows 和 Linux 双向打通、无缝协作。

为了直观看懂整体架构差异,先附上 WSL 整体运行全景图,清晰梳理用户层、WSL 运行时、两大版本底层内核、虚拟化底座的层级关系:

┌─────────────────────────────────────────────┐
│              Windows 应用 / 你(用户)       │
│   Explorer · VSCode · Terminal · wsl.exe    │
├─────────────────────────────────────────────┤
│              WSL 运行时 / 管理平面           │  ← 启动、挂载、网络、9P、WSLg
├─────────────────────────────────────────────┤
│                                              │
│  ┌──────────┐     ┌════════════════════┐     │
│  │ WSL1 路径 │ 或  │   WSL2 轻量 VM      │     │
│  │ syscall  │     │  ┌──────────────┐  │     │
│  │ 翻译层    │     │  │ 真实 Linux     │  │     │
│  │(无Linux   │     │  │ kernel(MSoft) │  │     │
│  │ kernel)   │     │  │ + distro rootfs│  │     │
│  └──────────┘     │  └──────────────┘  │     │
│                   └════════════════════┘     │
│              Hyper-V 虚拟化底座                │
└─────────────────────────────────────────────┘
         ▲                                   
         │ 9P 协议 / virtio / AF_UNIX 管道
    Windows 文件系统 ↔ Linux 文件系统互挂

注:WSL2 的“轻量 VM”并非传统 Hyper‑V 完整虚拟机,无 BIOS/GRUB,启动路径高度精简。

可见,WSL 所有能力都依托统一的运行时管理平面实现,核心差异集中在内核执行层,WSL1 与 WSL2 选择了两条完全不同的技术路线。

二、WSL1系统调用翻译 vs WSL2真实内核虚拟化

1. WSL1:无 Linux 内核,纯系统调用翻译的“模拟方案”
WSL1 的本质是运行在 Windows NT 内核之上的Linux 系统调用兼容层,全程没有任何真实 Linux 内核参与工作,所有 Linux 程序都靠“翻译适配”运行,具体工作逻辑如下:
程序加载:Linux 的 ELF 可执行文件,由 WSL 的 Pico provider 驱动在 NT 内核的 Pico 进程框架内完成加载与初始化,再由兼容层将 Linux 系统调用实时翻译为 NT 内核语义。

指令翻译:当 Linux 程序发起 open()、fork()、socket()、execve() 等系统调用时,WSL1 运行时会实时拦截,动态转换为等效的 Windows NT 内核操作指令。

用户态支撑:依托精简的自研 init 进程作为 PID 1,搭载从官方发行版提取的 rootfs 文件系统,完整保留 bash、apt、gcc 等 GNU 用户态工具,保证基础 Linux 命令可正常执行。

WSL1特点:
无任何 Linux 内核,全程复用 Windows NT 内核能力,“伪装”Linux 运行环境;

ELF 文件依靠 NT 驱动兼容运行,不依赖 KVM、虚拟机等虚拟化技术;

核心优势:访问 Windows NTFS 磁盘(/mnt/c)极致流畅,无跨系统开销,秒级启动、资源占用极低;

结构性硬伤:系统调用无法实现 100% 覆盖,ptrace、inotify、overlayfs、cgroup 等内核级特性天然缺失,进阶工具、容器、服务必然报错崩溃。

可见,WSL1用极致轻量化换兼容性,基础运维、简单脚本够用。但只要涉及内核级能力,就会陷入“系统调用猜谜”的结构性困境,上限极低。

2. WSL2:放弃翻译,原生运行真实定制 Linux 内核
微软彻底终结了 WSL1 的“翻译妥协方案”,WSL2 的核心逻辑:承认兼容层无法完美适配 Linux,直接通过高度优化的轻量虚拟机,运行官方维护的真实 Linux 内核,从根源解决兼容性问题。其核心工作机制分为六大模块:

(1)轻量专属 VM + 定制 Linux 内核
WSL2 搭载的并非传统笨重虚拟机,而是极简单用途 Hyper-V 轻量 VM,彻底摒弃了 BIOS、GRUB 等冗余启动流程,仅保留「Linux 内核 + 自研 init」核心组件,启动速度控制在 1-2 秒,兼顾虚拟化完整性与轻量化。内核由微软公开源码、独立维护,针对性适配 WSL 场景,内置 vmbus、virtio、内存气球动态调度、9P 协议优化等专属补丁,同时裁剪冗余模块,保证性能与兼容性平衡。

(2)内核与发行版 rootfs 完全剥离
WSL2 实现了内核与系统发行版的解耦:VM 仅负责运行统一的定制 Linux 内核,用户使用的 Ubuntu、Debian、Fedora 等发行版,本质只是独立的 ext4 格式 rootfs 镜像(VHDX 虚拟磁盘文件)。用户可随意切换、重装发行版,无需改动底层内核,灵活性极高。

(3)跨系统文件互通:核心依赖 9P 协议
9P(Plan 9)协议是 WSL2 实现 Windows 与 Linux 文件双向打通的核心胶水,彻底解决跨系统文件互访问题,也是其性能优缺点的根源:
Linux 访问 Windows 文件:WSL2 中,/mnt/c、/mnt/d并非直接访问 NTFS,而是通过9P协议​ 经 virtio 通道将 Windows 目录投射进 Linux;这一额外转发层正是跨系统文件访问存在延迟的根本原因。

Windows 访问 Linux 文件:Linux 专属 ext4 虚拟磁盘,通过 9P 反向暴露,Windows 可通过 \\wsl$\Distro\ 路径直接访问;

我们日常在 Linux 中执行code . 打开 Windows 目录项目、在资源管理器访问 WSL 本地文件,底层全部依赖 9P+virtio 通道+UID/GID 权限映射实现,这也是 WSL2 访问 /mnt 目录存在性能延迟的核心原因(跨协议转发存在开销)。

(4)网络机制:虚拟网卡 + 多模式网络适配
WSL2 拥有独立虚拟网卡(vNIC),依托 Hyper-V 虚拟交换机实现网络能力,完全区别于 WSL1 的网络共享模式:

默认 NAT 模式:Linux 独立私有 IP,可主动访问外网,外部无法直接主动访问 Linux 服务,安全性更高;默认通过 Hyper‑V 虚拟交换机(通常为 NAT 语义)实现网络隔离;Win11 及更新版本可在 .wslconfig中启用 mirrored模式,优化 IP 隔离问题,使 Linux 网络更贴近主机,适配更多调试场景。

自动端口转发:依托 localhostForwarding=true 机制,Linux 本地启动的服务(如 8000 端口),Windows 可直接通过 localhost 访问,无需手动配置映射,屏蔽了 NAT 隔离的使用门槛。

(5)进程与生命周期管理
WSL2 以自研 /init 作为 PID 1 核心进程,统一管控所有底层能力:负责全局挂载表管理、9P 文件系统挂载、binfmt 二进制兼容(支持 Linux 终端直接调用 Windows exe 程序),同时兼容转发系统初始化逻辑。Win11 新版本已原生支持 Systemd 模式,可无缝适配 Linux 自启服务、后台进程管理。而 wsl –shutdown、wsl -d 等命令,本质都是在管控轻量 VM 的生命周期与命名空间。

(6)WSLg 图形化与 GPU 加速
Win11 内置的 WSLg 技术,彻底补齐了 WSL 图形化短板:Linux 端的 X11/Wayland 图形程序,可通过 Weston/RDP 合成器,依托 AF_UNIX 管道与 virtio 通道,对接 Windows 远程桌面栈渲染窗口。最终实现 Linux GUI 应用原生窗口显示、剪贴板互通、音频回环,同时支持 GPU-PV 半虚拟化 CUDA 硬件加速,可流畅运行 AI 图形、算力任务。

三、优缺点对比

对比维度 WSL1 WSL2
底层架构 系统调用翻译层、Pico进程、无原生Linux内核 轻量化Hyper-V虚拟机、搭载微软定制Linux原生内核
系统调用兼容性 部分兼容,仅支持基础POSIX命令,内核级功能缺失 100%完全兼容,支持全部Linux内核特性与进阶服务
Docker容器支持 缺失cgroups、namespace、overlayfs等内核机制,无法作为容器宿主机 原生完美支持,适配Docker、K8s完整容器生态
文件系统机制 drvfs直接映射Windows NTFS目录,无虚拟化转发开销 独立ext4虚拟磁盘(vhdx),通过9P协议挂载Windows磁盘
跨文件性能 所有文件访问均需经过 syscall 翻译层,批量 I/O(git、npm、编译)性能明显弱于 WSL2 的 ext4 本地磁盘 Linux本地ext4磁盘读写极速,跨系统/mnt文件读写延迟较高
ELF二进制 NT 加载器+兼容垫片模拟运行 内核原生执行,标准 Linux 运行机制
网络模式 共享Windows主机IP与网络栈,端口直通、零配置 独立虚拟网卡 + Hyper‑V 虚拟交换机(通常 NAT 语义),IP 动态变化;Win11 支持 mirrored 模式,端口自动映射。
高阶功能支持 不支持Systemd、IPv6、OverlayFS、cgroup v2 原生支持Systemd、IPv6、OverlayFS、cgroup v2
GPU/GUI能力 无支持,完全受限 支持WSLg图形化、CUDA 硬件加速
硬件资源占用 极低,无虚拟化开销,完全依托Windows资源调度 动态分配资源,闲置自动释放内存/CPU,可控无冗余
启动速度 毫秒级瞬时启动,无任何延迟 秒级启动,略慢于WSL1,日常开发无感知
系统要求 最低要求为 Windows10 1709,但1809之后稳定性显著提升 Windows10 1903+ / Win11全版本(推荐2004+)

四、总结
WSL1是微软早期的轻量化过渡方案,依靠翻译层实现低开销运行,但内核兼容性存在天然缺陷,仅能满足极简运维、轻度命令使用场景。

WSL2是面向现代开发的生产级成熟方案,通过轻量化虚拟化技术补齐了所有内核短板,实现了100% Linux生态兼容,容器开发、算力调度、微服务调试、图形化应用等场景全面适配。唯一的跨系统文件读写短板,可通过规范项目存储路径完美规避。

两句话总结:
WSL1 是“能用 Linux 命令的 Windows 子系统”,WSL2 是“跑在 Windows 上的真实 Linux 运行环境”。
老旧设备、极度依赖 Windows ↔ Linux 高频互写、无需容器 → 可考虑WSL1​;容器、编译、AI、微服务、生产级 Linux 行为 → 优先选择WSL2。

WSL1 vs Wine:两种跨平台技术对比

WSL1 vs Wine:两种跨平台技术对比

WSL1是Windows平台下Linux翻译层,Wine是Linux平台下Windows翻译层,两者有很多相似之处,本文介绍一下两者的异同点。

一、基本概念
WSL1(Windows Subsystem for Linux 1):Windows 运行 Linux 程序的工具,仅限Windows平台,是微软官方的Linux兼容子系统
Wine(Wine Is Not an Emulator):Linux 运行 Windows 程序的兼容层,面向各类POSIX兼容系统,核心是API翻译转换,并非虚拟机、模拟器

二、架构、系统调用与内存机制深度对比
WSL1 与 Wine 常被归为「跨平台兼容层工具」,且均属于非虚拟化(Non-Virtualization)方案,无需虚拟硬件、不依赖虚拟机架构。但二者的底层实现完全不同,微软官方内核级适配 vs 开源社区用户态逆向实现,造就了截然不同的性能上限、兼容性短板和适用边界。咱们从核心架构、系统调用翻译开销、内存并发模型三个维度,做底层硬核拆解。

1. 核心架构差异:Pico Process 内核扩展 vs 纯用户态 API 重实现
WSL1:基于 Windows NT 内核的 Pico Provider 机制
WSL1 并非独立用户态进程,而是深度集成于 Windows NT 内核的原生子系统。微软通过拓展 NT 内核能力,引入 Pico Provider 机制,专门用于适配 Linux 程序运行。

当用户启动 Linux ELF 二进制文件时,系统内核驱动 lxss.sys 会创建专属的轻量级进程——Pico Process。该进程区别于常规 Win32 进程,不具备完整的 Win32 句柄表,所有运行执行上下文、权限管控、调用处理均由 WSL 内核驱动直接接管。

核心运行逻辑:Linux 程序产生的所有系统调用(Syscalls),不会走传统 Win32k 系统边界,而是被 lxss.sys 内核驱动直接拦截,在内核态完成解析,转换为等效的 Windows NT Native API 执行,实现 Linux 程序在 Windows 内核上的原生运行。

Wine:纯用户态的跨平台兼容层
与 WSL1 内核级实现完全不同,Wine 不包含任何内核模块、不修改宿主系统内核,是一套完全运行在 Linux、macOS 等 POSIX 宿主系统用户空间的兼容层,纯靠用户态代码实现 Windows 环境模拟。

其核心架构由两大模块构成:
– Winelib:核心核心组件,自主重新实现了全套 Windows 基础 DLL(kernel32.dll、user32.dll 等),核心作用是将 Windows 标准 API 调用,精准映射为 POSIX、libc 系统可识别的底层调用;
– wine-mono / wine-gecko:配套兼容组件,分别用于替代 Windows .NET 运行引擎与 IE 浏览器内核,补齐基础软件运行依赖。

当 Windows EXE 程序被加载时,Wine 内置的 PE Loader 加载器,会在用户空间手动完成 PE 文件导入表解析、地址重定位等操作。程序发起的所有 Windows API 请求,不会触达宿主内核,全部由 Wine 自身的动态链接库截获、翻译、处理。

2. 系统调用翻译链路与性能开销根源
WSL1:内核态转换,语义不匹配引发高开销
WSL1 依托内核态完成系统调用翻译,理论转发效率更高,但受限于 Linux 与 Windows NT 内核语义不兼容,存在无法规避的性能损耗,也是 WSL1 性能瓶颈的核心根源。

为适配两类内核的差异,WSL1 维护一套庞大的系统调用映射表,大量 Linux 原生调用无法直接匹配 NT 内核 API,必须通过多步组合操作模拟实现。例如 NT 虽有进程创建原语,但没有 Linux fork()的写时复制语义与从任意指令点分裂执行的模型,WSL1 需要用 NtCreateProcessEx+ 手工上下文构造组合模拟,开销显著。

除此之外,跨系统文件 I/O 是另一大短板。WSL1的/mnt/c通过内核内的DrvFs驱动,将Linux VFS操作反向映射到Windows NT的I/O 请求包(IRP)路径上,同时持续做POSIX权限位与NTFS ACL的双向转换,频繁的路径解析和元数据模拟导致严重的I/O上下文切换开销,导致 WSL1 的磁盘 IOPS 性能远低于原生 NTFS 和原生 Linux 文件系统。

Wine:用户态事件转换桥接层,GUI协议适配损耗突出
Wine 的核心性能问题集中在图形界面(GUI)消息循环与跨协议转换。Windows 采用同步阻塞式消息队列机制(Message Pump),而 Linux X11/Wayland 桌面环境为异步事件驱动机制,二者运行逻辑完全冲突。

为此,Wine 需要在用户空间搭建复杂的 Event Loop 转换层(X11DRV),通过事件转换桥接层中转机制 完成两类图形协议的适配。在高频图形刷新、游戏键鼠输入、动态界面渲染等场景下,持续的协议转换会产生极高的 CPU 占用,导致画面卡顿、延迟升高。

同时,大量商业软件、闭源工具依赖 Windows 未公开的内部 API(Undocumented APIs),Wine 无官方文档参考,只能通过逆向工程猜测适配逻辑,兼容性极不稳定,极易触发段错误(Segmentation Fault)、程序闪退、功能失效等问题。

3. 内存模型与并发控制机制差异
WSL1:共享 NT 地址空间,内存碎片化严重
WSL1 的 Pico Process 虽是独立 NT 进程,但其地址空间受 NT MM 的统一管理——NT 固有的地址空间预留格局(内核高位保留、系统映像固定映射区域等)使得 Linux 侧想要分配大块连续虚拟地址时,只能在零散的空闲空洞中拼凑,大内存分配的效率和灵活性明显劣于原生 Linux。

当 Linux 应用需要分配超大连续内存块(如数据库缓冲池、大型编译缓存)时,WSL1 必须在 Windows 已占用的地址空间中寻找空闲空洞,相比原生 Linux 系统,内存碎片化问题更突出,大内存分配效率更低,高负载场景性能衰减明显。

Wine:自主实现堆管理,多线程锁竞争瓶颈
Linux glibc 的内存分配策略,与 Windows CRT 堆管理逻辑、内存对齐规则、资源释放契约完全不兼容。为保证 Windows 程序稳定运行,Wine无法直接使用 Linux 原生堆(glibc malloc)来服务 Windows 程序的堆请求(因为分配对齐、释放契约、标志位语义不同),因此在用户态基于 mmap 拿到的页面之上模拟了一套兼容Windows HeapAlloc/RtlAllocateHeap语义的堆管理器。

这套独立的堆分配算法可以精准适配 Windows 程序的内存运行规范,但在多线程高并发场景下,Wine 内部的资源锁竞争会急剧加剧,成为限制程序运行速度的核心瓶颈,这也是 Wine 运行多线程大型软件卡顿、卡死的关键原因。

4. 底层架构核心总结:两种工程妥协
从操作系统工程设计角度来看,WSL1 与 Wine 均属于非虚拟化跨平台兼容方案,本质都是为异类程序适配非原生运行环境的工程妥协产物,但二者的实现层级、设计逻辑和技术天花板有着天壤之别:

WSL1:微软在不改动 NT 内核核心代码的前提下,通过内核扩展强行植入的 Linux 运行环境。依托官方内核级适配,它在命令行场景的稳定性、兼容性表现优异,但架构先天存在内核语义不匹配、磁盘IO孱弱、内存碎片化等致命缺陷,功能边界狭窄、扩展上限极低,这也是微软后续推出基于 Hyper-V 虚拟化的 WSL2、彻底重构架构的核心原因。

Wine:开源社区依靠二十年逆向工程,在纯用户态从零实现的 Windows 兼容运行时。无需修改宿主内核、跨平台、轻量化是其核心优势,但随着 Windows 闭源生态持续迭代,其逆向适配的维护成本呈指数级上升,永远无法实现 100% 全量兼容。

基于上述基础架构差异,我们可以挖掘出一个极具颠覆性的底层洞察:WSL1 与 Wine 并非简单的同类工具,而是跨平台兼容领域完美的「镜像双胞胎(Mirror Image)」。二者底层运作哲学高度同源,均依靠中间翻译层实现异类二进制跨内核运行,但翻译层级、技术复杂度、系统容错上限的本质区别,直接决定了二者截然不同的生命周期与最终发展结局。

4.1 架构同构性:同源的跨平台兼容逻辑
抛开适配方向的差异,WSL1 和 Wine 的核心工程思路完全一致,本质都是「宿主内核+中间翻译层+异类二进制伪装运行」的架构模型,核心逻辑可完全对仗对应:

所有跨平台兼容层的核心矛盾都是统一的:宿主内核拥有自身的系统原语,却不支持异类程序的运行规范,且无法直接加载异类二进制文件。二者都没有为 guest 程序提供原生内核环境,只能通过中间层伪装、翻译、模拟,欺骗应用程序使其认为自己运行在原生系统环境中。

核心角色/机制 WSL1(Linux 程序跑在 Windows 上) Wine(Windows 程序跑在 Linux 上)
外来二进制格式 ELF(Linux 可执行文件格式) PE(Windows exe/dll 文件格式)
宿主底层内核 Windows NT 宏内核 Linux 宏内核
原生缺失能力 NT 内核无 Linux 系统调用原语(sys_open、fork 等) Linux 内核无 Win32/NT 内核调用原语(ntdll 系列)
核心实现方案 内核态搭建垫片,lxss.sys 拦截 Linux 系统调用,翻译为 NT Native API(Nt/Zw 系列) 用户态搭建垫片(ntdll.so),拦截 Win32/NT 调用,翻译为 POSIX 系统调用 / libc 调用
核心运行目的 欺骗 Linux 程序,使其正常与系统交互、无感知运行 欺骗 Windows 程序,使其正常调用接口、稳定运行

在二进制加载环节,二者的设计思路也高度同源:系统原生加载器无法识别异类格式,二者均通过底层劫持完成加载。NT 内核本身不解析 ELF,而是通过 Pico Provider 创建一种不带标准 Win32 初始化链的 NT 进程(Pico Process);ELF 的实际解析和加载由 Linux rootfs 中的 ld-linux 解释器完成,NT 侧只负责后续 syscall 的拦截与语义实现。Linux 原生加载器默认仅支持 ELF,Wine 则通过 wine-preloader 提前拦截 PE 文件,手动完成导入表解析、内存重定位,绕过宿主默认加载逻辑。
基于这套高度对仗的同构逻辑,我们可以给出精准定义:WSL1 本质就是微软官方、拥有内核最高权限的「特权级 Wine」,二者唯一核心差异,只是跨平台适配的方向完全相反。

4.2 核心区别:翻译层级决定技术命运

既然架构同源,为什么 WSL1 开发难度远超 Wine、最终被微软主动放弃,而 Wine 历经二十年迭代依然持续维护?核心原因是:二者翻译的对象层级完全不同,复杂度和容错上限天差地别。

Wine:仅翻译用户态 API 语义,容错极高
Wine 的所有适配工作,都局限在用户态语义层。它需要兼容的 Win32、GDI、DirectX、COM 等接口,虽然庞大繁杂、存在大量未公开的黑魔法,但本质都是应用层逻辑,不触及内核底层运行机制。

这种设计带来了极高的容错性:当 Wine 遇到未实现的冷门 Win32 函数、私有接口时,最坏结果是程序报错、闪退、功能失效,仅影响当前应用进程,完全不会破坏宿主 Linux 内核的稳定性,不会触发内核崩溃、panic。哪怕适配存在缺陷,也只是应用层问题,不会波及系统底层。

WSL1:翻译内核态底层原语,无解兼容难题
WSL1 的工作是内核态原语级别的翻译,这是一项从底层架构上无法彻底兼容的工程难题。Linux 仅有数百个系统调用,但每一个原语都高度耦合内核底层机制,与 NT 内核的设计哲学完全相悖。

两类内核的底层核心设计完全不兼容:Linux 基于 task_struct 进程模型、copy-on-write 写时复制、inode/dentry 文件体系、标准 POSIX 权限位;而 Windows NT 基于调度器对象、PS 进程管理层、对象管理器、NTFS ACL 权限体系,二者是两套完全不兼容的坐标系。

这就导致 WSL1 在适配高端 Linux 场景(systemd、Docker、perf、overlayfs、ptrace 调试)时,只能不断在 NT 内核上打补丁、加钩子、做hack式兼容。这种强行适配的缺陷是致命的:任何翻译偏差、语义不匹配,都可能触发内核级异常,甚至导致系统蓝屏、内核 panic,稳定性风险极高。

4.3 终极结论:WSL2 诞生的底层真相
WSL1 的淡出主流,本质上是微软承认:仅靠内核态原语翻译,无法同时满足 Linux 兼容广度与性能预期,因此转向轻量虚拟化方案。依靠翻译 Linux 内核原语,需要无限堆砌兼容逻辑、修复底层bug,永远无法实现 100% 原生兼容,且稳定性、性能天花板很低。

因此微软彻底推翻了 WSL1 的架构思路,推出 WSL2:放弃内核态 API 翻译,直接嵌入原生 Linux 内核,基于 Hyper-V 轻量虚拟化运行真实 Linux 环境,仅通过 9P 协议、虚拟管道实现 Windows 与 Linux 的文件、窗口联动。

简单来说,WSL2 用「原生内核虚拟化」的正统方案,彻底终结了 WSL1「强行翻译内核原语」的妥协方案。而 Wine 之所以能够长存,正是因为它只做用户态适配,无需触碰内核底层,规避了无解的内核兼容难题。

三、全方位综合对比:性能、兼容、资源与实操体验
1. 资源占用:Wine完胜,WSL1更均衡
Wine仅作为中间翻译层运行,无系统级开销,仅占用当前运行软件的资源,极致轻量、几乎无额外损耗,低配电脑也能流畅运行。

WSL1需要维护一套完整的Linux用户态环境,有轻微系统开销,但相比虚拟机、双系统依然轻量化,资源占用远低于常规虚拟化方案,日常开发、命令行操作无压力。

2. 兼容性:WSL1稳定,Wine有时要看运气
WSL1优势:稳定可控
作为微软官方工具,WSL1对绝大多数Linux命令行工具、开发环境、脚本、服务的兼容性极高,几乎零报错。短板集中在底层能力:不支持内核模块、硬件驱动、32位程序、GUI重度Linux应用,无法运行嵌入式、工控、底层调试类工具。

Wine短板明显:兼容性碎片化
与WSL1自带整套Linux发行版用户态不同,Wine只翻译单个EXE。
Wine对日常轻量Windows软件(办公小工具、老旧单机软件、简易EXE程序)适配良好,但大型软件、专业工具、游戏、驱动依赖型软件基本翻车。Adobe系列、大型工业软件、带加密驱动的程序、新款3A游戏,大多无法正常运行,且报错无统一解决方案,只能靠试错调试。

3. 图形界面(GUI)支持
WSL1:原生不支持GUI,早期版本仅能纯命令行操作,需要手动安装X-Server等第三方工具才能勉强运行图形程序,体验卡顿、兼容性差,这也是WSL2迭代升级的核心原因之一。

Wine:原生支持Windows GUI程序,运行的软件窗口可无缝融入Linux桌面环境,拖拽、缩放、文件交互基本流畅,日常图形软件使用体验优于WSL1。

4. 性能表现
WSL1:系统调用直接依托Windows内核转发,命令行操作、代码编译、脚本运行速度接近原生Linux,无虚拟化延迟,性能损耗极低。

Wine:轻量软件性能接近原生Windows,无明显卡顿;但大型软件因API翻译损耗、兼容性适配问题,容易出现帧率波动、加载缓慢、功能异常,性能表现不稳定。

四、优缺点汇总

维度 ✅ 优点: ❌ 缺点:
WSL1 – 微软官方原生支持,安全稳定、无流氓捆绑
– Linux命令行、开发环境兼容性极强,适合后端/脚本开发
– 轻量化无虚拟化开销,开机即用、部署简单
– 完美适配Windows文件互通、终端联动
– 无真实Linux内核,不支持内核模块、硬件驱动
– 不兼容32位Linux程序,重度Linux工具无法运行
– 原生无GUI支持,图形应用体验极差
– 功能阉割严重,逐渐被WSL2替代
Wine – 极致轻量,无系统开销,低配设备友好
– 原生支持Windows GUI软件,跨平台复用Windows工具
– 开源免费、跨平台,Linux/macOS均可使用
– 无需安装Windows系统,快速运行老旧EXE程序
– 兼容性不可控,大型、专业、驱动型软件大概率闪退
– 部分软件需要手动配置环境,上手门槛高
– 无官方技术支持,报错只能自行排查试错
– 不支持系统级、内核级Windows程序运行

Win10无法启动VirtualBox

在Win10上遇到了一个问题:

Failed to open a session for the virtual machine ubuntu.

Raw-mode is unavailable courtesy of Hyper-V. (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT).

Result Code: E_FAIL (0x80004005)
Component: ConsoleWrap
Interface: IConsole {872da645-4a9b-1727-bee2-5585105b9eed}

最后发现是前几天安装了Win10的Hyper-V模块,卸载后就好了。

VirtualBox的几种联网方式

VirtualBox有四种联网方式:

NAT:
虚拟机通过网络地址转换协议来访问宿主机网络,虚拟机可以访问宿主机可以访问的所有网络
宿主机和虚拟机之间无法通讯
而在宿主机局域网其他主机看来,虚拟机是不存在的
虚拟机之间不可以相互访问

Bridged:
虚拟机通过桥接,把自己虚拟为宿主机同一局域网的一台设备,虚拟机可以访问宿主机可以访问的所有网络
对于宿主机来说,虚拟机就是同一局域网的一台设备
而在宿主机局域网其他主机看来,虚拟机就是同一局域网的一台设备
虚拟机之间可以相互访问

HostOnly:
虚拟机宿主机可以相互访问,默认虚拟机不可以访问宿主机所在网络(宿主机可以共享网络给虚拟机,但一般不会这么用)。
虚拟机之间可以相互访问

Internal:
只有虚拟机之间可以相互访问。

具体情况如下(假设网段设置都正确):

通讯 Internal HostOnly NAT Bridge
虚拟机到宿主机 NO YES YES YES
宿主机到虚拟机 NO YES NO YES,部分网络服务受限
虚拟机到其他主机 NO NO YES YES,部分网络服务受限
其他主机到虚拟机 NO NO NO YES
虚拟机到虚拟机 YES YES NO YES

VBoxManage常用命令

1、常用命令

#列出全部虚拟机
VBoxManage list vms
#列出全部运行中的虚拟机
VBoxManage list runningvms
#列出虚拟机信息
VBoxManage showvminfo uuid|vmname
#开启虚拟机
VBoxManage startvm uuid|vmname
#开启虚拟机,无GUI模式
VBoxManage startvm uuid|vmname --type headless
#暂停虚拟机
VBoxManage controlvm uuid|vmname pause
#继续运行虚拟机
VBoxManage controlvm uuid|vmname resume
#按下机箱重启按钮
VBoxManage controlvm uuid|vmname reset
#断电
VBoxManage controlvm uuid|vmname poweroff
#按下机箱电影按钮
VBoxManage controlvm uuid|vmname acpipowerbutton
#按下机箱睡眠按钮
VBoxManage controlvm uuid|vmname acpisleepbutton

2、全部参数

Oracle VM VirtualBox Command Line Management Interface Version 4.3.10
(C) 2005-2014 Oracle Corporation
All rights reserved.

Usage:

  VBoxManage [<general option>] <command>
 
 
General Options:
 
  [-v|--version]            print version number and exit
  [-q|--nologo]             suppress the logo
  [--settingspw <pw>]       provide the settings password
  [--settingspwfile <file>] provide a file containing the settings password
 
 
Commands:
 
  list [--long|-l]          vms|runningvms|ostypes|hostdvds|hostfloppies|
                            intnets|bridgedifs|hostonlyifs|natnets|dhcpservers|
                            hostinfo|hostcpuids|hddbackends|hdds|dvds|floppies|
                            usbhost|usbfilters|systemproperties|extpacks|
                            groups|webcams

  showvminfo                <uuid|vmname> [--details]
                            [--machinereadable]
  showvminfo                <uuid|vmname> --log <idx>

  registervm                <filename>

  unregistervm              <uuid|vmname> [--delete]

  createvm                  --name <name>
                            [--groups <group>, ...]
                            [--ostype <ostype>]
                            [--register]
                            [--basefolder <path>]
                            [--uuid <uuid>]

  modifyvm                  <uuid|vmname>
                            [--name <name>]
                            [--groups <group>, ...]
                            [--ostype <ostype>]
                            [--iconfile <filename>]
                            [--memory <memorysize in MB>]
                            [--pagefusion on|off]
                            [--vram <vramsize in MB>]
                            [--acpi on|off]
                            [--pciattach 03:04.0]
                            [--pciattach 03:04.0@02:01.0]
                            [--pcidetach 03:04.0]
                            [--ioapic on|off]
                            [--hpet on|off]
                            [--triplefaultreset on|off]
                            [--hwvirtex on|off]
                            [--nestedpaging on|off]
                            [--largepages on|off]
                            [--vtxvpid on|off]
                            [--vtxux on|off]
                            [--pae on|off]
                            [--longmode on|off]
                            [--synthcpu on|off]
                            [--cpuidset <leaf> <eax> <ebx> <ecx> <edx>]
                            [--cpuidremove <leaf>]
                            [--cpuidremoveall]
                            [--hardwareuuid <uuid>]
                            [--cpus <number>]
                            [--cpuhotplug on|off]
                            [--plugcpu <id>]
                            [--unplugcpu <id>]
                            [--cpuexecutioncap <1-100>]
                            [--rtcuseutc on|off]
                            [--graphicscontroller none|vboxvga|vmsvga]
                            [--monitorcount <number>]
                            [--accelerate3d on|off]
                            [--accelerate2dvideo on|off]
                            [--firmware bios|efi|efi32|efi64]
                            [--chipset ich9|piix3]
                            [--bioslogofadein on|off]
                            [--bioslogofadeout on|off]
                            [--bioslogodisplaytime <msec>]
                            [--bioslogoimagepath <imagepath>]
                            [--biosbootmenu disabled|menuonly|messageandmenu]
                            [--biossystemtimeoffset <msec>]
                            [--biospxedebug on|off]
                            [--boot<1-4> none|floppy|dvd|disk|net>]
                            [--nic<1-N> none|null|nat|bridged|intnet|hostonly|
                                        generic|natnetwork]
                            [--nictype<1-N> Am79C970A|Am79C973|
                                            82540EM|82543GC|82545EM|
                                            virtio]
                            [--cableconnected<1-N> on|off]
                            [--nictrace<1-N> on|off]
                            [--nictracefile<1-N> <filename>]
                            [--nicproperty<1-N> name=[value]]
                            [--nicspeed<1-N> <kbps>]
                            [--nicbootprio<1-N> <priority>]
                            [--nicpromisc<1-N> deny|allow-vms|allow-all]
                            [--nicbandwidthgroup<1-N> none|<name>]
                            [--bridgeadapter<1-N> none|<devicename>]
                            [--hostonlyadapter<1-N> none|<devicename>]
                            [--intnet<1-N> <network name>]
                            [--nat-network<1-N> <network name>]
                            [--nicgenericdrv<1-N> <driver>
                            [--natnet<1-N> <network>|default]
                            [--natsettings<1-N> [<mtu>],[<socksnd>],
                                                [<sockrcv>],[<tcpsnd>],
                                                [<tcprcv>]]
                            [--natpf<1-N> [<rulename>],tcp|udp,[<hostip>],
                                          <hostport>,[<guestip>],<guestport>]
                            [--natpf<1-N> delete <rulename>]
                            [--nattftpprefix<1-N> <prefix>]
                            [--nattftpfile<1-N> <file>]
                            [--nattftpserver<1-N> <ip>]
                            [--natbindip<1-N> <ip>
                            [--natdnspassdomain<1-N> on|off]
                            [--natdnsproxy<1-N> on|off]
                            [--natdnshostresolver<1-N> on|off]
                            [--nataliasmode<1-N> default|[log],[proxyonly],
                                                         [sameports]]
                            [--macaddress<1-N> auto|<mac>]
                            [--mouse ps2|usb|usbtablet|usbmultitouch]
                            [--keyboard ps2|usb
                            [--uart<1-N> off|<I/O base> <IRQ>]
                            [--uartmode<1-N> disconnected|
                                             server <pipe>|
                                             client <pipe>|
                                             file <file>|
                                             <devicename>]
                            [--lpt<1-N> off|<I/O base> <IRQ>]
                            [--lptmode<1-N> <devicename>]
                            [--guestmemoryballoon <balloonsize in MB>]
                            [--audio none|null|dsound]
                            [--audiocontroller ac97|hda|sb16]
                            [--clipboard disabled|hosttoguest|guesttohost|
                                         bidirectional]
                            [--draganddrop disabled|hosttoguest
                            [--vrde on|off]
                            [--vrdeextpack default|<name>
                            [--vrdeproperty <name=[value]>]
                            [--vrdeport <hostport>]
                            [--vrdeaddress <hostip>]
                            [--vrdeauthtype null|external|guest]
                            [--vrdeauthlibrary default|<name>
                            [--vrdemulticon on|off]
                            [--vrdereusecon on|off]
                            [--vrdevideochannel on|off]
                            [--vrdevideochannelquality <percent>]
                            [--usb on|off]
                            [--usbehci on|off]
                            [--snapshotfolder default|<path>]
                            [--teleporter on|off]
                            [--teleporterport <port>]
                            [--teleporteraddress <address|empty>
                            [--teleporterpassword <password>]
                            [--teleporterpasswordfile <file>|stdin]
                            [--tracing-enabled on|off]
                            [--tracing-config <config-string>]
                            [--tracing-allow-vm-access on|off]
                            [--usbcardreader on|off]
                            [--autostart-enabled on|off]
                            [--autostart-delay <seconds>]
                            [--vcpenabled on|off]
                            [--vcpscreens [<display>],...
                            [--vcpfile <filename>]
                            [--vcpwidth <width>]
                            [--vcpheight <height>]
                            [--vcprate <rate>]
                            [--vcpfps <fps>]
                            [--defaultfrontend default|<name>]

  clonevm                   <uuid|vmname>
                            [--snapshot <uuid>|<name>]
                            [--mode machine|machineandchildren|all]
                            [--options link|keepallmacs|keepnatmacs|
                                       keepdisknames]
                            [--name <name>]
                            [--groups <group>, ...]
                            [--basefolder <basefolder>]
                            [--uuid <uuid>]
                            [--register]

  import                    <ovfname/ovaname>
                            [--dry-run|-n]
                            [--options keepallmacs|keepnatmacs]
                            [more options]
                            (run with -n to have options displayed
                             for a particular OVF)

  export                    <machines> --output|-o <name>.<ovf/ova>
                            [--legacy09|--ovf09|--ovf10|--ovf20]
                            [--manifest]
                            [--iso]
                            [--options manifest|iso|nomacs|nomacsbutnat]
                            [--vsys <number of virtual system>]
                                    [--product <product name>]
                                    [--producturl <product url>]
                                    [--vendor <vendor name>]
                                    [--vendorurl <vendor url>]
                                    [--version <version info>]
                                    [--description <description info>]
                                    [--eula <license text>]
                                    [--eulafile <filename>]

  startvm                   <uuid|vmname>...
                            [--type gui|sdl|headless]

  controlvm                 <uuid|vmname>
                            pause|resume|reset|poweroff|savestate|
                            acpipowerbutton|acpisleepbutton|
                            keyboardputscancode <hex> [<hex> ...]|
                            setlinkstate<1-N> on|off |
                            nic<1-N> null|nat|bridged|intnet|hostonly|generic|
                                     natnetwork [<devicename>] |
                            nictrace<1-N> on|off |
                            nictracefile<1-N> <filename> |
                            nicproperty<1-N> name=[value] |
                            nicpromisc<1-N> deny|allow-vms|allow-all |
                            natpf<1-N> [<rulename>],tcp|udp,[<hostip>],
                                        <hostport>,[<guestip>],<guestport> |
                            natpf<1-N> delete <rulename> |
                            guestmemoryballoon <balloonsize in MB> |
                            usbattach <uuid>|<address> |
                            usbdetach <uuid>|<address> |
                            clipboard disabled|hosttoguest|guesttohost|
                                      bidirectional |
                            draganddrop disabled|hosttoguest |
                            vrde on|off |
                            vrdeport <port> |
                            vrdeproperty <name=[value]> |
                            vrdevideochannelquality <percent> |
                            setvideomodehint <xres> <yres> <bpp>
                                            [[<display>] [<enabled:yes|no> |
                                              [<xorigin> <yorigin>]]] |
                            screenshotpng <file> [display] |
                            vcpenabled on|off |
                            vcpscreens all|none|<screen>,[<screen>...] |
                            setcredentials <username>
                                           --passwordfile <file> | <password>
                                           <domain>
                                           [--allowlocallogon <yes|no>] |
                            teleport --host <name> --port <port>
                                     [--maxdowntime <msec>]
                                     [--passwordfile <file> |
                                      --password <password>] |
                            plugcpu <id> |
                            unplugcpu <id> |
                            cpuexecutioncap <1-100>
                            webcam <attach [path [settings]]> | <detach [path]> | <list>

  discardstate              <uuid|vmname>

  adoptstate                <uuid|vmname> <state_file>

  snapshot                  <uuid|vmname>
                            take <name> [--description <desc>] [--live] |
                            delete <uuid|snapname> |
                            restore <uuid|snapname> |
                            restorecurrent |
                            edit <uuid|snapname>|--current
                                 [--name <name>]
                                 [--description <desc>] |
                            list [--details|--machinereadable]
                            showvminfo <uuid|snapname>

  closemedium               disk|dvd|floppy <uuid|filename>
                            [--delete]

  storageattach             <uuid|vmname>
                            --storagectl <name>
                            [--port <number>]
                            [--device <number>]
                            [--type dvddrive|hdd|fdd]
                            [--medium none|emptydrive|additions|
                                      <uuid|filename>|host:<drive>|iscsi]
                            [--mtype normal|writethrough|immutable|shareable|
                                     readonly|multiattach]
                            [--comment <text>]
                            [--setuuid <uuid>]
                            [--setparentuuid <uuid>]
                            [--passthrough on|off]
                            [--tempeject on|off]
                            [--nonrotational on|off]
                            [--discard on|off]
                            [--bandwidthgroup <name>]
                            [--forceunmount]
                            [--server <name>|<ip>]
                            [--target <target>]
                            [--tport <port>]
                            [--lun <lun>]
                            [--encodedlun <lun>]
                            [--username <username>]
                            [--password <password>]
                            [--initiator <initiator>]
                            [--intnet]

  storagectl                <uuid|vmname>
                            --name <name>
                            [--add ide|sata|scsi|floppy|sas]
                            [--controller LSILogic|LSILogicSAS|BusLogic|
                                          IntelAHCI|PIIX3|PIIX4|ICH6|I82078]
                            [--portcount <1-30>]
                            [--hostiocache on|off]
                            [--bootable on|off]
                            [--remove]

  bandwidthctl              <uuid|vmname>
                            add <name> --type disk|network
                                --limit <megabytes per second>[k|m|g|K|M|G] |
                            set <name>
                                --limit <megabytes per second>[k|m|g|K|M|G] |
                            remove <name> |
                            list [--machinereadable]
                            (limit units: k=kilobit, m=megabit, g=gigabit,
                                          K=kilobyte, M=megabyte, G=gigabyte)

  showhdinfo                <uuid|filename>

  createhd                  --filename <filename>
                            [--size <megabytes>|--sizebyte <bytes>]
                            [--diffparent <uuid>|<filename>
                            [--format VDI|VMDK|VHD] (default: VDI)
                            [--variant Standard,Fixed,Split2G,Stream,ESX]

  modifyhd                  <uuid|filename>
                            [--type normal|writethrough|immutable|shareable|
                                    readonly|multiattach]
                            [--autoreset on|off]
                            [--property <name=[value]>]
                            [--compact]
                            [--resize <megabytes>|--resizebyte <bytes>]

  clonehd                   <uuid|inputfile> <uuid|outputfile>
                            [--format VDI|VMDK|VHD|RAW|<other>]
                            [--variant Standard,Fixed,Split2G,Stream,ESX]
                            [--existing]

  convertfromraw            <filename> <outputfile>
                            [--format VDI|VMDK|VHD]
                            [--variant Standard,Fixed,Split2G,Stream,ESX]
                            [--uuid <uuid>]
  convertfromraw            stdin <outputfile> <bytes>
                            [--format VDI|VMDK|VHD]
                            [--variant Standard,Fixed,Split2G,Stream,ESX]
                            [--uuid <uuid>]

  getextradata              global|<uuid|vmname>
                            <key>|enumerate

  setextradata              global|<uuid|vmname>
                            <key>
                            [<value>] (no value deletes key)

  setproperty               machinefolder default|<folder> |
                            hwvirtexclusive on|off |
                            vrdeauthlibrary default|<library> |
                            websrvauthlibrary default|null|<library> |
                            vrdeextpack null|<library> |
                            autostartdbpath null|<folder> |
                            loghistorycount <value>
                            defaultfrontend default|<name>

  usbfilter                 add <index,0-N>
                            --target <uuid|vmname>|global
                            --name <string>
                            --action ignore|hold (global filters only)
                            [--active yes|no] (yes)
                            [--vendorid <XXXX>] (null)
                            [--productid <XXXX>] (null)
                            [--revision <IIFF>] (null)
                            [--manufacturer <string>] (null)
                            [--product <string>] (null)
                            [--remote yes|no] (null, VM filters only)
                            [--serialnumber <string>] (null)
                            [--maskedinterfaces <XXXXXXXX>]

  usbfilter                 modify <index,0-N>
                            --target <uuid|vmname>|global
                            [--name <string>]
                            [--action ignore|hold] (global filters only)
                            [--active yes|no]
                            [--vendorid <XXXX>|""]
                            [--productid <XXXX>|""]
                            [--revision <IIFF>|""]
                            [--manufacturer <string>|""]
                            [--product <string>|""]
                            [--remote yes|no] (null, VM filters only)
                            [--serialnumber <string>|""]
                            [--maskedinterfaces <XXXXXXXX>]

  usbfilter                 remove <index,0-N>
                            --target <uuid|vmname>|global

  sharedfolder              add <uuid|vmname>
                            --name <name> --hostpath <hostpath>
                            [--transient] [--readonly] [--automount]

  sharedfolder              remove <uuid|vmname>
                            --name <name> [--transient]

  guestproperty             get <uuid|vmname>
                            <property> [--verbose]

  guestproperty             set <uuid|vmname>
                            <property> [<value> [--flags <flags>]]

  guestproperty             delete|unset <uuid|vmname>
                            <property>

  guestproperty             enumerate <uuid|vmname>
                            [--patterns <patterns>]

  guestproperty             wait <uuid|vmname> <patterns>
                            [--timeout <msec>] [--fail-on-timeout]

  guestcontrol              <uuid|vmname>

                              exec[ute]
                              --image <path to program> --username <name>
                              [--passwordfile <file> | --password <password>]
                              [--domain <domain>] [--verbose] [--timeout <msec>]
                              [--environment "<NAME>=<VALUE> [<NAME>=<VALUE>]"]
                              [--wait-exit] [--wait-stdout] [--wait-stderr]
                              [--dos2unix] [--unix2dos]
                              [-- [<argument1>] ... [<argumentN>]]

                              copyfrom
                              <guest source> <host dest> --username <name>
                              [--passwordfile <file> | --password <password>]
                              [--domain <domain>] [--verbose]
                              [--dryrun] [--follow] [--recursive]

                              copyto|cp
                              <host source> <guest dest> --username <name>
                              [--passwordfile <file> | --password <password>]
                              [--domain <domain>] [--verbose]
                              [--dryrun] [--follow] [--recursive]

                              createdir[ectory]|mkdir|md
                              <guest directory>... --username <name>
                              [--passwordfile <file> | --password <password>]
                              [--domain <domain>] [--verbose]
                              [--parents] [--mode <mode>]

                              removedir[ectory]|rmdir
                              <guest directory>... --username <name>
                              [--passwordfile <file> | --password <password>]
                              [--domain <domain>] [--verbose]
                              [--recursive|-R|-r]

                              removefile|rm
                              <guest file>... --username <name>
                              [--passwordfile <file> | --password <password>]
                              [--domain <domain>] [--verbose]

                              ren[ame]|mv
                              <source>... <dest> --username <name>
                              [--passwordfile <file> | --password <password>]
                              [--domain <domain>] [--verbose]

                              createtemp[orary]|mktemp
                              <template> --username <name>
                              [--passwordfile <file> | --password <password>]
                              [--directory] [--secure] [--tmpdir <directory>]
                              [--domain <domain>] [--mode <mode>] [--verbose]

                              list <all|sessions|processes|files> [--verbose]

                              process kill --session-id <ID>
                                           | --session-name <name or pattern>
                                           [--verbose]
                                           <PID> ... <PID n>

                              [p[s]]kill --session-id <ID>
                                         | --session-name <name or pattern>
                                         [--verbose]
                                         <PID> ... <PID n>

                              session close  --session-id <ID>
                                           | --session-name <name or pattern>
                                           | --all
                                           [--verbose]

                              stat
                              <file>... --username <name>
                              [--passwordfile <file> | --password <password>]
                              [--domain <domain>] [--verbose]

                              updateadditions
                              [--source <guest additions .ISO>] [--verbose]
                              [--wait-start]
                              [-- [<argument1>] ... [<argumentN>]]

                              watch [--verbose]

  debugvm                   <uuid|vmname>
                            dumpguestcore --filename <name> |
                            info <item> [args] |
                            injectnmi |
                            log [--release|--debug] <settings> ...|
                            logdest [--release|--debug] <settings> ...|
                            logflags [--release|--debug] <settings> ...|
                            osdetect |
                            osinfo |
                            getregisters [--cpu <id>] <reg>|all ... |
                            setregisters [--cpu <id>] <reg>=<value> ... |
                            show [--human-readable|--sh-export|--sh-eval|
                                  --cmd-set] 
                                <logdbg-settings|logrel-settings>
                                [[opt] what ...] |
                            statistics [--reset] [--pattern <pattern>]
                            [--descriptions]

  metrics                   list [*|host|<vmname> [<metric_list>]]
                                                 (comma-separated)

  metrics                   setup
                            [--period <seconds>] (default: 1)
                            [--samples <count>] (default: 1)
                            [--list]
                            [*|host|<vmname> [<metric_list>]]

  metrics                   query [*|host|<vmname> [<metric_list>]]

  metrics                   enable
                            [--list]
                            [*|host|<vmname> [<metric_list>]]

  metrics                   disable
                            [--list]
                            [*|host|<vmname> [<metric_list>]]

  metrics                   collect
                            [--period <seconds>] (default: 1)
                            [--samples <count>] (default: 1)
                            [--list]
                            [--detach]
                            [*|host|<vmname> [<metric_list>]]

  natnetwork                add --netname <name>
                            --network <network>
                            [--enable|--disable]
                            [--dhcp on|off]
                            [--port-forward-4 <rule>]
                            [--loopback-4 <rule>]
                            [--ipv6 on|off]
                            [--port-forward-6 <rule>]
                            [--loopback-6 <rule>]

  natnetwork                remove --netname <name>

  natnetwork                modify --netname <name>
                            [--network <network>]
                            [--enable|--disable]
                            [--dhcp on|off]
                            [--port-forward-4 <rule>]
                            [--loopback-4 <rule>]
                            [--ipv6 on|off]
                            [--port-forward-6 <rule>]
                            [--loopback-6 <rule>]

  natnetwork                start --netname <name>

  natnetwork                stop --netname <name>

  hostonlyif                ipconfig <name>
                            [--dhcp |
                            --ip<ipv4> [--netmask<ipv4> (def: 255.255.255.0)] |
                            --ipv6<ipv6> [--netmasklengthv6<length> (def: 64)]]
                            create |
                            remove <name>

  dhcpserver                add|modify --netname <network_name> |
                                       --ifname <hostonly_if_name>
                            [--ip <ip_address>
                            --netmask <network_mask>
                            --lowerip <lower_ip>
                            --upperip <upper_ip>]
                            [--enable | --disable]

  dhcpserver                remove --netname <network_name> |
                                   --ifname <hostonly_if_name>

  extpack                   install [--replace] <tarball> |
                            uninstall [--force] <name> |
                            cleanup

VirtualBox从U盘启动

默认情况下,Virtualbox从无法从U盘启动的。

但可以用变通的方法,将宿主机的U盘,模拟为一个虚拟盘,从虚拟盘进行启动。

1、首先产看本地硬盘信息
运行diskmgmt.msc
查看U盘是第几个驱动器,比如我的是第2个驱动器(编号从0开始,0,1,2这样)

2、将U盘模拟为一个虚拟盘

VBoxManage internalcommands createrawvmdk -filename D:\VirtualMashines\VirtualBox\WinXP\usbdisk.vmdk -rawdisk \\.\PhysicalDrive2

3、虚拟机中,添加该虚拟盘

4、启动,按F12,选择虚拟盘启动。

VirtualBox扩展及压缩虚拟磁盘

1、首先定位各虚拟磁盘的UUID

C:\ProgramerTools\Oracle\VirtualBox>VBoxManage.exe list hdds
UUID:           b806ffa9-ea8e-4059-9dd8-2d246e850ab6
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\WinXP\WinXP.vdi
Storage format: VDI
Capacity:       10240 MBytes

UUID:           945de0c8-f928-44ad-ae39-9a12a71568ef
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\Debian8\Debian8.vdi
Storage format: VDI
Capacity:       20480 MBytes

UUID:           e49d8a88-d68b-43b8-954e-2be419933e08
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\Docker\Debian8Docker\Debian8Docker
.vdi
Storage format: VDI
Capacity:       20480 MBytes

UUID:           eab29989-ce9c-4491-8dd0-2190ed3029d6
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\FreeBSD10\FreeBSD10.vdi
Storage format: VDI
Capacity:       20480 MBytes

UUID:           74bcd43e-a315-437e-9b4f-895051ff8433
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\FreeBSD10\FreeBSD10A01.vdi
Storage format: VDI
Capacity:       20480 MBytes

2、扩展WinXP虚拟磁盘
2.1我的xp虚拟机一共只有10G,我需要扩展到20G(要关虚拟机)

C:\ProgramerTools\Oracle\VirtualBox>VBoxManage modifyhd b806ffa9-ea8e-4059-9dd8-
2d246e850ab6 --resize 20480
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

2.2扩展后,开启虚拟机,自己到磁盘管理器中分配空间即可。

3、扩展Debian虚拟磁盘
3.1我的Debian8Docker虚拟机一共只有20G,我需要扩展到30G(要关虚拟机)

C:\ProgramerTools\Oracle\VirtualBox>VBoxManage modifyhd e49d8a88-d68b-43b8-954e-
2be419933e08 --resize 30720
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

3.2扩展后,开启虚拟机,使用gparted等工具分配空间即可。
需要提前unmount分区,如果是调整扩展分区,需要umount该扩展分区下的所有挂载点。

4、压缩WinXP虚拟磁盘
4.1需要到微软官网下载sdelete工具,然后在虚拟机中运行:

sdelete -z

4.2关闭虚拟机,运行:

VBoxManage modifyhd b806ffa9-ea8e-4059-9dd8-2d246e850ab6 --compact

5、压缩Debian虚拟磁盘:
5.1A在虚拟机中运行zerofree命令,需要将分区挂载为只读模式

apt-get install zerofree
cd /
umount /home
zerofree /dev/sda6

5.1B在虚拟机中运行dd命令,需要将分区挂载为读写模式

dd if=/dev/zero of=/bigemptyfile
rm bigemptyfile 

5.2关闭虚拟机,运行:

VBoxManage modifyhd 945de0c8-f928-44ad-ae39-9a12a71568ef --compact

6、压缩FreeBSD虚拟磁盘:
6.1A在虚拟机中运行dd命令,需要将分区挂载为读写模式

dd if=/dev/zero of=bigemptyfile bs=1m
rm bigemptyfile

6.1B在虚拟机中运行dd命令,需要将分区挂载为读写模式(适用于影片空闲空间较小)

cat /dev/zero > bigemptyfile;sync;sleep 1;sync;
rm -f bigemptyfile

6.2关闭虚拟机,运行:

VBoxManage modifyhd eab29989-ce9c-4491-8dd0-2190ed3029d6 --compact
VBoxManage modifyhd 74bcd43e-a315-437e-9b4f-895051ff8433 --compact

VMWare扩展及压缩虚拟磁盘

1、扩展虚拟磁盘
1.1A我的xp虚拟机一共只有10G,我需要扩展到20G(要关虚拟机)

"D:\Program files\VMware\VMware Workstation\vmware-vdiskmanager.exe" -x 20GB "D:\VirtualMashines\VMware\WinXP\WinXP.vmdk"

1.1BVMWare10以后,可以直接在管理工具中
虚拟机-》设置-》硬盘-》实用工具-》扩展

1.2扩展后,开启虚拟机,自己到磁盘管理器中分配空间即可。

2、压缩WinXP虚拟磁盘(vmware-tools)
2.1管理工具(关闭虚拟机)
虚拟机-》设置-》硬盘-》实用工具-》碎片整理

2.2开启虚拟机
系统托盘图标-》vmware-tools-》压缩

3、压缩WinXP虚拟磁盘(vmware-vdiskmanager)
3.1需要到微软官网下载sdelete工具,然后在虚拟机中运行:

sdelete -z

3.2关闭虚拟机,运行:

"D:\Program files\VMware\VMware Workstation\vmware-vdiskmanager.exe" -k "D:\VirtualMashines\VMware\WinXP\WinXP.vmdk"

4、压缩Debian虚拟磁盘:
4.1A在虚拟机中运行zerofree命令,需要将分区挂载为只读模式

apt-get install zerofree
umount /etc/home
zerofree /dev/sda6

4.1B在虚拟机中运行dd命令,需要将分区挂载为读写模式

dd if=/dev/zero of=/bigemptyfile
rm bigemptyfile 

4.2关闭虚拟机,运行:

"D:\Program files\VMware\VMware Workstation\vmware-vdiskmanager.exe" -k "D:\VirtualMashines\VMware\Debian8\Debian8.vmdk"

5、压缩FreeBSD虚拟磁盘:
5.1A在虚拟机中运行dd命令,需要将分区挂载为读写模式

dd if=/dev/zero of=bigemptyfile bs=1m
rm bigemptyfile

5.1B在虚拟机中运行dd命令,需要将分区挂载为读写模式(适用于影片空闲空间较小)

cat /dev/zero > bigemptyfile;sync;sleep 1;sync;
rm -f bigemptyfile

5.2关闭虚拟机,运行:

"D:\Program files\VMware\VMware Workstation\vmware-vdiskmanager.exe" -k "D:\VirtualMashines\VMware\FreeBSD10\Debian8.vmdk"