Windows 原生运行 Linux 的技术细节

简介:

Microsoft 最近宣布了将 Linux Bash 与 Windows 10 进行集成的意图,通过这种集成,Windows 10 用户将能在操作系统中原生运行 Linux ELF64 二进制程序。为避免对该技术的实现方法产生错误的猜测,Windows Subsystem for Linux 团队主管 Deepu Thomas 详细介绍了在 Windows 上运行 Linux 的技术细节。

为了解释在 Windows 上运行 Linux 的方法,首先需要介绍一些相关技术和功能:

Windows 用户模式。是 CPU 的一种运行模式,可对普通应用程序进行隔离和保护。每个以这种模式启动的应用程序都有自己专用、无法被其他应用程序修改的虚拟地址空间。此外如果一个应用程序崩溃,其他应用程序不会受到波及。

Windows 内核模式。主要由(内核模式的)驱动程序之类的操作系统核心组件使用的一种 CPU 运行模式。与计算机硬件进行的所有交互都是在这种模式下处理的。为尽可能避免崩溃,Windows 内建并以该模式运行的组件需要进行全面的测试,因为这种层面的崩溃会危及整个操作系统。这篇 MSDN 文章详细介绍了这两种 Windows 模式之间的差异。

Windows NT 子系统。Windows NT 问世之初就在应用程序所能调用的 API 和内核层之间进行了隔离。这样 Windows NT 便可支持多种子系统,例如 POSIX、OS/2 以及 Win32。这些子系统最初的用途是简化 UNIX 和 OS/2 应用程序向 Windows 移植的工作。虽然 POSIX 和 OS/2 子系统已被取消,但它们的架构依然保留了下来。

Pico 进程和驱动。DrawBridge 项目引入的 Pico 进程和相应的驱动提供了一种基于过程的容器。这是一种不包含操作系统服务的轻量级解决方案,系统调用是由一对 Pico 驱动处理的。

用户模式 Linux。通过这种方式可将 Linux 作为应用程序在其他 Linux 宿主机基础之上运行。此时来宾 Linux 内核无需直接访问硬件,而是将系统调用转发至宿主机 Linux,由其代为访问。

为了运行 Linux,Microsoft 创建了 Windows Subsystem for Linux (WSL),这个子系统的整体架构如下图所示:

screenshot

当用户以用户模式启动 bash.exe 时,会同时启动相关服务以及 LX 会话管理器。这个服务在用户通过命令提示符输入的 bash 命令和待执行的相关原生 ELF64 二进制程序之间承担了中介的角色。这里的 Linux 二进制程序是 Canonical 提供的用户模式 Ubuntu 14.04 系统的组成部分,以 Pico 进程的形式启动并在用户模式下运行。此时由 lxss.sys 和 lxcore.sys 这两个驱动负责模拟 Linux 内核并拦截系统调用。大部分情况下,相应的驱动会将 Linux 内核调用映射为对应的 Windows 内核调用,但也有些情况可能缺乏对应的 Windows 内核调用。例如 fork (),Thomas 解释了其中的原理:

根据记录,Linux fork () syscall 没有直接对等的 Windows 调用。当针对 Windows Subsystem for Linux 进行 fork 系统调用时,lxcore.sys 会执行一些前期工作为进程的复制做准备。随后它会调用内部的 Windows NT 内核 API 以使用相应语意创建进程,并为新建的进程完成额外数据的复制。

WSL 提供了两种可被 Linux 访问的文件系统:VolFs 和 DriveFs。前者在各方面都非常类似于常规的 Linux 文件系统,包括权限支持、symbolic 链接、大小写敏感,以及 Windows 文件系统中不允许使用的字符。后者提供了与 Windows 互操作的能力,使得用户能够在 Linux 中看到所有 Windows 卷。

这个功能与虚拟化无关,Linux 二进制程序也没有为了在 WSL 中运行而移植或重编译。这种方式运行的 Linux 命令可以像 Windows 应用程序一样访问本地主机,无需使用虚拟化的网络。

根据 Thomas 的介绍,针对 WSL 进行性能评测后发现,性能表现非常接近用相同硬件直接运行 Linux 的性能,这证明 WSL 在性能方面的表现很出色。

Microsoft 团队曾在 WSL 上运行过 Python 和 Ruby,并像其他 Linux 用户那样使用 gcc 编译过程序,大部分情况下都可以正常工作,但也有一些小问题:sudo 无法完全正常使用,文件系统需要进行一定的调整,运行 MySQL 会遇到一些小问题等。有些用户提到无法运行 Java、Semaphores 或共享内存。目前 UserVoice WSL 频道中最需要的三个特性分别是:在两个环境中使用 slash,通过 Bash 启动 Windows 进程,以及将 WSL 开源。

Microsoft 提供的在 Windows 上运行 Linux 的能力可以帮助运维团队,尤其是负责运维云实例的团队无需更换计算机或使用虚拟化解决方案,便可直接从一台 Windows/Linux 计算机管理自己的所有系统。云中运行的很多计算机都运行了 Linux,这个功能可以让运维人员的工作变得轻松一些。

====================================分割线================================
文章转载自 开源中国社区[http://www.oschina.net]

目录
相关文章
|
2天前
|
安全 网络协议 Linux
telnet在windows和linux上的使用方法
Telnet是一个简单且强大的网络工具,广泛用于远程管理和网络诊断。尽管存在安全风险,但在受控环境中,Telnet仍然是一个非常有用的工具。通过本文的介绍,您应该能够在Windows和Linux系统上安装并使用Telnet进行各种网络操作。
54 18
|
2天前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
44 14
|
22天前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
42 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
5天前
|
Ubuntu 网络协议 Linux
快速部署WSL(Windows Subsystem for Linux)
WSL提供了一种轻量级的方法,使开发者能够在Windows上无缝运行Linux环境。通过本文介绍的步骤,可以快速安装、配置和使用WSL,以满足开发和测试的需求。
37 8
|
5天前
|
安全 Linux KVM
Linux虚拟化技术:从Xen到KVM
Xen和KVM是Linux平台上两种主要的虚拟化技术,各有优缺点和适用场景。通过对比两者的架构、性能、安全性、管理复杂性和硬件依赖性,可以更好地理解它们的适用场景和选择依据。无论是高性能计算、企业虚拟化还是云计算平台,合理选择和配置虚拟化技术是实现高效、稳定和安全IT环境的关键。
39 8
|
22天前
|
自然语言处理 安全 Java
Nexpose 7.0.1 for Linux & Windows - 漏洞扫描
Nexpose 7.0.1 for Linux & Windows - 漏洞扫描
40 6
|
25天前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
1月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
68 4
|
4月前
|
Ubuntu Linux 虚拟化
安装Windows Linux 子系统的方法:适用于windows 11 版本
本文提供了在Windows 11系统上安装Linux子系统(WSL)的详细步骤,包括启用子系统和虚拟化功能、从Microsoft Store安装Linux发行版、设置WSL默认版本、安装WSL2补丁,以及完成Ubuntu的首次安装设置。
1280 2
|
7月前
|
Linux Windows Ubuntu
Windows 使用 Linux 子系统,轻轻松松安装多个linux
Windows 使用 Linux 子系统,轻轻松松安装多个linux
720 0
Windows 使用 Linux 子系统,轻轻松松安装多个linux