目前win10系统对wsl的支持在逐步提升,mac已经转型消费向的arm阵营了,也许从远期来看是对的方向,但当下的开发还是以桌面工作环境为主,所以目前而言还是配一下桌面开发环境,做一下笔记

参考笔记

https://www.lagou.com/lgeduarticle/85437.html

https://zhuanlan.zhihu.com/p/145488247

https://www.sitepoint.com/wsl2/

预备

win+x快捷键,选Y系统,在设备规格中选“重命名这台电脑”,可以配置个简单点的名字尽量英文小写字母后面配hosts的时候也简单点

安装

升级win10到最新版本

家庭版和专业版都可以,有的企业版本貌似没有microsoft store商店,所以不推荐

  1. 访问:https://support.microsoft.com/zh-cn/help/3159635/windows-10-update-assistant 下载更新助手(windows易升) 或者直接访问 https://www.microsoft.com/zh-cn/software-download/windows10 点立即更新 升级安装时间主要看你的机器性能及网络带宽

安装配置好你的网络访问工具

比如clash,v2等等解决网络访问慢和阻塞的问题,此处不可描述n字省略。

安装windows terminal

在开始菜单找到microsoft store商店进入后搜索并安装 windows terminal

安装WSL2

参考:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10

右键选择以管理员身份运行windows terminal,打开默认的Windows PowerShell 粘贴安装指令:

1
2
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

运行完毕后重启系统 按照步骤4中下载并更新linux内核包 参考: https://aka.ms/wsl2kernel

比如下载安装包为:

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

右键选择以管理员身份运行windows terminal,打开默认的Windows PowerShell 粘贴配置指令:

1
wsl --set-default-version 2

安装对应的linux发行版,此次以ubuntu1804为例子 https://www.microsoft.com/zh-hk/p/ubuntu-1804-lts/9n9tngvndl3q?rtc=1&activetab=pivot:overviewtab

安装完成后创建初始用户(比如www)并设置密码则安装完毕

通过终端运行

1
wsl -l -v

可以确认当前的发行版所使用的wsl的版本是2还是1

如果上一个步骤中配置后忘记了初始用户的密码可以通过命令行处理一下 参考:https://winaero.com/reset-password-wsl-linux-distro-windows-10/

先设置默认登陆用户到root,此处以ubuntu18.04发行版为例子 右键选择以管理员身份运行windows terminal,打开默认的Windows PowerShell 粘贴配置指令:

1
ubuntu1804 config --default-user root

以root身份打开ubuntu18.04的终端修改www用户密码:

1
passwd www

输入新密码后,再把默认用户切回来 右键选择以管理员身份运行windows terminal,打开默认的Windows PowerShell 粘贴配置指令:

1
ubuntu1804 config --default-user www

现在用刚更新后的密码登录即可。

安装包管理工具

  1. 基础包安装工具

右键选择以管理员身份运行windows terminal,打开默认的Windows PowerShell 运行:

1
2
3
4
Install-PackageProvider -Name NuGet -Force
Install-Module -Name PowerShellGet -Force
Update-Module -Name PowerShellGet
Exit
  1. 官方基础命令行包管理工具winget(类似于apt/yum等发行版的包管理器)

网站:https://github.com/microsoft/winget-cli 下载:https://github.com/microsoft/winget-cli/releases 找最新版本的下载后执行(比如):https://github.com/microsoft/winget-cli/releases/download/v.0.2.2521-preview/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.appxbundle

  1. 安装三方chocolatey包管理工具(全局-管理员)

网站:https://chocolatey.org 安装参考:https://chocolatey.org/install#individual

右键选择以管理员身份运行windows terminal,打开默认的Windows PowerShell 粘贴安装指令:

1
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
  1. 安装三方scoop包管理工具(当前用户)

网站:https://scoop.sh/

直接运行windows terminal(以非管理员身份) 打开默认的Windows PowerShell 粘贴安装指令:

1
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')

或者

1
iwr -useb get.scoop.sh | iex

如果运行出现权限异常则执行:

1
Set-ExecutionPolicy RemoteSigned -scope CurrentUser

后重新运行上面的安装指令

升级安装最新的PowerShell

网站:https://github.com/PowerShell/PowerShell

直接运行windows terminal(以非管理员身份) 打开默认的Windows PowerShell

用winget下载安装:

1
winget install -i powershell

其中的-i参数可以在部分有安装选项的软件中提供安装过程中的交互,如果都按照默认值安装则可以直接不带-i参数执行默认的静默模式安装

