WSL与Windows交互实践

  • 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
[email protected] ~ % ls
go  mush  test
[email protected] ~ % pwd
/home/mush
[email protected] ~ %

后面都基于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:

[email protected]:/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后缀才行,不然会提示找不到命令 :

[email protected]:/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)"; then
        return $?
    else
        if [ -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 $?
        else
           printf "%s: command not found\n" "$1" >&2
           return 127
        fi
    fi
}

或在.zshrc中添加:

command_not_found_handler() {
    if cmd.exe /c "(where $1 || (help $1 |findstr /V Try)) >nul 2>nul && ($* || exit 0)"; then
        return $?
    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

原文地址:https://www.cnblogs.com/mushroom/p/8969338.html

时间: 2024-11-09 03:59:32

WSL与Windows交互实践的相关文章

windows IOCP 实践

关于 windows IOCP 有人说 windows IOCP 是 windows 上最好的东西. IOCP 是真正的异步 IO,意味着每次发起一个 IO 请求,该调用本身则立即返回, 而包括 IO 操作和数据从内核缓冲区到用户缓冲区之间的拷贝都由系统完成,直到这个过程结束系统才通知用户进程. linux 上没有这样的异步 IO. IOCP 的使用 创建一个新的完成端口.完成端口被设计成与一个线程池相互合作,线程池的线程并发的用来处理完成的 IO 通知.CreateIoCompletionPo

linux和windows交互

1.从Windows上传数据文件到Linux: a.设置Linux上村文件的目录: 设置文件路径:(SecureCRT)选项-->会话选项-->连接-->SSH2-->SFTP 标签,在这里设置好: 本地目录.远程目录 注:本地目录好像没啥用,远程目录有用,Windows文件上传到Linux文件下时,默认放到远程目录下面.所以本地目录是windows下的目录,远程目录是Linux下的目录地址 b.SecureCRT下运行命令:rz 会弹出一个框来,让你选择要上传到Linux上的文件

使用Samba实现Linux与Windows文件共享实践

前言 一直以来都以为FTP和NFS是局域网文件共享的常用方式,但是在最近接触Samba之后,了解到一些用户需要简化访问学习成本,满足基础的权限控制管理,并支持实时编辑和保存文件,我才明白这些需求使用之前的方法都是很难满足的,而Samba却可以完美的支持上述需求,虽然在开始接触时花了一些时间学习,但把配置和语法梳理清楚之后就很简单了. Unix与Windows文件共享的最佳方式之一 更新历史 2015年07月11日 - 初稿 阅读原文 - http://wsgzao.github.io/post/

让64位的WSL(windows子linux系统)支持运行32位程序

假设有一个新的Ubuntu WSL实例,则需要安装qemu-user-static软件包,添加i386 binfmt,启用i386体系结构,更新软件包列表,并安装一些i386软件包: 安装qemu和binfmt sudo apt update sudo apt install qemu-user-static sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\

Windows之wsl简单配置

Windows的wsl是Windows环境下启动的一个Linux环境,通常我们安装的是Ubuntu版本. 1.安装和简单配置 这里推荐一个文章,按照文章一步一步完全做就行 https://www.jianshu.com/p/3e627ff45ccb 2.设置启动wsl的默认登陆用户: 打开cmd,键入 ubuntu config --default-user root 这样,以后再运行ubuntu它就会默认以root登陆,更改其他用户则修改root字段即可. 原文地址:https://www.c

windows 下使用Linux 子系统-安装.net core 环境

在 Windows 上进行 web 开发,比较普遍的方案是使用 phpstudy 或者别的一些集成环境软件进行环境搭建,写好代码后将代码上传至版本管理工具 git/svn,再将代码同步到 Linux 服务器,这个过程当中开发者的开发环境(Windows)与代码最终执行的环境(Linux)不一致经常会导致一些奇奇怪怪的问题,想在 Windows 上进行 linux 下的 web 开发,不想用 mac(毕竟没钱买 mac),又不想使用虚拟机(虚拟机开机速度慢,添加站点需要重启,分配内存会导致机器变得

推荐一款好用的WSL终端模拟器

Windows 10 中包含了一个 WSL(Windows Subsystem for Linux)子系统,我们可以在其中运行未经修改过的原生 Linux ELF 可执行文件.利用它我们可以做很多事情,对开发人员和普通用户都是如此.当然对开发人员的吸引力更大一些,因为这意味着在一些情况,不再需要使用 Linux 虚拟机.双系统.Cygwin/MSYS2 了. 在WSL里我们可以直接访问本地文件系统,例如你电脑有3个分区C:,D:,E:,在WSL里的路径分别为/mnt/c,/mnt/d,/mnt/

Windows 8.1 explorer.exe 出错 “Application Hang”

不知道为什么explorer常常会卡一下 看系统日志发现有来源于“Application Hang”的错误 部分常规信息: 程序 explorer.exe 版本 6.3.9600.17415 停止与 Windows 交互并关闭.要查看是否有关于该问题的详细信息,请检查操作中心控制面板中的问题历史记录. 网上发现老外也有类似情况 http://www.eightforums.com/general-support/63158-windows-8-1-explorer-exe-suddenly-cr

Linux (Windows Linux子系统)

Linux (Windows Linux子系统) 如果想体验Linux环境下开发和运行.NET Core应用,我们有多种选择.一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种Linux Distribution,目前来说像RHEL.Ubuntu.Debian.Fedora.CentOS和SUSE这些主流的Distribution都是支持的.如果读者朋友们觉得这种方式比较麻烦,我们也可以采用虚拟机的形式安装相应的Linux Distribution,比如我经常使用的都是安