概述
微软在年初开发者大会上突然宣布在 Windows 10 年中周年更新版本会引入 Bash,一时间引起轩然大波。此举,也被视为讨好开发者的一种方式。 Linux 系统在服务器或者嵌入式等平台开发还是得到广泛使用的,以往开发人员会采取安装虚拟机(Vmware / vBox等),模拟 Shell 环境(Cgywin / MiniGW等)或者安装多系统,甚至专门部署一台 Linux 主机。 这一次,微软与 Canonical 公司(Ubuntu 母公司)合作,在 Windows 10 引入 Linux 子系统(Windows Subsystem for Linux),使得 Ubuntu Bash Shell 下 64位 ELF 格式用户模式应用程序原生可以在 Windows 10 下运行。这里需要注意的是,与虚拟机等方式存在本质上的不同。Linux 二进制文件可以不需要重新编译,直接在 Windows 10 下运行,而且调用的是 Windows NT 的系统 API。这样,不论是便捷性还是性能都会强很多。 那么究竟是怎么回事呢?要先从 Windows NT 架构说起...... Windows NT 即 Windows New Technology,最初微软于 1993 发布的面向工作站 / 服务器的高性能 32位操作系统。现在的 WindowsXP/2003/Vista/2008/7/2012/10 等操作系统都是基于 NT 架构构建。因为最初是微软和IBM 合作开发的,所以 NT 也支持 OS/2 应用程序。当然 20多年过去了 NT 架构也发生很多变化,不过一些基本结构还是类似的。 后来,随着时间推移,这些早期的子系统已经被淘汰。但是由于存在这样的框架支持,因此可以在先前资源的基础上添加 Windows Subsystem for Linux。 类似 NT 架构核心文件 Ntoskrnl.exe 和 Ntdll.dll,Linux 子系统实时将 Linux 的系统调用转换为 Windows 的系统调用,通过核心文件 LXCore.sys 和LXSS.sys。 所以,在 Windows 10Linux 子系统中并不存在 Linux 系统内核,所有系统调用(System Call)都会被转换为 NT 系统调用(System Call)。
部署那么如何打开 Linux 子系统呢? 1、安装 Linux 子系统 控制面板>启用或关闭 Windows 功能>适用于 Linux 的 Windows 子系统 也可以在 PowerShell 下执行 Enable-WindowsOptionalFeature -Online -FeatureNameMicrosoft-Windows-Subsystem-Linux 命令。 安装完成重启计算机 2、打开开发者模式 设置>更新和安全>针对开发人员>开发人员模式,然后重启计算机。 3、安装 Ubuntu 打开命令行提示符(管理员),输入 Bash 开始下载安装,视网络状况及速度可能需要几十分钟到几个小时。安装完成后按照提示设置 Unix 用户名和密码。 这样 Bash 环境就可以使用了,安装完成后会在用户目录下C:\Users\F\AppData\Local\lxss 创建相关文件。可以,看到跟常见的 Linux 文件系统目录结构一致。 可以通过命令查看 Linux 版本信息。 uname -a Linux F-TABLETBOOK 3.4.0+ #1 PREEMPT ThuAug 1 17:06:05 CST 2013 x86_64 x86_64 x86_64 GNU/Linux cat /proc/version Linux version 3.4.0-Microsoft(Microsoft@Microsoft.com) (gcc version 4.7 (GCC) ) #1 SMP PREEMPT Wed Dec 3114:42:53 PST 2014 cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04.5LTS" sudo lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: trusty 可以看到,是基于 Ubuntu 14.04 LTS 长期支持版本构建。当然,还可以通过 sudoapt-get install gcc 安装软件。
实践现在,就以在 OMAPL138 Linux 系统编写一个简单的 hello 程序为例,介绍在 Linux 子系统下的开发。 首先需要交叉编译器,注意,只有 64位版本才能在 Linux 子系统下运行,这里使用的是arm-2013.05-24-arm-none-linux-gnueabi-x86_64-linux-gnu.tar.bz2。 命名规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch - 体系架构,如ARM,MIPS vendor - 工具链提供商 os - 目标操作系统 eabi - 嵌入式应用二进制接口(Embedded ApplicationBinary Interface) 根据对操作系统的支持与否,ARM GCC可分为支持和不支持操作系统,如 arm-none-eabi:这个是没有操作系统的,自然不可能支持那些跟操作系统关系密切的函数,比如fork(2)。使用的是newlib这个专用于嵌入式系统的C库。 arm-none-linux-eabi:用于Linux的,使用Glibc。 比如, arm-none-eabi-gcc 用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application)。 arm-none-linux-gnueabi-gcc 主要用于基于 ARM 架构的 Linux 系统,可用于编译 ARM 架构的 u-boot、Linux内核、Linux应用等。 arm-eabi-gcc Android ARM 编译器。 armcc ARM 公司推出的编译工具,功能和 arm-none-eabi 类似。 arm-none-uclinuxeabi-gcc 用于uCLinux,使用Glibc。 arm-none-symbianelf-gcc 用于symbian。 1、解压文件到任意目录,因为有 Linux 子系统支持,所以你可以将文件放到任何 Windows 下可以访问的目录。解压需要一会时间。 tar jxvf arm-2013.05-24-arm-none-linux-gnueabi-x86_64-linux-gnu.tar.bz2-C ./ 2、解压完成后可以先配置下环境变量 exportPATH=$PATH:/mnt/d/Project/Linux/arm-2013.05/bin 3、然后,编写一个简单的 hello 程序。 4、交叉编译程序 arm-none-linux-gnueabi-gcchello.c -o hello 编译成功后可以查看下文件信息 filehello hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped 可以看到这个文件是32位 ELF 格式小端字节序 ARM 平台使用动态链接库的可执行文件。 5、上传程序到开发板文件系统并执行,可以使用 Bash 命令行方式也可以直接使用第三方工具比如 SecureCRT 和 SecureFX。这里以命令行方式为例。 n 使用 SFTP 协议登录开发板,192.168.1.35 是开发板 IP 地址。 sftproot@192.168.1.35 n 上传程序到 /home/root sftp>puthello /home/root n 退出 SFTP sftp>exit n 使用 SSH 协议连接开发板 ssh-l root 192.168.1.35 n 更改权限 root@tl:~#chmod +x hello n 执行程序 root@tl:~#./hello Hello world!
运行图形界面程序虽然,微软的出发点是想让开发者执行 Bash 命令行程序,但实际上 GUI 图形界面程序也可以执行,外国论坛上的大神都完整的安装了 unity、xfce以及 deepin 等。 如果,想要运行 GUI 程序,首先需要安装 X Server 服务器,可以使用 Xming 或 VcXsrv 之类的软件,安装完成后运行 XLaunch 简单配置下即可。 看起来是不是跟 Windows 10 主题也没有违和感呢?
附录 参考资料
|