以前都是在虚拟机上安装linux,居然刚知道win10有WSL(Windows Subsystem for Linux)可以直接在win10上安装linux,消耗低,效率高,很赞,趁着干兴趣把WSL探索了一下,记录如下:

WSL安装和使用

这个网上比较多,也很简单,在Windows安装组件中添加【适用于Linux的Windows子系统】,现在只是增加了WSL支持,下一步需要在Microsoft Store中搜索linux查找linux发行版本,然后进行安装,我这里安装了Ubuntu18.04,安装之后在开始菜单中启动Ubuntu,这时候才会提示安装Ubuntu,安装之后会设置一个用户,下一次在选择Ubuntu就直接进入linux命令行了。

从上面可以看出,安装过程是两步,第一步是安装了一个UWP程序,第二步是第一次启动UWP程序时,真正安装linux发布版本。运行Ubuntu,然后再进程中找到他,定位到所在文件夹,可以看到UWP的安装文件,真正有用的文件是ubuntu1804.exe和install.tar.gz,安装的过程就是把install.tar.gz解压到一个特定的目录,然后再wsl系统中注册发行版本。可以通过以下命令查看所有已安装的发行版本

wslconfig /l

也可以使用以下命令启动一个指定的发行版本,如果不带参数就是启动默认发行版本

wsl -d <DistributionName>

刚才安装UWP程序中的ubuntu1804,exe程序时一个c++程序,可以复制出来运行,使用help参数可以看到可选参数,其中有安装、配置和运行某个命令。其实我们可以把上述的两个文件复制出来反复使用,重新安装unbuntu就不用到store里面下载了。

使用以下命令可以卸载一个linux发行包(注意这里不是卸载UWP程序)

wslconfig /u <DistributionName>

如何找到linux发行包的安装目录(微软不推荐直接访问它)呢,可以启动Ubuntu,然后再其中运行vim,再在win10任务管理器中找到vim进程,右键选在“打开文件所在的位置”就找到了,这里其实就是把整个tar.gz文件解压到这里了。

WSLAPI调用测试

然后又探索了一下怎么自己写程序发布一个linux版本,WSL增加了一个wslapi.dll,其中暴露的几个wslapi函数,简单的很:

WslConfigureDistribution
WslGetDistributionConfiguration
WslIsDistributionRegistered
WslLaunch
WslLaunchInteractive
WslRegisterDistribution
WslUnregisterDistribution

在这里查看详情[WSLAPI]

由于本机没有安装C++开发环境,就用C#和notepad++简单的写了一个测试,是一个命令行程序,直接用.netframeworks带的csc编译就可以,我测试了WslIsDistributionRegistered、WslLaunchInteractive、WslRegisterDistribution、WslUnregisterDistribution,除了第一个函数外,其他函数测试时都要将另外几个函数注释掉,只是为了验证就不细化了。

test.cs

 using System;
using System.Runtime.InteropServices; namespace HelloWorldApplication
{
/* 类名为 HelloWorld */
class HelloWorld
{
/* main函数 */
[DllImport("wslapi.dll", EntryPoint="WslIsDistributionRegistered",CharSet=CharSet.Auto)]
static extern bool WslIsDistributionRegistered(string distributionName);
[DllImport("wslapi.dll", EntryPoint="WslLaunchInteractive",CharSet=CharSet.Auto)]
static extern ulong WslLaunchInteractive(
string distributionName,
string command,
bool useCurrentWorkingDirectory,
ref ulong exitCode
);
[DllImport("wslapi.dll", EntryPoint="WslRegisterDistribution",CharSet=CharSet.Auto)]
static extern ulong WslRegisterDistribution(
string distributionName,
string tarGzFilename
);
[DllImport("wslapi.dll", EntryPoint="WslUnregisterDistribution",CharSet=CharSet.Auto)]
static extern ulong WslUnregisterDistribution(
string distributionName
);
static void Main(string[] args)
{
Console.WriteLine("Hello World!"); bool aa = WslIsDistributionRegistered("Ubuntu-18.04");
Console.WriteLine(aa.ToString());
//启动一个wsl Distribution
/*ulong excode=0;
WslLaunchInteractive("tsclinux",null,false,ref excode);*/ //安装一个distribution
/*ulong ucode = WslRegisterDistribution("tsclinux","install.tar.gz");
Console.WriteLine(ucode.ToString());*/ //卸载
ulong ucode = WslUnregisterDistribution("tsclinux");
Console.WriteLine(ucode.ToString());
Console.ReadKey();
}
}
}

程序测试中使用的install.tar.gz就是从Ubuntu18.04中复制出来的包,我只是将他注册成了tsclinux而已,将来可以试一下自己制作一个发行包。

其他资源

微软提供的把一个发行包做成UWP在微软商店中发布的开源工程distro launcher repo on github,安装之后会将/etc/resolv.conf删除,以便启动时wsl根据windows10的配置自动生成该文件

