红联Linux门户
Linux帮助

迈入Linux内核学习的神圣殿堂

发布时间:2014-12-29 09:29:55来源:linux网站作者:ASH0713

学习本身是件很玄乎的事情,有些人潇潇洒洒没见怎么用心就能够获得很好的成绩,而有些人则相反,投悬梁锥刺骨也还是成绩平平收获平平。这里面很大一部分的原因就是方法。当然因为每个人的情况并不相同,对于linux内核学习这件事来说,也就没有这样一个标准的方法存在,但是我们仍然可以来共同探讨一下如何才能更加有效的去学习linux内核。

本期特邀请中国Linux内核领域的权威专家将针对在Linux内核学习过程中遇到的问题,给予解答。欢迎午饭积极提问,与专家一起讨论!

专家著作:《Linux内核修炼之道》 《linux那些事儿之我是USB》

本期专家:任桥伟

擅长领域:Linux内核与驱动

专家简介: 西安交通大学本科、上海交通大学硕博,资深研发工程师、项目经理、51CTO做客专家,专注于Linux内核与驱动开发。著有《Linux内核修炼之道》(人民邮电出版社)、《Linux那些事》(电子工业出版社)等备受网友关注的专业图书。

精选本期网友提问与专家解答,以供网友学习参考。

Q: 我想问一下专家,为了成为一名合格的网络工程师,他应该了解linux的那些方面?

A: 既然是作为一名网络工程师,首要的自然网络方面的基础,比如局域网、广域网、各种网络协议等,操作系统本身只是作为将这些网络知识给予利用的一个平台。如果是希望从事linux平台上的工作,那么就需要对linux操作系统的系统架构以及工作原理进行一定程度的了解,当然对linux系统本身的使用也要非常的熟练,特别是要能够熟练的掌握linux平台上网络相关的命令、工具。

Q:我想深入学习LINUX,打算从LINUX 0.01那一万行代码开始,你看合适吗?我接触LINIX不多,只有一些粗浅的知识,谢谢。

A: 你的问题实际上可以分解为两个问题:如何深入学习linux,或者说如何学习linux内核?从哪一个版本开始学习比较合适,比如0.01?

对于第一个问题,根据你描述的自己的情况,我的建议是:

1. “先会使用它”,这也是linus本人的回答,也就是说首先要能够熟练的使用linux操作系统。如果连linux是什么、常用的操作都不会就去研究内核,是不可能入“门”的。

2. 看懂内核源码需要一些操作系统、C语言等的基础。

3. 对内核有个整体的理解和认识。这方面,lkd这本书,和我的linux内核修炼之道应该都能够帮助你。

4. 会配置和编译内核,看得懂内核中的Kconfig和Makefile文件,这两个文件就是内核中的地图,看得懂它们,在内核里就不会迷路。

5. 记住,学习内核就是学习内核的源代码,任何内核有关的书籍都是基于内核,又不高于内核的。内核源码本身就是最好的参考资料,其他任何经典或非经典的书最多只是起到个辅助作用,不能也不应该取代内核代码在我们学习过程中的主导地位。因此你要做得是选择内核的一个部分或子系统,以韩峰同志对待日记的态度,严谨而细致得理解每一段代码的实现,多问多想多记。切勿抱着走马观花,得过且过的态度。

其实也就是我在linux内核修炼之道中总结的:全面了解抓基本,兴趣导向深钻研;融入社区做贡献,坚持坚持再坚持。

下面是第二个问题,从哪一个版本开始学习比较合适?

我个人建议从新的内核开始,固然新内核的代码非常庞大,但并没有说非要求大求全,追求每个部分都要理解。学内核忌讳求大而全,如果对哪部分比较感兴趣,研究相关的源码和change就行了,当然仁者见仁智者见智,自己如果觉得从低版本开始更好更适合,那采用这种方式也未尝不可,毕竟各人的路还是各自走的。

Q:尽管我知道Linux的内核有难度, 但是我还是想知道我要把C语言(或者汇编,再者其它语言)学到什么程度才能有足够的知识去学习Linux内核? -------感谢专家的回答.

A:在《Linux内核修炼之道》的3.1节专门对类似问题做了回答,概括就是:

首先,学习Linux内核并不仅仅只需要C语言的知识,还需要掌握一些操作系统的理论基础,甚至包括一些硬件的常识,毕竟linux内核源码是一个操作系统的核心代码。

