环境配置

xmut-lby大约 13 分钟

环境配置

在本讲义中我们使用WSL作为基本环境,发行版上选择我们习惯、且对新手比较友好的Ubuntu作为发行版,版本选择20.04LTS,新的LTS版本22.04在我的WSL上偶发一些问题,不清楚是兼容性问题还是其他问题。为了兼容性选择了次新版本。

编辑器选择的是我顺手的VIM。工具链使用最基本的gcc+gdb+make的组合。

安装WSL

控制面板->程序->程序和功能->启用或关闭Windows功能

打开下面的适用于Linux的Windows子系统选项。

上方的Hyper-V如果你准备使用WSL2,那么需要打开找个选项(如果你是Windows Home版本,这个选项可能不存在)

点击之后Windows会开始安装WSL,之后会要求你重启。

安装发行版

重启后我们只是启动了WSL支持,你还需要安装发行版才能真正把linux系统跑起来。

不是Linux吗?发行版是什么?

什么是发行版?

你以为Linux是个完整的操作系统,安装后就可以开箱即用。实际上所谓的Linux只是一个内核(的源代码)。内核你可以理解成像引擎那样的东西。实际上甚至可以说只有图纸。Linux内核是开源的,任何人都可以获得他的源码。但你要用他,你只能自己编译,然后自己去找各种软件安装上去,才能用[1]

有些厂商,例如Redhat、Canonical、SUSE等以及一些非商业组织,例如Debian、Arch社区等会寻找合适的内核版本,加上各类软件(shell、图形界面、开发工具等等)形成一个可以开箱即用的Linux系统,这就是发行版。例如Redhat Linux,Debia,Ubuntu,OpenSUSE,Arch Linux等。

很多人都会问:学哪个Linux好,实际上大多数Linux在使用上并没有太大区别。主要的区别在两个方面:

  1. 界面,不同的发行版选用的桌面风格有比较大的区别,类似Redhat和Debian这样的大佬,基本上桌面都平平无奇。而一些比较小众、或者需要吸引用户的发行版,都会把桌面做得尽可能酷炫一些。
  2. 软件安装包的版本,基本上可以划分为两大阵营,RedHat的rpm系和Debian的deb系。不同的安装包版本决定了你用什么方式来安装软件(yum或者apt),以及你找的软件安装包的版本。客观的说,deb系的软件安装包会更多一些。

不过这两者对我们都没有太大影响。因为我们主要使用命令行来工作,这样第一点就没关系了。第二点上,虽然会影响我们安装软件包的方式,但大多数比较流行的发行版都有成熟的包管理器,他们使用上并不会有太大区别。

本讲义中我们使用Ubuntu 20.04作为发行版。

你需要打开Microsoft Store,搜索Ubuntu 20.04,注意要选择正确的版本:

我机器上因为已经安装了,所以按钮是打开,如果你机器上没有,这个按钮应该是获取或者安装(如果你已经获取过的话)。

等待安装完毕,在你的开始菜单就会出现对应的图标:

我是Win11,Win10的话请自行查找。

点击图标打开,会进行一些安装,完成之后会要求你输入用户名和密码:

当然,两次密码必须相同。这里需要注意的是,类Unix系统下,输入密码时都没有回显提示,你看不到任何比如*或者是.的内容(为了防止通过密码长度猜密码)。但不用担心,你确实在输入。

结束后,你会看到一个这样的窗口,和$提示符:

注意上图红框中的那句话,他说这个提示信息每天会出现一次,如果你觉得烦不想每天都看,那么可以创建/home/leon/.hushlogin这个文件来disable这个message。

这里就安装完毕了,你可以输入命令看看效果,我们先用ll命令来看一下:

$ ll
total 8
drwxr-xr-x 1 leon leon 4096 Oct 29 13:17 ./
drwxr-xr-x 1 root root 4096 Oct 29 13:16 ../
-rw-r--r-- 1 leon leon  220 Oct 29 13:16 .bash_logout
-rw-r--r-- 1 leon leon 3771 Oct 29 13:16 .bashrc
drwxr-xr-x 1 leon leon 4096 Oct 29 13:17 .landscape/
-rw-r--r-- 1 leon leon    0 Oct 29 13:17 .motd_shown
-rw-r--r-- 1 leon leon  807 Oct 29 13:16 .profile

这里要注意,$是Linux的提示符,输入命令时不要输入$。本文会在包含回显的内容里加入提示符$,如果只有命令,那就不加入$

