Win10 WSL使用记录
笔者最近添置了一台新设备,预装 win10 系统。在之前的设备上,笔者偶尔会使用 ubuntu 系统,故而使用的是 win 8 + ubuntu 的双系统模式。之前也对关于双系统相关的内容做过记录,关于 windows 双系统的空间划分和引导相关的内容可参见Windows环境下安装双系统总结,关于 win + ubuntu 的引导等大致内容可参考Windows下设置Ubuntu引导项。
面对 win10 的新环境时,笔者面对的选择在于是否也像之前的设备那样安装双系统。由于笔者是一名学生,所以安装的 Linux 系统主要用于学习 Linux 的使用( 学习命令行等 Linux 相关的内容 )以及进行简单的程序编写( 会用到 gcc/g++ 以及其他 Linux 程序 ),而其他相关工作如 word/ppt 之类的工作实际上还是需要 windows 平台上进行的,从而也就免不了在两个系统之间进行频繁的切换操作。而 win10 系统上提供了另一个选择,也就是 WSL( Windows subsystem for Linux ). WSL 实际可以为使用者提供一个 Linux bash on win10 的体验过程,可以理解为在 win10 上为用户打开了一个 Linux 中的终端窗口。而实际上,这一点可以满足很多对 Linux 系统的需求,包括但不限于学习 Linux 命令行的基本操作,学习 shell,使用 Linux 自带的一些软件,以及作为接触实际 Linux 系统的跳板等等。当然虚拟机也是一个可行的选项,不过 WSL 的优势在于更快的响应速度和更少的资源占用。
WSL 安装
WSL 的安装过程在微软官方的文档中有很清楚的描述,安装过程可以参考 Windows Subsystem for Linux Installation Guide for Windows 10。目前支持的版本为 WSL 和 WSL2,其中后者要求 win10 系统版本较高,目前笔者安装的是 WSL1. 关于 WSL 的介绍在官方文档中非常详细,有需要的推荐阅读 Windows Subsystem for Linux Documentation。目前 windows store 中支持的 Linux 系统包括 Ubuntu,Kali 和 Debian 等,用户可根据个人需求安装。
在完成 WSL 的安装后,可通过 win + s 打开 win10 的搜索界面,输入安装的 Linux 版本名字从而找到对应的程序,确定运行即可打开对应的 bash 窗口,其中第一次登陆时会花费一定的时间进行初始化并要求创立账号,而后续的使用过程中打开的过程都会很快。
WSL 与 win10 之间的文件访问
有基础的 Linux 背景可以知道,Linux 系统使用 EXT 文件系统,而 windows 使用的是 NTFS 文件系统,两者无法兼容。比如在之前笔者安装双系统的情况下,windows 系统由于不支持对 EXT 系统的读写故而是无法直接对磁盘上的 Linux 系统保存的文件进行修改的,而 Linux 由于支持 NTFS 的访问,故而笔者在 Linux 系统下可以直接对 windows 系统下的一些文件进行简单操作。在 WSL 中,同样存在两种不同文件系统的问题。这里分为 WSL 访问 win10 文件和 win10 访问 WSL 文件分别进行描述。
WSL --> win10
由于 Linux 是支持对 NTFS 格式文件系统的访问的,故而在 WSL 终端中可以对整个磁盘上的系统进行访问。其中,win10 系统对应位于 /mnt 目录下,如笔者 win10 存在 c 盘和 d 盘两个系统盘,故而在 /mnt 目录下存在 c 和 d 两个文件夹分别与 windows 系统上的分区对应,对于上述两个目录中文件的操作即直接对应于对 win10 中文件的操作。与双系统中 Linux 可以直接对所有文件修改不同,使用 WSL 提供的终端进行文件访问时需要遵循 win10 的权限管理,故而有些文件的访问和修改需要使用 root 权限。
win10 --> WSL
在较老的 WSL 版本中,是不推荐(或者说禁止)使用 windows 环境下的工具(包括文件资源管理器)对 WSL 系统中的文件进行直接的修改/创建等操作的( 老版本的 WSL 系统的文件位于某个不想让用户找到的目录中,虽然看起来与正常 windows 目录一致,但由于其对 Linux 的支持故而存在一定的不同)。推荐的方式是将 WSL 和 win10 需要共享编辑和使用的文件放在 win10 的文件系统中( 在 WSL 环境下就是位于 /mnt/c/ 和 /mnt/d/ 文件目录下),这样 WSL 和 Win10 系统均可以正确的对上述共享的文件进行处理,反之则不行。这是因为 Linux 本身支持对 NTFS 格式文件的访问能力,故而 WSL 对 windows 环境下文件能够正确的进行访问和修改。而绝大部分的 windows 应用是没有考虑对 WSL 中使用的 EXT 格式的支持的,从而直接使用 windows 系统的应用在 WSL 的目录中进行文件修改可能使得文件的相关属性被损坏。一个比较常见的现象就是使用 WSL 提供的终端查询文件时是无法显示直接通过 windows 应用在 WSL 目录下创建的文件的(属性不全或被损坏从而无法识别)。相关的内容在微软的博客中也有记录,可以参考Do not change Linux files using Windows apps and tools。
在新版本的 WSL 中,win10 系统可以直接通过文件资源管理器去访问 WSL 相关的文件目录,打开文件资源管理器,在路径栏输入路径 \\wsl$\ 即可看到安装好的 WSL 版本对应的目录。新版本的 WSL 会在启动时建立一个 9P protocol file server,使得所有基于 windows 系统应用的对 WSL 文件的访问均通过该 server 完成。对应的,该 server 保证对 WSL 中文件系统的支持,从而使得目前可以直接通过 windows 系统的应用对 WSL 系统中的文件进行访问和操作。(注意,用户应该基于 \\wsl$\ 路径访问对应的文件。同时,从原理上也可以看得到,直接使用 windows 系统应用修改 WSL 中文件时,需要保证对应的 WSL 终端正在运行,否则不存在 server 支持正确的访问操作。)
在 WSL 提供的终端中,也可以通过命令 explorer.exe . 命令在当前目录打开 win10 的文件资源管理器。
explorer.exe . //通过 win10 的文件资源管理器打开当前目录
上述内容也可以参考微软的文章What’s new for WSL in Windows 10 version 1903?。
WSL 命令执行
在新版本的 WSL 中,可支持在 windows PowerShell/CMD 环境下执行 WSL 中命令,也支持在 WSL 环境下运行 windows 命令。
在 CMD 或 PowerShell 环境下执行 WSL 中的命令只需通过 wsl + command 的形式,其中 command 为对应的在 WSL 中执行程序和任务的命令。
wsl ls -l //列举当前目录下的文件的详细信息 wsl sudo rm xxx //以 root 权限删除当前目录下的 xxx 文件
在 WSL 终端中,可通过 xxx.exe 的方式对 windows 环境中的相关应用程序进行调用,如在 WSL 终端中打开计算器程序,直接输入 calc.exe 即可。
calc.exe //在 WSL 终端中执行 windows 计算器程序
能够在 WSL 终端中找到对应的 windows 可执行程序的方式是在终端的 PATH 路径中加入了对应的 windows 可执行程序的目录(看起来好像是把 windows 环境变量 PATH 直接加入了进来)。
在实际使用中,也支持 windows 程序和 WSL 命令的混合使用,具体可以参考Windows interoperability with Linux。