通过winget安装相关基础软件

wox 启动器(类似于macos下的Alfred)

1
winget install -i wox

notepad++文本编辑器

1
winget install -i notepad++

vscode代码编辑器

1
winget install -i vscode

Microsoft Edge 浏览器

1
winget install -i "Microsoft Edge"

git源码管理工具

1
winget install -i git

配置windows terminal

支持sudo(管理员身份运行)

使用psutils脚本 参考:https://github.com/lukesampson/psutils 直接运行windows terminal(以非管理员身份) 打开默认的Windows PowerShell

1
scoop install psutils

使用gsudo工具 网站:https://github.com/gerardog/gsudo

右键选择以管理员身份运行windows terminal,打开默认的Windows PowerShell 运行:

1
PowerShell -Command "Set-ExecutionPolicy RemoteSigned -scope Process; iwr -useb https://raw.githubusercontent.com/gerardog/gsudo/master/installgsudo.ps1 | iex"

或者用前面的chocolatey包管理工具来安装:

1
2
choco install gsudo
refreshenv

配置支持管理员身份运行的windows terminal选项

参考:https://blog.csdn.net/weixin_39858881/article/details/107026065

在windows terminal的右上方的下拉菜单中选择设置然后编辑settings.json文件

其中powershell的图标"C:\\opt\\data\\assets\\img\\Giuj3FT.png"下载自:https://i.imgur.com/Giuj3FT.png

cmd命令行图标"C:\\opt\\data\\assets\\img\\CMD_32px.png" 下载自: https://raw.githubusercontent.com/mahoshojoHCG/GithubPageAccessories/master/Terminal/CMD_32px.png

参考:https://github.com/mahoshojoHCG/GithubPageAccessories/tree/master/Terminal

基本的配置例子:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// This file was initially generated by Windows Terminal 1.3.2651.0
// It should still be usable in newer versions, but newer versions might have additional
// settings, help text, or changes that you will not see unless you clear this file
// and let us generate a new one for you.

// To view the default settings, hold "alt" while clicking on the "Settings" button.
// For documentation on these settings, see: https://aka.ms/terminal-documentation
{
  "$schema": "https://aka.ms/terminal-profiles-schema",

  "defaultProfile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",

  // You can add more global application settings here.
  // To learn more about global settings, visit https://aka.ms/terminal-global-settings

  // If enabled, selections are automatically copied to your clipboard.
  "copyOnSelect": false,

  // If enabled, formatted data is also copied to your clipboard
  "copyFormatting": false,

  // A profile specifies a command to execute paired with information about how it should look and feel.
  // Each one of them will appear in the 'New Tab' dropdown,
  //   and can be invoked from the commandline with `wt.exe -p xxx`
  // To learn more about profiles, visit https://aka.ms/terminal-profile-settings
  "profiles": {
    "defaults": {
      // Put settings here that you want to apply to all profiles.
    },
    "list": [
      {
        "guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
        "hidden": false,
        "name": "PowerShell",
        "colorScheme": "Solarized Dark",
        "fontFace": "Sarasa Mono Slab SC",
        "source": "Windows.Terminal.PowershellCore"
      },
      {
        "guid": "{41dd7a51-f0e1-4420-a2ec-1a7130b7e950}",
        "name": "Windows PowerShell Elevated",
        "commandline": "gsudo.exe powershell.exe",
        "hidden": false,
        "colorScheme": "Solarized Dark",
        "fontFace": "Sarasa Mono Slab SC",
        "icon": "C:\\opt\\data\\assets\\img\\Giuj3FT.png"
      },
      {
        "guid": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}",
        "hidden": false,
        "name": "Ubuntu-18.04",
        "source": "Windows.Terminal.Wsl"
      },
      {
        // Make changes here to the cmd.exe profile.
        "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
        "name": "命令提示符",
        "commandline": "cmd.exe",
        "hidden": false
      },
      {
        // Make changes here to the cmd.exe profile.
        "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6102}",
        "name": "命令提示符(管理员)",
        "commandline": "gsudo.exe cmd.exe",
        "hidden": false,
        "icon": "C:\\opt\\data\\assets\\img\\CMD_32px.png"
      },
      {
        // Make changes here to the powershell.exe profile.
        "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
        "name": "Windows PowerShell",
        "commandline": "powershell.exe",
        "hidden": false
      },
      {
        "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
        "hidden": false,
        "name": "Azure Cloud Shell",
        "source": "Windows.Terminal.Azure"
      },
      {
        "guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
        "hidden": false,
        "name": "PowerShell",
        "source": "Windows.Terminal.PowershellCore"
      },
      {
        "guid": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}",
        "hidden": false,
        "name": "Ubuntu-18.04",
        "source": "Windows.Terminal.Wsl"
      }
    ]
  },

  // Add custom color schemes to this array.
  // To learn more about color schemes, visit https://aka.ms/terminal-color-schemes
  "schemes": [],

  // Add custom actions and keybindings to this array.
  // To unbind a key combination from your defaults.json, set the command to "unbound".
  // To learn more about actions and keybindings, visit https://aka.ms/terminal-keybindings
  "actions": [
    // Copy and paste are bound to Ctrl+Shift+C and Ctrl+Shift+V in your defaults.json.
    // These two lines additionally bind them to Ctrl+C and Ctrl+V.
    // To learn more about selection, visit https://aka.ms/terminal-selection
    { "command": { "action": "copy", "singleLine": false }, "keys": "ctrl+c" },
    { "command": "paste", "keys": "ctrl+v" },

    // Press Ctrl+Shift+F to open the search box
    { "command": "find", "keys": "ctrl+shift+f" },

    // Press Alt+Shift+D to open a new pane.
    // - "split": "auto" makes this pane open in the direction that provides the most surface area.
    // - "splitMode": "duplicate" makes the new pane use the focused pane's profile.
    // To learn more about panes, visit https://aka.ms/terminal-panes
    {
      "command": {
        "action": "splitPane",
        "split": "auto",
        "splitMode": "duplicate"
      },
      "keys": "alt+shift+d"
    }
  ]
}

