从零开始的WSL2使用教程

9,557 阅读12分钟

原文发布于语雀,但是没人看😭.目前文章基本成型,更新会很少,就搬到掘金了,作为我在掘金的第一篇博客.教程翔实,所有知识来源均给出(但也可能存在漏了的😂,尽力了),请放心食用

本文不介绍wsl的优缺点,仅作为如何使用wsl入门linux的教程📃

允许转载, 但请不要断章取义且不贴出原文链接. 不仅无法解决读者问题,还影响检索到原文的可能. 曾深受其害😡

打算学一学Linux, 以前没接触过 发现可以在windows上直接装Linux子系统,评价貌似不错,就选择了用WSL2来入门Linux 一路上坑很多,来捋一捋


12.2.2021
自认为目前已经很熟悉Linux的各种操作了,开发环境已基本迁移至WSL2,非常舒适 比一般的虚拟机强太多了 ​

流程

Step1 下载安装WSL2

官方教程是最清楚的,没有遇到任何坑,可能的坑官方在教程底部列出来了 微软官方教程 教程下方有个安装 Windows 终端(可选),建议直接安装,会极大程度的提升你的使用体验

之后所有的操作都在Window终端(Windows Terminal)上进行,选择的发行版是Ubuntu

附:快速打开终端方法 win+s || win+q || 触摸板三指点击 || win+r后,输入wt然后回车

打开wt后记得设置Default profile为Linux,我的设置为Ubuntu image.png

Step2 了解下Linux的相关知识,试试基础的Linux命令

参考教程 www.linuxprobe.com/basic-learn… 了解下Linux的相关知识,试试基础的Linux命令 但是,不要把教程中所有命令都试一遍,玩玩基础的就行 每个命令一定要看清楚再做

Step3 换源

目前使用阿里源,因为之前清华源出现了奇怪的问题。但换源方法是一样的

步骤如下:

ubuntu查看当前版本

 $ cat /etc/issue image.png 我的是Ubuntu 20.04.2 LTS

其他相关命令 cat /proc/version uname -a lsb_release -a

进入/etc/apt目录

cd /etc/apt

其中sources.list文件指定了软件源。为了保险起见,先将当前的软件源进行备份

$ sudo cp sources.list sources.list.bak

管理员模式用vim打开 sources.list进行编辑

$ sudo vim sources.list

关于vim,一定要学一学vim的使用方法

删除所有内容

输入gg dG

其中,gg为跳转到文件首行; dG为删除光标所在行以及其下所有行的内容; d为删除,G为跳转到文件末尾行;

如果输入错了,输入u会撤回上一步操作

打开 ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror,找到自己ubuntu对应版本的镜像

复制内容后在wt中右键(粘贴) 然后 保存退出文件 :wq image.png

其他源

更新

sudo apt-get update sudo apt-get upgrade

此时可能遇到问题,出现一堆报错Err,W之类的 image.png 报错原因:解析域名不对 解决方案:参考 $ sudo vim /etc/resolv.conf 在其中添加: nameserver 127.0.1.1 #这里用的是阿里云的DNS服务器 nameserver 223.5.5.5   nameserver 223.6.6.6 image.png 保存退出 这个时候就可以正常更新了!!!

Step4 换源完成后,试试下载个东西

tree命令的全称即是“tree”,该命令作用是用于以树状图形式列出目录的内容。 执行tree命令,它会以树状图的方式列出指定目录下的所有文件,包括目录里的文件,显示出指定目录的文件目录结构 比如: image.png 但是,你直接输入tree会发现没有用,需要下载软件 输入 $ sudo apt install tree tree会自动下载,现在你可以使用tree了 可以用$man tree 或者Linux命令查询网站查看使用方法

注意:不要在文件很多的地方用,否则显示不完 如果已经开始了,可以使用ctrl+c强行中断当前程序的执行

相关知识: Debian、Ubuntu、Mint 和其它基于 Debian 的发行版都使用 .deb 文件和 dpkg 包管理系统。有两种方法可以通过此系统安装应用。你可以使用 apt 程序从仓库进行安装,也可以使用 dpkg 程序从 .deb 文件安装应用。我们来看看如何做到这两点。 使用 apt 安装应用非常简单: $ sudo apt install app_name 通过 apt 卸载应用也非常简单: $ sudo apt remove app_name 要升级已安装的应用,首先需要更新应用仓库: $ sudo apt update 完成后,你可以使用以下命令更新任何程序: $ sudo apt upgrade 如果你只想更新一个应用,该怎么办?没问题。 $ sudo apt update app_name 最后,假设你要安装的应用不存在于 Debian 仓库中,但有 .deb 下载。 $ sudo dpkg -i app_name.deb

