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编译就可以,我测试了WslIsDistributionRegistered、WslLaunchInteractive、WslRegisterDistribution、WslUnregisterDistribution,除了第一个函数外,其他函数测试时都要将另外几个函数注释掉,只是为了验证就不细化了。
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的配置自动生成该文件