配置完成后默认第二项“Windows PowerShell Elevated”即为管理员权限的PowerShell终端不需要右键再选择windows terminal图标手工执行了。

美化windows terminal/powershell

参考:https://github.com/JanDeDobbeleer/oh-my-posh#installation

参考:https://hcg.today/2019/08/02/windows-terminal/

参考:https://sspai.com/post/52868

参考:https://www.cnblogs.com/kasnti/p/12547985.html

参考:https://coolcode.org/2018/03/16/how-to-make-your-powershell-beautiful/

安装字体

参考:https://github.com/microsoft/cascadia-code/releases

参考:https://github.com/be5invis/Sarasa-Gothic

国内镜像:https://mirrors.tuna.tsinghua.edu.cn/github-release/be5invis/Sarasa-Gothic/

下载解压安装更纱黑体之后,我们重新启动一个 PowerShell 终端,就可以在菜单栏右键,选择「属性-字体」,并在字体中选择更纱黑体。适合终端使用的等宽字体是「等距更纱黑体 T SC」或「Sarasa Mono T SC」。

安装colortool

1
2
3
scoop install colortool
#colortool -s
#colortool -d OneHalfDark

安装:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
mkdir ~\dir_colors
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
Set-ExecutionPolicy -Scope CurrentUser Bypass
Install-Module windows-screenfetch -Scope CurrentUser -AllowClobber
Install-Module PSColor -Scope CurrentUser
Install-Module DirColors -Scope CurrentUser
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
Set-Prompt
Set-Theme Agnoster
Install-Module -Name PSReadLine -AllowPrerelease -Scope CurrentUser -Force -SkipPublisherCheck

编辑当前用户的powershell默认启动配置:

1
2
if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }
notepad $PROFILE

在弹出的notepad记事本中粘贴内容:

1
2
3
4
5
6
7
8
9
#Import-Module DirColors
#Update-DirColors ~/dircolors
Set-Alias edit notepad
Import-Module posh-git
#if (!(Get-SshAgent)) {
#    Start-SshAgent
#}
Import-Module oh-my-posh
Set-Theme Paradox

配置powershell支持命令行代理

参考: https://zcdll.github.io/2018/01/27/proxy-on-windows-terminal/

编辑当前用户的powershell默认启动配置:

1
2
if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }
notepad $PROFILE

在弹出的notepad记事本中追加粘贴内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# NOTE: registry keys for IE 8, may vary for other versions
$regPath = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'

function Clear-Proxy
{
    Set-ItemProperty -Path $regPath -Name ProxyEnable -Value 0
    Set-ItemProperty -Path $regPath -Name ProxyServer -Value ''
    Set-ItemProperty -Path $regPath -Name ProxyOverride -Value ''

    [Environment]::SetEnvironmentVariable('http_proxy', $null, 'User')
    [Environment]::SetEnvironmentVariable('https_proxy', $null, 'User')
}

