You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
13 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 02 | 学习路径爬过这六个陡坡你就能对Linux了如指掌
很多人觉得Linux操作系统刚开始学起来很难主要是因为我们平时办公或者学习用的都是Windows系统而Windows和Linux的使用模式是完全不一样的。
Windows的基本使用模式是“**图形化界面+菜单**”。也就是说,无论我们做什么事情,首先要找一个图形化的界面。在这里面,“开始”菜单是统一的入口,无论是运行程序,还是做系统设置,你都能找到一个界面,界面上会有各种各样的输入框和菜单。我们只要挨个儿看过去,总能找到想操作的功能。实在不行,还有杀手锏,就是右键菜单,挨个儿一项一项看下去,最终也能实现想做的操作。
如果你刚刚上手Linux就会发现情况完全不一样。你基本是这也找不着那也找不着觉得Linux十分难用从而“从入门到放弃”。
Linux上手难学习曲线陡峭所以它的学习过程更像一个**爬坡模式**。这些坡看起来都很陡但是一旦爬上一阶就会一马平川。你会惊叹Linux的设计之美而Linux的灵活性也会使得你有N多种方法解决问题从而事半功倍你就会有一切尽在掌握的感觉。只可惜大部分同学都停留在了山脚下。
那怎样才能掌握这项爬坡技能呢?我们首先需要明确,我们要爬哪些坡。
我总结了一下在整个Linux的学习过程中要爬的坡有六个分别是熟练使用Linux命令行、使用Linux进行程序设计、了解Linux内核机制、阅读Linux内核代码、实验定制Linux组件以及最后落到生产实践上。以下是我为你准备的爬坡秘籍以及辅助的书单弹药。
## 第一个坡抛弃旧的思维习惯熟练使用Linux命令行
上手Linux的第一步要先从Windows的思维习惯切换成Linux的“**命令行+文件**”使用模式。
在Linux中无论我们做什么事情都会有相应的命令工具。虽然这些命令一般会在bin或者sbin目录下面但是这些命令的数量太多了。如果你事先不知道该用哪个命令很难通过枚举的方式找到。因此在这样没有统一入口的情况下就需要你对最基本的命令有所掌握。
一旦找到某个命令行工具,替代输入框的是各种各样的启动参数。这些参数怎么填,一般可以通过-h查看help挨个儿看过去就能找到相应的配置项还可以通过man命令查看文档。无论是什么命令行工具最终的配置一般会落到一个文件上只要找到了那个文件文件中会有注释也可以挨个儿看下去基本就知道如何配置了。
这个过程可能非常痛苦,在没有足够熟练地掌握命令行之前,你会发现干个非常小的事情都需要搜索半天,读很多文档,即便如此还不一定能得到期望的结果。这个时候你一定不要气馁,坚持下去,继续看文档、查资料,慢慢你就会发现,大部分命令的行为模式都很像,你几乎不需要搜索就能完成大部分操作了。
恭喜你这个时候你已经爬上第一个坡了。这个时候你能看到一些很美丽的风景例如一些很有技巧的命令sed和awk、很神奇的正则表达式、灵活的管道和grep、强大的bash。你可以自动化地做一些事情了例如处理一些数据会比你使用Excel要又快又准关键是不用框框点点在后台就能完成一系列操作。在处理数据的同时你还可以干别的事情半夜处理数据第二天早上发个邮件报告这都是Excel很难做到的事情。
不过在这个专栏里命令行并不是我们的重点但是考虑到一些刚起步的同学在第一部分我会简单介绍一些能够让你快速上手Linux的命令行。专栏每一模块的第一节我都会有针对性地讲解这一模块的常用命令足够你把Linux用起来。
如果你想全面学习Linux命令推荐你阅读《**鸟哥的Linux私房菜**》。如果想再深入一点,推荐你阅读《**Linux系统管理技术手册**》。这本砖头厚的书可以说是Linux运维手边必备。
## 第二个坡通过系统调用或者glibc学会自己进行程序设计
命令行工具也是程序只不过是别人写的程序。从用别人写的程序到自己能够写程序通过程序来操作Linux这是第二个要爬的坡。
用代码操作Linux可以直接使用Linux系统调用也可以使用glibc的库。
Linux的系统调用非常多而且每个函数都非常复杂传入的参数、返回值、调用的方式等等都有很多讲究。这里面需要掌握很多Linux操作系统的原理否则你会无法理解为什么应该这样调用。
刚开始学Linux程序设计的时候你会发现它比命令行复杂得多。因为你的角色再次变化这是为啥呢我这么说估计你就能理解了。
**如果说使用命令行的人是吃馒头的,那写代码操作命令行的人就是做馒头的**。看着简简单单的一个馒头可能要经过N个工序才能蒸出来。同样你会发现你平时用的一个简单的命令行却需要N个系统调用组合才能完成。其中每个系统调用都要进行深入地学习、读文档、做实验。
经过一段时间的学习你啃下了这些东西恭喜你又爬上了一个坡。这时候你已经很接近操作系统的原理了你能看到另一番风景了。大学里学的那些理论你再回去看现在就会开始有感觉了。你本来不理解进程树调用了fork就明白了你本来不理解进程同步机制调用了信号量也明白了你本来分不清楚网络应用层和传输层的分界线调用了socket都明白了。
同样专栏的第一模块我会简单介绍一下Linux有哪些系统调用每一模块的第一节我还会讲解这一模块的常用系统调用以及如何编程调用这些系统调用。这样可以使你对Linux程序设计入个门但是这对于实战肯定是远远不够的。如果要进一步学习Linux程序设计推荐你阅读**《UNIX环境高级编程》**,这本书有代码,有介绍,有原理,非常实用。
## 第三个坡了解Linux内核机制反复研习重点突破
当你已经会使用代码操作Linux的时候你已经很希望揭开这层面纱看看系统调用背后到底做了什么。
这个时候,你的角色要再次面临变化,**就像你蒸馒头时间长了,发现要蒸出更好吃的馒头,就必须要对面粉有所研究**。怎么研究呢?当然你可以去面粉厂看人家的加工过程,但是面粉厂的流水线也很复杂,很多和你蒸馒头没有直接关系,直接去看容易蒙圈,所以这时候你最好先研究一下,面粉制造工艺与馒头口味的关系。
对于Linux也是一样的进一步了解内核的原理有助于你更好地使用命令行和进行程序设计能让你的运维和开发水平上升一个层次但是我不建议你直接看代码因为Linux代码量太大很容易迷失找不到头绪。最好的办法是先了解一下Linux内核机制知道基本的原理和流程就可以了。
一旦学起来的时候你会发现Linux内核机制也非常复杂而且其中相互关联。比如说进程运行要分配内存内存映射涉及文件的关联文件的读写需要经过块设备从文件中加载代码才能运行起来进程。这些知识点要反复对照才能理清。
但是一旦爬上这个坡你会发现Linux这个复杂的系统开始透明起来。无论你是运维还是开发你都能大概知道背后发生的事情并在出现异常的情况时比较准确地定位到问题所在。
Linux内核机制是我们这个专栏重点要讲述的部分我会基于最新4.x的内核进行讲解当然我也意识到了内核机制的复杂性所以我选择通过故事性和图形化的方式帮助你了解并记住这些机制。
这块内容的辅助学习,我推荐一本《**深入理解LINUX内核**》。这本书言简意赅地讲述了主要的内核机制。看完这本书你会对Linux内核有总体的了解。不过这本书的内核版本有点老不过对于了解原理来讲没有任何问题。
## 第四个坡阅读Linux内核代码聚焦核心逻辑和场景
在了解内核机制的时候,你肯定会遇到困惑的地方,因为理论的描述和提炼虽然能够让你更容易看清全貌,但是容易让你忽略细节。
我在看内核原理的书的时候也遇到过这种问题有的地方实在是难以理解或者不同的书说的不一样这时候该怎么办呢其实很好办Linux是开源的呀我们可以看代码呀代码是精准的。哪里有问题找到那段代码看一看很多问题就有方法了。
另外,当你在工作中需要重点研究某方面技术的时候,如果涉及内核,这个时候仅仅了解原理已经不够了,你需要看这部分的代码。
但是开源软件代码纷繁复杂,一开始看肯定晕,找不着北。这里有一个诀窍,就是**一开始阅读代码不要纠结一城一池的得失,不要每一行都一定要搞清楚它是干嘛的,而要聚焦于核心逻辑和使用场景**。
一旦爬上这个坡对于操作系统的原理你应该就掌握得比较清楚了。就像蒸馒头的人已经将面粉加工流程烂熟于心。这个时候你就可以有针对性地去做课题把所学和你现在做的东西结合起来重点突破。例如你是研究虚拟化的就重点看KVM的部分如果你是研究网络的就重点看内核协议栈的部分。
在专栏里我在讲述Linux原理的同时也会根据场景和主要流程来分析部分代码例如创建进程、分配内存、打开文件、读写文件、收发网络包等等。考虑到大量代码粘贴会让你看起来比较费劲也会占用大量篇幅所以我采取只叙述主要流程只放必要的代码大部分的逻辑和相互关系尽量通过图的方式展现出来给你讲解。
这里也推荐一本书,《**LINUX内核源代码情景分析**》。这本书最大的优点是结合场景进行分析,看得见、摸得着,非常直观,唯一的缺点还是内核版本比较老。
## 第五个坡实验定制化Linux组件已经没人能阻挡你成为内核开发工程师了
纸上得来终觉浅,绝知此事要躬行。从只看内核代码,到上手修改内核代码,这又是一个很大的坎。这相当于蒸馒头的人为了定制口味,要开始修改面粉生产流程了。
因为Linux有源代码很多地方可以参考现有的实现定制化自己的模块。例如你可以自己实现一个设备驱动程序实现一个自己的系统调用或者实现一个自己的文件系统等等。
![](https://static001.geekbang.org/resource/image/9e/85/9e970ed142da439f6fbe6d7c06f11785.jpeg)
这个难度比较大涉及的细节比较多上一个阶段我的建议是不计较一城一地的得失不需要每个细节都搞清楚这一个阶段要求就更高了。一旦代码有一个细微的bug都有可能导致实验失败。
专栏最后一个部分,我专门设计了两个实验,帮你度过这个坎。只要跟着我的步伐进行学习,接下来,就没人能够阻挡你成为一名内核开发工程师了。
## 最后一个坡:面向真实场景的开发,实践没有终点
说了这么多,我们都只是走出了万里长征第一步。我始终坚信,真正的高手都是在实战中摸爬滚打练出来的。
如果你是运维,仅仅熟悉上面基本的操作是不够的,生产环境会有大量的不可控因素,尤其是集群规模大的更是如此,大量的运维经验是实战来的,不能光靠读书。如果你是开发,对内核进行少量修改容易,但是一旦面临真实的场景,需要考虑各种因素,并发与并行,锁与保护,扩展性和兼容性,都需要真实项目才能练出来。
## 总结时刻
今天我把爬坡的过程分解成了六个阶段并给你分享了我的私家爬坡宝典。你都记住了吗我把今天的内容总结成了下面这张图。建议你牢牢记住这张图在接下来的四个月中按照这个路径稳步前进攻克Linux操作系统。
![](https://static001.geekbang.org/resource/image/bc/5b/bcf70b988e59522de732bc1b01b45a5b.jpeg)
Linux操作系统爬坡路线图
## 课堂练习
你可以结合第一节的测试结果,并根据我今天讲的爬坡方法,思考一下,在接下来的四个月里,你准备怎么学习这个专栏。
欢迎在留言区写下你的**爬坡计划**,也欢迎你把今天的文章分享给你的朋友,和他一起学习、进步。
编辑乱入:超哥推荐的图书,部分已上架极客时间商城,点击下方图片,即可购买。和专栏一起配合使用,学习效果会更好哦!
[![](https://static001.geekbang.org/resource/image/6b/68/6bae103a79601bddd51b87f4e838e868.jpg)](https://h5.youzan.com/v2/feature/2VpBYpR2As)
[![unpreview](https://static001.geekbang.org/resource/image/00/f2/00f868b7654dcb50ae2c91fd7688d2f2.jpg)](time://mall?url=https%3A%2F%2Fj.youzan.com%2FG69gDi)
限量发售中仅限5000份3大体系22个模块定位工作中80%的高频问题。