另外这里的路径可以简单说一下,每个Linux用户,都有一个属于他的个人工作目录,他们都/home/下,以用户名命名。另外他们还有一个别名,叫~,方便你使用:

$ ll /home/leon
total 8
drwxr-xr-x 1 leon leon 4096 Oct 29 13:17 ./
drwxr-xr-x 1 root root 4096 Oct 29 13:16 ../
-rw-r--r-- 1 leon leon  220 Oct 29 13:16 .bash_logout
-rw-r--r-- 1 leon leon 3771 Oct 29 13:16 .bashrc
drwxr-xr-x 1 leon leon 4096 Oct 29 13:17 .landscape/
-rw-r--r-- 1 leon leon    0 Oct 29 13:17 .motd_shown
-rw-r--r-- 1 leon leon  807 Oct 29 13:16 .profile

$ ll ~/
total 8
drwxr-xr-x 1 leon leon 4096 Oct 29 13:17 ./
drwxr-xr-x 1 root root 4096 Oct 29 13:16 ../
-rw-r--r-- 1 leon leon  220 Oct 29 13:16 .bash_logout
-rw-r--r-- 1 leon leon 3771 Oct 29 13:16 .bashrc
drwxr-xr-x 1 leon leon 4096 Oct 29 13:17 .landscape/
-rw-r--r-- 1 leon leon    0 Oct 29 13:17 .motd_shown
-rw-r--r-- 1 leon leon  807 Oct 29 13:16 .profile

你可以看到是同一个文件夹。

因此/home/leon/.hushlogin就等于~/.hushlogin,因为当前我们就处于~路径下。 我们可以直接创建这个文件来禁止掉这个消息:

$ touch .hushlogin
$ ll -al
total 8
drwxr-xr-x 1 leon leon 4096 Oct 29 13:26 ./
drwxr-xr-x 1 root root 4096 Oct 29 13:16 ../
-rw-r--r-- 1 leon leon  220 Oct 29 13:16 .bash_logout
-rw-r--r-- 1 leon leon 3771 Oct 29 13:16 .bashrc
-rw-r--r-- 1 leon leon    0 Oct 29 13:26 .hushlogin
drwxr-xr-x 1 leon leon 4096 Oct 29 13:17 .landscape/
-rw-r--r-- 1 leon leon    0 Oct 29 13:17 .motd_shown
-rw-r--r-- 1 leon leon  807 Oct 29 13:16 .profile

在Linux中,touch命令用来刷新一个文件,我们也经常用这个命令来创建空文件。

终端

现在你已经可以正常使用了。不过先别急,默认情况下开启的窗口是Windows的cmd窗口,非常丑陋且功能比较少。我们可以换一个更好用点的终端,我个人使用的是Windows Terminal,你同样可以在Microsoft Store里找到他。在你安装了发行版之后,这个发行版就会出现在Windows Terminal的菜单里:

在此之前你可以在设置里对你的终端进行配置。

更换软件源

在开始使用之前,我们要更换软件源到国内源。

大家要明白一点,现在绝大多数Linux系统安装软件都不需要你到处去找。而是负责的组织会维护一个软件仓库。当你需要安装软件时,可以通过命令直接从对应的仓库里直接下载软件安装,这是非常贴心的:

  1. 你不用满世界找软件去了
  2. 你不用担心下木马了
  3. 也不存在买69.7块钱买vscode的事情了

有没有什么缺点?

有,有些发行版为了版本稳定,仓库里的软件版本通常都不会很新。如果你需要新版本的软件,你可能需要自己下载并编译。

什、什么,编译?

是的,编译。

你可能不知道Linux这类系统中很多软件实际上是以源代码的形式存在的。你下载源代码,根据配置编译,安装,就可以使用了。

不用太担心,这类源码里通常都有很完善的编译配置和开关,只不过你要仔细阅读对应的文档,没错,是英文的。

打开终端,输入:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

这里可能会提示你输入用户密码,输入即可。

这一步是为了把文件备份起来,以免你等下操作错误导致问题。

然后

sudo sh -c 'echo "" > /etc/apt/sources.list'
sudo vi /etc/apt/sources.list

用vi编辑器打开这个文件,你应该会看到一个空文件。

不用在意,请按下面的操作处理,注意,对于vim的初学者来说,他的操作有亿点点难,请注意一定要按所列的操作,大小写不要出问题。