有关apt命令(彩蛋🥚)

新版本的apt命令做了些简化

apt 命令取代的命令命令的功能
apt installapt-get install安装软件包
apt removeapt-get remove移除软件包
apt purgeapt-get purge移除软件包及配置文件
apt updateapt-get update刷新存储库索引
apt upgradeapt-get upgrade升级所有可升级的软件包
apt autoremoveapt-get autoremove自动删除不需要的包
apt full-upgradeapt-get dist-upgrade在升级软件包时自动处理依赖关系
apt searchapt-cache search搜索应用程序
apt showapt-cache show显示安装细节

🥚在终端输入 apt-get -h 会在末尾出现 “本 APT 具有超级牛力(This APT has super cow power)。 🥚在终端输入 apt-get moo 会在屏幕上显示一头牛

                 (__)
                 (oo)
           /------\/
          / |    ||
         *  /\---/\
            ~~   ~~
..."Have you mooed today?"...

继续

docs.microsoft.com/zh-cn/windo…

wsl最佳实践

  • 将开发环境完全控制在 WSL 里,坚持不在 Windows 下安装任何开发软件,这样其实就不太会踩到诸如路径格式不一致导致的问题。
  • 如果你用IDE,那么IDE也要想尽办法用 WSL 上的那套编译环境,有 remote 模式可以考虑用 remote 模式,remote 模式不给力的,像 idea 这种的,可以选择直接装 Linux 的版本,GUI 可以用 vcxsrv 之类的搞。
  • 所有项目文件都放在 WSL 里,这样其实就不会太依赖跨系统IO的速度。
  • 所有需要用Git之类的工具管理的配置文件,全都放在 WSL 里,如果某些配置文件 Windows 软件需要复用,那么就软链接过去,这种配置文件级别的小文件其实不关心IO的速度,能直接软链接就已经很完美了。
  • 只把现有的互调支持当作一个兜底方案,确实需要的时候,偶尔用一下,平时高频使用的工作流中尽量不依赖这种互调。

各种问题

官方:疑难解答

git报错:The TLS connection was non-properly terminated.

fatal: unable to access 'github.com/mattwojo/he…': GnuTLS recv error (-110): The TLS connection was non-properly terminated.

解决方案:sudo

sudo git clone github.com/mattwojo/he…

意外导致WSL关闭,如何重启WSL?

#⭐⭐目前最佳方案⭐⭐
#poweshell输入
wsl --shutdown

端口占用问题

问题描述:开发时 localhost:部分端口号 访问失效,疑似微软的锅造成的BUG

12.7.2021

在vscode中编程时有时候localhost的某个端口失效,自行排查的结果应该是该端口被占用。于是使用任务管理器把该进程关掉,但仍然不可用。 猜测:占用端口的进程实际上没有被关掉 解决方案:重启wsl wsl --shutdown

12.22.2021

再次出现端口失效,且重启wsl无效 猜测:占用端口的进程实际上没有被关掉, 且此次的进程不属于wsl 解决方案:重启计算机

装几个小玩意 todo

10.19.2021 可以直接装linux的gui程序了 微软nb🥳🥳🥳 docs.microsoft.com/en-us/windo…

目前很多GUI的会有不可预知的bug,不建议安装,除非你像我一样只是用来玩玩

System Monitor(GUI) 👈目前对位而言没啥用,用来玩玩

类似windows上的任务管理器,用于查看系统资源使用情况 windows本身的任务管理器无法看到wsl里面的进程, 只会显示一个image.png 所以需要System Monitor查看wsl里面进程的运行情况

#安装(如果不存在):
sudo apt-get install gnome-system-monitor

下载好后固定在开始菜单方便使用 image.png 我刚刚打开了vscode, 通过wsl插件开发,我把鼠标放在System Monitor上面之后, 会悬浮详细信息 比如👇这个就是告诉我这个进程是跟vscode-server有关的 图像 0.png 参考

ImageMagick(GUI)

