• WSL探索及WSLAPI调用记录


    以前都是在虚拟机上安装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编译就可以,我测试了WslIsDistributionRegisteredWslLaunchInteractiveWslRegisterDistributionWslUnregisterDistribution,除了第一个函数外,其他函数测试时都要将另外几个函数注释掉,只是为了验证就不细化了。

    test.cs

     1 using System;
     2 using System.Runtime.InteropServices;
     3 
     4 namespace HelloWorldApplication
     5 {
     6     /* 类名为 HelloWorld */
     7     class HelloWorld
     8     {
     9         /* main函数 */
    10         [DllImport("wslapi.dll", EntryPoint="WslIsDistributionRegistered",CharSet=CharSet.Auto)]
    11         static extern bool WslIsDistributionRegistered(string distributionName);
    12         [DllImport("wslapi.dll", EntryPoint="WslLaunchInteractive",CharSet=CharSet.Auto)]
    13         static extern ulong WslLaunchInteractive(
    14           string distributionName,
    15           string command,
    16           bool   useCurrentWorkingDirectory,
    17           ref ulong exitCode
    18         );
    19         [DllImport("wslapi.dll", EntryPoint="WslRegisterDistribution",CharSet=CharSet.Auto)]
    20         static extern ulong WslRegisterDistribution(
    21           string distributionName,
    22           string tarGzFilename
    23         );
    24         [DllImport("wslapi.dll", EntryPoint="WslUnregisterDistribution",CharSet=CharSet.Auto)]
    25         static extern ulong WslUnregisterDistribution(
    26           string distributionName
    27         );
    28         static void Main(string[] args)
    29         {
    30             Console.WriteLine("Hello World!");
    31 
    32             bool aa = WslIsDistributionRegistered("Ubuntu-18.04");
    33             Console.WriteLine(aa.ToString());
    34             //启动一个wsl Distribution
    35             /*ulong excode=0;
    36             WslLaunchInteractive("tsclinux",null,false,ref excode);*/
    37             
    38             //安装一个distribution
    39             /*ulong ucode = WslRegisterDistribution("tsclinux","install.tar.gz");
    40             Console.WriteLine(ucode.ToString());*/
    41             
    42             //卸载
    43             ulong ucode = WslUnregisterDistribution("tsclinux");
    44             Console.WriteLine(ucode.ToString());
    45             Console.ReadKey();
    46         }
    47     }
    48 }

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

    其他资源

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

  • 相关阅读:
    转载 | CSS文本溢出显示省略号
    转载 | CSS书写顺序
    转载 | CSS布局大全
    threejs sprite 制作标签
    typeScript 中的类
    Es5中的类
    typeScript中的函数
    websocket在vue项目中的使用
    typeScript中的变量数据类型
    echarts 中的1/4圆环行图的使用
  • 原文地址:https://www.cnblogs.com/bingzhu/p/10269033.html
Copyright © 2020-2023  润新知