function Set-Proxy
{
    $proxy = 'http://example.com'

    Set-ItemProperty -Path $regPath -Name ProxyEnable -Value 1
    Set-ItemProperty -Path $regPath -Name ProxyServer -Value $proxy
    Set-ItemProperty -Path $regPath -Name ProxyOverride -Value '<local>'

    [Environment]::SetEnvironmentVariable('http_proxy', $proxy, 'User')
    [Environment]::SetEnvironmentVariable('https_proxy', $proxy, 'User')
}

其中http://example.com替换为你本地http代理的地址比如:http://127.0.0.1:1080

验证:

1
Invoke-WebRequest -URI https://httpbin.org/ip

配置WSL磁盘挂载问题

参考:https://p3terx.com/archives/problems-and-solutions-encountered-in-wsl-use-2.html

windows terminal打开Ubuntu-18.04标签页

1
sudo nano /etc/wsl.conf

粘贴内容:

1
2
3
4
5
6
enabled = true
root = /mnt/
options = "metadata,umask=22,fmask=111"
mountFsTab = true
C:\ /mnt/c drvfs rw,noatime,uid=1000,gid=1000,metadata,umask=22,fmask=11 0 0

windows本地环境与wsl环境问题

参考: https://zhuanlan.zhihu.com/p/237941890

WSL访问windows环境: 通过上面的drvfs的方式,挂载win下的磁盘分区到/mnt路径下,不过wsl2的访问win的性能比较差

windows环境访问WSL:

整体磁盘分区挂载方式: 目前而言需要Windows 10 Insider Preview Build 20211版本才能通过wsl –mount 挂载物理磁盘 而且还有概率会碰到ubuntu系统下的rpc服务的问题 https://github.com/microsoft/WSL/issues/5915

走网络磁盘映射方式: 系统默认会提供\wsl$的入口,比如我们上面安装的Ubuntu 18.04 那么整个发行版的访问路径就是

1
\\wsl$\Ubuntu-18.04

然后用资源管理器打开\\wsl$后可以右键Ubuntu-18.04文件夹将其映射为网络驱动器,比如U:盘。

普通的映射有个问题是并非Administrator权限 参考:https://cnzhx.net/blog/install-app-into-mapped-network-drive-in-windows-10/

新建这个wsl_startup.bat批处理文件:

1
2
3
@echo off
rem net use u: /delete
net use u: \\wsl$\Ubuntu-18.04 /persistent:yes

将上面的批处理添加到“任务计划程序” win开始,输入“任务计划程序”打开 任务计划程序(本地)>任务计划程序库>右键“创建基本任务”: 名称:wsl_startup 触发器:计算机启动时 操作:启动程序 程序或脚本,选择上面创建的wsl_startup.bat文件 完成 在右侧的列表中找到wsl_startup项,右键>属性 安全选项中选中:不管用户是否登录都要运行 勾选中使用最高权限运行 确定设置完成

打开注册表编辑器找到路径:

1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

新建修改DWORD类型键值:

1
EnableLinkedConnections

值为1

如果win10是家庭版非专业版,默认是没有组策略编辑器的,需要通过手工打开

编辑一个批处理比如enable_gpedit.bat:

1
2
3
4
5
6
@echo off
pushd "%~dp0"
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt
for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i"
pause

然后在资源管理器中右键以管理员身份运行 完成后就可以使用组策略编辑器了 接着我们需要允许当前用户使用mklink创建软链接 参考:https://blog.csdn.net/SharkMarine/article/details/88538995

win+r运行

1
secpol.msc

本地策略>用户权限分配>右侧列表中找到“创建符号链接”打开后点击“添加用户或组”,输入当前用户比如user,然后点右侧的检查名称,成功后点确定

然后重启电脑

重启后系统会自动挂载wsl的ubuntu18.04发行版实例的磁盘到U:盘分区 同时当前用户也可以通过mklink创建软链接了。

需要注意的地方:windows的软链接和linux系统的软链接是互相不认识的,所以win下创建的软链接只能windows系统自己用,linux下的亦然。

代码开发与运行环境

基于目前drvfs访问性能的问题以及在可见的未来ms应该大概率会支持直接访问ext4的磁盘分区,所以目前来说个人觉得更好的方案就是在win10下默认自动挂载wsl的分区到盘符后创建目录软链接,本地IDE直接读取U:盘符或者软链后的目录中的各个项目,运行环境可以在win下安装或者直接使用wsl中的环境运行代码项目。