其次,对于C语言来说,也不需要很精通,但要能够链表等数据结构的C实现,当然对C越熟悉会越有帮助,意思就是说起码要能够看懂C代码。我们在研究分析内核源码的过程中,要去体会内核源码的美。

Q:老师你好,我现在的目标是做linux系统管理员。我现在的公司是在给移动做电子商务平台的,服务器也是用的linux的。但是我们很多权限都没有,他们是有自己的系统组的负责管理linux的各种事务。我觉得现在的环境不大利于我的linux学习,老师有什么方法或者建议给我吗?或者说我学习linux的一些注意事项或者方法?? 谢谢了

A:首先,环境是可以自己创造的,公司的没有提供很多的权限,可以在自己的PC上搭建实践的环境啊。下面是我个人的一些建议,希望对你有用。

1. 从命令开始从基础开始。了解Linux 的基础知识,包括用户管理、群组的概念等;掌握常用的命令。

2. 作为一个linux系统管理员,要适应与习惯在命令行下工作的方式,并勤于实践。

3. 学习shell等脚本语言。

4. 有一定的网络的基础,包括路由概念、OSI七层网络模型、TCP/IP模型及相关服务对应的层次等。

5. 学会使用文档,学会在linux社区寻求帮助与分享经验。

Q:学习linux内核需要什么样的基础呢?

A:《Linux内核修炼之道》的3.1节即为介绍内核学习的技术基础:

1. 熟练使用Linux操作系统。Linux操作系统是Linux内核在用户层面的具体体现,只有熟练掌握Linux的基本操作,才能在内核学习的过程中达到事半功倍的效果。

2. 掌握操作系统理论基础。只需要掌握操作系统中比较基础的理论,比如分时(time-shared)和实时(real-time)的区别,进程的概念,CPU和系统总线、内存的关系等。

3. 掌握C语言基础。不需要很精通C语言,但能够理解链表、散列表等数据结构的C实现,用过GCC编译器。当然,越熟悉C语言就会越有帮助。

Q:我想问一下 ,学习Linux的过程中, 在真实的机器上操作和在虚拟机上操作有什么不同么?需不需要真实的构建一台纯Linux系统的机器去进行学习?

A:先打个不是很恰当的比方,就像联通的iphone作为iphone的阉割版,基本上并不会影响我们的使用。同样,虚拟机上的linux也基本上不会影响我们去学习各种linux的操作,特别是对于新手。但是有条件的话,我建议还是直接安装个linux系统在机子里,这样起码可以避免心理上对windows的那种依赖。

Q:请问专家一个问题,BSD内核与LINUX内核有什么差异。LINUX内核比BSD内核有什么优势?

A:建议你去看一下这篇文章:“Solaris、Linux和FreeBSD的内核比较”

Q:我是一名企业网管,学习好linux有必要去玩LFS吗

A:学习好Linux与去玩LFS应该没有必然的联系,但是玩LFS或许是一个菜鸟变成高手的捷径,它可以帮助我们学习Linux系统的内部是如何工作的,并打下一个扎实的基础。

Q:专家,你好,我接触LINUX不太久,想了解和深入内核,怎样有个循序渐进的过程,从哪里开始?

A:通常语言及其库的学习分为几个层次,1.熟练使用,2.阅读源码,了解实现原理,3.对源码进行扩展。同样,linux内核的学习也可以由浅入深划分为几个层次:全面了解抓基本,兴趣导向深钻研;融入社区做贡献,坚持坚持再坚持。

第一层次全面了解抓基本是说:能够对Linux以及内核有个全面的认识和了解,有个整体的概念,不求有多么深入,另外要掌握Linux内核源代码的分析方法。内核源码千千万,还一直前仆后继的往里面加,我们必须得掌握一种好的分析方法。

第二层次兴趣导向深钻研是说:在第一层次修炼中已经对内核有个全局的认识和了解之后,接下来就应该按照认识的发展规律,以兴趣为导向,寻找一个子系统或模块,对它的代码深入钻研和分析,不懂的地方就通过社区、邮件列表或者直接发Email给maintainer请教等途径弄懂,千万不要得过且过,这样分析下来,对同步、中断等等内核的很多机制也同样会非常了解,俗话说一通则百通就是这个道理。