WSL探索及WSLAPI调用记录的更多相关文章

  1. 工作经验:Java 系统记录调用日志,并且记录错误堆栈

    前言:现在有一个系统,主要是为了给其他系统提供数据查询接口的,这个系统上线不会轻易更新,更不会跟随业务系统的更新而更新(这也是有一个数据查询接口系统的原因,解耦).这时,这个系统就需要有一定的方便的线 ...

  2. 前端项目中常用es6知识总结 -- 箭头函数及this指向、尾调用优化

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...

  3. SpringAop实操之记录关键业务请求数据

    AOP,中文名称,切面.在不影响业务代码情况下,实现想要的功能,是个真炫酷的事. aop是个好东西,记录日志是必须的. 记录数据也一样的,那么也是可以用aop来实现的,这里借助注解一起解决问题吧. 因 ...

  4. sklearn中决策树算法DesiciontTreeClassifier()调用以及sklearn自带的数据包sklearn.datasets.load_iris()的应用

    决策树方法的简单调用记录一下 clf=tree.DecisionTreeClassifier() dataMat=[];labelMat=[] dataPath='D:/machinelearning ...

  5. ABP开发框架前后端开发系列---(4)Web API调用类的封装和使用

    在前面随笔介绍ABP应用框架的项目组织情况,以及项目中领域层各个类代码组织,以及简化了ABP框架的各个层的内容,使得我们项目结构更加清晰.上篇随笔已经介绍了字典模块中应用服务层接口的实现情况,并且通过 ...

  6. 详解JavaScript调用栈、尾递归和手动优化

    调用栈(Call Stack) 调用栈(Call Stack)是一个基本的计算机概念,这里引入一个概念:栈帧. 栈帧是指为一个函数调用单独分配的那部分栈空间. 当运行的程序从当前函数调用另外一个函数时 ...

  7. ES6学习笔记 -- 尾调用优化

    什么是尾调用? 尾调用(Tail Call)是函数式编程的一个重要概念,就是指某个函数的最后一步是调用另一个函数. function f(x) { return g(x) } 如上,函数 f 的最后一 ...

  8. JavaScript函数尾调用与尾递归

    什么是函数尾调用和尾递归 函数尾调用与尾递归的应用 一.什么是函数的尾调用和尾递归 函数尾调用就是指函数的最后一步是调用另一个函数. //函数尾调用示例一 function foo(x){ retur ...

  9. WSL中使用npm install报错

    报错内容类似下面的格式.具体解决方法请看这里:https://github.com/Microsoft/WSL/issues/14 着重关注 https://github.com/Microsoft/ ...

随机推荐

  1. (转)Oracle命令

    转自:http://www.cnblogs.com/NaughtyBoy/p/3181052.html Oracle登录命令 1.运行SQLPLUS工具 C:\Users\wd-pc>sqlpl ...

  2. 【hdu 6214】Smallest Minimum Cut

    [链接] 我是链接,点我呀:) [题意] 求最小割中最少的边数. [题解] 模板题 [代码] const int INF = 1e9; const int maxn = 1e3 + 7; const ...

  3. 【Codeforces Round #442 (Div. 2) C】Slava and tanks

    [链接] 我是链接,点我呀:) [题意] 有n个位置,每个位置都可能有不定数量的tank; 你每次可以选择一个位置投掷炸弹. 并且,这个位置上的所有tank都会受到你的攻击. 并且失去一点体力. 然后 ...

  4. 【例题3-4 UVA - 340】Master-Mind Hints

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这里出现了没有在相同位置的只能唯一配对. 就是说 3322 2234 这种情况. 只有3个weak pair. 即key[1]=a[ ...

  5. 从Set里面取出有序的记录

    Set里面的记录是无序的.假设想使用Set,然后又想里面的记录是有序的,就能够使用TreeSet.而不是HashSet.在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,T ...

  6. Cannot find module "element-ui/lib/theme-default/index.css"——解决办法

    在vuejs中使用element-ui 1.安装 cnpm install style-loader --save-dev cnpm install css-loader --save-dev cnp ...

  7. 删除GitHub上项目中的某个文件

    原文地址 https://www.jianshu.com/p/242412b43ca5 1.首先在本地中更新有该项目的最新包 即确保本地项目和git上的项目内容保持同步(git pull拉取项目代码) ...

  8. 几种常见web 容器比较 (tomcat、 jboss 、resin、 weblogic、 websphere、 glassfish)(转)

    点击打开PDF下载链接 web 容器比较 tomcat jboss resin weblogic websphere glassfish 1. Tomcat是Apache鼎力支持的Java Web应用 ...

  9. java异常中Exception捕获不到的异常

    一 概念 众所周知java提供了丰富的异常类,这些异常类之间有严格的集成关系,分类为 父类Throwable Throwable的两个子类Error和Exception Exception的两个子类C ...

  10. 嵌入式平台下的ldd

    x86平台有ldd可以很方便的查看对库的依赖关系,但在嵌入式linux环境中没有这个命令,替而代之是 CC=$(CROSS_COMPILE)gcc LDD=$(CROSS_COMPILE)readel ...