• 1. WSL是什么
  • 2. WSL新特性
  • 3. WSL管理配置
  • 4. WSL交互
  • 5. 解决方案
     * 5.1 使用别名
     * 5.2 多复制一份
     * 5.3 重定向
     * 5.4 symlink
  • 6. 其他
     * 6.1 闲聊
     * 6.2 参考

1. WSL是什么

​ WSL 是Windows Subsystem for Linux 的简称,主要是为了在Windows 10上原生运行Linux二进制可执行文件(ELF格式),而提供的兼容层。 通俗来讲是在Windows10 嵌入了个Linux子系统(默认是ubuntu),方便运行大部分 Linux 命令及软件,比如grep MySQL Apache。这很大方便了使用Windows做开发的同学,不需要双系统或虚拟机了。

在Windows功能中启用```适用于Linux的Windows子系统```,然后在Windows CMD中直接输入```bash```,即可进入Linux环境,执行命令:

2. WSL新特性

从Windows10 1709版本时开始,可以直接输入wsl进入交互环境, bash方式会逐渐废弃掉。

以前的 bash -c [command]直接用 wsl [command]来替代。

另一个特性是:Windows 10商店里,可以下载安装其他Linux发行版。这样就可以自由选择,不用限制到Ubuntu。

然后可以在程序列表中直接打开Ubuntu进入,或在CMD或Powershell中直接输入ubuntu进入:

PS D:\> ubuntu
mush@mushroom ~ % ls
go  mush  test
mush@mushroom ~ % pwd
/home/mush
mush@mushroom ~ %

后面都基于wslUbuntupowershell来介绍和演示。

3. WSL管理配置

Windows10自带了wslconfig,去管理多个安装的发行版,比如卸载某个发行版,设置默认启动的发型版。

在PowerShell中输入wslconfig /?, 可以看到:

PS D:\> wslconfig /?
在 Linux Windows 子系统上执行管理操作用法:/l, /list [/all] - 列出已注册的分发内容。/all - 有选择地列出所有分发内容,包括目前正安装或未安装的分发内容。/s, /setdefault <DistributionName> - 将指定的分发内容设置为默认值。/u, /unregister <DistributionName> - 注销分发内容。

切换默认发行版:

PS D:\> wslconfig /l
# 适用于 Linux 的 Windows 子系统:
Legacy (默认)
Ubuntu
PS D:\> wslconfig /s Ubuntu
PS D:\> wslconfig /l
# 适用于 Linux 的 Windows 子系统:
Ubuntu (默认)
Legacy

在Windows 1803 后,还支持更多配置。比如网络,root目录等。进入发行版后, 可以在/etc/wsl.conf中配置。 如果没有该文件,可以手动创建一个配置:

[automount]
enabled = true  # 自动挂载 c:/ 等到 /mnt
root = /windir/
options = "metadata,umask=22,fmask=11"
mountFsTab = false[network]
generateHosts = true
generateResolvConf = true

4. WSL交互

也是从1709开始,WSL支持在Windows 10上直接使用 Linux命令:

PS D:\test>  wsl ls -la
total 5836
drwxrwxrwx 1 root root    4096 Jan 25 13:20 .
drwxrwxrwx 1 root root    4096 Apr 20 16:25 ..
-rwxrwxrwx 1 root root     105 Oct 14  2017 03-build.ps1

同样在 WSL 内也可以使用Windows应用程序,比如notepad,docker:

root@mushroom:/mnt/d/go/src/code.teambition.com/soa/webhooks# docker.exe ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                                                                        NAMES
63698edb01a8        quay.io/coreos/etcd:latest   "/usr/local/bin/etcd"    2 days ago          Up 27 hours         0.0.0.0:2379->2379/tcp, 2380/tcp                                                             etcd

这是个非常赞的特性,极大方便了开发者。但在使用过程中发现,有个体验非常不好的地方,必须带.exe后缀才行,不然会提示找不到命令 :

