以前都是在虚拟机上安装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的配置自动生成该文件

最新文章

  1. 2015-12-01 SQL查询语句基础
  2. Linux下部署FTP服务器
  3. cocos2d-x初步了解
  4. AutoCAD学习笔记
  5. Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用
  6. centos 7 DenyHosts 安装 防暴力破解ssh登陆
  7. cookie和session区别
  8. 《day17_String_StringBuffer》
  9. shelll函数求两个输入数字之和
  10. XML Schema 简介
  11. js标签放在html的什么位置比较好
  12. TCP连接建立系列 — 服务端接收SYN段
  13. Help is needed for Dexter UVA - 11384(二分)
  14. [转帖] CA如何保护自己的私钥
  15. BZOJ 4562: [Haoi2016]食物链(拓扑排序)
  16. 软件工程 week 05
  17. 新版vue-cli输入本地ip不能访问,只能用localhost才可以访问?
  18. python大法好——
  19. MySQL升级方法一
  20. 集合框架—常见的Set集合

热门文章

  1. 想在子线程里面触发的信号的槽函数在子线程执行,信号槽连接必须使用DirectConnection 方式(即使跨线程,也可以强迫DirectConnection,而不能是AutoConnection)
  2. Oracle Web链接客户端
  3. UVA 11461 - Square Numbers 数学水题
  4. 2.CCGridAction(3D效果),3D反转特效,凸透镜特效,液体特效,3D翻页特效,水波纹特效,3D晃动的特效,扭曲旋转特效,波动特效,3D波动特效
  5. CSS布局开篇
  6. IWorkSpace与IWorkSpaceFactory与IWorkSpaceEdit
  7. 《编程导论(Java)&amp;#183;4.1数据抽象的含义》
  8. php实现删除链表中重复的节点
  9. JS冲突解决方法
  10. 【2005】N只猴子选大王