第三层次融入社区做贡献是说:通过第二层次的修炼,你应该对至少一到两个部分有了很深入的理解,对内核代码采用的通用手法也已经很熟悉,那么你应该开始进入第三层次,努力融入到内核的开发社区,此时的你已经不会再是社区中潜水小白的角色,而是会针对某个问题发表自己的见解。你已经可以尝试参与到内核的开发中去,即使仅仅修改了内核中的一个错误单词,翻译了一份大家需要的文档,也是做出了自己的贡献,会得到大家的认可。

最后一个层次可以归纳为两个字,就是“坚持”,能够在内核的修炼之道上走多远,都取决于我们能够坚持多久。

这些正是《Linux内核修炼之道》中所总结的,具体可以参考书中或者我博客中所讲的内容。

Q:我是做javaee方面的,我们的服务器用的就是RedHat,我想学习服务器方面的配置,是不是用不着学习linux内核啊。但是服务器的管理好像需要些一些脚本。那是不是内核又必须要了解啊~

A:确实没太大必要去学习内核,不过对内核了解一些的话,比如内核的整体框架,应该会对自己有一定的帮助。

Q:大学时学过一期的Fedora 9,由于自身对LINUX感兴趣,看过不少RHCE教程,并自学RHEL 5一年,对LINUX基本操作和服务的基本配置都有所掌握,但一直停留在这个基础上,由于工作上也没有涉及到LINUX,没有实践经验,只能自己模拟。想请教一下,对于我现在这种情况,如何寻找突破点,可以在LINUX上提高一个层次。

A:你这样的情况,对于Linux的使用与配置应该算是非常的娴熟了,如果希望能够提高一下,倒可以去玩一下LFS,再了解一下内核,对内核的框架结构以及工作流程有一定的理解,当然这些是基于你感兴趣的基础上。

Q:您好!我现在是一个培训学校的网络管理员,但是我对于网络的前景很茫然,不知道该确定那个方向,在网上查了一些资料,但是还是很犹豫,想请前辈们,详细说一下网络的发展前景,和所需要学习哪些具体的内容。谢谢!!!

A:说起发展前景,我相信任何方面只要做到足够的专,都会非常的受欢迎和抢手的。

如果你自己本身很希望做这方面的事情,那就多研究研究这方面所需要的知识,比如网络,然后注意积累平时工作学习中遇到的问题以及解决办法,这样在某个阶段量变才会引起质变。

就像我在说如何学习内核的时候说的,好奇心是一切事物发展的原动力,它决定了你在某一领域所能达到的成就。意思就是,遇到问题不要得过且过,尽力的去想办法解决,或者去尽力的发现问题,你自己的水平会很快的得到提高的。

Q:我现在正在学习Linux的各种操作(想作为以后的工作方向),但是学习的时候有很多疑惑,感觉学这个好像没什么用似的,也是一种操作系统嘛,能做些基本的操作就行了,那么我们学习Linux更深入一点到底能干什么?我真的想在这一行有所成,但是现在却感觉很渺茫,不知道从事Linux到底能干什么。其实很羡慕那些做开发的人,C语言也学了,但是却不知道从何做起,如果真让我做个什么程序的话又什么都做不出来,老师您说,我现在应该怎么学习比较好呢?

A: Linux和windows一样,仅仅是一个操作系统,我们能在上面做什么取决于我们希望利用它们做什么。如果仅仅是好奇着玩玩的话,那么一些基本的命令,图形界面会使用就成了,如果是希望从事系统管理网络管理方面的工作,那么应该注意去培养自己shell、网络知识等等方面的素质,如果希望往底层发展,比如从事驱动和内核相关的开发,那么就要对内核有所理解,这个时候可以按照我在《Linux内核修炼之道》里的方法去学习,也可以寻找一种适合自己的学习方法。

不管做什么事情,最重要最关键的一步就是去开始,开发没什么神秘的,你可以尝试着写一些小的东西,去找一些项目来做,或者自己做一些小玩意儿小游戏都是可以的。

Q:老师您好。我以后想做Linux 下的JAVA 开发。需要怎么做呢?先熟悉Linux 的基本操作,然后再移植过来?还是怎么的啊?感谢专家。

A:既然是Linux下的Java开发,两个关键点就是Linux和Java,也就是说Linux上的基本操作、环境配置和开发工具要比较的熟悉,起码使用起来没什么障碍,同时就是Java语言的掌握。

其实只要不做底层的开发,不管windows还是linux也都只是提供了一个开发以及使用的环境和平台,只是一个工具而已。

Q:请问如果成为一个合格的linux系统工程师,至少需要具备哪些方面的知识?能详细谈及一下吗?