一个处理图片的工具, 一般直接使用命令行

man imagemagick 查看它可以干嘛

convert icon.png icon.ico 这样会生成一个ico文件,且不会删除原文件

其他各种各样的命令👇可以通过man查看详细用法

convert
identify
mogrify
composite
montage
compare
stream
display
animate
import
conjure

miniconda和pytorch

请参考官方教程:Enable PyTorch with DirectML on WSL 2 | Microsoft Docs 注意:

  • wget的时候如果选择换源在后续创建环境的时候可能会报错, 尽量按照官方教程的做
  • 运行conda create --name pydml python=3.8 -y的时候会提示conda: command not found,此时需要修改.bashrc文件,具体操作流程如下👇
    • vim ./.bashrc 打开文件
    • 在文件的最后添加export PATH=$PATH:/home/mirrorgo/miniconda3
      • 注意:这里的路径应该是你自己的miniconda3的安装位置
    • 保存之后运行source ~/.bashrc重启环境变量
  • import torch记得在interactive Python session中使用,否则无效
  • 后续如果想尝试安装anaconda-navigator却失败了,那么不要着急,因为我也一样😭😭😭目前找不到原因
    • 先不用GUI了,纯命令行操作吧

在vscode中使用

报错: import 'package' cannot be resolved 解决方案:

ctrl+shift+P, 输入select Interpreter 选定解释器 image.png 选择安装了该package的环境👉比如我用的pytorch在pydml中 解决

更多关于conda的知识

卸载 Anaconda_Anaconda

jupyter notebook (in vscode)

miniconda创建的虚拟环境中使用vscode的jupyter notebook ​

  • 安装vscode的jupyter相关扩展
  • 切换到要使用jupyter的环境
  • 创建一个空的notebook
  • 编辑系统镜像配置文件,添加镜像
    • vim ~/.condarc
    • 换上交大的镜像
conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge/

∵之前用其他的镜像会出问题 👈参考博客

  • 运行,提示要安装对应的kernel
    • 需要安装或更新ipykernel
  • 安装

image.png

www.jianshu.com/p/653c66f0d… blog.csdn.net/qq_44721831…

linux体验优化

快捷键

ctrl+c强制终止当前命令
ctrl+I清屏
ctrl+a光标移动到命令行首
ctrl+e光标移动到命令行尾
ctrl+u从光标所在位置删除到行首
ctrl+z把命令放入后台
ctrl+r在历史命令中搜索

回收站

Trash-Cli:Linux 上的命令行回收站工具 trash-put           把文件或目录移动到回收站 trash-empty         清空回收站 trash-list          列出回收站文件 trash-restore       恢复回收站文件 trash-rm            删除回收站文件

搜索回收站文件: $ trash-list | grep foo 2007-08-30 12:36:00 /home/andrea/foo 2007-08-30 12:39:41 /home/andrea/foo

$ trash-empty

只删除符合某种模式的文件: $ trash-rm *.o 注意:要用双引号圈住模式来避免 shell 拓展。

我能把 rm 的别名设置为 trash-put 吗?

可以,但不应该这样做。以前我觉得这是个好主意,但现在我不觉得。 虽然 trash-put 的界面看起来与 rm 兼容,但它们有不同的语法,这些差异会导致一些问题。比如,用 rm 删除目录时需要 -R,trash-put 则不需要。

但有时候我忘记用 trash-put 了,真的不能给 rm 设置别名吗?

你可以给 rm 设置一个别名来提醒你不要使用它: alias rm='echo "This is not the command you are looking for."; false'

如果你真的要用 rm,那就在 rm 前加上斜杠来取消别名: \rm file-without-hope

注意,Bash 别名是有在交互式界面才有效,所以使用这个别名不会影响使用 rm 的脚本。

被移动到回收站的文件在哪?

从 home 分区移动到回收站的文件在这: ~/.local/share/Trash/

alias

要想设置的别名和删除的别名永久生效则要写入环境变量配置文件里 即:  vi ~/.bashrc    ---------->>这样才能永久生效

我使用vscode来编辑 code ~/.bashrc

alias -p 查看all别名 永久生效的别名有时候需要重启terminal才能生效

image.png /etc/bashrc 和 ~/.bashrc 的区别: 前者是针对全局用户,后者是针对当前用户

