本文是整一个系列教程的第一讲,本文的习惯和文风也会贯穿整个系列。对于不清楚的地方,欢迎评论,在微信群中讨论、或直接修改。这是一个 wiki,设计上来说就是共同编辑的。笔者也是第一次开课,欢迎大家批评指正!
为了方便叙述,我们只会提供 Ubuntu/Debian 系的详细指引
相信各位肯定是因为迫不得已而使用 Linux。更深入得想一想,还有没有其他原因呢?
对于图形化界面,我们所访问的其实是设计者抽象出的交互逻辑。但对于高效的系统,自底向上的彻底理解和掌握是高效使用系统的必备途径。我们得以更深入洞悉文件和文件之间的联系,获得系统更高的主动权。同时,以最小化的人机接口访问能把足够多的资源投入至计算,获得最高的资源利用率。
因此,学习 Linux 和命令行,我们需要掌握:
让我们开始吧!
先来个具体的例子,跑个小火车先。建一个 Linux 虚拟机,把 ssh 的 22 端口映射出来。打开电脑上的终端模拟器(见基本知识:能用的终端),用下列命令连接:
ssh -p port ubuntu@host
(tips by 陈炎:Ubuntu镜像的用户没有ubuntu,只有root, so:
ssh -p port root@host
)
安装一个小火车程序然后跑小火车吧!(建议逐行复制到命令行里查看执行细节,一次性粘贴进去也可以)
sudo apt install -y sl
sl -a
man sl
(tips by 陈炎:第一次使用apt安装sl会报错:
E: Unable to locate package sl
因为是新机器,apt的本地缓存没更新,使用如下命令与源同步后再安装sl即可
sudo apt update
)
可以看到,命令行其实并不魔幻。通常来说就是如下的形式:
程序 子命令 选项 对象
其中,终端默认会在PATH
里面寻找你所需要的程序。如果需要执行不在 PATH
里的程序,需要指明文件路径。比如./hello
,或者/home/abc/ab
。你可以通过 which
命令查看在 PATH
找到的可执行程序的具体位置。
上文例子里的命令都是在PATH
里的。APT 是 Ubuntu 的包管理器,这是一个可执行文件和链接库的组织程序,可以帮你管理依赖,以及直接使用他人准备好的可执行程序。我们使用它的子命令 install
,作的对象是 sl
。-y
是一个选项,指的是不需要安装前确认。
man
是 manual 的意思,指的是查看帮助。通常来说,使用 -h
选项会输出命令的帮助页面,你也可以使用 man
命令查看详细帮助。tldr
也是一个和 man 类似的有用的偷懒工具,你可以安装并使用试试。
练习任务:
安装tldr
,使用man
和tldr
分别查看apt
工具的帮助。
可选任务:使用 zsh + oh-my-zsh + p10k 的形式强化你的终端。
注:练习任务是为了巩固知识设计的,需要完成。选任务是通常是操作性的内容,在互联网上有足够多的信息,为了使内容主线清晰,我们会选择性忽略一部分。
本文我们不会涉及到很深刻的内容,只是让大家有一个大概的印象。在后续探索中,大家会有更深入的想法。
文件是 Linux 最基础的抽象,也是这一套系统的最强大之处。先辈们一直在思考如何统一表示一个系统中各式各样的资源:文件、网络 socket、CPU、进程等等。最终大家发现,所有这些资源都具有输入输出属性,和我们对文件的期望一致。
所以,得 Linux 哲学第一条:一切皆文件。
这时候就有更多问题了:
停下来想一想:
如果是你来设计,你会如何组织这一套系统?如何处理文件之间的相互关系?
注:“停下来想一想”会是这个系列的常客。笔者不期望同学们想出完美的方案,但是多想想总比等着吸收知识更好。问题可能需要打磨,欢迎大家提建议。
Windows 下,物理实在先于文件而存在,你可能会看到 C D E盘等盘符,文件是放在盘符下的。但是 Linux 中,硬盘本身也是文件,所以根目录 /
,在所有文件之前存在,所有文件都由其派生。其中,文件夹是一种特殊类型的文件,其中可以包含一系列文件和文件夹的索引。
通过 cd
命令,你可以在切换当前所在的文件夹;通过 ls
命令,你可以查看文件夹下面的内容(不加参数默认是查看当前文件夹)。路径有一些缩写,你可以认为它们会被自动扩展为从 /
出发的路径。.
是当前目录,..
是当前目录的父目录,~
是当前用户的家目录,通常为 /home/用户名
,或者 /root/
。
Linux 上,文件的路径分绝对路径和相对路径两种。绝对路径指的是以 /
为开头,从根目录开始查找到本文件的路径,如 /home/lcpu/hello.c
,~/hello.c
,./hello.c
。相对路径指的是相对于当前所在文件夹,文件的存放位置。如果你的当前目录在 /home/lcpu/
,那么 hello.c
指的就是绝对路径为 /home/lcpu/hello.c
的文件。
注意,了安全性考虑,对于可执行文件,如果没有提供绝对路径,终端会在 PATH
中查找,而不会在当前文件夹下查找。如果当前目录下有 hello
,需要使用 ./hello
进行执行。直接执行的话,终端会因为 PATH
指定的路径中没有 hello
而报错。
在自己机器上的
/
下面逛逛。
资料并回答:/proc
和/dev
是什么?哪个文件可以反映 CPU 的核心频率?
对文件的基本操作,有读、写、执行三种。作为多机系统,Linux 中文件如果对每个访问者都相同,那就没有安全性可言了。Linux 的做法是,抽象出了“用户”这个实体(其实就是在 /etc/passwd
里面定义的一行 UID 和用户名的对应而已)。为了方便用户的文件共享,同时抽象出了组(Group)的概念,代表一组互相信任的用户。
root是一个特殊用户。自行查阅资料。
用权限位 4、2、1 (二进制下第 3 2 1个 bit )代表读、写、执行的权限,每个文件的读、写、执行,对应当前用户、组内用户以及其他用户组成的 3*3 矩阵,就是文件的权限。把每一类用户的权限相加可以得到当前权限的简写。
例子:750,当前用户,可读可行可执行;同组,可读可执行不可写;其他用户,没有任何权限。你可以查看 chmod
的帮助,了解如何改变权限。
所以可执行文件并不是因为这个文件本身有什么特别,而是这个文件被你赋予了可执行的性质。 一个简单的文本文件也可以被加上可执行的权限,也可以发挥操作其他文件的作用,后文的Shell脚本,以及Python脚本,都是如此。
查阅 scp 和 rsync 的 manual,可以了解如何与远程主机之间进行文件传输。
如果你会写 Python 的话,写一个从输入读取4个数字,输出他们和的程序,输出结果到控制台。(如果不会的话,下载这个写好的 Python 程序)
在本地跑起来这个程序之后,把#!/usr/bin/env python3
放在脚本的第一行,然后给这个脚本加上可执行的属性。这个特殊的一行叫Shebang
然后直接运行这个文本!还记得应该如何运行一个不在PATH
中的命令吗?
并不是所有可执行文件都是像 解释执行 的 Python 程序那么简单。我们以 C++ 程序的编译来看看,可执行的二进制是如何生成的。
这是一张从 ICS 课本上拿的图。可以看到,本质上编译器在做文件的变换,把一种文件变换成另一种文件。但同时,我们如果需要调用标准库(C 中的 printf),就需要知道去哪里找这些标准库文件。
指导查找标准库位置的,是环境变量 LD_LIBRARY_PATH
。PATH
是查找可执行文件的环境变量,PKG_CONFIG_PATH
是pkg-config(不需要了解)使用的包的查找位置。这一系列的路径就规定了文件的默认查找路径,这样编译器等就可以找到你需要的文件。
PATH
做的事其实更像 “自动查找”。在不使用 路径 执行命令时,为了安全性考虑,终端将默认在 PATH
中查找,而不搜索当前目录。
环境变量可以理解为,在和终端中存在的一系列可更改的,程序可以读取的值。可以看维基百科上的内容。读到
Syntax
那一节的UNIX
部分就行。通过echo $名称
可以打印环境变量。
打印出当前环境的PATH
。
现在,你已经掌握了编译的基本原理了,可以上手编译了。这次我们先编译个 Vim 编辑器。这是个命令行下非常好用的文本编辑工具。你可以先用包管理器安装尝试使用,然后再进行下面的步骤。
主要步骤:
完成上手编译的过程
可能遇到的一些问题:
Github 下载不下来:挂上代理,或者使用 LCPU 的 Git 镜像服务(需自己注册并添加公钥至lcpu git)
现在你对基础编译已经有了足够的了解,说不定正踌躇满志准备动手编译 Linux kernel。但是如果我们向拥有两套冲突的环境应该怎么办?如果环境足够难配,但是有人已经整理好了,我应该怎么直接用呢?
这时候 docker 和 singularity 这一类容器化工具,就可以发挥直接利用他人打包好的环境的作用。感兴趣的同学可以查阅资料了解 layered fs的思想,还有 docker 网络的实现。不感兴趣的同学直接上手,会用这样的工具,享受工具的便利就行。
这次的小任务是搭建一个 wiki.js (是的,就是大家现在看到的这个 wiki)。如果直接在系统里面搭也是可行的,大概操作是:
虽然不难,但预计用时会在十五分钟以上。但这件事情其实是“重复造轮子”,所有人都在配一样的环境。
我们使用 Docker 进行部署。
你可以在 docker 新人教程中较为完整地学习 docker相关知识。
安装 docker 和 docker compose, 部署 wiki.js 至相应端口,并在端口转发网页中转发该网页
~/.bash_history
。如果你改了终端,相信你也知道需要提交哪个文件2023.05.02 孙远航 init edition
2023.05.08 陈炎 踩坑记录