root@mushroom:/mnt/d/go/src/code.teambition.com/soa/webhooks# docker
The program 'docker' is currently not installed. You can install it by typing:
apt-get install docker

比如同事在mac上写了个docker build的脚本,放到Windows上后 想使用WSL去执行,发现必须加后缀才行,这样脚本就没办法统一了

5. 解决方案

当然也可以在中装个docker,而不是使用宿主机上的docker。但这样会很冗余,而且性能不好。经过一番折腾找到几种解决方案:

5.1 使用别名

在WSL 中.bashrc设置别名,去掉后缀:

alias docker=docker.exe
alias docker-compose=docker-compose.exe

这样就可以正确运行命令了, 但别名只在交互环境有效,脚本执行坏境不行。

5.2 多复制一份

在宿主机上找到 docker.exe,然后复制一份重命名为 docker 放到同级目录,这样在wsl中也是可以执行的,有点蠢萌黑魔法的感觉。

5.3 重定向

思路是定义command_not_found_handle函数(bash 4.0+ 支持),当任何命令找不到时,都会调用调用它。 然后在该函数中尝试调用宿主机上cmd.exe,由它来来执行命令,并返回结果。

在.bashrc中添加:

command_not_found_handle() {if cmd.exe /c "(where $1 || (help $1 |findstr /V Try)) >nul 2>nul && ($* || exit 0)"; thenreturn $?elseif [ -x /usr/lib/command-not-found ]; then/usr/lib/command-not-found -- "$1"return $?elif [ -x /usr/share/command-not-found/command-not-found ]; then/usr/share/command-not-found/command-not-found -- "$1"return $?elseprintf "%s: command not found\n" "$1" >&2return 127fifi
}

或在.zshrc中添加:

command_not_found_handler() {if cmd.exe /c "(where $1 || (help $1 |findstr /V Try)) >nul 2>nul && ($* || exit 0)"; thenreturn $?else[[ -x /usr/lib/command-not-found ]] || return 1/usr/lib/command-not-found --no-failure-msg -- ${1+"$1"} && :fi
}

5.4 symlink

使用符号连接,讲宿主机上的docker.exe 映射到 WSL中:

ln -sf /mnt/c/Program\ Files/Docker/Docker/resources/bin/docker.exe /usr/bin/docker

6. 其他

6.1 闲聊

差不多有2年左右,没写博客了。主要是因为从C#/Net,转向Golang相关的技术栈了,需要重新积累和学习下。前期写了段时间c++,然后写Golang,发现Golang写着舒服多了。当然跟有了女朋友后,变懒也有很大关系。

这篇是开头,希望能继续坚持分享,也有利于自己成长。新博客会同步到github一份,方便备份修改。

6.2 参考

https://docs.microsoft.com/en-us/windows/wsl/interop

https://docs.microsoft.com/en-us/windows/wsl/wsl-config

https://github.com/Microsoft/WSL/issues/2003

