This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
<audio id="audio" title="01 | 入学测验你究竟对Linux操作系统了解多少" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/29/f3/294761293f283421c13a251899acf1f3.mp3"></audio>
<img src="https://static001.geekbang.org/resource/image/1d/30/1d29bf1eb0f943a91fd233105f06c830.jpg" alt=""><img src="https://static001.geekbang.org/resource/image/be/0e/bec42567b46fe69e4e4d4e427f625c0e.jpg" alt=""><img src="https://static001.geekbang.org/resource/image/5a/fd/5a48f52da754b201ff4ca1ab831875fd.jpg" alt=""><img src="https://static001.geekbang.org/resource/image/96/e2/96c2368e46d049dd60f85b82c7cbb1e2.jpg" alt=""><img src="https://static001.geekbang.org/resource/image/4f/52/4fc17ea8b6877c8a3fe7cbb906575e52.jpg" alt=""><img src="https://static001.geekbang.org/resource/image/5f/f5/5f5d850a0eb1998da4005a378078a7f5.jpg" alt=""><img src="https://static001.geekbang.org/resource/image/7f/99/7f42798b9aa414fe10bd240963854e99.jpg" alt="">
[<img src="https://static001.geekbang.org/resource/image/00/f2/00f868b7654dcb50ae2c91fd7688d2f2.jpg" alt="unpreview">](time://mall?url=https%3A%2F%2Fj.youzan.com%2FG69gDi)<br>
限量发售中仅限5000份3大体系22个模块定位工作中80%的高频问题。

View File

@@ -0,0 +1,114 @@
<audio id="audio" title="02 | 学习路径爬过这六个陡坡你就能对Linux了如指掌" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/ae/7e/ae339f4a53a07f03795c1c46fa43c67e.mp3"></audio>
很多人觉得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有源代码很多地方可以参考现有的实现定制化自己的模块。例如你可以自己实现一个设备驱动程序实现一个自己的系统调用或者实现一个自己的文件系统等等。
<img src="https://static001.geekbang.org/resource/image/9e/85/9e970ed142da439f6fbe6d7c06f11785.jpeg" alt="">
这个难度比较大涉及的细节比较多上一个阶段我的建议是不计较一城一地的得失不需要每个细节都搞清楚这一个阶段要求就更高了。一旦代码有一个细微的bug都有可能导致实验失败。
专栏最后一个部分,我专门设计了两个实验,帮你度过这个坎。只要跟着我的步伐进行学习,接下来,就没人能够阻挡你成为一名内核开发工程师了。
## 最后一个坡:面向真实场景的开发,实践没有终点
说了这么多,我们都只是走出了万里长征第一步。我始终坚信,真正的高手都是在实战中摸爬滚打练出来的。
如果你是运维,仅仅熟悉上面基本的操作是不够的,生产环境会有大量的不可控因素,尤其是集群规模大的更是如此,大量的运维经验是实战来的,不能光靠读书。如果你是开发,对内核进行少量修改容易,但是一旦面临真实的场景,需要考虑各种因素,并发与并行,锁与保护,扩展性和兼容性,都需要真实项目才能练出来。
## 总结时刻
今天我把爬坡的过程分解成了六个阶段并给你分享了我的私家爬坡宝典。你都记住了吗我把今天的内容总结成了下面这张图。建议你牢牢记住这张图在接下来的四个月中按照这个路径稳步前进攻克Linux操作系统。
<img src="https://static001.geekbang.org/resource/image/bc/5b/bcf70b988e59522de732bc1b01b45a5b.jpeg" alt="">
## 课堂练习
你可以结合第一节的测试结果,并根据我今天讲的爬坡方法,思考一下,在接下来的四个月里,你准备怎么学习这个专栏。
欢迎在留言区写下你的**爬坡计划**,也欢迎你把今天的文章分享给你的朋友,和他一起学习、进步。
编辑乱入:超哥推荐的图书,部分已上架极客时间商城,点击下方图片,即可购买。和专栏一起配合使用,学习效果会更好哦!
[<img src="https://static001.geekbang.org/resource/image/6b/68/6bae103a79601bddd51b87f4e838e868.jpg" alt="">](https://h5.youzan.com/v2/feature/2VpBYpR2As)
[<img src="https://static001.geekbang.org/resource/image/00/f2/00f868b7654dcb50ae2c91fd7688d2f2.jpg" alt="unpreview">](time://mall?url=https%3A%2F%2Fj.youzan.com%2FG69gDi)<br>
限量发售中仅限5000份3大体系22个模块定位工作中80%的高频问题。

View File

@@ -0,0 +1,90 @@
<audio id="audio" title="开篇词 | 为什么要学习Linux操作系统" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/bd/16/bd7af6a01d606dadc8ed1f2f78dea916.mp3"></audio>
你好,我是你的老朋友刘超。在“[趣谈网络协议](https://time.geekbang.org/column/intro/85?utm_term=zeusMX7NJ&amp;utm_source=app&amp;utm_medium=geektime&amp;utm_campaign=85-end&amp;utm_content=caozuoxitongkaipianci)”结课半年之后我又给你带来了一个新的基础课程“趣谈Linux操作系统”。
在“趣谈网络协议”的开篇词中我表达了作为一个合格的IT工程师在职业生涯中学习基础知识的重要性。如果说当时我对这件事只是一种感性认识在专栏推出之后我的想法有了一些变化。
我通过留言区和同学们进行了很多互动,也和其他做基础知识专栏的作者有了不少交流,我发现,**无论是从个人的职业发展角度,还是从公司招聘候选人的角度来看,扎实的基础知识是很多人的诉求**。这让我更加坚信,我应该在“趣谈”基础知识这条道路上走下去。
目前极客时间的专栏覆盖了网络、算法、数学、数据库、编程语言等各个方面而操作系统也是基础中非常重要的一环。尤其我作为一名云架构师Linux操作系统的基础知识更是必不可少的。在实践中收获了很多心得之后我希望在极客时间继续跟你分享。
你可能会说,**我们大学里上过操作系统的课,而且每天都在用操作系统,为什么还要专门学一遍呢**?尽管我的操作系统课成绩不错,但是在大学的时候,我和你的看法一样,我觉得这门课没有什么用,现在回想起来可能有这样几个原因。
第一大学里普遍使用的操作系统是Windows老师大多也用Windows。Windows的优势是界面友好很容易上手于是我们就养成了要配置东西了就去菜单找用鼠标点点的习惯似乎会攒电脑、装系统、配软件就能搞定一切问题。
第二一种操作系统对应的是一系列的软件生态而大学里很多课程都是围绕Windows软件生态展开的。例如学C++用的是Vistual Studio学数据库用的是SQL Server做网站用的是IIS等等。
第三大学里的操作系统课往往都是纯讲理论讲了很多原理但是压根儿没法和平时用的Windows系统的行为关联起来也根本弄不清操作系统在底层到底是怎么做的。
直到毕业之后我加入EMC第一个项目就是基于Linux开发分布式文件系统。你能想象只能对着一个黑框敲命令时我心中的崩溃吗我那时真的觉得我大学的操作系统算是白学了。于是我痛定思痛开启了学习Linux的征程。
一旦开始学我发现Linux对于编程世界来说简直就像一扇门。尽管门里的知识浩如烟海每一本书都厚如砖头但我发现这条路上任何一片景色都精彩无比。
## 打开Linux操作系统这扇门你才是合格的软件工程师
根据2018年W3Techs的数据统计对于服务器端Unix-Like OS占的比例近70%其中Linux可以称得上是中流砥柱。随着移动互联网的发展客户端基本上以Android和iOS为主。Android是基于Linux内核的因而客户端也进入了Linux阵营。可以说**在编程世界中Linux就是主流不会Linux你就会格格不入。**
那些火得不行的技术什么云计算、虚拟化、容器、大数据、人工智能几乎都是基于Linux技术的。那些牛得不行的系统团购、电商、打车、快递都是部署在服务端也几乎都是基于Linux技术的。
所以说如果你想进大公司想学新技术Linux一定是一道绕不过去的坎。只有进入Linux操作系统这扇门你才能成为合格的软件工程师。
## 研究Linux内核代码你能学到数据结构与设计模式的落地实践
Linux最大的优点就是开源。作为程序员有了代码啥都好办了。只要有足够的耐心我们就可以一层一层看下去看内核调度函数看内存分配过程。理论理解起来不容易但是一行行的“if-else”却不会产生歧义。
在Linux内核里你会看到数据结构和算法的经典使用案例你甚至还会看到并发情况下的保护这种复杂场景在实践中遇到问题的时候你可以直接参考内核中的实现。
例如平时看起来最简单的文件操作通过阅读Linux代码你能学到从应用层、系统调用层、进程文件操作抽象层、虚拟文件系统层、具体文件系统层、缓存层、设备I/O层的完美分层机制尤其是虚拟文件系统对于接入多种类型文件系统的抽象设计在很多复杂的系统里面这个思想都能用得上。
再如,当你写代码的时候,大部分情况下都可以使用现成的数据结构和算法库,但是有些场景对于内存的使用需要限制到很小,对于搜索的时间需要限制到很小的时候,我们需要定制化一些数据结构,这个时候内核里面这些实现就很有参考意义了。
## 了解Linux操作系统生态能让你事半功倍地学会新技术
Linux是一个生态里面丰富多彩。很多大牛都是基于Linux来开发各种各样的软件。可以这么说只要你能想象到的技术领域几乎都能在里面找到Linux的身影。
数据库MySQL、PostgreSQL消息队列RabbitMQ、Kafka大数据Hadoop、Spark虚拟化KVM、Openvswitch容器Kubernetes、Docker这些软件都会默认提供Linux下的安装、使用、运维手册都会默认先适配Linux。
因此在Linux环境下很容易能够找到现成的工具这不仅会让你的工作事半功倍还能让你有亲密接触大牛思想的机会这对于你个人的技术进步和职业发展都非常有益。
如果不进入Linux世界你恐怕很难享受到开源软件如此多的红利。
考虑到以上这些在设计“趣谈Linux操作系统”专栏的时候我主要秉承两大原则希望能够帮你打开Linux操作系统这扇门。
第一个原则仍然是“**趣谈**”。我希望通过故事化的方式,将枯燥的基础知识结合某个场景,给你生动、具象地讲述出来,帮你加深理解、巩固记忆、夯实基础。
操作系统是干什么的呢我们都知道一台物理机上有很多硬件最重要的就是CPU、内存、硬盘、网络。同时一台物理机上也要跑很多程序这些资源应该给谁用呢当然是大家轮着用谁也别独占谁也别饿着。为了完成资源分配这件事操作系统承担了一个“大管家”的作用。它将硬件资源分配给不同的用户程序使用并且在适当的时间将这些资源拿回来再分配给其他的用户进程。
鉴于操作系统这个“大管家”的角色,我设计了一个故事,将各个知识点串起来,来帮助你理解和记忆。
假设,我们现在就是在做一家外包公司,我们的目标是把这家公司做上市。其中,操作系统就是这家外包公司的老板。我们把这家公司的发展阶段分为这样几个时期:
<li>
**初创期**这个老板基于开放的营商环境x86体系结构创办一家外包公司系统的启动。因为一开始没有其他员工老板需要亲自接项目实模式
</li>
<li>
**发展期**:公司慢慢做大,项目越接越多(保护模式、多进程),为了管理各个外包项目,建立了项目管理体系(进程管理)、会议室管理体系(内存管理)、文档资料管理系统(文件系统)、售前售后体系(输入输出设备管理)。
</li>
<li>
**壮大期**:公司越来越牛,开始促进内部项目的合作(进程间通信)和外部公司合作(网络通信)。
</li>
<li>
**集团化**公司的业务越来越多会成立多家子公司虚拟化或者鼓励内部创业容器化这个时候公司就变成了集团。大管家的调度能力不再局限于一家公司而是集团公司Linux集群从而成功上市从单机操作系统到数据中心操作系统
</li>
<img src="https://static001.geekbang.org/resource/image/80/5d/80a4502300dfa51c8520001c013cee5d.jpeg" alt="">
第二个原则就是**图解**。Linux操作系统中的概念非常多数据结构也很多流程也复杂一般人在学习的过程中很容易迷路。所谓“一图胜千言”我希望能够通过图的方式将这些复杂的概念、数据结构、流程表现出来争取用一张图串起一篇文章的知识点。最终整个专栏下来你如果能把这些图都掌握了你的知识就会形成体系和连接。在此基础上再进行深入学习就会如鱼得水、易如反掌。
<img src="https://static001.geekbang.org/resource/image/bf/02/bf0bcbea6a24bc5084bc0d4ffca7c502.jpeg" alt="">
例如,这张图就表示了文件操作在各个层的数据结构的关联。只要你学完之后,能对着这张图将它们之间的关系讲清楚,对于文件系统的部分,你就会了然于心了。
一段新的征途即将开始今天就是“开学典礼”。从今天开始在接下来的四个月时间里我会带你一步一步进入Linux操作系统的大门让基础变成你技术生涯的左膀右臂。
在开始正式学习之前,我也想听你讲讲,之前你在学习和工作过程中,遇到过哪些操作系统相关的问题,有哪些困惑,又有哪些经验,也可以谈谈你对新学期的期许。
欢迎在留言区和我分享。
[<img src="https://static001.geekbang.org/resource/image/19/bc/19bc90ffcf4b1fba4938727e5bc0ecbc.jpg" alt="unpreview">](time://mall?url=https%3A%2F%2Fshop18793264.youzan.com%2Fv2%2Fgoods%2F1y7qqgp3ghd2g%3Fdc_ps%3D2347114008676525065.200001)
Linux知识地图2.0典藏版现货发售2000份把5米长的图谱装进背包1分钟定位80%的高频问题。