如何更深入地学习Linux?
问:如何更深入地学习 Linux?
我是一个在校的大二学生,对 Linux 非常感兴趣,以后想往 Linux 方向发展,现在能熟练的操作 Linux 系统,基本上熟悉了各种命令,也能写一些 shell 脚本,平时写代码都用 Linux,基本上可以独立搭建各种开发环境,C 语言、操作系统原理学的不错,但是学校并没有这样的课程安排,现在也很迷茫,不知道如何才能更加深入的学习 Linux,比如 Linux 内核,驱动开发或者运维等等,希望各位大神能给一些意见
Tianheng Chen,半吊子码农,操作系统,Apple实习生
鉴于越来越多的人看到了答案,我觉得现在有必要更正一些用词错误和概念错误,非常感谢杨周的建议和斧正。
增加内容:关于楼主背景,很多人问我关于我的背景问题,在此统一作答,楼主目前大学本科三年级,在美国上学,专业为ECE和数学,所以找实习的机会比较多,找到的概率也比国内同胞们大一些,我高中同班同学有两个人大二的时候就找到google实习的。本人学习成绩略渣,这个不是谦虚,是正儿八经的渣,GPA全系中位数,另:谁给我发私信,说大神膜拜什么的,会让我浑身不舒服,我认为高斯欧拉傅里叶可以称作大神,普通人嘛,就安安分分做普通人吧。
很多大一大二的朋友私信问我怎么从基础学习,为了更加符合这些同学的基础,增加了最基础的知识内容,方便大家学习。
另,在最后增加了所有提到的书籍的全名,方便大家查找,有pdf链接的我会放上pdf的链接。如侵害了版权,请告知我。
删减内容:我把关于关于linux使用和运维的内容删去了,因为这本不是我擅长的内容,放在这里未免误人子弟,尤其是在杨周的提醒之下,才知道对运维的理解是错误的,所以觉得瞎写的话不免有悖知乎的精神,我想有更多人会有更好的答案。
说说我的学习经历吧。因为我对这方面也非常感兴趣,而且年龄和背景和题主十分相似。
我觉得要深入学习linux,有三个方面是要全面了解的。(下面有些东西会写成英文,因为有些东西的中文翻译我真的不太清楚,所以为了最大程度的避免误人子弟,我还是尽量用词准确,见谅)
1. 最重要的linux的内核工作方式:包括但是不限于:
●内存分页
●进程切换
●interrupt 和 exception,以及system call
●lock
●进程管理
●内存管理和分配
●signal
●文件系统(ext2, ext3)
●输入输出设备
●缓存
书可以看《Understanding the Linux Kernel, Third Edition [Daniel P. Bovet, Marco Cesati]》,《IA-32 Intel® Architecture Software Developer’s Manual Volume 3: System Programming Guide》
这个是理解linux的基础的基础,对于理解操作系统有莫大的好处。而且无论对于high level还是low level的编程都是相通的,很多东西在学完操作系统之后,你对他们的理解就完全不一样了。就像学好缓存在对于提高大运算上面的效率是很有帮助的。
一边看书一边可以写一个简单的linux自己玩,时长一个学期比较合适。因为课程要求,所以我写过一个可以多任务运行的linux,附带一个声卡driver。当时演示的时候放的是凤凰传奇,教授整个人斯巴达了。但是不得不说这是一个非常大的工作量。
但是无论是要做内核开发还是驱动开发,我觉得这些都是基础中的基础,是要扎扎实实掌握的,不得有半点马虎。
2. CPU架构/汇编
操作系统跟CPU的架构是离不开的,我个人觉得是相辅相成的。很明显的能看到Intel为了和操作系统配合起来,实现了很多硬件功能。最明显的就是虚拟内存已经可以在硬件层面上直接换算,不需要通过软件了。不懂x86或者arm的架构,会一定程度上造成理解linux内核的困难。比如为什么要以某种特定的方式分页,为什么内存管理的时候需要不同的算法,interrupt,system call的意义何在?等等等等的问题都需要精通CPU的架构。
当时就是因为对TLB的理解不够深入,不够仔细,造成我的系统每次切换任务的时候,会page fault。
重点在于interrupt的处理,缓存的概念和内存相关结构的设计。至于乱序执行,pipeline之类的都是次要的,对于linux不是特别的重要。
x86的汇编是基础,有助于debug和理解linux源代码。我写系统的时候大段写过x86代码来实现低层操作。不知道真正的linux是不是这样实现的。
3. high level编程
系统毕竟是为了应用程序而服务的,就像有需求才有生产一样。没有应用程序的需求,就不会设计相关的系统功能。了解high level的编程一定程度上可以融会贯通。
学习过程:以下均是为大一大二的朋友们写的,有更好建议的朋友请留言指正。
1. 逻辑电路,数字电路,简单处理器,汇编,C语言,参考书籍《Yale N. Patt and Sanjay J. Patel,Introduction to Computing Systems: from bits and gates to C and beyond, 2nd Edition, McGraw-Hill, 2003.》我强烈建议这本书,这也是学校的教科书。原因是有同学反映即使是计算机系的学生看底层的书仍然看不懂,这本书从最基本的逻辑电路讲起,再上升到汇编和机器语言,最后很自然的过渡到了C语言,所有这些内容都建立在一个简单的LC-3处理器的基础上,我相信即使是工作多年的朋友看这本书仍然会说“原来如此”。时长:一个学期,对于有基础的同学,半个学期。
附录中,有LC-3处理器的所有细节,包括电路,对处理器没有任何概念的同学是非常好的补充材料。
2.数据结构,OOP,参考网站:cplusplus.com. http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/
时长:一学期
3.x86汇编,x86 Assembly
从LC-3到x86https://courses.engr.illinois.edu/ece391/references/patt-and-patel-appendix-B.pdf
4.操作系统:参考最上。
《Understanding the Linux Kernel, Third Edition [Daniel P. Bovet, Marco Cesati]》http://idak.gop.edu.tr/esmeray/UnderStandingKernel.pdf
《Yale N. Patt and Sanjay J. Patel, Introduction to Computing Systems: from bits and gates to C and beyond, 2nd Edition, McGraw-Hill, 2003.》链接没有,自己买吧
Intel速 64 and IA-32 Architectures Software Developer Manuals
Tanky Woo,Python/运维 at 知道创宇,…
研究Linux内核是一个很不错的选择
网络方面也是一个必备技能。
如果是运维,这个要求比较广:
最简单的就是会用命令,我不清楚你提到的熟悉各种命令到底是熟悉多少/熟悉到什么程度,除开日常使用的大部分命令,运维排查问题还需要了解很多命令,把这些工具用好,你可以解决很多问题。
借用网上的一幅图,看看你了解多少(反正我还有一些不了解 :( ):
运维的另外一方面就是根据公司需求,用好框架,比如Nagios, Puppet,SaltStack,Docker等,这方面的基础搭建要求非常高,你需要考虑如何做基础构建,才能达到高度模板化、自动化等。至少现在这方面都是我们Boss来做。
运维更多的就是和业务绑定在一起,根据业务来做开发和调整。
还有一方面,建议掌握一门除开Shell外的脚本语言,个人建议是Python。用合适的工具,做合适的事情,只靠Shell很难做好。
就说那么多了,如果你在大二就能达到你说的那个程度,那你已经很棒了,继续钻研吧。我觉得迷茫是正常,但是没必要去过多的想,随心去学,不是很好么。
孙立伟,资深码农 http://www.noware.cn ( ͡°…
给你一个网站,Welcome to Linux From Scratch!,尽情的折腾吧。
chinatree,從事運維,關注信息安全。
一谈到深入学习Linux,多数人马上联想到Linux内核,但这是一个较长远的目标,建议这个定位在重要但不紧急的任务。因为如果内核就接触就能接触的话,那这就不可以算啥深入的知识啦。
至于楼主说的熟悉各种命令,能写Shell脚本,不确定是到什么程序,建议楼主寒暑假有时间的话可以去找一两家公司尝试面试一下验证自己有哪些不足 :)
楼主现在是一个在校大二学生,迷茫是正常现象,之所有产生迷茫主要原因在于没有真实案例给你展示你的能力,而你又觉得你所要学的基本都掌握得差不多。然而人是渴望得到认可、得到掌声的,现在你的能力暂时还没有发挥用武之地,所以缺少了认可和掌声提供的动力,以后你在实际工作中所完成的每一项任务给你带来的成就感和满足感,以及你发现比你腻害的牛人还很撸力的学习的时候,你就会清晰的知道自己该往哪个方向加油。
Linux内核和驱动开发我不熟悉,没啥可建议的 :(
运维(ops)职业,要求的知识面很广泛,除了Linux知识,开发的一些技术、网络知识、脚本能力、排错能力、安全等等,像 @Tanky Woo的图片中所涉及到的命令、知识点在监控、排障能力上体现得淋漓尽致。
最后,学校的知识对实际工作来说,那真的只是冰山一角,提醒楼主多把自己所学知识付诸实践,按老马(马克思)说的,实践是检验真理的唯一标准。在实践中学会思考问题,提出问题,解决问题,这样你会发现要学的东西很多很多,简单的可以理解为属于你现在不懂的知识都可以算作深入学习...
1AN WANG,离开是新的开始。
先看,Robert Love 的 linux kernel development 。
《Linux内核设计与实现(原书第3版)》([美]Robert Love)【摘要 书评 试读】
再看,Wolfgang Mauerer 的 professional linux kernel architecture 。
《深入Linux内核架构》([德]莫尔勒)【摘要 书评 试读】
期间结合代码和实践。
都搞完了,对内核的机制应该就算比较熟悉了,至于用户态的就另说了。
偏应用的看看鸟哥私房菜不错。
来自:知乎
链接:http://www.zhihu.com/question/23564190