按下i键。此时注意看左下角,会有一个-- INSERT --,表明vi进入了插入模式:

此时你可以把窗口切换到这个文档,然后用鼠标选中并复制下面这段文字:

deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

然后回到终端的窗口,右击鼠标。 你会发现文字已经被贴入编辑器了。

按下ESC键。你应该看到下面的-- INSERT --没了。

输入:,你应该会在左下方看到这个字符,并且光标也来到了这里:

键入wq!,注意有个叹号,然后回车:

你就会发现回到了命令行模式。

如果你需要,我稍微解释下刚刚的这些操作

第一个操作:

sudo sh -c 'echo "" > /etc/apt/sources.list'

我们把/etc/apt/sources.list这个文件置空,这样就不需要用vi来清除文件了。 注意这里的sudo,代表用su也就是超级用户来执行这个命令,所以他会需要你输入密码鉴权。 因为/etc/apt/sources.list这个文件普通用户是不能操作的。

同理下面我们也需要用sudo来打开这个文件,否则无法存盘。

接下来就是在vi里处理了。首先要明确一点,vi/vim分模式,刚进入编辑器时,处于普通模式,在这个模式下,你无法输入内容。你需要通过i来进入插入模式,才能输入。

进入插入模式之后,我们利用终端支持的鼠标右键粘贴模式,将内容字符粘贴进去。

接下来按ESC的目的,是退出插入模式进入普通模式,接下来输入:,进入命令模式

命令里的wq!中,w表示写入文件,q表示退出编辑器,!表示强制操作。因为这个文件是只读文件,如果不加!,vi会拒绝写入。

你会发现整个过程没有什么不可理解的东西,你不理解只是因为你不知道而已。

接下来我们需要更新一下软件:

sudo apt update
sudo apt upgrade

安心等待软件更新完毕。

apt是什么?

apt 是Debian系的包管理工具,所谓包你可以理解为软件。

通过apt提供的一组接口,你可以很方便地安装、卸载、搜索你想要的软件包。

最后我们安装上我们可能会需要的软件:

sudo apt install gcc g++ gdb make -y

后面的-y参数表示所有问题的回答都是yes,这样就可以帮我们自动安装了。

最后测试一下是否安装成功:

leon@DESKTOP-7E4P1LN:~$ gcc --version
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

leon@DESKTOP-7E4P1LN:~$ g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

leon@DESKTOP-7E4P1LN:~$ make --version
GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

leon@DESKTOP-7E4P1LN:~$ gdb --version
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

小知识 Linux命令行的参数

绝大多数Linux软件都有相同的参数约定,比如说:

  1. --version,打印当前版本,一般也用来进行软件是否安装的测试
  2. -h或者--help,打印帮助信息
  3. -v或者--verbose,用来打印额外的处理过程

等等,等你用多了,你就会习惯这些参数。

文件交互

有些时候你可能会需要把复制文件到WSL系统里,或者希望WSL能访问Windows的文件。有几种方法可以解决这个问题:

直接打开WSL目录

你想不到的是,Windows的exe文件是可以直接在WSL里执行的,尤其是系统目录下的那些文件,可以直接执行不用带完整路径,我们可以通过exploere.exe这个Windows的文件资源管理器来直接打开WSL的目录:exploere.exe .,注意后面有个.,表示当前目录。

这样你可以直接打开这个目录。

利用这一特点我们还有很多奇妙的用法,比如说如果你要把main.c这个文件的内容复制到剪切板,你可以这样用:cat main.c | clip.execat是Linux打印文本文件的命令,中间的|表示把输入通过管道给后面的程序作为输入,也即把cat main.c的输出,作为clip.exe的输入。而clip.exe是Windows剪切板程序。

用软连接

WSL把Windows的所有磁盘都挂载到/mnt/下,比如C盘,就是/mnt/c/,D盘就是/mnt/d,以此类推。所以理论上我们是可以访问所有磁盘文件的。但这个目录就很不方便,我们可以用软连接ln来把你经常访问的目录链接到我们的~目录下,方便访问。

假设我要把E:\MyProjects\链接到~\prj,那么你可以用这条命令:

ln -s /mnt/e/MyProjects ~/prj

注意两者的次序。-s表示这是一个软链接。

ls看一下,你可以发现prj文件夹,此时你cd到这个文件夹就可以访问对应的文件了。


  1. 了解下什么叫LFSopen in new window ↩︎