环境配置
环境配置
在本讲义中我们使用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在使用上并没有太大区别。主要的区别在两个方面:
- 界面,不同的发行版选用的桌面风格有比较大的区别,类似Redhat和Debian这样的大佬,基本上桌面都平平无奇。而一些比较小众、或者需要吸引用户的发行版,都会把桌面做得尽可能酷炫一些。
- 软件安装包的版本,基本上可以划分为两大阵营,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系统安装软件都不需要你到处去找。而是负责的组织会维护一个软件仓库。当你需要安装软件时,可以通过命令直接从对应的仓库里直接下载软件安装,这是非常贴心的:
- 你不用满世界找软件去了
- 你不用担心下木马了
- 也不存在买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软件都有相同的参数约定,比如说:
--version
,打印当前版本,一般也用来进行软件是否安装的测试-h
或者--help
,打印帮助信息-v
或者--verbose
,用来打印额外的处理过程
等等,等你用多了,你就会习惯这些参数。
文件交互
有些时候你可能会需要把复制文件到WSL系统里,或者希望WSL能访问Windows的文件。有几种方法可以解决这个问题:
直接打开WSL目录
你想不到的是,Windows的exe文件是可以直接在WSL里执行的,尤其是系统目录下的那些文件,可以直接执行不用带完整路径,我们可以通过exploere.exe
这个Windows的文件资源管理器来直接打开WSL的目录:exploere.exe .
,注意后面有个.
,表示当前目录。
这样你可以直接打开这个目录。
利用这一特点我们还有很多奇妙的用法,比如说如果你要把main.c
这个文件的内容复制到剪切板,你可以这样用:cat main.c | clip.exe
,cat
是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
到这个文件夹就可以访问对应的文件了。