比如对系统的管理?对文件的管理?对磁盘的管理?对服务的管理?安全设置?除此之外还有吗?在这些管理中哪些管理是比较重要的?shell编程对于系统管理来说重要吗?内核管理对系统管理重要吗?谢谢老师的解答~~

A: 1. 还有网络、数据库等方面的知识。

2. shell等脚本的编程和使用是很重要的。

3. 对内核研究很深确实没太大必要,不过了解一些内核的架构和工作流程还是有帮助的。

Q:您好。我打算学习kernel,可是真的不知道从哪里入手。很想有一个互动的学习环境,因为学习内核主要还是自己啃课本,太难入手了。

A:首先,对于如何入手,我在《Linux内核修炼之道》里已经总结了4个循序渐进的层次“全面了解抓基本,兴趣导向深钻研;融入社区做贡献,坚持坚持再坚持”,具体的内容,你可以看看这本书或者我的博客,上面说了很多我在学习内核上的建议和感悟。

其次,要纠正一下你“学习内核主要还是自己啃课本”的说法,记住,学习内核就是学习内核的源代码,任何内核有关的书籍都是基于内核,而又不高于内核的。内核源码本身就是最好的参考资料,其他任何经典或非经典的书最多只是起到个辅助作用,不能也不应该取代内核代码在我们学习过程中的主导地位。

Q:我原来接触Linux 比较多但是现在工作中好长时间没有用了 搭建linux 服务都忘掉了 但是我还是很喜欢linux 我想知道linux 运维都需要知道哪些哦 我想去专攻

A:给一个我们以前招linux运维工程师的要求,你可以参考下:

1. 熟悉运维相关技术,制定运维技术方案;

2. 至少熟悉一种脚本语言,能够开发运维工具进行系统管理;

3. 熟悉运维相关的网络技术;

4. 熟悉大规模机群系统的维护管理;5. 深入理解Linux/FreeBSD系统,有系统调优经验者优先。

Q:您好,学习内核将来可以从事什么样的工作?考取rhce,有用吗?rhce,适合做什么样的工作?请解惑,谢谢

A:1. 学习内核可以从事内核和驱动开发的工作啊。

2. 考取rhce貌似不是关键,关键的是自己的水平真正的提高了。

Q:我是北大青鸟的,我刚工作出来,现在干监控,我想学linux,以后的道路不知道怎么走

A:想学就去学吧,很多事没有去做的时候,是不知道做了之后会有多大的影响的。送你一句话,也是我《Linux内核修炼之道》前言里的一句话:今天的必然正是由之前一系列的偶然所决定的。

Q:问问,初期学习linux 以什么版本学习为好。现在linux有很多版本,但是初期学习以那个版本为好。虽然命令大部分都一样,但是还是有很多区别的吧。

A:如果你指的是发行版的话,那看自己喜好了,随便哪个都成,现在用的比较多的是Ubuntu。

如果你指的是内核版本的话,我个人建议从新的内核开始,固然新内核的代码非常庞大,但并没有说非要求大求全,追求每个部分都要理解。学内核忌讳求大而全,如果对哪部分比较感兴趣,研究相关的源码和change就行了,当然仁者见仁智者见智,自己如果觉得从低版本开始更好更适合,那采用这种方式也未尝不可,毕竟各人的路还是各自走的。

Q:老师 你好!使用LINUX系统有一段时间了,会一些操作等,能够驾设一些服务器,但总感觉是机械化的操作,只知道不停得编辑配置文件,出现了问题,不知道哪里下手。灵活性不强,还是没有一个非常全面的系统认识,想深入内核学习,但好像英语能力差确是个瓶颈,怎么深入。

A:学习内核,英语能力好当然会有很大的帮助,不过差些也没太大问题,主要是C等语言基础能看得懂代码,毕竟英语虽然是国际通用语言,但在开发层次上来说,通用的语言是代码,呵呵。如果不知道怎么对内核入门的话,可以去看看我的博客,或者我的那两本书,应该会有很大的帮助。

Q:如何对linux操作系统的系统架构以及工作原理进行学习和了解

A:1. 玩一下LFS。

2. 找本内核的入门书看看。

Q:Linux命令,看到眼花瞭乱的,记住这个又忘了那个,头都大了,有没有什么好的学习方法,看你都高级的工程师了。哈哈!谢谢了!

A:命令?用熟了就记得了,没必要去记。旁边放个手册,用的时候如果忘了就看下,熟了就记得了。