WSL与Windows交互实践相关推荐

  1. ubuntu安装python_使用WSL在Windows上搭建Python开发环境

    简介 2016年,微软推出了Windows Subsystem for Linux(WSL),这使得Windows具有了强大的Unix功能.2019年5月,微软宣布发布了具有更新架构的WSL2,该架构 ...

  2. 把windows装到linux下,如何将WSL(Windows Subsystem for Linux 2)安装到Windows 10?

    原标题:如何将WSL(Windows Subsystem for Linux 2)安装到Windows 10? Windows 10凭借大受欢迎的WSL(Windows Subsystem for L ...

  3. 大家来玩WSL(Windows Subsystem for Linux)

    文章目录 (零)前言 (一)安装 1.1 安装其他发行版 (二)主机与网络 2.1 桥接网络 2.2 固定IP地址 2.3 改主机名 2.4 hosts文件 (三)启动运行 3.1 新建用户 3.2 ...

  4. NVT SDK 架构分层、后台任务和前台应用交互实践

    23-NVT SDK 架构分层.后台任务和前台应用交互实践 主要是探讨NVT SDK中代码的分层.解耦思想,为快速.敏捷.逻辑清晰开发提供可行的操作方式和思考提供参考和学习: ACC检测功能:底层配置 ...

  5. WSL(Windows Subsystem for Linux)升级到WSL2时报错:由于虚拟磁盘系统限制,无法完成请求的操作

    WSL(Windows Subsystem for Linux)升级到WSL2时报错: 由于虚拟磁盘系统限制,无法完成请求的操作.虚拟硬盘文件必须是未压缩和未加密的文件,并且不能是稀疏文件. 解决方案 ...

  6. 微软 WSL 2 (Windows Subsystem for Linux) 1.0 正式版发布

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! WSL(Windows Subsystem for Linux)是微软为 Windows 系统推出的一个兼容层,可 ...

  7. Wsl与Windows互相访问

    wsl访问Windows cat /etc/resolv.conf 获取nameserver,即为Windows的ip 在wsl中访问ip即可 Windows访问wsl服务 使用命令ip addr | ...

  8. 阿里智能对话交互实践与创新

    来源:人工智能头条 作者 :孙健,李永彬,陈海青,邱明辉 概要:过去 20 多年,互联网及移动互联网将人类带到了一个全新的时代,如果用一个词来总结和概括这个时代的话,「连接」这个词再合适不过. 过去 ...

  9. wsl(windows上运行linux)安装到非C盘解决方案

    前言 最近有小伙伴在问wsl默认安装在C盘的问题,觉得安装在C盘太占内存,毕竟一般新买的电脑默认C盘也就分了100多G,时间久了确实不够用.以前我还真没关注过这个问题,但是最近我发现我的C盘也越来越小 ...

最新文章

  1. 建议转变编程时的思维习惯改为:忽略细节关扰,直指问题核心,追寻问题关键。...
  2. html上的样式 ui vant_解决vue中组件库vant等ui组件库的移动端适配问题
  3. 在食堂吃饭是最好的解
  4. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树
  5. dama数据管理知识体系指南第二版pdf_DMBOK数据管理 - CDMP认证培训
  6. (转)Spring Boot(十六):使用 Jenkins 部署 Spring Boot
  7. forEach遍历对象数组案例
  8. Java设计模式百例 - 原型模式
  9. 事件元素JS的event对象--知识点总结
  10. maven下载 oracle 驱动包com.oracle:ojdbc14:jar
  11. 正交多项式-勒让德多项式,两类切比雪夫多项式及零点,拉盖尔多项式,埃尔米特多项式
  12. Tomcat启动报Exception in thread “main“ java.lang.UnsatisfiedLinkError: no secure-tomcat in java.library
  13. 两句css 搞定页面滚动时的卡顿问题?
  14. python基础-包文件批量导入导出
  15. 2021年中国旅游人次、箱包销售收入及利润总额分析[图]
  16. MATLAB用imshow画图时更改和显示坐标轴
  17. 富士康服务器主板装系统,富士康主板如何刷bios 富士康主板刷bios的技巧
  18. python经典爬虫之获取酷狗音乐TOP500信息
  19. python爬虫——利用百度搜索引擎爬取所需图片
  20. 辐射探测、监测和安全设备行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)

热门文章

  1. Ehcache 3.0发布,修补了API并支持非堆存储
  2. UI整理-----part2--UI控件
  3. OC高效率52之理解消息转发机制
  4. 带边框有点击事件的表格
  5. EF Code First执行SQL语句及存储过程
  6. linux 增量备份镜像,【备份与恢复】合并增量备份与映像副本
  7. mysql+dump+选项_mysqldump 备份常用选项以及备份脚本
  8. java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算
  9. HDU1892(二维树状数组)
  10. HDU4756(次小生成树)