黑客第二课:脱屌第一步 —— Vim Fundamentals
黑客第二课:脱屌第一步 —— Vim Fundamentals
在上一节课(Web地址 http://www.cpp7.com/bbs/forum.php?mod=viewthread&tid=25)中,我讲到了UNIX、GNU和Linux这些东东,在有些同学的作业反馈里,也提到它们,并说已经去维基百科它们了 —— 这种积极预习的做法,是值得褒奖的。
那么,我们在正式进入第二课之前,我就来给大家做一个跟UNIX、GNU、Linux等等有关的测验。题目是这样的:请将下图中左边圈子(即Set A)里的各图标,与右边圈子(即Set B)里的与前者相匹配或对应的名称,用箭头连接起来。下图中,已经给出了一个连线示例,请你完成全部的连线。

在不倚助于Google等工具的情况下,你所答出的正确连线之数量,或许可以预示你学习接下来的课程的相关情况:
0条 —— 你完全不适合本课程的学习,劝退。
1 – 14条 —— 你的计算机学科基本素养一般,学习后面的课程,须投入很多额外的努力。
15—28条 —— 你的计算机学科基本素养较好,学习后面的课程,须投入稍多一些的努力。
29—41条 —— 你的计算机学科基本素养非常好,学习后面的课程,将会比较轻松。
如何评判你做出的各条连线是否正确呢?当然是可以利用Google等工具了。在得到这类工具的帮助的情形下,如果你在60分钟内,仍不能确定全部正确连线,那么,结论依然是:你完全不适合本课程的学习,劝退。
经过上面这一回自测之后,我们可以正式进入本课程的第二节(第二课)。
首先,我来解释一下本课的标题。
什么叫“脱屌第一步”呢?
这里的“屌”,指的当然不是男性的外生殖器(否则本课程就成了令人自宫的《葵花宝典》了),也不是“很牛”、“很厉害”的意思,而是指“电脑技术屌丝”,简称“电脑屌丝”。
那么,什么是“电脑屌丝”呢?
在本课程中,关于“电脑屌丝”,藉由以下这样的量表(Rating Scale)来判断或衡量。
这个量表,分为六个轴。
第1轴,关于对何种操作系统(仅以下列各种操作系统作为参照指标)的依赖或熟练程度:Microsoft Windows?的分值最高;GNU Linux(或含前一项)的分值非常接近零;UNIX(或含前一项)的分值为零;诞生于UNIX以前的操作系统(或含前一项)的分值为负数且其绝对值与操作系统兴起年代负相关;若不知操作系统为何物,则完全不适合本课程的学习。(※ Windows?是Microsoft Corporation的商标。)
第2轴,关于平时热衷于如何捣鼓电脑软件:喜好或熟练于(为己或为人)安装或重装 Microsoft Windows操作系统的分值最高; 喜好或熟练于配置 Microsoft Windows上各类GUI软件[backcolor=Red] 注1 [/backcolor](或含前一项)的分值次高;喜好或熟练于在Console/Shell下配置UNIX-like[backcolor=Red] 注2 [/backcolor]上的各类软件(或含前一项)的分值非常接近零;喜好或熟练于自己开发软件(编写小程序或RAD开发的除外)(或含前一项)的分值为零;喜好或熟练于对软件进行逆向工程(或含前项)的分值为负数且其绝对值与工程难度正相关;若不知软件为何物,则完全不适合本课程的学习。
[hr]
[backcolor=Red] 脚注 [/backcolor]
(1)GUI,Graphical User Interface,用户图形界面,就是由诸如窗口、按钮、菜单、文本框、图标等等视觉与鼠标操作要素构成的界面的。与GUI相对的是TUI,Text User Interface(文本类型用户界面),也叫CLI,Command Line Interface(命令行界面),一般说来,就是用户通过它给出的提示符(Prompt)向系统键入一系列文字命令,且系统通常也通过该界面给出反馈信息。而负责提供提示符与解释用户键入命令的意义的机构,称为Shell(壳)。
(2)在本课程中,UNIX-like指一切类似于UNIX的操作系统,或它们的统称。这个词也可以被写作:*NIX或UN*X。作为统称,它包含但不限于以下操作系统:各类BSD、MINIX、GNU/Linux、GNU Hurd、GNU/OpenSolaris、 System V、RTOS、Syllable、AIX UNIX?、HP-UX UNIX?、IRIX UNIX?、NeXTSTEP、Mac OS X、iOS、SunOS、Solaris UNIX?、SCO UNIX/UnixWare/OpenServer、Xenix、VxWorks等。(※ UNIX?是The Open Group的商标。)
※ GNU的发音为[gnu:],这个词是“GNU is NOT UNIX”的缩写。Linux的发音为[?l?n?ks]。
[hr]
第3轴,关于平时热衷于如何捣鼓电脑硬件:喜好或熟练于(为己或为人)攒机或策划攒机的分值最高;喜好或熟练于利用汇编语言编程(或含前一项)的分值非常接近零;喜好或熟练于捣鼓单片机(或含前一项)的分值为零;喜好或熟练于自己动手捣鼓电子电路(或含前一项)的分值为负数且其绝对值与工程难度正相关;若不知硬件为何物,则完全不适合本课程的学习。
第4轴,关于网络黑客经历:追求或喜好或熟练于使用诸如木马/蠕虫/间谍软件等工具的分值最高;喜好或熟练于使用扫描/嗅探等工具(或含前一项)的分值次高;喜好或熟练于分析网络服务协议/数据包(或含前一项)的分值非常接近零;喜好或熟练于自己开发服务器软件(或含前一项)的分值为零;喜好或熟练于解密工程(或含前一项)的分值为负数且其绝对值与工程难度正相关;若在以往五年之中有出于贪婪私欲利用黑客技术攫获他人任何财富或权利(不论对象是无辜的百姓还是恶贯满盈的官员,只要你有出于满足私欲的主观故意,则是。这里完全排除了所谓“劫富济贫”的客观结果因素)的经历,则完全不适合本课程的学习。
第5轴,关于平时的金钱开销程度:分值与经济上依赖父母或家长的程度正相关。若对父母或家长的经济依赖达到或超过了他们通常情况下可以承受的极限,则完全不适合本课程的学习。
第6轴,关于平时的除电脑以外的兴趣爱好:沉溺于赌博或任何婚姻外的性行为(包括通奸、自慰)(或含后一项)的分值最高;沉溺于观看渲染性行为的影像或文字资料(如俗称的“A片”)(或含后一项)的分值次最高;沉溺于网络闲聊或漫无目的泡网(或含后一项)的分值再次高;嗜好吃喝(或含后一项)的分值再次次高;喜好或熟练于阅读文字书本(不含前一项)的分值非常接近零;喜好或熟练于数学(或含前一项)的分值为零;喜好或熟练于其他理科或工科的理论或实验(或含前一项)的分值为负数且其绝对值与其造诣正相关;若对摄入精神药物或麻醉药物有非医学用途造成的瘾癖,则完全不适合本课程的学习。
上述六个轴上的最高分,可以由你自己来设定(须一致),比如5分或10分;而其余的分值档次,可以由你来适当地来划分。
如果你在六个轴上的评判均为最高分,那么,你就是一枚彻头彻尾的、最最典型的电脑屌丝。如果你在六个轴上的评判均非常接近零分,那么,你的身上就已经几乎完全没有任何电脑屌丝的成分了,学习接下来的课程,对于你来说就是如履平地。如果你的得分介于上述两者之间(但没有出现负分),那么,学习接下来的课程,你将付出一定的辛劳,总体的辛劳程度与总体的分数正相关。如果在某个或某些轴上评判为负分,那么, 学习接下来的课程,你将健步如飞。如果你在六个轴上的评判均没有出现正分,那么,你是名副其实的电脑高手或牛人或大神。还有,只要在量度过程中,出现一次“完全不适合本课程的学习”的评判,那么,不论接下来的评分或评判如何,你就是真的完全不适合本课程的学习,强烈建议你果断放弃本课程。综上所述,对于受测者,只要在其身上不出现超过最高分的评判结果,就都是本课程可以接纳的学员。
我们可以在一个平面上,将上述六个轴的正分值与零分值部分刻画出来,如下图:

当然,类似地,我们也可以在一个平面上,将上述六个轴的负分值与零分值部分刻画出来(将负分变为其绝对值),如下图:

最后,我们还可以综合地,将上述两幅图合到一个3D空间中来(但上述两平面中的一个必须作镜像反转),如下图:

这样,我们可以看出,在零分值所标定的那道红色环线 —— “赤道”的上方,是“电脑屌丝”即属于“矮矬穷”的空间,而 “赤道”的下方,则是属于“黑极富”的空间。
关于“黑极富”:“黑”指黑客(Hacker),精通计算机系统或对计算机系统有深刻理解的人。“极”指极客(Geek),在计算机方面能力超群或富有独特的钻研与创造力的人。至于“富”,这里基本上没有什么引申的含义,指的就是经济上的富裕(Wealthy) —— 我们的课程,从来不会排斥将我们的学员培养成可以拥有丰厚经济收入的人。我们认为,能够成为“黑”且“极”的人,自然完全可以成为资财富有的人。不过,我们的要求是:成为富人之后,必须即刻与持续地孝敬自己的父母。一个不懂得孝敬父母的黑客,终将沦为贪婪可鄙的Cracker。
如果你不幸已经失怙,那么,请用你收获的金钱善待你的配偶。
我们这个课程的目标,就是:将你从“矮矬穷”的电脑屌丝(如果你是的话),拉扯成为一位合格甚至优异的“黑极富”。不过,如果你在前述的第5轴和第6轴上持续高分的话,那么我们将无法保证为你实现上述目标。
回到本节课的标题“脱屌第一步”。这个标题说明了本节课的内容,是将你拖离电脑屌丝的第一步。即便是在目前的这个“脱屌”阶段(入黑的预备阶段),这第一步也是非常小的一步,但是,它的意义重大,它将为电脑屌丝们开启一道全然崭新的门径。并且,我可以预先告诉你一个令你振奋的结论:只要你认真学习并反复操练直至熟练掌握本节课所涉及的知识与技能,那么,你将在你所身处的电脑屌丝圈子里,成为一个实至名归的“小高手”!
此外,本节课还有一个副标题 —— “Vim Fundamentals”,它揭示了本节课教学的终点,即教授学员掌握 Vim的最基要使用方法。
Vim 是什么?
当你阅览到上面这几行中出现的“Vim”这个单词的时候,请注意它的书写:在指代该软件的名称的时候,它的第一个字母必须大写。此外,一个特别容易被忽略或胡乱猜测的问题是:“Vim”一词的发音,显然你无法直观地从文字书写的角度知晓它的发音,所以,必须由我来告诉你:它的发音是[vim],而不是久经讹传的[?vi: ?ai ?em]。(※ Vim所属的许可协议兼容于 GNU General Public License。)
Vim 是一个软件,它的基本用途是以“文本编辑”这个功能呈现的,也就是说,在一个不太辽阔的视角下,它是一款文本编辑器。从文本编辑器这个层面上说,它类似于电脑屌丝们在Microsoft Windows上使用的前者所自带的“记事本(Notepad)” —— 如果你在论坛上发帖的时候,不想自己辛苦键入的文字,被网页自动刷新掉或因为提交失败而彻底丢失的话,通常你就会先在“记事本”里输入和编辑文字甚至将它们保存好,是不是这样?没错,就是那个“记事本”。
或许你很难将“会用一款‘记事本’一样的软件”与“成为屌丝群中的‘小高手’”联系在一起。如果你有这样的疑惑,反而可以揭示出Vim的重要性,具体地说,这是一种作为黑客必须熟练掌握的最基本工具的重要性。
在我们讨论电脑屌丝量表的第4轴的时候,涉及到了这么一种现象:典型的电脑屌丝喜好或只会使用所谓“黑客工具”,而在普遍的实际情况中,这一类所谓“黑客工具”都是GUI的。
在后续的课程中,你将了解到:本课程十分抵制那一类所谓“黑客工具”的软件,至少会与它们保持相当长远的距离。我们的目标是:尽量由我们自己亲自动手编写实现黑客功能/用途的程序或软件 —— 这本身就是黑客的内容。(所以说,那些使用所谓“黑客工具”尤其是GUI的工具的人,根本算不上黑客。)
提到编写软件,有些电脑屌丝们通常会想到诸如Visual Studio或者Eclipse这样的IDE(集成开发环境),通常这类他们所听闻或熟知的IDE也都是GUI的。顺便提一下,Microsoft Windows自带的记事本,显然也是GUI的。
如果总是依赖于GUI,你将永远无法成为真正的黑极富 —— 这有颇具现实意义的理由:当你登录一个UNIX-like系统从事黑客的时候,几乎不可能有GUI环境供你使用,即便有,那也是一个极端糟糕的选择,必须远离直至摒弃!根据我们课程的目标之一,即:你必须在系统提供给你的最小的条件下,展开对关键信息的编撰或更改工作,譬如编写程序、查看或更改系统上的设置。正是基于对这个宗旨的贯彻,我们在学习Vim之前,还必须学习vi的基本使用。通常情况下,只要是一个完整的UNIX-like系统,vi是该系统上的文本编辑器的最低配备,换句话说,如果一个UNIX-like系统自带了文本编辑器,那么vi将是一个“下限”。而我们的黑客教学,必须从这一类“下限”起步。
至此,我们提到了vi。请注意,“vi”这个单词的拼写,即便是指代该软件的名称的时候,也是所有字母都小写。而这个单词的发音,则是[?vi: ?ai],千万不要念成[vi:]。(※ vi的许可协议是BSD License。)
现在,我来讲述我的一个小小的亲身经历,它可以体现出掌握vi使用的重要性。
我有一部用来解码卫星电视信号的机顶盒 —— 它从卫星天线(“锅”)那里摄取人造地球卫星广播出来的信号,然后将这些信号解释成为可以观看的电视节目,输送到电视机上。这一类的机顶盒,其实就是一台电脑,只不过没有显示器与键盘鼠标与它相连接(电视机还不能完全算作它的显示器)。这台电脑使用的操作系统是Linux的(请注意,我是在说“是Linux的”而非“是Linux”)。有一次,为了能更长久地收看卫星电视节目,我须要更新机顶盒里的某项设置。进行这种操作,屌丝一些的做法是通过一台与机顶盒同在一个网络中的电脑(通常是Microsoft Windows的)上的一个GUI软件,连接到这部机顶盒,然后在一个图形界面中,为机顶盒修改那些设置。但这样做,违背了黑客的一个原则,即采用最直接的(通常是“幕后”的)途径来实现某项工作。上述那个Microsoft Windows上的GUI软件,之所以能够连接并读写机顶盒,是因为该软件的运行是建立在telnet这样的远程登录服务的基础之上的。也就是说,该GUI软件只是把telnet这个仅需的功能给包装起来而已,且包装得花里胡哨。作为黑客,一旦了解到这个事实(这也是必须的),就应该直接使用telnet登录那部机顶盒,修改相关设置。而这些设置是以文本文件的形式存放在机顶盒上的。这就意味着,我只需利用telnet登录机顶盒一次,就可以把查看、编辑(修改)、保存设置及至重启机顶盒的工作全部完成(而不需要任何额外的工具,进行诸如导出、导入、甚至“远程操控”这样的工作)。于是,我就telnet上了那台机顶盒,telnet在我所使用的电脑上为我呈现了机顶盒的Shell。我透过Shell,输入命令“vi”,果然地,vi这个文本编辑器被打开了,确切地说,是机顶盒里的vi程序被我打开了。利用机顶盒里的vi程序,查看、编辑、保存机顶盒里的文件,是非常自然的事情,就像在自己的(本地的)电脑上使用本地的记事本操作本地的文件一样。
显然那部机顶盒里没有Vim —— Vim比vi更高级一些,也更好用:Vim是Vi IMproved的意思,而vi则是“Visual”的缩写 —— 见识过Microsoft Visual Studio的屌丝们,不要被“Visual”这个名头给迷惑了,千万不要以为vi具有“亲切友好”的可视化界面,vi压根儿就没有这种特质:在vi里面,你甚至不能使用键盘上的方向键来操纵光标的移动!这就好像你在玩电子游戏的时候,手柄上的方向按键是无法操纵主角人物移动的一样。
上面说了这么多,算是初步阐释了一下关于Vim和vi的使用背景以及它们在黑客生涯中的重要性。再强调一下吧:
你若不会使用Vim或vi,那么在黑客的世界里,就好像现实社会中那种大字不识一个的纯文盲一样!
下面就要开始扫盲了!
在扫盲的起头,有些事情还须要说明一下。
Vim是有GUI版本的,比如gvim,即图形化的vim。这类GUI版本的Vim甚至可以在Microsoft Windows上安装并使用。但是,本课程极力抵制这类GUI版本的软件,原因是:如果电脑屌丝抱着gvim学习Vim或vi的话,他们将很难抵御GUI软件上的图形化的按钮与菜单以及允许鼠标点选的诱惑,这样一来,对于Vim和vi的学习终将沦为虎头蛇尾一般的无用功 —— 这是屌丝们极易滑去的境地!
请记住:使用游泳圈,是不可能学会游泳的!
所以,为了强迫电脑屌丝们固守学习纯正黑客技术的阵地,本课程要求学员使用相当纯正的UNIX(而非GNU Linux)环境。在一台完全空白的PC(即x86或x86-64的俗称“台式机”或“笔记本”的电脑)上从无到有地架设这样的UNIX环境,是必须的!为了满足这样的要求,你应当添置一台新的PC或腾出一台空白的PC(而不是指望使用所谓“双(多)系统”机器),这对于穷屌丝来说,在经济上恐怕是个挑战,但这几乎是本课程对他们唯一的在经济上的可观的要求。说白了,学习纯正的黑客技术,须要砸下本钱!
当你准备好了这样的PC之后,我们开始安装操作系统 —— FreeBSD 9.0 —— 本课程认为:各类BSD都是UNIX,对此有不同意见的,请搁置相关的争论。
首先,我们下载FreeBSD 9.0 RELEASE i386 [backcolor=Red] 注3 [/backcolor] 的DVD光盘映像,地址是:
http://ftp.freebsd.org/pub/FreeB ... LEASE-i386-dvd1.iso
或
ftp://ftp.freebsd.org/pub/FreeBS ... LEASE-i386-dvd1.iso
[hr]
[backcolor=Red] 脚注 [/backcolor]
(3)对于FreeBSD的版本来说,这里的“RELEASE”有“正式发行”的含义,具体地说,它是一个“正式发行”的二进制版本,这里的“二进制”意味着它(的源代码)已经由编译可以直接运行在某个特定硬件架构(有些机构则喜欢称“体系结构”)的计算机上,后缀的“i386”即指明了这种架构。除了“i386”架构之外,FreeBSD 9.0 还提供了可以运行在Alpha、AMD64、IA64、PC98、PowerPC、Sparc64六种硬件架构上的二进制发行版。—— 这里有必要提醒一下:有些不负责任的教师声称“amd64是针对AMD公司的CPU产品的”或“如果你的CPU是AMD的,就选amd64”,这属于信口胡说,是极端错误的。事实上,“amd64”是Intel x86架构(在FreeBSD的架构列表中由“i386”指代)的一种延伸。由于它最早由AMD公司公布,故得其名,而在Intel方面,则称之作“Intel 64”(不同于Intel Architecture 64即IA-64)。如果为排除“amd64”或“Intel 64”中出现的机构名称,则一般称之为“x86_64”或简称“x64”。从指令集(体系结构的重要范畴之一)看,以下CPU产品均符合上述列表中的“amd64”架构:
Athlon 64,Athlon 64 FX,Athlon 64 X2,Turion 64,Turion 64 X2,Opteron,Sempron,Phenom —— AMD公司的,采用AMD64指令集;
Pentium 4,Pentium D,Pentium Extreme Edition,Celeron D,Xeon,Core 2、Core 2 Quad,Core i3,Core i5,Core i7 —— Intel公司的,采用Intel 64指令集。
再重申一遍:在做类似的针对于硬件架构的选择时,请谨记这两道关系式:
i386 = x86 = x86_32 = IA32
amd64 = x86_64 = x64 = Intel 64 ≠ IA64
与“RELEASE”这样的二进制发行版相对的,就是“SNAPSHOT”,即向用户提供某种“预览”,以令后者可以领略系统(的各分支)发开的动向。
还有两个用来修饰FreeBSD版本的词,是“CURRENT”和“STABLE”。前者指代FreeBSD 开发的 “最前沿”,对用户的技术要求比较高。而对于后者,不要被它的字面上的意思所迷惑,实际上,这个词专门指代FreeBSD 开发的“分支”,缀以这个名字的版本,是专门提供给那些希望参与FreeBSD开发的用户使用的,普通用户千万不要望文生义地选择了它。
[hr]
将下载好的ISO文件刻录成DVD光盘 —— 屌丝们应该擅长操持此事 —— 将光盘推入“空白电脑”的DVD驱动器,随即(重)启动。
不要按任何键,直至出现有Daemon(FreeBSD的吉祥物)圆头的“Welcome to FreeBSD”界面(单色、字符的)。
按下[ENTER]键。
直到进入蓝底色的“FreeBSD Installer”文字界面。
在“Welcome”对话框中,选择<Install>。
在“Keymap Selection”对话框中,选择<No>。
在“Set Hostname”界面中,输入一个Hostname(主机名),之后,按下[ENTER]键。
在“Distribution Select”界面中,用方向键与空白键选中全部四个项目(doc、games、ports、src),之后, 按下[ENTER]键。
在“Partitioning”对话框中,选择“Manual”,进入分区程序。
现在,我们要学习有关FreeBSD硬盘分区的一些基础知识。我们以FreeBSD所支持的较新的一种标准 —— GPT(Globally Unique Identifier Partition Table,GUID分区表)来讲解。
当我们进入“Partition(分区) Editor”之后,会看到唯一的一项(如果你只有一个物理硬盘的话):
ada0 或 da0,后面跟着显示的是硬盘的总容量,单位一般是GB。
这里若是ada,就是指SATA或IDE硬盘,而若是da,则指SCSI(发音为[?sk?zi])或USB硬盘。
这里的0指第一个。通常,在计算机科学领域,计数用的“自然数”从0开始。那么,若有ada1,则是指你这台电脑上的第二块SATA或IDE硬盘。
我们再来讨论硬盘用量的单位GB这个词。
这个词由大些字母“G”和大写字母“B”组成。
字母“G”表示一个单纯的数(正如“三个代表”里的“三”),在计算机学科的度量中,用大写字母表示单纯的数,我们经常遇到的,还有:
K、M、T。
它们分别表示2的10次方(1,024),2的20次方(1,048,576),2的40次方(1,099,511,627,776)。而G则表示2的30次方(1,073,741,824)。
而大写字母“B”,则是“Byte(s)”的缩写。“Byte”的汉语译词一般为“字节”。一个字节即由2的3次方即8个(几乎一定是连续的)Bit(s)组成。“Bit”的汉语译词一般为“位元”或“位”或“比特”。位元是计算机系统可以存放或传输信息的最小单位:在一个位元中,要么存放一个0,要么存放一个1。“Bit”的缩写形式,一般是小写字母“b”。
但在业界,衡量硬盘之类的存储设备,通常所用到的K、M、G、T则分别指代10的3次方(1,000)、10的6次方(1,000,000)、10的9次方(1,000,000,000)、10的12次方(1,000,000,000,000)。为了与以2作为底数的计数方法下的K、M、G、T区别看来,后者也经常被写作Ki、Mi、Gi、Ti —— 这里的小写字母i代表了“Binary”。
回到“Partition Editor”,这里的硬盘容量若是显示“GB”,其实指的是“GiB”。所以,如果你购置了一块标称容量为1TB的硬盘装在电脑里的话,那么此时可能会显示为900多GB。
接着,在“Partition Editor”界面中,用左右方向键选择<Create>来创建一个分区。我们选择“GPT”,<OK>后程序告诉我们已经成功为这一块物理硬盘建立了GPT。其实,这一步并不是创建分区,而是创建了一个Partition Scheme,只是因为当前连一个分区也没有,所以选择<Create>之后首先要创建一个 Scheme。
这时,在物理硬盘容量的右边,又跟着显示了“GPT”,说明前述操作生效。如果要“反悔”上一步操作,那么就用左右方向键选择<Revert>。
现在,我们再选择<Create>,就可以正式地创建分区了。
在“Add Partition”界面中,我们看到有四项指标,分别是:
Type、Size、Mountpoint、Label。
关于Type,在 GPT的背景下,我们只有三种types可以选择:
freebsd-boot、freebsd-ufs、freebsd-swap。
“boot”是“Bootstraps”(拔靴带)的缩略,因为“Bootstraps”一词有“依靠自己力量”的引申义,所以“Boot”就是指电脑启动的过程 [backcolor=Red] 注4 [/backcolor] 。具体地说,以PC上经典的MBR体系为例,通常的Boot的过程是:
PC通电开机,PC上固有的BIOS(基本输入输出系统)对PC的硬件进行POST(Power On Self Test),之后,BIOS在第一块物理硬盘上寻找它上面的最外磁道(Track)上的第一个扇区(Sector),这个扇区被称为MBR(Master Boot Record,主引导记录)。对于硬盘来说,一个扇区的大小为512 Bytes。所以,MBR的大小恒定为512 Bytes。在这512B的空间中,开头的446B被规定为Bootstrap(有“启动代码”与“启动程序”两种翻译,但有的地方把“Boot Loader”也翻译为“启动程序”,汉语学界的翻译显得十分混乱,所以,最好的办法,还是遵守英语原文用法),随后的64B被规定为Partition Table(分区表),最后的2B为结束标志(被规定为“55AA”)。
[hr]
[backcolor=Red] 脚注 [/backcolor]
(4)“Boot”除了被翻译为“启动”之外,还普遍地被翻译为“引导”。两词经常混用。
[hr]
MBR(包括Bootstrap和Partition Table)经由BIOS被加载到内存的0x7c00位置(由于MBR有512B,所以,MBR在内存中的结尾,应该是在0x7c00 + 512B = 0x7dff位置),当确认MBR上最后2B的内容(结束标志,位置显然就应该在0x7dfe - 0x7dff)为55AA之后,位居MBR开头的Bootstrap被运行,运行的目的是,解读Partition Table,由此找到操作系统的内核的所在,或能够加载操作系统内核的程序(Boot Loader,除了被翻译为“启动程序”之外,还有一个不错的翻译叫做“启动管理器”)的所在。
在我小的时候,Boot一般用的是Floppy/Diskette(软盘)而非Hard Disk(硬盘)。将软盘插入软盘驱动器之后,一阵杠唧杠唧,操作系统(当时是DOS)就被加载并启动了。当时,非常憧憬自己可以制作一张那样Boot-able的软盘,即便没有操作系统,但也足以在开机之后玩出一些花样。
现在,当你们完成了这节课的目标 —— Vim Fundamentals之后,在UNIX系统上做出这样一张Boot-able磁盘,就是轻而易举的事情了。—— 最多只有512B的工作量!512B,就是半个KB,在屌丝们的“A片”当中,AV的主角们恐怕连一下动作也做不到。这算又是一个振奋人心的好消息吧,希望大家能够坚持学习!
关于Boot,最后再补充一下,前面提到的Bootstrap,也叫MBC(Master Boot Code)。当我们使用Microsoft Windows操作系统时,Windows系统将MBC写在MBR之内,当MBC被运行后,它将会加载NTLDR程序。而使用GNU/Linux,情况就灵活得许多,可为GNU/Linux服务的Boot Loader程序(比如著名的LILO和GRUB),即可以放在MBR之内,也可以放在MBR之外,即在root(根,请特别注意不要跟boot一词混淆)分区。如果采用后一种方法,就必须经由MBR上的MBC(可以跟GNU/Linux无关)将控制权交给Boot Loader。在x86架构下,此时Boot Loader只能藉由BIOS提供的“中断调用int 13H ah=8H”来获取Drive Parameters,而BIOS可以提供的关于磁盘Cylinder(柱面)的参数只有10bits,也就是说,只能表示从0到1023(2的10次方-1)这麽1024个数,所以,如果操作系统的内核位于硬盘的第1024个Cylinder之后,操作系统将无法被加载,Boot将归于失败。因此,我们一般在硬盘的最开头,布置一个/boot分区,将操作系统的内核放置其中,就可以确保BIOS可以寻找到它。
而对于FreeBSD,可以配合使用的Boot Loader除了LILO和GRUB之外,还有boot0。后者有两个特点:(1)它是FreeBSD的御定Boot Loader。(2)只有它的规格可以写入MBR,而其他的Boot Loaders都无法被MBR那512B的容量装下。
由于本课程的现阶段,不主张学员们使用双(多)操作系统,所以,FreeBSD提供的一个标准的MBR就足够用了。不过,上述的解说,已经足够为学员藉着LILO或GRUB规置双(多)操作系统打下坚实而清晰的基础了!
下面,我们讲“freebsd-ufs”。这里的“ufs”是指UNIX File System。这是我们的操作系统的“正文”所在。后面的教学内容会详细解说这一部分。
最后是“freebsd-swap”。这里的“swap”是“交换”的意思,代表了交换分区或交换空间(Swap Space)。交换空间非常类似于Microsoft Windows系统上的“虚拟内存”,也就是让操作系统将硬盘空间作为内存(RAM)来使用。一般规划这个空间的经验法则是:Swap的容量必须设置为RAM的容量的至少2倍,且不能少于64MB。
看完了Type这个部分,我们可以看Mountpoint这个部分了。(Size和Label,屌丝们不可能不懂吧。)
Mountpoint,即“挂载点”,这是UNIX-like系统知识中的一个难点和重点。它是许多UNIX-like初学者畏难情绪的渊薮。对于UNIX-like,有太多初学者浅尝辄止于此。它之所以对Microsoft Windows用户(屌丝们)带来这麽大的困扰,是因为它是UNIX-like分区与FHS(Filesystem Hierarchy Standard,文件系统层次结构标准)的结合点,而这两下都是Microsoft Windows用户所极端不适应的。
前面已经介绍了关于分区的基本知识,下面,我们要比较详细地学习一下FHS的基本知识。
屌丝们一定已经非常熟悉Microsoft Windows的文件层次结构了,诸如:
C:\Windows\
C:\Windows\System32\
C:\User\yourname\Documents\
C:\User\yourname\Application Data\
C:\Program Files\
C:\Program Files\Common Files\
而UNIX-like系统上的FHS,则要复杂(也更科学)得多。
以FreeBSD为例,分述如下:
Root Filesystem(根文件系统)
概论:Root Filesystem 位于整个层次结构的最顶端。它必须含有可以Boot操作系统的程序(专指Boot Loader)以及相关文件,以及挂载其他文件系统的能力。它的规模必须是精简的(为安全考虑)。应用软件不应该在它上面创建任何内容。它应该包括以下目录:
※ UNIX-like系统中没有Microsoft Windows或DOS下的那种诸如C:、D:、E:之类的盘符观念。
/ 文件系统的根目录,也就是“目录树”的最顶端。
/bin/ 存放着在单个用户和多用户环境下的基本工具,比如系统的基本命令,如ls、cp、cd、mkdir、rm等等。这些命令都具有“应急管理”的用途。
/sbin/ 与/bin/不同的是,这里存放着系统管理的基本工具,如fdisk、mkfs等。
/boot/ 存放着操作系统的内核镜像文件以及Boot Loader。但鉴于x86架构下有“第1024 Cylinder 限制”的问题,所以,在这样的限制下,往往为/boot/目录单独设置分区,有如前述的freebsd-boot类型分区。
/dev/ 设备节点目录。一切设备,如磁盘分区、终端等等,都必须以文件形式在这里存在。
/etc/ 存放着系统启动的配置和脚本。
/etc/defaults/ 存放着系统默认的启动配置和脚本。
/etc/periodic/ 存放着每天、每星期和每月周期性地运行的脚本。
/mnt/ 一般是空目录。系统管理员习惯利用它来挂载临时的文件系统,比如USB硬盘等。
/lib/ 存放着共享链接库和内核模块。
/media/ 类似于/mnt/。
/root/ root用户的Home(家)目录。请注意它和root文件系统的“root”(根、目录结构的顶层、根目录)完全不是一回事,千万不要混淆!它类似于Microsoft Windows下的C:\User\Administrator\ 。
/srv/ 存放着系统服务专属的数据文件。
/home/ 各用户的Home(家)目录的所在。它类似于Microsoft Windows下的C:\User\ 。
/tmp/ 存放着临时文件,这些文件的生命期不会超过下一次Booting。
/usr/ 存放着大多数用户的应用软件。下面有专门的讲解。
/var/ 多用途日志、 临时或短期存放的, 以及打印假脱机系统文件。
/var/log/ 存放着各种系统记录文件。
/var/lock/ 存放着各种锁定文件。所谓锁定文件,是一种应用程序用以标明自身存在或正在运行的标记,通常都是空文件。FreeBSD本身不带这个目录。
/var/run/ 存放着关于各运行着的软件的状态文件。作为服务而长期运行的程序在启动之后,会将自己的PID(进程ID)写成一个文件,存放于此处。
/proc/ 存放着虚拟文件系统。在这里,系统内核与进程状态,被归档为文本文件。
/opt/ 存放着对于操作系统来说是“额外的”软件及其所需的文件。FreeBSD本身不带这个目录。
/usr/ 目录
/usr/bin/ 存放着各种实用命令和应用软件,与/bin/不同的是,聚集在这里的东东,并非用于“应急管理”。
/usr/sbin/ 存放着系统后台程序、可供用户执行的系统工具,与/usr/bin/之于/bin/类似,聚集在这里的东东,并非用于“应急管理”。
/usr/include/ 主要存放着C和C++程序设计所用的头文件。
/usr/lib/ 类似于/lib/,但只包含各类应用程序的共享链接库,而不包含内核模块。
/usr/libdata/ 存放着各种实用工具的数据文件。它类似于Microsoft Windows下的\Application Data\。
/usr/libexec/ 存放着系统实用程序、后台程序。
/usr/share/ 存放着与硬件架构、操作系统版本无关的数据文件。这与/usr/bin/形成强烈的对比,后者被谓之为“bin”,就有“在特定架构下的二进制可执行代码”的意味。
/usr/local/ 存放着本地执行文件、 库文件等等, 同时也是 FreeBSD ports 安装的默认安装目录。 它的内部布局,大体类似于 /usr/ 中的。唯一被规定的限制在于:/usr/local/share/ 与 /usr/share/ 必须完全等效(通常用符号链接实现,类似于Microsoft Windows的“快捷方式”)。
/usr/src/ 存放着FreeBSD的源代码文件、本地程序的源码文件。
/usr/obj/ 存放着通过联编 /usr/src 而得到的目标文件。
/usr/ports/ 存放着 FreeBSD 的 Ports Collection 。
/usr/X11R6/ 存放着 XFree86软件及其所需的文件,如X11R6的可执行文件、库文件、配置文件等。在大多数UNIX-like上,X Window系统就直接部署在此处,所以许多X的应用软件也默认地如此认为,所以不要擅自变更它的位置。
下面,我们介绍“挂载点”。
在上面,我们反复提到了一个名词 —— File System(文件系统)。不同于Microsoft Windows或DOS观念下的File System其实是“分区类型” [backcolor=Red] 注5 [/backcolor] 的意思,在UNIX-like体系中,File System则是Directory Tree(目录树)的意思。
[hr]
[backcolor=Red] 脚注 [/backcolor]
(5)Microsoft Windows或DOS支持的分区类型有FAT、FAT32、NTFS等。在UNIX-like阵营,则有Ext2、Ext3、Ext4、XFS、JFS、ReiserFS等等。
[hr]
提到“目录树”,屌丝们也不会陌生,因为Microsoft Windows上就有这种现象 —— 目录层次如“树干(根)–树枝”状分布。在UNIX-like世界里,也是类似的,只不过,它采用了单目录树的设计。那么,我们所设置的分区,都将以 Mount(挂载)的方法,加入到这单独一棵树上。而各分区与这棵大树的众结点,就是所谓的挂载点。
也就是说,只有分区被挂载到目录树上(的挂载点),它们才可以被访问/存取。而挂载这种方法,甚至可以延伸地作用到不在本地电脑的、网络上的某处文件体系身上。用户若不特别加以关注,是无法判断他/她面前的这个/usr/目录是位于本地电脑上,还是位于远程的某个主机上。对于没有参与或观察挂载操作的用户来说,他/她无法觉察到挂载的具体细节,他/她所面对的,惟有一棵完整而自洽的目录树。就从这一点上来说,UNIX-like的挂载机制,就比Microsoft Windows的类似实现要高明得多 —— 在Microsoft Windows上,必须将远程文件体系(一个卷即逻辑磁盘/分区或一个文件夹)“映射”为“我的电脑”下的一个卷,并须为之配备一个卷符(盘符),且有格格不入的图标,显得十分拖沓与累赘。
正是UNIX-like利用了挂载机制,才使得LiveCD(可以只在光盘/U盘上运行而完全无需硬盘的操作系统)成为可能 —— 即文件系统的根目录并不被本地的物理硬盘所挂载。
综上所述,挂载点成为各分区以分支目录形式接入目录树的入口。另一方面,若分区没有被挂载,那么,对应的分支目录里面就是空的。此外,要特别注意的是:当UNIX-like系统启动时,首先被挂载的是由 Boot Loader所提供其具体位置的 Root Filesystem,而后系统依据/etc/fstab文件的具体内容,逐项挂载其他的Filesystems。
现在,我们用图表来展现相关的内容。在下面的例子中,我们有两块物理硬盘,第一块是SATA的,被标为ada0,第二块是SCSI的,被标为da0。

我们看到,在上述分区与挂载方案中,除了/(根目录)与Swap Space之外,我们还为/boot、/home、/tmp、/var、/usr这五个分支目录单独地设置了分区,并将它们挂载到Root Filesystem上 —— 将哪些分支目录设置为独立的分区,并没有任何硬性的强制规定,施行何种规置方案,取决于用户的个人习惯与使用环境的技术要求。
一般说来,为/boot、/home、/tmp、/var、/usr这五个分支目录设置独立的分区,缘由是这样的:
/boot 前面已经说过了,为这个目录设置独立的分区,主要是为了规避x86架构下有“第1024 Cylinder 限制”。
/home 这里存放着属于用户自己的文件。对于一个具有实用的面向多用户的系统(比如为多用户服务的在线服务器)来说,这个目录是最主要的工作空间,也是最耗费硬盘资源的区域,所以,非常有必要为此目录设置独立的分区,甚至为其配备独立的物理硬盘或磁盘阵列。然而,对于那些具有另外特殊用途的系统(比如Router(路由器))来说,这个目录却是几乎是无用的。
/tmp 由于这里存放着临时文件,且其中的数据访问权限是完全开放的,所以就有必要为其设置独立的分区,从而避免某些心怀恶意的使用者往其中充塞大量垃圾数据以至于侵扰系统上其他部分的合法资源。
/var 正如这个目录的名字(Variable)所揭示的,这里存放的数据富于变化性,这些数据包括了诸如Log(日志)之类的文件。与为/tmp设置独立分区的理由类似,一旦自动轮替机制(最新的信息会覆盖掉最旧的信息)失效,独立分区的方案可以避免大量的数据挤占系统上其他部分的合法资源。
/usr 前面我们看到,这个目录的结构与根目录的结构非常类似,可谓是一个“小根目录”,所以它的结构与内容也颇为庞杂,且耗费的硬盘资源也是相当可观的,并且它里面的内容可以是Read-Only(只读不写)的,所以,我们有非常充分的理由,为它设置独立的分区(甚至可以用只读模式来挂载它)。
下面,给出一个分配硬盘资源并设置分区与挂载点的例子,供学员们参考。
还是假设有两块物理硬盘,第一块是SATA的,容量是400GB,第二块是SCSI的,容量是800GB,再假设电脑内存容量是8GB。
/dev/ada0p1 freebsd-boot /boot 512MB(对于FreeBSD来说,推荐的为64KB的boot设置,而上限是545KB。)
/dev/ada0p2 freebsd-ufs / 40GB
/dev/ada0p3 freebsd-ufs /usr 359.5GB
/dev/da0p1 freebsd-ufs /tmp 16GB
/dev/da0p2 freebsd-ufs /var 200GB
/dev/da0p3 freebsd-ufs /home 560GB(如果系统上用户不多,可以适当缩减此项配额,转而扩大/var所在的分区规模)
/dev/da0p4 freebsd-swap swap 24GB
※ 这里出现的路径“/dev/”表示:分区都是以“/dev/”目录下的文件形式存在于系统之中的 —— 这一点,在“Partition Editor”阶段并不会显明,但以后我们会体会到这一点。
学员可以根据自己的电脑的实际情况以及自己的具体需求,设置分区与挂载点。
在设置过程中,若出现错误,想“反悔”时,可以用<Revert>回滚。
若想调整、补充已经设置好的内容,可以用<Modify>。
对于Boot分区(freebsd-boot)与Swap Space(freebsd-swap),挂载点都不必填写。
顺便说一句,其实,UNIX-like系统的分区与挂载点设置,一点都不难,跟屌丝们在Microsoft Windows里配置他们电脑的道理是一样的,比如说,如果屌丝们的电脑上挂有两块硬盘,一块较小一块很大,较小的那块硬盘设两个分区:C盘装系统,D盘安放应用程序(软件);很大的那块硬盘也设两个分区:E盘存放自己的普通文档,而F盘则非常非常大,且目录层次也异常庞杂,用来存放长年日以继夜下载得来并严选珍存的“A片”…… 屌丝们把捣鼓自己Windows下的硬盘资源的那种废寝忘食的劲头,分一些些在学习UNIX-like上,那也足够让自己脱屌了!
当一切确认无误之后,选择<Finish>,设置将会生效,且硬盘将进入准备格式化阶段。在接下来的“Confirmation”对话框中,程序给出“data will be PERMANENTLY ERASED”(硬盘数据将被永久抹除)的警告,选择<Commit>进行确认。
只要你对于上述每一步操作都认真仔细地完成(并检查确认)了,那么,接下来,你就可以松一口气了,FreeBSD系统进入自动安装阶段。
这一阶段的安装结束之后,进入设置系统基本信息阶段,此时,画面回到单色的TUI界面,要求你设置root密码 —— root是整个系统的最高级管理员。
接着又进入“Network Configuration(网络配置)”界面,此时,会显示出系统所寻找到的网络适配器(一般就是俗称“网卡”),如果仅有一个适配器,就直接按<Ok>进入下一步,如果适配器不止一个,则要逐个配置。
接下来出现的对话框,是询问用户是否要为选定的适配器设置IPv4和DHCP,可以直接按<Yes>让系统自行继续。之后则是IPv6,这个可以暂时忽略选择<No>。
之后,会出现IPv4 DNS的设置,这跟Microsoft Windows中关于网络适配器的TCP/IP设置很类似,一般就使用你的路由器的IP地址,比如就是系统自动获取到的192.168.1.1等。
接下来,是“Select local or UTC clock”的对话框,对于中国学员,可以选<No>继续。之后,选择国家或地区(比如Asia->China或Hong Kong或Taiwan)。
而后,进入“System Configuration”界面,这里需要你选择需要开启的系统服务,一般地,用空格键全部选中,然后按<Ok>。接着,进入“Dumpdev Configuration”对话框,这里提示该项功能会透过/var目录耗用大量磁盘空间,如果满足这个条件,就可以按<Yes>继续。
接下来,进入“Add User Accounts”界面,强烈建议你选<Yes>为系统增加新的用户 —— 在UNIX-like的使用过程中,要尽量避免使用root账户来进行日常的一般性操作,应该代之以普通用户的身份行事。
此时,应该根据提示,逐项输入信息。
最后,进入“Final Configuration”界面,可以直接选定Exit结束整个安装过程,但之后又会有提示“Manual Configuration”即系统可以提供一个Shell界面让用户可以手动配置系统,我们选<Yes>。
此时,我们就正式进入了最具UNIX-like本色的操作环境 —— Shell!
下面,我们要开始学习关于Shell以及CLI的一些基本知识,并藉着这样的途径,开始进一步(但仍然是初阶地)了解UNIX-like系统。
我们使用电脑,无非是向电脑(系统)表达我们的意图 —— 这种意图的表达,是以Command(命令)方式存在的,而命令则是以Text(文本,即由键盘输入的信息,与利用鼠标进行点击、拖拽等的图形界面相对)形式存在的,然后,我们期待电脑就我们的命令做出相应的反馈。
我们希望向电脑表达的意图,通常是这样的:
I want you(指电脑) to get/do/make/take something in some way.
在所有的这样的意图表述中,“I want you”这个部分是雷同的,所以,就可以省略它。那么,上面的语句就可以表达为:
To get/do/make/take something in some way.
在自然语言的语法看来,“To get/do/make/take”是谓语动词,所以,我们将它统合地概念化为:
V
而“something”是V的Object(对象,宾语),所以,我们将它概念化为:
O
因此, “To get/do/make/take something”就可以概念化为:
V(O)
而最后的“in some way”则是表达了进行V(O)所须要遵从的法则、方法、依据(Argument),所以,我们将它概念化为:
A
那么,“To get/do/make/take something in some way.”就可以概念化为:
V(O,A)
或
V(A,O)
我们将O与A放在V所作用的同一对括号中,暗示着:在V看来,O和A的概念可以彼此交换(混同),也就是说,对于某些场景,在V看来,A也可以被当作O,反之亦然。
举个例子:我们希望系统将当前目录的上一级目录中的文件foo.bar复制到当前目录来,自然语言的表达是:
To copy the file which name is “foo.bar “ and which is in the parent directory from there to the current directory.
按照V(O,A)的概念范式,这里的V是“copy”,O是“the file which name is “foo.bar “ and which is in the parent directory”,A则是“from there to the current directory”。
在UNIX-like命令体系中:
V是“cp”。
O则用“../foo.bar”表达 —— 其中的“../”表示“the parent directory(当前目录的上一级目录)”。
A则用“./”表达 —— 其中的“./”表示“the current directory(当前目录)”。
于是,整个意图用命令表达就是:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
