centos安装mysql wsl_科协五分钟—— Windows最强命令行WSL

欢迎关注精仪系科协栏目:”科协五分钟“。本栏目每周一期,会向大家介绍科协科创成果,推送最新动态,提供技术交流的平台,也会有面向低年级同学的科普讲解。

本期将会为大家介绍一个WIndows10的一个命令行工具WSL(全称为Windows Subsystem for Linux)。如有谬误,还请指正。

01

什么是WSL

       在2016年8月,微软正式发布了 Windows 10 Anniversary Update 周年更新(它还有着 RS1,Version 1607,Build 14393 等一大堆别名)。其中最让开发者兴奋的一个特性之一,就是WSL(当时叫Bash on Ubuntu on Windows)的正式加入。

59c38a940e22284f0b5990ecc2d7990a.png

在Windows上原生运行Linux?

是的,你没听错,巨硬疯了(雾

当然,BUG 10也是名不虚传,正式推出的时候依然问题多多(不仅 zsh、tmux 等工具无法使用,网络相关的操作更是一塌糊涂,还有各种各样奇妙的bug)。不过经过两年多的发展(修bug),WSL已经足够成熟,值得推荐了。

虽然取了这样违反广告法的的标题,但WSL确实是我遇到的使用体验最好的Windows命令行工具:

● 好看!!!(支持字体、配色自定义)

● 支持常见的*NIX命令行工具(cat、grep、awk 等)

● 自动补全、语法高亮、历史记录

● 互操作性(共享文件系统、网络栈,可调用 Win32 程序)

● 完善的开发工具链支持(gcc、make、cmake、autoconf等,以及开发所需的依赖安装)

● 包管理器,以及其他GNU软件的支持

● 快速呼出(快捷键、右键菜单入口)

● ……

WSL实现原理

既然把 WSL 吹得这么牛逼,那 WSL 究竟是个什么东西呢?简单来说,WSL 是一个兼容层,有点像反过来的 Wine。

首先,问一个问题,为什么 Linux 上的程序无法在 Windows 上运行呢?

了解过一点操作系统原理的同学应该都知道,这是 Windows 与 Linux 的内核提供的接口不同(系统调用、API 等)导致的。举个栗子,我们想知道某目录下的内容,在 Linux 下我们会使用ls命令,而在 Windows 下我们会使用dir命令。

当我们在 Linux 上执行ls命令,ls会调用 getdents 这个系统调用,Linux 内核收到请求,将目录的内容返回给应用程序;当我们在 Windows 上执行dir命令,dir会调用 NtQueryDirectoryFile 这个 API,NT内核收到请求,将目录的内容返回给应用程序。虽然系统不同,但基本上都是一个道理。

那么WSL所做的,还是拿ls举例,就是将Linux 的系统调用转换为 NT API NtQueryDirectoryFile。NT 内核收到 WSL 的请求,将目录的内容返回给 WSL,WSL 再把返回的内容包装好后返回给 ls。

也就是说,WSL 在 Linux 应用程序与 Windows NT 内核之间起到了翻译者的作用。只要实现了足够多的系统调用翻译,那么理论上 WSL 可以完全模拟成一个 Linux 内核。

和之前的类Unix命令行Cygwin相比,WSL的操作更为底层,Cygwin将linux的系统调用转换为Win32 API的调用,并且依然工作在 User Mode,而 WSL 则是转换为更底层的 NT API 调用,工作在Kernel Mode。因此,理论上讲WSL和Windows是同一层级的系统,因为Windows也是建立在NT内核上的。从实际测试来看,WSL的性能表现非常接近用相同硬件直接运行 Linux 的性能。

4fc2c3d118c6f72d13986efc8e04d4e1.png

▲WSL 架构示意图 图片来源:windows-for-linux-nerds

更重要的是,如果使用 Cygwin,Linux 应用程序的源码必须 link 至 Cygwin 运行库,修改源码重新编译后才能在 Windows 下运行。这些重新编译后的 Linux 应用程序在调用 POSIX API 时不会直接去请求内核,而是会去调用 Cygwin 运行库,由运行库翻译成 Win32 API、执行调用后返回结果。这也就意味着,重新编译后的应用程序需要依赖 Cygwin 运行库才能正常运行,而且只能在Windows上运行。而在 WSL 下,我们可以直接运行未经任何修改的 ELF 格式 Linux 可执行程序。

以上只是对于WSL的粗浅解释,具体实现请参考官方博客。

文件系统

Winodws为WSL提供了两个文件系统:VolFs和DriveFs,分别实现了两个目标:

  1. 提供一个完全支持Linux文件系统的环境

  2. 能够与Windows上的设备和文件互通

a40c5909b02c408185f1e5bdc2d4e23a.png

▲文件系统 图片来源:wsl-file-system-support

以上的架构使得WSL能够桥接Windows文件系统与Linux文件系统这两个完全不同的文件系统,使WSL具有良好的互操作性。

01

安装WSL

注意,WSL 仅支持 64 位系统,且本文中所描述的安装方法仅适用于 Windows 10 Fall Creators Update(秋季创意者更新,RS3,Version 1709,Build 16299)及以上版本。

第一步

打开「控制面板」中的「程序与功能」,点击左侧边栏的「启用或关闭 Windows 功能」选项,在弹出的窗口中勾选「适用于 Linux 的 Windows 子系统」,然后点击确定(需要重启)。

2f5cc632ed12f3d50a3b03044739db02.png

如果你懒得用 GUI,也可以直接在 PowerShell 中以管理员权限执行命令:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

第二步

打开 Microsoft Store,搜索「WSL」。挑选一个你喜欢的 Linux 发行版,然后点击安装。(截至目前,商店中可用的发行版有 Ubuntu、openSUSE、SUSE Linux Enterprise Server、Debian以及 Kali Linux)

d099662434c42cf2b17e23d2ad2ed51f.png

第三步

在开始菜单中找到你刚刚安装的发行版,打开它。等待几分钟的初始化过程,设定好用户名与密码后(不需要与 Windows 的相同,用过 Linux 的选手应该都懂的)就会自动进入 Linux 环境。

至此,你已经完成了 WSL 的安装。

你也可以同时安装多个发行版,它们的数据都是独立的,互不影响。

e7b322eb4dfc6d7c55e1e681e43ebc89.png

03

美化与其他

如果你正在使用中文 Windows 系统,而且之前并没有修改过Win32 Console的默认配置,那么你的 WSL 终端默认就会是那个样子。当然你可以尝试去给它美化一下,经过一番折腾我的效果是这样的:

608a204c78f8558fb02bfd6a459f9b06.png

好看的要求勉强满足(不过使用tmux、vim的时候还有bug),但是快捷键和功能的缺失还是存在的,因此有必要使用一个更强大的终端模拟器。

个人比较推荐的有:

  • wsl-terminal/wsltty

    两个基本没有区别,wsl-terminal是基于mintty,fatty和wslbridge开发的;wsltty是mintty的作者再次开发的版本,两者都是专门为 WSL 开发的终端模拟器,稳定易用,资源占用小,界面也没有区别,功能上可能有细微差异。

64d2f98f64748cd365365bc55ee8411d.png
  • Hyper

    基于 Electron 的跨平台终端模拟器,好看和可扩展性是卖点,BUG 不少。

7dede2e85c418e190828d52355b4e5f2.png

Windows的互操作性

Windows 下的所有盘符都挂载在 WSL 中的 /mnt 目录下,可以直接操作。WSL 中的所有数据则存放于 C:\Users\{你的用户名}\AppData\Local\Packages\{Linux发行版包名}\LocalState\rootfs 目录中(不要在 Windows 中修改这些文件,这会造成文件权限错误):

47a34ba0e6510e1d857cdc6aa0581c46.png

你可以在 Windows 命令行环境中直接调用 WSL 中的命令:

986cc07f8ed3c5fdb9d7d6da90ab4126.png

也可以在 WSL 中调用 Windows 中的命令行程序:

a73b27a40b134a7d99d8400664711ec1.png

甚至可以把 Windows 命令和 WSL 命令混着用:

4c18defe0cafa228f473236309ca588b.png

同时,WSL 与 Windows 共享网络栈,也就是说你可以:

  • 在 WSL 中启动 web server,在 Windows 上使用浏览器访问

  • 在 Windows 下启动 MySQL/Redis 服务器,在 WSL 中连接

  • ……

其他程序的支持

现在已经有不少程序支持WSL了:

  • Visual Studio Code

    VScode的终端界面除了可以选择cmd或者powershell外,也对wsl提供了支持,可以比较方便的进行一些linux下的操作。

0a842d66de5f08f520d393cba344a880.png
  • Clion

    Clion中,可以选择以WSL作为C/C++程序的编译环境,对于一些小型的、需要运行在linux环境下的C/C++程序,可以直接在Windows下使用WSL进行开发(我的C++大作业和PA都是这么干的

d5078cae1f6ba07c639cbc400c2b818c.png

其他关于 WSL 的折腾

虽然 Microsoft 开发 WSL出来主要是着重于命令行环境的使用,但经过测试,WSL 是可以通过 X Server 执行 GUI 应用程序的,具体过程可以参考:

在Win10的Linux子系统中运行图形化程序

除了Microsoft Store中有的几个发行版,你也可以安装一些未提供的 Linux 发行版,比如 Arch Linux。使用的时候如果出现问题,请先查看issue界面.

在微软发布的Windows 10 20H1首个预览版本18836中,增加了一些新的特性:添加了用户从Windows访问WSL发行版中的Linux文件的功能。可以通过\\wsl$\来访问WSL文件,或者通过导航到\\wsl$来查看正在运行的发行版列表。以及增加了导入和导出发行版的功能,相信大约1年之后这些新的特性会加入正式版。

03

总结

虽然 WSL 很不错,但是其比起真正的 Linux 系统还是有很多不足:

  • 无法运行所有Linux软件(如32位二进制文件)

  • 无法运行需要在WSL中未实现的特定Linux内核服务的软件(比如Docker)

  • 缺乏音频和显卡的支持,没有对OpenCL和CUDA的支持

  • I/O 性能较为孱弱(关闭Windows Defender可解决)

如果你日常开发中需要使用到那些 WSL 未提供的 Linux 特性,那么还是乖乖跑 VM 或者装 Linux 吧。

希望这篇文章能给需要在Windows上使用完整的Linux环境,习惯于linux强大的命令行工具,又不希望有很高的资源占用或者装双系统的各位提供一个新的解决方案。

最后,标准结局:

13c9c0f49989cded43e544516e264219.png 85980567b1c5f8677ea0ca8598e1ae23.png

文章参考:WSL 配置指北:打造 Windows 最强命令行

好了,本期科协五分钟到这里就结束了,对linux感兴趣的同学欢迎加入科协科创组(大雾)。

编辑 胡克勤

审核 路菀萍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值