WSL 安装/配置指北
其中最让包括我在内的众多开发者感到兴奋的特性之一,就是 WSL(Windows Subsystem for Linux.
好消息是,在之后的更新中,这些 BUG 都已被逐一消灭。
经过了两年的发展,WSL 已经足够成熟.
1. 我理想中的命令行界面
既然取了这么个标题,那我自然得先描述一下我的目标,也就是我理想中的命令行界面应该是什么样子的:
- 好看(配色、字体可以自由设定);
- 支持 UTF-8 字符的输入与显示;
- 支持常见的 *NIX 命令行工具(cat、grep、awk 等);
- 自动补全、语法高亮、历史记录;
- 完善的复制粘贴支持;
- 互操作性(共享文件系统、网络栈,可调用 Win32 程序);
- 支持常用的脚本语言(PHP、Python、Node.js 等);
- 包管理器,以及其他各种常用软件的支持;
- 快速呼出(快捷键、右键菜单入口)。
然而遗憾的是,Windows 上的命令行一直以来都很微妙。
- 好看(配色、字体可以自由设定);
- 支持 UTF-8 字符的输入与显示;
- 支持常见的 *NIX 命令行工具(cat、grep、awk 等);
- 自动补全、语法高亮、历史记录;
- 完善的复制粘贴支持;
- 互操作性(共享文件系统、网络栈,可调用 Win32 程序);
- 支持常用的脚本语言(PHP、Python、Node.js 等);
- 包管理器,以及其他各种常用软件的支持;
- 快速呼出(快捷键、右键菜单入口)。
2. 难用的 Windows 命令行
停停停,那边的 PowerShell 爱好者 ,咱别动粗成吗?
首先我要对标题做出一些订正,Windows 原生命令行其实也可以不那么难用。虽然 cmd.exe 是公认的难用到反人类(毕竟是用来兼容 DOS 的老古董),但后来推出的 PowerShell 已经足够强大且现代化,能够称得上是一个成熟的命令行 Shell 了。如果你愿意学习的话,PowerShell 几乎可以满足你对命令行的所有期待。这一点可以参见:Is PowerShell ready to replace my Cygwin shell on Windows?
但是,PowerShell 与 Bash 等类 Unix 系统上的 Shell 程序几乎是两个完全不同的世界。不仅语法不同,其平台上各类常用的命令行工具也基本不一致(比如类 Unix 系统中的 grep
对应 PowerShell 中的 Select-String
,uniq
对应 Select-Object -Unique
等)。往深了说,他们的系统设计理念都是不一样的,比如很多人推崇的 Unix 哲学,在 Windows 上就基本不见踪影;而 COM 等概念也是 Windows 独一份。
对于包括我在内的很多用户都认为 Windows 命令行不怎么好用,仅此而已。
回到正题。
虽然 Windows 的命令行一直遭人诟病,但是人家的图形界面牛逼啊。于是无数工程师前赴后继,试图在 Windows 上创造出不输给类 Unix 系统的命令行体验 —— 却绝大多数以失败告终。曾经努力过的人,或者回到可爱的 Linux 上,或者进入高贵冷艳的 macOS 的世界。其中有先辈留下了 Cygwin、GnuWin32 等工具集,让我们可以在 Windows 下使用类 Unix 系统中常见的命令行工具,成为了不少 Windows 用户的救赎。
然而,就当大家都觉得「也就这样了」的时候,Microsoft 出人意料地站了出来。
带着他新鲜出炉的 WSL。
grep
对应 PowerShell 中的 Select-String
,uniq
对应 Select-Object -Unique
等)。往深了说,他们的系统设计理念都是不一样的,比如很多人推崇的 Unix 哲学,在 Windows 上就基本不见踪影;而 COM 等概念也是 Windows 独一份。3. Windows Subsystem for Linux,参上!
大家都把 WSL 吹得这么牛逼,那 WSL 究竟是个什么玩意儿呢?
简单来说,WSL 是一个 兼容层,有点像反过来的 Wine。
首先,我问个问题,为什么 Linux 上的程序无法在 Windows 上运行呢?
了解过一点操作系统原理的同学应该都知道,这是 Windows 与 Linux 的内核提供的接口不同(系统调用、API 等)导致的。举个栗子,我们想知道某目录下的内容,在 Linux 下我们会使用 ls
命令,而在 Windows 下我们会使用 dir
命令。
当我们在 Linux 上执行 ls
命令,ls
会调用 getdents
这个系统调用,Linux 内核收到请求,将目录的内容返回给应用程序;当我们在 Windows 上执行 dir
命令,dir
会调用 NtQueryDirectoryFile
这个 API,NT 内核收到请求,将目录的内容返回给应用程序。虽然系统不同,但基本上都是一个道理。
然而,当我们把 Linux 上的应用程序拿到 Windows 上运行时,应用程序和内核就双双懵逼了。比如 ls
会尝试调用 getdents
系统调用(理想化的情况下,暂不考虑可执行文件格式等问题),Windows 的 NT 内核一看,心说:「这他娘的什么东西,老子不认识啊,啥情况啊」,ls
也想:「尼玛,内核怎么不回话啊,咋回事儿啊」……两边语言不通,应用程序自然无法正确执行。
但是有了 WSL,情况就不一样了。
依然拿 ls
举例,当我们在 WSL 中运行 ls
命令时,ls
会调用 getdents
系统调用(这个系统调用接口是 WSL 提供的,Windows 本身并没有这个接口),WSL 收到这个请求,明白了应用程序是想要知道目录的内容,于是把 Linux 的系统调用转换为 NT API NtQueryDirectoryFile
。NT 内核收到 WSL 的请求,将目录的内容返回给 WSL,WSL 再把返回的内容包装好后返回给 ls
。
也就是说,WSL 在 Linux 应用程序与 Windows NT 内核之间起到了翻译者的作用。很简单的道理,既然 NT 内核无法理解 Linux 应用程序的 POSIX 系统调用,那就弄个翻译来将 POSIX 系统调用实时转换为 NT 内核能理解的 API 调用,突出一个见人说人话、见鬼说鬼话。
只要实现了足够多的系统调用翻译,那么理论上 WSL 可以完全模拟成一个 Linux 内核。
相信各位都听说过鼎鼎大名的 Cygwin。同样是能让 Linux 应用程序运行在 Windows 上,WSL 和 Cygwin 有什么不同呢?其实差别还是挺大的。
虽然 Cygwin 提供了完整的 POSIX 系统调用 API(以运行库 Cygwin*.dll
的形式提供),但其依然工作在 User Mode;而 WSL 中的 Linux 应用程序进程会被包裹在一个叫做 Pico Process 的东西里,这个东西里发出的所有系统调用请求都会被直接送往 Kernel Mode 中的 lxcore.sys
与 lxss.sys
处理。
同样是将 POSIX 系统调用转换为 Windows 中的 API,Cygwin 是转换成 Win32 API 的调用(因为它架设在 Win32 子系统上,很多内核操作受限于 Win32 的实现,比如 fork
),而 WSL 则是转换为更底层的 NT API 调用(WSL 是与 Win32 平行的子系统,直接架设在 NT 内核上,可以通过 NT API 原生实现 fork
等系统调用)。
WSL 架构示意图。图片来源:Windows for Linux Nerds
最重要的一点:如果使用 Cygwin,Linux 应用程序的源码必须 link 至 Cygwin 运行库(Cygwin*.dll
),修改源码重新编译后才能在 Windows 下运行。这些重新编译后的 Linux 应用程序在调用 POSIX API 时不会直接去请求内核,而是会去调用 Cygwin 运行库,由运行库翻译成 Win32 API、执行调用后返回结果。这也就意味着,重新编译后的应用程序需要依赖 Cygwin 运行库才能正常运行(有时候你会碰到的「缺少 Cygwin1.dll
」报错就是这个原因),而且这样编译出来的可执行程序是纯正的 Win32 PE 格式封装,只能在 Windows 上运行。
而在 WSL 下,我们可以直接运行未经任何修改的 ELF 格式 Linux 可执行程序。
最后总结一波:
WSL 就像是一个翻译官,就算那些未经修改的 Linux 应用程序们操着一口纯正的 POSIX 系统调用语法,WSL 也能快速准确地将其翻译为 NT 内核能听懂的 API 调用;
而那些使用了 Cygwin 重新编译后的 Linux 应用程序,就像是改造人一样变成了 Win32 应用程序的形状,还被套了个翻译机。程序自己(源码中)说的是 POSIX,经过翻译机(Cygwin 运行库)之后就变成 Win32 API 调用了,这样 NT 内核也能听得懂。
但是每次添加新程序都要改造,多麻烦啊,还是 WSL 原生态更健康(笑)。
以上只是我对 WSL 的粗浅解释,其具体实现原理可以参考官方博客上的 这一系列文章。
ls
命令,而在 Windows 下我们会使用 dir
命令。ls
命令,ls
会调用 getdents
这个系统调用,Linux 内核收到请求,将目录的内容返回给应用程序;当我们在 Windows 上执行 dir
命令,dir
会调用 NtQueryDirectoryFile
这个 API,NT 内核收到请求,将目录的内容返回给应用程序。虽然系统不同,但基本上都是一个道理。ls
会尝试调用 getdents
系统调用(理想化的情况下,暂不考虑可执行文件格式等问题),Windows 的 NT 内核一看,心说:「这他娘的什么东西,老子不认识啊,啥情况啊」,ls
也想:「尼玛,内核怎么不回话啊,咋回事儿啊」……两边语言不通,应用程序自然无法正确执行。ls
举例,当我们在 WSL 中运行 ls
命令时,ls
会调用 getdents
系统调用(这个系统调用接口是 WSL 提供的,Windows 本身并没有这个接口),WSL 收到这个请求,明白了应用程序是想要知道目录的内容,于是把 Linux 的系统调用转换为 NT API NtQueryDirectoryFile
。NT 内核收到 WSL 的请求,将目录的内容返回给 WSL,WSL 再把返回的内容包装好后返回给 ls
。Cygwin*.dll
的形式提供),但其依然工作在 User Mode;而 WSL 中的 Linux 应用程序进程会被包裹在一个叫做 Pico Process 的东西里,这个东西里发出的所有系统调用请求都会被直接送往 Kernel Mode 中的 lxcore.sys
与 lxss.sys
处理。fork
),而 WSL 则是转换为更底层的 NT API 调用(WSL 是与 Win32 平行的子系统,直接架设在 NT 内核上,可以通过 NT API 原生实现 fork
等系统调用)。Cygwin*.dll
),修改源码重新编译后才能在 Windows 下运行。这些重新编译后的 Linux 应用程序在调用 POSIX API 时不会直接去请求内核,而是会去调用 Cygwin 运行库,由运行库翻译成 Win32 API、执行调用后返回结果。这也就意味着,重新编译后的应用程序需要依赖 Cygwin 运行库才能正常运行(有时候你会碰到的「缺少 Cygwin1.dll
」报错就是这个原因),而且这样编译出来的可执行程序是纯正的 Win32 PE 格式封装,只能在 Windows 上运行。4. 安装 WSL,拥抱可爱的 Linux
好了不说废话,让我们开始安装 WSL。注意,WSL 仅支持 64 位系统,且本文中所描述的安装方法仅适用于 Windows 10 Fall Creators Update(秋季创意者更新,RS3,Version 1709,Build 16299)及以上版本。
第一步,打开「控制面板」中的「程序与功能」,点击左侧边栏的「启用或关闭 Windows 功能」选项,在弹出的窗口中勾选「适用于 Linux 的 Windows 子系统」,然后点击确定(可能需要重启)。
如果你懒得用 GUI,也可以直接在 PowerShell 中以管理员权限执行命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
第二步,打开 Microsoft Store,搜索「WSL」。挑选一个你喜欢的 Linux 发行版,然后点击安装。(截至目前,商店中可用的发行版有 Ubuntu、openSUSE、SUSE Linux Enterprise Server、Debian 以及 Kali Linux。)
第三步,在开始菜单中找到你刚刚安装的发行版,打开它。等待几分钟的初始化过程,设定好用户名与密码后(不需要与 Windows 的相同,用过 Linux 的选手应该都懂的)就会自动进入 Linux 环境。
至此,你已经完成了 WSL 的安装。
你也可以同时安装多个发行版,它们的数据都是独立的,互不影响。
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
5. 使用更专业的终端模拟器
我猜你现在正在对上面那个窗口发呆。
—— 这个新宋体他娘的是个什么情况?
如果你正在使用中文 Windows 系统,而且之前并没有修改过 Win32 Console 的默认配置,那么你的 WSL 终端默认就会是这样的。新宋体,就是这么 Hardcore。惊不惊喜,意不意外?
好吧不开玩笑,Windows 这个控制台窗口就是很多人讨厌它的原因之一,难用又难看。丑这一点倒还有解决方法.
难用却是实打实的。尽管 Win10 上的控制台已经改进了不少(可以看看 Microsoft 的官方博客:Windows Command Line Tools For Developers),但其依然是最难用的终端模拟器之一,或许没有之一。
因此,为了实现我们的目标,一个更强大的终端模拟器是必须的。
我个人比较推荐的终端模拟器有:
-
专门为 WSL 开发的终端模拟器,基于 mintty 与 wslbridge,稳定易用。
-
Windows 上的老牌终端模拟器,功能极为强大,要啥有啥。
-
基于 Electron 的跨平台终端模拟器,好看和可扩展性是卖点,BUG 不少。
还有其他各种各样的终端模拟器,选个自己喜欢的就好。反正不管选哪个,都比默认的那玩意儿要好用。
另外,设定终端模拟器的 Shell 入口时有个坑,需要注意一下(参见下文 6.4)。
6. 让我们更深入一些
以下是 WSL 的一些优化技巧。
6.1 使用软件源镜像
由于众所周知的原因,各大发行版默认的软件源在中国大陆的访问速度都很屎。
我目前使用的是 清华大学的 Ubuntu 镜像源。
6.2 安装 zsh 与 oh-my-zsh
想要快乐地使用命令行,一个趁手的 Shell 是必不可少的。
我个人习惯使用 zsh,安装步骤不再赘述。
6.3 安装多个发行版
Windows 10 Fall Creators Update 之后,WSL 支持同时安装多个 Linux 发行版,直接在 Microsoft Store 中搜索想要的发行版并点击安装即可。这些发行版可以同时运行,并且数据互相独立。你可以使用 wslconfig.exe
来查询已安装的发行版,或者更改默认的发行版。
删除发行版也很简单,直接卸载对应的商店应用即可(记得备份哦)。
wslconfig.exe
来查询已安装的发行版,或者更改默认的发行版。6.4 多种进入 WSL 的方式比较
新版支持同时安装多个发行版,那自然不能像以前那样只提供一个 bash.exe
入口了。
秋季创意者更新之后的 Windows 提供了 多种进入 WSL 环境的方式:
-
wsl.exe
打开默认发行版中的默认 Shell。
-
.exe
打开指定发行版中的默认 Shell。
-
bash.exe
(DEPRECATED)
打开默认发行版中的 bash Shell。
如果你更改了默认 Shell 却总是打开 bash,就说明你使用了这个入口。
你也可以通过这些入口直接在 WSL 中执行命令并返回结果:
-c [command]
bash -c [command]
wsl [command]
(不再需要指定 -c
)
bash.exe
入口了。wsl.exe
.exe
bash.exe
(DEPRECATED)-c [command]
bash -c [command]
wsl [command]
(不再需要指定 -c
)6.5 与 Windows 的互操作性
WSL 与 Windows 之间的互操作性 (Interoperability) 很牛逼。怎么个牛逼法呢?
Windows 下的所有盘符都挂载在 WSL 中的 /mnt
目录下,可以直接操作。WSL 中的所有数据则存放于 C:\Users\{你的用户名}\AppData\Local\Packages\{Linux发行版包名}\LocalState\rootfs
目录中(不要在 Windows 中修改这些文件,这会造成文件权限错误):
$ ls /mnt
c d e
$ mount -l
rootfs on / type lxfs (rw,noatime)
C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000)
D: on /mnt/d type drvfs (rw,noatime,uid=1000,gid=1000)
E: on /mnt/e type drvfs (rw,noatime,uid=1000,gid=1000)
你可以在 Windows 命令行环境中直接调用 WSL 中的命令:
PS C:\temp> wsl ls -al
total 0
drwxrwxrwx 1 printempw printempw 4096 Sep 7 19:04 .
drwxrwxrwx 1 printempw printempw 4096 Sep 7 18:38 ..
-rwxrwxrwx 1 printempw printempw 4 Sep 7 19:04 foo.txt
你也可以在 WSL 中调用 Windows 中的命令行程序:
$ which ipconfig.exe
/mnt/c/Windows/System32/ipconfig.exe
$ ipconfig.exe
Windows IP Configuration
...
你可以在 WSL 中直接启动 Windows 应用:
$ notepad.exe "C:\temp\foo.txt"
你还可以通过 pipes 与 Windows 程序通信:
# 复制内容至 Windows 剪贴板
$ cat foo.txt | clip.exe
你甚至可以把 Windows 命令和 WSL 命令混着用:
PS> ipconfig | wsl grep IPv4
IPv4 Address. . . . . . . . . . . : 192.168.1.114
$ ipconfig.exe | grep IPv4 | cut -d: -f2
192.168.1.114
$ ls -al | findstr.exe foo.txt
-rwxrwxrwx 1 printempw printempw 4 Sep 7 19:04 foo.txt
$ cmd.exe /c dir
Volume in drive C is Windows
Volume Serial Number is B263-****
Directory of C:\temp
2018/09/07 19:04 .
2018/09/07 19:04 ..
2018/09/07 19:04 4 foo.txt
1 File(s) 4 bytes
2 Dir(s) 194,422,341,632 bytes free
同时,WSL 与 Windows 共享网络栈,也就是说你可以:
- 在 WSL 中启动 web server,在 Windows 上使用浏览器访问;
- 在 Windows 下启动 MySQL/Redis 服务器,在 WSL 中连接;
- 诸如此类。
如果你对 WSL 与 Windows 之间互操作的原理有兴趣,可以参考一下这些文章:
/mnt
目录下,可以直接操作。WSL 中的所有数据则存放于 C:\Users\{你的用户名}\AppData\Local\Packages\{Linux发行版包名}\LocalState\rootfs
目录中(不要在 Windows 中修改这些文件,这会造成文件权限错误):$ ls /mnt
c d e
$ mount -l
rootfs on / type lxfs (rw,noatime)
C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000)
D: on /mnt/d type drvfs (rw,noatime,uid=1000,gid=1000)
E: on /mnt/e type drvfs (rw,noatime,uid=1000,gid=1000)
PS C:\temp> wsl ls -al
total 0
drwxrwxrwx 1 printempw printempw 4096 Sep 7 19:04 .
drwxrwxrwx 1 printempw printempw 4096 Sep 7 18:38 ..
-rwxrwxrwx 1 printempw printempw 4 Sep 7 19:04 foo.txt
$ which ipconfig.exe
/mnt/c/Windows/System32/ipconfig.exe
$ ipconfig.exe
Windows IP Configuration
...
$ notepad.exe "C:\temp\foo.txt"
# 复制内容至 Windows 剪贴板
$ cat foo.txt | clip.exe
PS> ipconfig | wsl grep IPv4
IPv4 Address. . . . . . . . . . . : 192.168.1.114
$ ipconfig.exe | grep IPv4 | cut -d: -f2
192.168.1.114
$ ls -al | findstr.exe foo.txt
-rwxrwxrwx 1 printempw printempw 4 Sep 7 19:04 foo.txt
$ cmd.exe /c dir
Volume in drive C is Windows
Volume Serial Number is B263-****
Directory of C:\temp
2018/09/07 19:04 .
2018/09/07 19:04 ..
2018/09/07 19:04 4 foo.txt
1 File(s) 4 bytes
2 Dir(s) 194,422,341,632 bytes free
- 在 WSL 中启动 web server,在 Windows 上使用浏览器访问;
- 在 Windows 下启动 MySQL/Redis 服务器,在 WSL 中连接;
- 诸如此类。
6.6 DrvFs 文件权限问题
虽然 WSL 中可以直接访问 Windows 磁盘的内容,但如果你曾经这么做过,你应该对这样绿油油一片的 ls
不会感到陌生。为什么 NTFS 文件系统中的文件到 WSL 下权限就全部成 0777
了呢?
这主要是 DrvFs 中 Linux 文件权限的实现导致的。
在 WSL 中,Microsoft 实现了两种文件系统,用于支持不同的使用场景:
-
VolFs
着力于在 Windows 文件系统上提供完整的 Linux 文件系统特性,通过各种手段实现了对 Inodes、Directory entries、File objects、File descriptors、Special file types 的支持。比如为了支持 Windows 上没有的 Inodes,VolFs 会把文件权限等信息保存在文件的 NTFS Extended Attributes 中。记得我上面警告过你不要在 Windows 中修改 WSL 里的文件吗?就是因为 Windows 中新建的文件缺少这个扩展参数,VolFs 无法正确获取该文件的 metadata,而且有些 Windows 上的编辑器会在保存时抹掉这些附加参数。
WSL 中的
/
使用的就是 VolFs 文件系统。
-
DrvFs
着力于提供与 Windows 文件系统的互操作性。与 VolFs 不同,为了提供最大的互操作性,DrvFs 不会在文件的 NTFS Extended Attributes 中储存附加信息,而是从 Windows 的文件权限(Access Control Lists,就是你右键文件 > 属性 > 安全选项卡中的那些权限配置)推断出该文件对应的的 Linux 文件权限。
所有 Windows 盘符挂载至 WSL 下的
/mnt
时都是使用的 DrvFs 文件系统。
由于 DrvFs 的文件权限继承机制很微妙,最后导致的结果就是所有文件的权限都变成了 0777
。而且由于早期的 DrvFs 不支持 metadata,所以你无法给这些文件 chown/chmod,只能对着绿油油的 ls
干瞪眼。不过好消息是,Windows Insider Build 17063 之后,DrvFs 也像 VolFs 一样支持给文件写入 metadata 了。
要启用 DrvFs 的 metadata 支持,你需要添加参数重新挂载磁盘:
# 修改成你自己的盘符
$ sudo umount /mnt/e
$ sudo mount -t drvfs E: /mnt/e -o metadata
不过如果仅仅是执行了这个,虽然支持了文件权限的修改,但磁盘下的文件权限默认依然还是 0777
,除非你给它们整个 chmod
一遍。如果你不想这么做,也可以指定其他的 mount 参数:
$ sudo mount -t drvfs E: /mnt/e -o metadata,uid=1000,gid=1000,umask=22,fmask=111
这样磁盘下的文件的默认权限就是 0644
,ls
也不会再是绿油油一片啦。
不过每次使用时都要重新挂载未免也太烦,我们可以通过另一个新特性 Automatically Configuring WSL 实现自动挂载。在 WSL 中创建 /etc/wsl.conf
,在其中填写如下内容:
[automount]
enabled = true
root = /mnt/
options = "metadata,umask=22,fmask=111"
mountFsTab = true
# 这个文件里还可以添加其他配置项,有兴趣的可以看看上面的链接
重启终端,所有的盘符就会使用上面的配置自动挂载啦(可以使用 mount -l
查看)。
另外,如果你想要给不同的盘符设定不同的挂载参数(上面的方法对所有盘符都有效,如果你想在 WSL 中运行 Windows 下的应用程序,就得每次都 chmod +x
一下,所以我一般都会把 C:
排除掉),就需要手动修改 /etc/fstab
。首先确保 wsl.conf
中的 mountFsTab
为 true
,然后编辑 /etc/fstab
,添加如下内容:
# 不在此列表中的盘符会使用 wsl.conf 中的参数挂载
# 格式可以自己去查 fstab 的帮助文档
E: /mnt/e drvfs rw,relatime,uid=1000,gid=1000,metadata,umask=22,fmask=111 0 0
ls
不会感到陌生。为什么 NTFS 文件系统中的文件到 WSL 下权限就全部成 0777
了呢?- VolFs着力于在 Windows 文件系统上提供完整的 Linux 文件系统特性,通过各种手段实现了对 Inodes、Directory entries、File objects、File descriptors、Special file types 的支持。比如为了支持 Windows 上没有的 Inodes,VolFs 会把文件权限等信息保存在文件的 NTFS Extended Attributes 中。记得我上面警告过你不要在 Windows 中修改 WSL 里的文件吗?就是因为 Windows 中新建的文件缺少这个扩展参数,VolFs 无法正确获取该文件的 metadata,而且有些 Windows 上的编辑器会在保存时抹掉这些附加参数。WSL 中的
/
使用的就是 VolFs 文件系统。 - DrvFs着力于提供与 Windows 文件系统的互操作性。与 VolFs 不同,为了提供最大的互操作性,DrvFs 不会在文件的 NTFS Extended Attributes 中储存附加信息,而是从 Windows 的文件权限(Access Control Lists,就是你右键文件 > 属性 > 安全选项卡中的那些权限配置)推断出该文件对应的的 Linux 文件权限。所有 Windows 盘符挂载至 WSL 下的
/mnt
时都是使用的 DrvFs 文件系统。
0777
。而且由于早期的 DrvFs 不支持 metadata,所以你无法给这些文件 chown/chmod,只能对着绿油油的 ls
干瞪眼。不过好消息是,Windows Insider Build 17063 之后,DrvFs 也像 VolFs 一样支持给文件写入 metadata 了。# 修改成你自己的盘符
$ sudo umount /mnt/e
$ sudo mount -t drvfs E: /mnt/e -o metadata
0777
,除非你给它们整个 chmod
一遍。如果你不想这么做,也可以指定其他的 mount 参数:$ sudo mount -t drvfs E: /mnt/e -o metadata,uid=1000,gid=1000,umask=22,fmask=111
0644
,ls
也不会再是绿油油一片啦。/etc/wsl.conf
,在其中填写如下内容:[automount]
enabled = true
root = /mnt/
options = "metadata,umask=22,fmask=111"
mountFsTab = true
# 这个文件里还可以添加其他配置项,有兴趣的可以看看上面的链接
mount -l
查看)。chmod +x
一下,所以我一般都会把 C:
排除掉),就需要手动修改 /etc/fstab
。首先确保 wsl.conf
中的 mountFsTab
为 true
,然后编辑 /etc/fstab
,添加如下内容:# 不在此列表中的盘符会使用 wsl.conf 中的参数挂载
# 格式可以自己去查 fstab 的帮助文档
E: /mnt/e drvfs rw,relatime,uid=1000,gid=1000,metadata,umask=22,fmask=111 0 0
6.7 其他关于 WSL 的折腾
虽然 Microsoft 开发 WSL 出来主要是着重于命令行环境的使用,但经过测试,WSL 是可以通过 X Server 执行 GUI 应用程序的,甚至还可以在 WSL 里面用 Wine 执行 Windows 程序.
也有人试过在 WSL 中运行完整的 DE,体验似乎还不错,有兴趣的同学可以去试试。
另外,你也可以通过某些神秘的方法用上 Microsoft Store 未提供的 Linux 发行版,比如 Arch Linux。
如果你对 WSL 的底层实现有兴趣,也可以去围观一下 WSL 的官方博客:
7. 总结
虽然 WSL 很不错,但是其比起真正的 Linux 系统还是有很多不足(Docker 等涉及未实现的内核特性的软件无法使用,Raw socket 相关的操作依然容易出错,I/O 性能相比之下较为孱弱等)。如果你日常开发中需要使用到那些 WSL 未提供的 Linux 特性,那么还是乖乖跑 VM 或者装 Linux 吧。
对我来说,WSL 最大的意义就是,让我能够用我熟悉的 Linux 那一套去操作 Windows。
如果你和我的需求一样,那么比起 Cygwin、VM 等解决方案,WSL 有着完整的 Linux 环境、强大的互操作性、更低的资源占用。离不开 Windows,却又羡慕 Linux 下强大命令行工具的各位,相信你们会喜欢 WSL 的。
而且最近几年 Microsoft 在笼络开发者方面的努力大家有目共睹,这里就容我夸上一句:
Microsoft,干得漂亮!
Win10系统初探
Win10是针对触屏进行改进的系统, 和Win7还是有很大区别的(Win8就忽略了吧), 感觉上Win10 2 in 1 本有以下区别:- App应用: 和一般exe装程序不同, app应用通过微软Store来安装.例如qq或者网易云音乐就是更贴切平板控制模式, 更适合触屏. 另外, 空间也省点. 换句话, 就是Win10既可以像以往操作系统那样安装程序, 也可以像手机平板那样从商店安装APP.
- 操作中心: 类似于安卓那种顶部提示中心和一些功能的快捷控制(例如wifi,定位,飞行模式等). 这种设计就是为了Win10用于手机和平板吧. 我电脑可以右划调出操作中心, 也可以按个右下角一个信息提示一样的图标调出.
- 虚拟桌面和任务视图: 就是Win键+Tab的功能, 不过现在还可以设置多个桌面, 有点像Mac里面的任务-桌面控制视图.
- 平板模式: 在操作中心里面就有, 选了以后键盘禁用, 开始菜单变得更像手机里面一个一个大图标(Win8那种全屏列表). 另外, 旋转控制的键这时就可以用了, 电脑就像平板一样.
- Cortana, 类似于Siri吧, 我就用来搜索..
- 开始菜单: 变得更复杂, 可以定制菜单位置啊, 内容了, 还有平板模式. Win8是横向列出程序, Win10是纵向的, 怪怪的…
- EDGE浏览器: 感觉还可以, 速度也OK.
- 新的设置菜单: 也是为了平板设计的吧, 图标大大的, 功能和控制面板类似, 摆放得不习惯, 需要学习周期.
- 高分屏设计: 分辨率, 自定义DPI, 字体等都有所改进, 为了4K屏吧.
Win10 安装子系统 WSL
Win10可以安装自身内嵌的Ubuntu了(WSL
, Windows Subsystem for Linux)! 搞法如下:- 更新Win10系统到最新(右下角 全部设置, 更新和安全 -> 系统)
- 设置 -> 更新和安全 -> 针对开发人员 -> 开发人员模式. 然后会下载开发人员模式包 (Developer Mode Package). 下载失败也没关系.
- 控制面板 -> 程序和功能 -> 启用或关闭Window功能 -> 选上 适用于Linux的Window子系统 , 然后确认就好了
- 重启, 然后进去后
win+R
来运行cmd, 输入bash
来运行. 或者直接在搜索里找ubuntu或者bash (可以创建一个快捷方式) lsb_release -a
可以知道ubuntu的版本- 更新完系统发现C盘被占了很多空间, 在C盘发现有
Windows.old
文件夹占了很大空间, 这个是为了让你可以恢复之前系统留下的. 解决办法: C盘右键后, 在常规或者工具里找到磁盘清理, 然后点左下角 清理系统文件, 可以找到旧系统的垃圾. 不想要就都清了吧 (传递优化文件删不掉..不知道为啥). - 内嵌ubuntu和win的文件系统怎么分呢? window的文件在ubuntu里是在
/mnt/c/
来表达NTFS里的C盘, 而 ubuntu系统文件则是在C:\Users\Yourname\AppData\Local\lxss\rootfs
里面(lxss文件夹系统文件式隐藏), 我这里的ubuntu的home, root, mnt, temp
不是放在rootfs 而是同等级的, rootfs里的相应文件夹为空(即这些文件夹为单独分区处理). 注意在ubuntu里并不能通过上述路径(rootfs)来访问自身文件系统的. 可以创建相应的C:\Users\Yourname\AppData\Local\lxss
文件夹到桌面快捷方式. - ubuntu和win里的执行文件并不互通!!切记! 不能像mingw那样直接在命令行里执行exe文件.
- 如果要移除WSL, 可以在cmd命令行使用
lxrun /uninstall
, 这样不会移除root和home文件夹,lxrun /uninstall /full
, 再安装可以lxrun /install
. 上述卸载方式并不会卸载bash, 只是卸载ubuntu系统. 要卸载bash, 请参看第三条, 取消 适用于Linux的Window子系统
Win 10 WSL 的X server问题
WSL 是不支持 X server的. 但是呢, 可以在win10里面安装另外的Xserver来接上WSL的x需求. 推荐使用vcXsrv或者Xming, 也可以使用cygwin-x. 安装完毕, 打开X server相关的就好了.安装好后, 尝试安装几个东东: gedit(文本编辑器), nautilus (文件管理器), unity (就是打开程序那个面板罗), ubuntu-desktop (就是桌面咯). 后面三个就不太建议安装了, 比较大, 而且要桌面干嘛?! 而且不稳定 会有些问题, 等以后更好的版本发布了再折腾吧
sudo apt-get install gedit
gedit myfile
###### Maybe some errors, record as follow
## error: XDG_RUNTIME_DIR not set in the environment.
export DISPLAY=localhost:0
echo "export DISPLAY=locahost:0" >> ~/.bashrc
## failed to commit changes to dconf: Failed to execute child process "dbus-launch" (No such file or directory)
sudo apt-get install --reinstall dbus dbus-x11
## dconf-WARNING **: failed to commit changes to dconf: Error sending credentials: Error sending message: Invalid argument
## dbus uses unix sockets to communication, which windows bash at the moment doesn't support. So we just need to tell it to use tcp. In /etc/dbus-1/session.conf, you need to replace <listen>unix:tmpdir=/tmp</listen> with <listen>tcp:host=localhost,port=0</listen> and then you are done
sudo sed -i 's$<listen>.*</listen>$<listen>tcp:host=localhost,port=0</listen>$' /etc/dbus-1/session.conf
## If you want to install GUI
sudo apt-get install nautilus unity compizconfig-settings-manager
## Setup ccsm like: https://github.com/microsoft/bashonwindows/issues/637
compiz
附虚拟桌面快捷键:
- 贴靠窗口:Win +左/右> Win +上/下>窗口可以变为1/4大小放置在屏幕4个角落
- 切换窗口:Alt + Tab(不是新的,但任务切换界面改进)
- 任务视图:Win + Tab(松开键盘界面不会消失)
- 创建新的虚拟桌面:Win + Ctrl + D
- 关闭当前虚拟桌面:Win + Ctrl + F4
- 切换虚拟桌面:Win + Ctrl +左/右
- 最大化/恢复/最小化: ctrl + win + up / ctrl + win + down / ctrl + win + down down
Win10安装双系统
- 去Ubuntu官网下载系统, 这里下载的是个人桌面版. 下载文件是iso文件, 可以写到光盘或者U盘.
- 找个U盘4G左右大小, 备份好数据后, 格式化掉.
- 下载UltraISO,试用版即可, 使用不介绍了(打开iso,写入硬盘映像,选择U盘写入即可)
- 然后准备好一个分区空间用来安置Ubuntu, 打开 磁盘管理, 我从C盘里选择压缩磁盘, 压缩出48G出来. (记住盘符哦!)
- 准备好后,重启, 使用自己电脑设置boot顺序的方法选择U盘启动(例如Yoga 900是完全关机后捅侧面的小键). 然后进去就可以开始安装Ubuntu了.
- 安装一些常规就不说了, 有两步很重要: 第一是安装类型选择其他选项(Other option), 来自定义分区(比较稳妥), 第二是设置分区表.
- 分区表, 选择刚才释放空间出来的分区(空闲空间), 点击下面的
+
号用来添加分区, 主要是三个:- 系统文件,
/
, 分区类型主分区, 分区位置空间起始位置, Ext4 日志文件系统, 挂载点:/
- 虚拟内存交换分区,
swap
, 内存较小(<2G)时建议是物理内存2倍大小,较大的话一倍内存也就够了,再大也是8G据说就够了(例如我8G内存就是8192 MB). 逻辑分区, 空间起始位置, 用于Swap (没有挂载点) - 启动分区,
/boot
, 设置200MB就够了, 逻辑分区, 空间起始位置, Ext4 日志文件系统, 挂载点:/boot
- 理论上还需要挂载一个
/home
分区来放用户文件(例如我就是16G给/
,16G给/home
), 但其实不挂也可以.
- 系统文件,
- 分区表弄好后, 选中
/boot
分区, 看清楚是/dev/sda?
,下面安装启动引导器的设备选择相应的/boot分区的/dev/sda?
( 很重要). - 然后其余就随意设置, 安装完后重启, 然后就会出现系统选择的界面(默认第一个是ubuntu, 不按键就会进入, 第三个是Win10). 如果没有系统选择界面而是进入了Win10, 可能需要更改BIOS里面EFI boot顺序(将Ubuntu的提前到第一)
如能开机有Ubuntu的选择登入界面, 能就成功了, 如果没有, 直接进入ubuntu, 或者想修改ubuntu的开机Grub2. 可以参考:
- Ubuntu内编辑
sudo gedit /etc/default/grub
,GRUB_HIDDEN_TIMEOUT=0
和GRUB_HIDDEN_TIMEOUT_QUIET=true
两行注释掉(前面加#
) sudo update-grub
, 更新grub信息. 实际上,grub的信息在/boot/grub/grub.cfg
文件内, 不太建议直接修改. 然后重启试试- 如果想登入时默认win10而不是ubuntu, 可以修改
/etc/default/grub
的GRUB_DEFAULT=0
为GRUB_DEFAULT=2
(第三项就是2),再sudo update-grub
- 我是高分辨屏,选择时很不清, 可以更改上述文件的
#GRUB_GFXMODE=640x480
一行去掉注释. 再sudo update-grub
- 如果只是想偶尔进去看看这个选择界面(包括什么安全模式),旧版ubuntu按着
shift
重启, 新版用按着Esc
- 在上面的安装教程里有些东东是不需要的了, 例如EasyBCD. 新电脑的话都有UEFI 统一可扩展固件接口, 这玩意限制了对自由系统Linux的安装和双启动. 即使安装了EasyBCD也不能搞掂双系统选择, 有个帖子说要禁用UEFI后还要再重装Win10才可以(至少我根据帖子里的方法, 不用UEFI, 设置了Legacy的, 首选Legacy不是UEFI, 禁用Secure Boot, 停用了快速启动, 但都不能正常使用EasyBCD设置多启动选择, 所以可以不用白费力气安装EasyBCD和进行一大堆的BIOS设置了. 现在的Ubuntu兼容Win10的启动,将首boot设为Ubuntu就可以了, 就是没有这篇博文那样启动时那么fancy)
- 这篇如何在 Win8 上禁用 UEFI 安全引导以安装Linux讲解禁用UEFI, 但我测试无效. 其实用 高级重启->疑难解答->UEFI设置重启电脑进入BIOS界面和直接进入BIOS界面是一样的. 另外, 高级重启在帖子里是用更新恢复->高级启动->立即重启实现, 更简单方法是, 开始菜单->电源->按着Shift键点重启就可以了.
- 帮朋友在Win7上面安装, 发现Ubuntu识别不了刚才压缩的空闲卷, 经研究, 因为刚硬盘分区是动态磁盘, 而不是基础磁盘. 解决方法是使用分区助手将其从动态分区转为基础分区. 很奇怪, 还需要把有个盘删掉才可以.因为基础磁盘MBR分区最多四个分区(包含隐藏的一个),所以最多CDE三个盘. 当我转换为基础分区后, 新添加F盘就又变回去动态磁盘…然后空间太多, 想帮中间一个D盘扩展..一扩展就坏了, 尼玛将一大块又叫D盘,实际D盘变成了两块…然后删掉吧..然后D盘就挂了消失了… 大家小心…另外主分区只能有1-4号,逻辑分区从5-16号. 最后尝试使用DiskGenius, 4.8破解修复丢失的分区,修复能找到, 设置为GPT的分区格式就分区表损坏了..慎用..
- 旧版BIOS没有Boot顺序(也没有UEFI),这时可以用EasyBCD来设置开机引导.具体可以参加上面提到的帖子. 据说UEFI可以用EasyUEFI,但设置看起来比较怪, 我直接改Ubuntu的Grub更容易.
体验 Windows 10 内置的Linux 子系统
WSL 简介
安装步骤
开启开发人员模式
启用 WSL 功能
在应用商店进行搜索
安装 Ubuntu
内核版本和发行版本号
后话
---------
Windows10上,免虚拟机使用Linux
虽然Windows图形化的操作系统十分易用,但不可否认的是————Linux中环境下,很多软件具有轻快迅速的特点。平常我们使用Linux一般是
借助于虚拟机或者双系统,随着Windows10的数次更新,微软显然也意识到了部分开发者的需求。
这次说的就是开启微软自带的Linux功能,目前微软提供的系统覆盖了主流的Linux系统。
##开启Linux子系统
在应用商店内安装之前,首先我们需要更新到最新的Windows10系统。
然后打开控制面板——程序——启用和关闭Windows功能——勾选上“适用于Linux的Windows子系统”
重启电脑以后即可访问应用商店,搜索Linux来安装Linux系统。
子系统中完全与Windows共享系统资源,运行速度相较于VM虚拟机稍快。
由于国内访问自带Linux源访问速度并不快,推荐大家使用中科大的开放Linux源: https://mirrors.ustc.edu.cn/repogen/
Windows10 内置 Linux 子系统初体验
文章大部分内容转载 anyesu – 简书,区别是此文为当时的测试版,目前为正式版。
简介
- Win10 在最近的更新版本内正式增加了子系统的功能,于是就去更新体验了下。
实际上此功能早在 2016 年已经存在,只不过当时是测试版,且支持系统有限。 - Windows 10 的 Linux Bash 支持「并不是使用虚拟机 / 模拟器」实现的,而是嵌入一个完整的 Ubuntu Linux 环境。
技术上是实时将 Linux 的系统调用转换为 Windows 的系统调用,你可以把它看做是 Wine 是一种反向技术。
微软将其称为「Windows 下的 Linux 子系统」 (Windows Subsystem for Linux)。 - 它可以让 Windows 10 系统完美兼容 Linux 应用程序,支持直接原生运行 Linux Bash 命令行以及数万个 Linux 应用程序!
- 目前支持的系统有:Ubuntu、Debian、OpenSUSE、SUSE Linux、Kali Linux 等
- 关于原理
开启方式
- 开启开发人员模式
- 开启此功能
- 在 Windows Store 下载你想用的系统
使用方式
- 点击启动即可,和正常使用虚拟机没什么大差异。仅仅适合作为一个 bash 玩玩。
注意
- 似乎不适合做网络服务器
- 对 Docker 支持不理想
- ifconfig 默认没有,自行安装吧
apt-get isntall net-tools
将其移出 C 盘
- 原意自然是占用硬盘的问题啦。
参考文章:将 Win10 子系统 (Ubuntu) 从 C 盘迁移走
LxRunOffline
Donation
Features
- Install any Linux distro to any directory on your computer.
- Move an existing installation to another directory.
- Duplicate(copy) an existing installation.
- Register an existing installation directory. This enables you to install to a USB stick and use it on different computers.
- Run arbitrary Linux commands in a specified installation.
- Configure default user, environment variables and various flags.
- Export configuration to an XML file and import from the file.
- Export an installation to a tar file.
Install
choco install lxrunoffline
, Scoop scoop bucket add extras
, scoop install lxrunoffline
, or download the binaries directly:- Latest releases: https://github.com/DDoSolitary/LxRunOffline/releases
- Development builds: https://ci.appveyor.com/project/DDoSolitary/lxrunoffline > choose the first job > ARTIFACTS
Usage
LxRunOffline install
command.LxRunOffline
for available actions and run LxRunOffline
for available arguments/flags.Build
Visual Studio
vcpkg install --triplet x64-windows libarchive boost-program-options boost-format tinyxml2
MSYS2
pacman -Sy --needed --noconfirm base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-libarchive mingw-w64-x86_64-boost mingw-w64-x86_64-tinyxml2
make
.Compatibility
- v1.x: Only Windows 10 Fall Creators Update (v1709) or earlier.
- v2.x: Only Windows 10 Fall Creators Update (v1709) or later.
- v3.x: Only Windows 10 April 2018 Update (v1803) or later.
WLinux 是专门为Windows 10 Linux® 子系统调整的 Linux® 发行版,基于 Debian® 构建。
啥?售价 144 RMB???买了!
开玩笑的啦其实苏卡卡当初入手的时候在做活动只卖 35 RMB 的。。。
wlinux-setup
开始进行环境设置。暂时先不了,先 cat 一下 sources.list
:deb.debian.org
,立刻换成中科大源。sudo apt update
更新包列表,然后就可以开始使用 WLinux 最大的卖点 wlinux-setup
了。立刻执行:$ wlinux-setup
|
WLinux Setup
wlinux-setup
,在这里选择 Yes。thefuck
的,所以把 PyPi 也选中了。如果想把语言修改成中文的可以把 Language 也选上。exit
回到 wlinux-setup
。wlinux-setup
会再询问你一次你想使用什么 shell:n
而不是 nvm
???立刻选择 No,然后回车。NodeJS 完了以后是安装 Go,回车确认安装。
wlinux-setup
中安利付费的 X410:fctix
作为非拉丁语系语言的输入法,当然是安装了。fctix
自动启动和是否现在就执行 fctix-autostarts
:其它配置
.zshrc
里头,这样每次安装完系统就可以快速完成配置。比如设置 Git 全局邮箱和用户名:
试用
wlinux-setup
直接搞定;对于 WSL 里安装 Docker 的各种坑,WLinux 在 wlinux-setup
里用 Secure Bridge 把 WSL 和 Docker for Windows 绑定起来的方法的确是个 workaround;WLinux 还内置了像 wslu 这样的对于 WSL 的实用的工具.-------------------------
Windows Subsystem for Linux (WSL) 安裝教學 & 初體驗
A team of sharp developers at Microsoft has been hard at work adapting some Microsoft research technology to basically perform real time translation of Linux syscalls into Windows OS syscalls.
Requirements[3]
- 電腦執行 Windows 10 Build 14316 以上版本
在這裡升級:http://go.microsoft.com/fwlink/p/?LinkId=821403 - x64 的處理器以及 Windows
- 必須使用 AMD 或 Intel 的 x64 相容 CPU
- 已加入 Windows 測試人員計劃
Prepare
啓用開發人員模式
啟用 Windows subsystem for Linux (Beta) 方法一
- 請按下 Win + X,然後選擇命令提示字元。接著鍵入
OptionalFeatures
並且按下 Enter。 - 將列表拉到最底部,將適用於 Linux 的 Windows 子系統 (搶先版 (Beta)) 的核取方塊打勾,並且點選確定。
3. 待其處理完畢後,請儲存你的資料以及此網頁連結,然後重新開機。
啟用 Windows subsystem for Linux (Beta) 方法二
powershell
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
安裝 Windows subsystem for Linux (Beta)
- Windows 要求重新開機時,請重新開機,因為 Windows subsystem for Linux 的某些底層需求只有在 Windows 啟動時才能載入。[5]
- 重新開機完成之後,請按下 Win + X,然後打開命令提示字元。
- 如果你要使用預設的設定,請執行
lxrun /install /y
,這會同意使用者條款、安裝子系統並且設定使用者名稱為root
,密碼為空。然後請跳到下一個部分繼續閱讀**(推薦)**
如果你要手動設定,請執行bash
,閱讀條款之後輸入y
以繼續。 - 資料處理完成之後,請設定 UNIX 使用者名稱及密碼,要注意這裡的使用者名稱及密碼跟 Windows 的那對完全沒有關係。[6]如果你選擇使用者名稱為 root,密碼就不需要設定。
技巧、注意事項
- 如果以後要打開 Ubuntu on Windows,執行
bash
。 - 可以我看到一開始進去的 path 是
/mnt/c/Users/Birkhoff Lee
,也就是說 Windows 有把你的使用者目錄(C:/Users/使用者名稱
)掛載進去。
往上層目錄看,原來它是把所有硬碟的檔案系統直接以可讀可寫的權限掛載進去,所以請不要在裡面執行rm -rf /mnt/C/*
之類的東西,不然會爆炸,以下誠招勇者嘗試 - root 使用者的檔案目錄可以在 Windows Explorer 下面找到,path:
C:\Users\使用者名稱\AppData\Local\lxss\rootfs
- Docker 目前在上面跑不了,該 issue 討論串連結:https://github.com/Microsoft/BashOnWindows/issues/85
- 本篇教學安裝到的 Ubuntu 版本是 14.04.4 LTS。
- 這目前只是測試版,不是所有東西都能 work。
- 解除安裝:執行
lxrun /uninstall /full /y
- 請在 https://github.com/Microsoft/BashOnWindows/issues 回報問題
- 每個使用者的 Ubuntu on Windows 都是獨一的
- 在 Windows 下跑
bash -c "指令"
可以直接執行 bash 指令 - FAQ 連結:https://msdn.microsoft.com/zh-tw/commandline/wsl/faq
References
- https://msdn.microsoft.com/commandline/wsl/install_guide: It is important that you DO reboot when prompted as some of the infrastructure which Bash on Windows requires can only be loaded during Windows' boot-up sequence. ↩︎
-------------------------------------------------------------------------
Windows Subsystem for Linux Installation Guide for Windows 10)
wsl-issue-and-reference
- https://sspai.com/post/43813
- https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04
- https://stackoverflow.com/questions/46286420/php7-0-fpm-extremly-slow-on-ubuntu-windows-subsystem-linux
- https://github.com/Microsoft/WSL/issues/2100
- https://serversforhackers.com/c/php-fpm-configuration-the-listen-directive
- https://www.linode.com/docs/web-servers/nginx/serve-php-php-fpm-and-nginx/
------------------------------------------
WSL 使用指南
04 安装桌面环境
安装桌面
嗯,使用WSL后你一定开始怀念Linux双系统的桌面环境了……
WSL的初衷是为了在Windows系统中运行Linux工具链,所以WSL没有“原生”搭载桌面环境,但这不影响我们自己安装一个Linux桌面环境。
以Ubuntu
为例,为WSL安装桌面环境需要两大项工作————在Win10中安装X Server
、在WSL中安装Ubuntu桌面
等组件。
安装X Server
下载并安装VcXsrv,安装之后桌面会出现两个快捷方式分别为VcXsrv
和XLaunch
。
安装Ubuntu桌面
在Windows系统中安装X Server
后,开始在WSL中通过命令行安装Ubuntu桌面组件,步骤如下:
-
更新系统
:
sudo apt-get update && sudo apt-get upgrade
-
安装桌面组件,该过程需要一些时间,请坐和放宽~~
echo "y"|sudo apt-get install ubuntu-desktop unity compizconfig-settings-manager
-
配置dbus以避免出现错误
dpkg-reconfigure dbus && service dbus restart
配置桌面
所需组件安装完成之后,接下来开始配置工作,步骤如下:
- 打开Windows主系统桌面的
XLaunch
图标,并按照图示操作。
- 点击下一步保持默认设置直到最后完成,此时我们会看到一个纯黑色的无标题栏窗口(黑色的原因是没有任何
X Client
连接)。
-
切换到
Ubuntu
的Bash
窗口,执行以下命令配置X Server
端口。export DISPLAY=localhost:0
-
执行以下命令,然后切换到VcXsrv窗口(即之前打开的纯黑色窗口)
sudo ccsm
-
按照下图设置桌面环境并退出,如果提示遇到冲突则选择忽略冲突即可。
-
切换到
Ubuntu``Bash
窗口,执行以下命令并切换回VcXsrv
窗口查看效果。sudo compiz
- Enjoy!
安装中文支持并配置profile文件
-
在桌面环境打开一个
终端
,执行以下命令安装中文支持(如果当前不是用户root
,命令前面要加上sudo
)apt-get -y install language-pack-zh-hans
-
将以下环境变量添加到
/etc/profile
文件export DISPLAY=localhost:0 export LANG=zh_CN.UTF-8 export LANGUAGE=zh_CN.UTF-8 export LC_ALL=zh_CN.UTF-8
-
重新加载
profile
source /etc/profile
-
重新生成
locale
locale-gen
-
注意!我们开启桌面后是root账户,有可能会影响WSL稳定性!
-
如果需要以其他用户启动桌面环境,必须重新配置
ccsm
及其他组件,当然我们也可以把已经配置好的配置文件复制到其他账户下,方法为——把将已配置桌面环境的用户目录(cd ~
)下.cache
文件夹复制到其他用户目录下。 -
Ubuntu桌面环境的安装方法参考了Run any Desktop Environment in WSL
下一步
-
美化桌面环境见自定义桌面环境
-
桌面环境的进一步探索见通过脚本提高效率
from https://github.com/iWangJiaxiang/WSL-Guideline/blob/master/WSL-Guideline/%E4%B8%AD%E6%96%87/04-%E5%AE%89%E8%A3%85%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83.md
(https://os.51cto.com/article/698844.html)