#all alias alias alert='notify-send --urgency=low -i "([([ ? = 0 ] && echo terminal || echo error)" "(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert//''')"' alias c='clear' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l='ls -CF' alias la='ls -A' alias ll='ls -alF' alias ls='ls --color=auto' alias ping='ping -c 5' alias rm='echo "This is not the command you are looking for."; false' alias tl='trash-list'

todo:理想中的rm rm的时候,会提示

9files will be delete 50.3M in total rm -i 的提示内容

输入y后 trash-put 将文件或目录移入回收站

别名

10 handy Bash aliases for Linux A normal ping will go on forever. We don't want that. Instead, let's limit that to just five pings. alias ping='ping -c 5'

alias c='clear'

备份

wsl -t Ubuntu
wsl -l -v
wsl --export Ubuntu F:\_wsl_backup\Ubuntu.tar

huyangjia.com/computer-te…

Unable to correct problems, you have held broken packages.

下载nvm时请使用github.com/nvm-sh/nvm的命令

nvm

若要更改要用于项目的 Node.js 版本,请创建新的项目目录 mkdir NodeTest,输入目录 cd NodeTest,然后输入 nvm use node 切换到当前版本,或输入 nvm use --lts 切换到 LTS 版本。 你还可以使用已安装的任何其他版本的特定数量,如 nvm use v8.2.1。 (若要列出 Node.js 的所有可用版本,请使用以下命令:nvm ls-remote)。

npm WARN deprecated node-uuid@1.4.7: use uuid module instead 需要更习npm的版本

nvm install-latest-npm

但是依然npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.???

www.runoob.com/nodejs/node…

cnpm下载出来的express貌似不太对 别用cnpm 而且下载的世界还比npm久,这是为什么

问题:curl: (7) failed to connect to raw.githubusercontent.com port 443: connection refused 解决方案:挂梯子

问题:nvm sudo: npm: command not found 情况与这个很类似 我的解决方案:参考 直接npm,不用sudo

问题:有时候碰到apt-get下载不了的情况 解决方案:来源

suggest you install aptitude which can help you resolve conflicts then install your package with aptitude

sudo apt install aptitude

用aptitude替代apt-get ∵aptitude可以帮忙找到些依赖的包

关于aptitude vs apt-get aptitude 与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具。与 apt-get 不同的是,aptitude 在处理依赖问题上更佳一些。举例来说,aptitude 在删除一个包时,会同时删除本身所依赖的包。这样,系统中不会残留无用的包,整个系统更为干净。

有的问题 apt-get 解决不了,必须使用 aptitude 解决,有的问题,用 aptitude 解决不了,必须使用apt-get.

aptitude 解决得更好的地方: install, remove, reinstall(apt-get无此功能), show(apt-get无此功能), search(apt-get无此功能), hold(apt-get无此功能), unhold(apt-get无此功能), apt-get 解决得更好的地方: source(aptitude无此功能), build-dep (低版本的aptitude没有build-dep功能) apt-get 跟 aptitude 没什么区别的地方:update, upgrade (apt-get upgrade=aptitude safe-upgrade, apt-get dist-upgrade=aptitude full-upgrgade)

下载npm后出现了个package-lock.json是什么 (官方解答)

sudo: npm:command not found 解决方案:添加软链接 blog.csdn.net/m0_46267097… qastack.cn/programming…

Linux命令进阶

零零散散

cd -返回上一层所在目录

快速创建文件和文件夹

#创建dir1,dir2,dir3,dir4,dir5
mkdir dir{1,2,3,4,5}
#创建file1.txt,file2.txt,file3.txt,file4.txt
touch file{0..4}.txt
#创建嵌套的文件夹(不加-p会无法创建)|| 用-pv替代-p会显示每次创建的操作
mkdir -p dir1/dir2/dir3/dir4/dir5

其他

ls -l www.cnblogs.com/EasonJim/p/… linuxize.com/post/how-to…

硬链接,软链接 blog.csdn.net/youcai35/ar… 这个 bbs.huaweicloud.com/blogs/20701… metmoon.com/2019/05/29/… blog.csdn.net/hpuxiaofang… www.cnblogs.com/xiexj/p/721…

blog.csdn.net/xiaofei0859…

这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接“。

上面的理解貌似有问题:硬链接的总数计算是不是: 上级输入文件名+本级 . +子目录的 ..

软链接的缺点: 因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径