以前都是在虚拟机上安装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. 关于JS的面向对象总结

    什么是面向对象: 对象由两部分构成:属性 和 方法: 面向对象的特点: 1.封装:对于相同功能的代码,放在一个函数中,以后再用到此功能,只需要调用即可,无需再重写:避免大量冗余代码: 专业话说:低耦合 ...

  2. angular 响应式自定义表单控件—注册头像实例

    1. 组件继承ControlValueAccessor,ControlValueAccessor接口需要实现三个必选方法 writeValue() 用于向元素中写入值,获取表单的元素的元素值 regi ...

  3. macos中xcode使用opencv,错误总结

    使用opencv时,进行编译时,会出现如上图所示错误,按图示更改就行了(我编译出来的有2处)主要参考 https://blog.csdn.net/fk1174/article/details/7011 ...

  4. 深入理解线程本地变量ThreadLocal

    ThreadLocal理解: 假设在多线程并发环境中.一个可变对象涉及到共享与竞争,那么该可变对象就一定会涉及到线程间同步操作,这是多线程并发问题. 否则该可变对象将作为线程私有对象,可通过Threa ...

  5. Linux下设置MySQL不区分大写和小写

            MySQL在Linux下数据库名.表名.列名.别名大写和小写规则:  1.数据库名与表名是严格区分大写和小写  2.表的别名是严格区分大写和小写  3.列名与列的别名在全部的情况下均是 ...

  6. vuex概念总结及简单使用实例

    原文 简书原文:https://www.jianshu.com/p/0546983f5997 大纲 1.什么是Vuex 2.什么是“状态管理模式”? 3.什么情况下应该使用 Vuex? 4.Vuex和 ...

  7. 2、opencv2.4.13.6安装

    一. 卸载opencv3.3.0: Going to the "build" folder directory of opencv from terminal, and execu ...

  8. matplotlib学习之颜色样式

    一.颜色 1.内建八种默认颜色 蓝色 - 'b' 绿色 - 'g' 红色 - 'r' 青色 - 'c' 品红 - 'm' 黄色 - 'y' 黑色 - 'k' 白色 - 'w' 2.灰度 plt.plo ...

  9. Facebook开源软件列表

    从 Facebook 的 GitHub 账户中可以看到,Facebook 已经开源的开源项目有近 300 个,领域涉及移动.前端.Web.后端.大数据.数据库.工具和硬件等.Facebook 开源项目 ...

  10. Android自己定义控件2-简单的写字板控件

    概述 上一篇文章我们对自己定义控件进行了一个大体的知识介绍. 今天就来学习自己定义一个简单的写字板控件. 先来看看效果图 就是简单的依据手指写下的轨迹去画出内容 实现 在上一篇文章里提到了androi ...