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的配置自动生成该文件

posted @ 2019-01-14 21:03  炳烛之明  阅读(668)  评论(0编辑  收藏  举报