前言

终于到了我心心念念的速成大法了(突然有一种招摇撞骗的既视感)。
速成是不可能速成的,纯属个人胡扯,不保证学会,也不做任何承诺(笑

Linux的本质

众所周知Linux受到了Unix的启发,Unix的设计哲学是“Everything is files. (一切皆文件)”。
而Linux的创始人Linus Torvalds大神则进一步提出“Everything is a stream of bytes(一切皆文本流/数据流)”。
这里引用Vamei大佬的一段话,以加深对文本流的理解。

系统运行时,数据会在CPU的指挥下不断地流动,就好像一个勤劳的上班族。有时数据需要到办公室上班,因此被读入到内存,有时会去酒店休假,传送到外部设备。有的时候,数据需要搬个家,转移到另一个文件。在这样跑来跑去的过程中,数据像是排着队走路的人流,我们叫它文本流(text stream,或者byte stream)。然而,计算机不同设备之间的连接方法差异很大,从内存到文件的连接像是爬山,从内存到外设像是游过一条河。为此,Unix定义了流 (stream),作为连接操作系统各处的公路标准。有了“流”,无论是从内存到外设,还是从内存到文件,所有的数据公路都是相同的格式。至于公路下面是石头还是土地,就都交给操作系统处理,不劳用户操心。

因此Linux的本质就是文本流(这样说很显然有失偏颇,不过我就这么一说你也就这么一听,图一乐就好)。

命令行

插播一段计算机学史,由于价格问题,早期计算机都是多人一机,用户面前只有屏幕和键盘,用来承担信息输入和输出的工作,被称作终端(terminal)。而终端所显示的界面很显然不会是图形化界面,而是命令行界面(command-line interface,CLI)。而终端和文本流的关系是这样的:

当Unix执行一个程序的时候,会自动打开三个流,标准输入(standard input),标准输出(standard output),标准错误(standard error)。比如说你打开命令行的时候,默认情况下,命令行的标准输入连接到键盘,标准输出和标准错误都连接到屏幕。 ——Vamei

如今都是个人电脑(Personal Computer),终端的概念就被弱化了。因此现在的终端严格意义上指的是终端模拟器(Terminal Emulator),也就是在图形化界面上模拟终端的功能。
而终端上的命令行,就是连接用户和Linux系统的桥梁。

谈及命令行就不得不谈一下shell,顾名思义,shell是一个壳——Linux内核的外壳,负责外界与Linux内核的交互。实际上Shell是命令行解释器,负责把命令解释成计算机指令。而Shell有很多种,绝大多数Linux系统把Bash作为默认的命令行解释器。

了解了以上内容就可以建立命令行与文本流的基本认知了:

想象一下敲击一个 $ls 键盘敲击的文本流(“ls\n”,\n是回车时输入的字符,表示换行)命令行 (命令行实际上也是一个程序)。 命令行随后调用/bin/ls得到结果(“a.txt”),最后这个输出的文本流(“a.txt”)流到屏幕,显示出来,比如说: a.txt 假设说我们不想让文本流流到屏幕,而是流到另一个文件,我们可以采用重新定向(redirect)的机制。 $ls > b.txt 重新定向标准输出。这里的>就是提醒命令行,让它知道我现在想变换文本流的方向了,我们不让标准输出输出到屏幕,而是要到b.txt这个文件 (好像火车轨道换轨)。此时,计算机会新建一个b.txt的文件,并将命令行的标准输出指向这个文件。        ——Vamei

文本流的操作符可以去看鸟哥的私房菜,这里就不过多介绍了,速成嘛,囫囵吞枣知道个大概就行了。

萌新万能指令

了解了命令行自然要了解基本指令/命令。
俗话说的好,授人以鱼不如授人以渔,因此这里只介绍两个指令 man 和 help 。

man

先说man命令,可以通过一些参数,快速查询linux帮助手册,并且格式化显示。
语法就是 man <待查命令>,简单粗暴,虽然man有一大堆参数可以用,但是绝大多数时候用不着。
最骚的地方在于,你可以通过man查询man自身的手册,也就是 man man 。

help

然后是help,help命令只能显示shell内部命令的帮助信息,而linux系统中绝大多数命令是外部命令,所以help命令的作用非常有限,语法是 help <内部命令> 。

但是如果把help作为命令参数是可以查看外部命令的帮助信息的,语法是 <外部命令> —help

和man命令得到的详尽的文档描述相比,help命令的帮助信息相对简单,萌新还是比较推荐多用 man 命令。

文件系统

学会了命令自然要了解命令操作的对象——文件系统,同时,文件系统也是文本流的重要节点。
和Windows基于硬件(硬盘)的文件组织形式不同,Linux使用树状结构组织文件,硬件则可以挂载在树上。
这棵树的主干就是根目录“/”,所有的目录和文件,无论是不是挂载过来的,最终都分层排列到以“/”为起始的文件系统之下。

根目录下

/boot
这个目录下包含系统启动文件(boot loader),例如Grub,Lilo或者Kernel,以及initrd,system.map等配置文件。(Initrd ramdisk或者””initrd””是指一个临时文件系统,它在启动阶段被Linux内核调用。initrd主要用于当“根”文件系统被挂载之前,进行准备工作。)

/sys
这个目录下包含内核、固件以及系统相关文件。

/sbin
包含系统操作和运作所必需的二进制文件以及管理工具,主要就是可执行文件。类似WINDOWS下的EXE文件。

/bin
包含单用户模式下的二进制文件以及工具程序,比如cat,ls,cp这些命令。

/lib
包含/sbin和/bin目录下二进制文件运行所需要的库文件。

/dev
内含必需的系统文件和驱动器。

/etc
内含系统配置文件,其下的目录,比如 /etc/hosts, /etc/resolv.conf, nsswitch.conf, 以及系统缺省设置,网络配置文件等等。以及一些系统和应用程序的配置文件。

/home
每一个用户的在这个目录下,都会单独有一个以其用户名命令的目录,在这里保存着用户的个人设置文件,尤其是以 profile结尾的文件。但是也有例外,root用户的数据就不在这个目录中,而是单独在根路径下,保存在单独的/root文件夹下。

/media
一个给所有可移动设备比如光驱、USB外接盘、软盘提供的常规挂载点。

/mnt
临时文件系统挂载点。比如,你并不想长期挂载某个驱动器,而是只是临时挂载一会U盘烤个MP3之类的,那么应该挂载在这个位置下。

/opt
在Linux系统中,这个目录用到的并不多,opt是 可选系统程序包(Optional Software Packages)的简称。

/var
这个路径下通常保存着包括系统日志、打印机后台文件(spool files)、定时任务(crontab)、邮件、运行进程、进程锁文件等。这个目录尤其需要注意进行日常的检查和维护,因为这个目录下文件的大小可能会增长很快,以致于很快占满硬盘,然后导致系统便会出现各种奇奇怪怪的问题。

/tmp
顾名思义,这是一个临时文件夹,专门用来保存临时文件,每次系统重启之后,这个目录下的”临时”文件便会被清空。同样,/var/tmp 也同样保存着临时文件。两者唯一的不同是,后者 /var/tmp目录保存的文件会受到系统保护,系统重启之后这个目录下的文件也不会被清空。

/proc
这个目录是驻留在系统内存中的虚拟(psuedo,伪)文件系统,其中保存的都是文本格式的系统内核和进程信息。

User目录下

/usr
用户数据目录,包含了属于用户的实用程序和应用程序。这里有很多重要的,但并非关键的文件系统挂载这个路径下面。在这里,你会重新找到一个 bin、sbin 和 lib目录,其中包含非关键用户和系统二进制文件以及相关的库和共享目录,以及一些库文件。

/usr/sbin
包含系统中非必备和并不是特别重要的系统二进制文件以及网络应用工具。

/usr/bin
包含用户的非必备和并不是特别重要的二进制文件。

/usr/lib
保存着/usr/sbin以及/usr/bin中二进制文件所需要的库文件。

/usr/share
“平台无关”的共享数据目录。

/usr/local
是/usr下的二级目录,这里主要保存着包含系统二进制文件以及运行库在内的本地系统数据。

使用nano编辑文本文件

了解了文件系统,那么我们理所应当具备修改它们的能力,这时候就得掏出命令行环境下的文本编辑器——nano。
声明一下,我知道vim很好用效率很高,我自己日常也是用vim,但是单论上手难度,nano比vim低了不是一点半点,我能五分钟教会妹子用nano,但是给我50分钟也不敢说我能教会vim。

nano界面简单清爽,上边是文本区,最底下是菜单,支持鼠标点击以及组合键的方式进行操作。
涉及到的快捷键主要有两个,Control和Meta,^代表Ctrl,M代表Meta(也就是alt)。

正常使用上下左右操作光标,然后进行编辑即可。

编辑完成后,根据下方快捷键提示,输入Ctrl+O组合键保存,编辑文件名后回车就算完成编辑了。

是不是很简单?我说五分钟没有骗你吧

写在最后

看到这里你应该可以理解Linux日常使用的绝大部分术语和名词,并具备了修改系统文件的能力。
也就是说,你已经可以无障碍读懂绝大多数教程以及官方文档,并能按着说明操作了。
最后放上Vamei大佬的骑着企鹅玩树莓系列教程。
实践出真知,快去部署你的第一个selfhost项目吧!