Windows 的使用方式是图形化界面,鼠标点来点去的就好。而 Linux 的使用方式是命令行,记得刚学 Linux 操作系统的时候(就单纯命令行的时候)真的不适应,上手难,老想着找找图形界面点一下。当你学会 Linux 操作系统的基本操作之后,你会爱上这种模式,比如我现在在 windows 都会装个 cmder 来使用命令行;当你熟练 Linux 操作系统的命令行操作之后,你会发现效率比图形化的方式不知道高多少。
总的来说 Linux 上手难,学习曲线陡峭,所以它的学习过程更像是一个爬坡过程。当你爬上一个坡之后,你会发现 Linux 的设计之美和灵活性,当又爬上一个坡之后你又发现 Linux 的另一种美或者设计的巧妙。在整个 Linux 的学习过程中,要爬的坡有以下这么几个:熟练使用 Linux 命令行、在 Linux 环境下进行编程、了解 Linux 内核机制、阅读 Linux 内核代码、修改 Linux 内核源码以及最后落到生产实践上。如下图所示:
1. 熟练使用 Linux 命令行
也就是要抛弃在使用 windows 时对图形化界面的依赖,习惯于 Linux 中在黑乎乎的界面中使用“命令行”的方式。在 Linux 中,无论做什么事情,都会有相应的命令工具,命令工具其实就是一个可执行文件。这些可执行文件一般都在 bin 或者 sbin 目录中。使用命令往往需要在命令工具名后面跟上各种参数,这些参数怎么填可以使用 -h 或者 help 命令查看使用方式;也可以使用 man 命令查看使用方式。当然最好记住几个常用的命令工具的使用方式。
当命令行使用多了之后,你会发现大部分命令的使用模式都很像,有些时候不需要搜索就能完成大部分操作。到这一步,你会发现一些很有技巧的命令 sed 和 awk、正则表达式、管道和 grep、bash;可以通过命令自动化处理一些事情。
推荐书籍
- 学习 Linux 命令行的话,推荐阅读 《鸟哥的 Linux 私房菜》;
- 深入一点的话《Linux 系统管理技术手册》
2. 在 Linux 环境下进行编程
接下去就是在 Linux 环境下的编程了,通过代码的方式来使用 Linux。此时需要使用 glibc 的库,或者直接使用 Linux 系统调用(不推荐)。Linux 的系统调用非常多;glibc 的库函数也非常复杂,传入的参数、返回值、调用的方式等都很有讲究。这个时候可能需要懂一些 Linux 系统机制,否则比较难理解为什么这样调用。
当学完这个阶段之后,你将会理解进程树(fork)、同步机制(信号量)、网络应用层和传输层的分界线(socket)。
推荐书籍
- 《UNIX 环境高级编程》:有代码、有介绍、有原理
3. 了解 Linux 内核机制
在接下去就是了解 Linux 内核的原理,有助于你更好地使用命令行和进行程序设计。但是此时不建议看内核源码,因为 Linux 代码量太大,很容易迷失,找不到头绪。最好的办法是,先了解一下 Linux 内核机制,知道基本的原理和流程。
当了解了 Linux 内核机制的原理之后,Linux 这个复杂的系统也开始变得透明起来。在出现问题时,也比较容易准确定位到问题所在。
推荐书籍
- 《深入理解 Linux 内核》:这本书言简意赅地讲述了主要的内核机制。看完这本书,会对 Linux 内核有总体的了解。
4. 阅读 Linux 内核源码
了解内核机制的时候,虽然能让你更容易看清全貌,但容易让你忽略细节。当看内核原理的书的时候遇到难以理解的地方,那么最有效的方式就是看代码。当你重点研究某方面技术的时候,如果涉及到内核,那就需要看这部分的代码,因为原理已经不够了。比如你是研究虚拟化的,那就重点看 KVM 的部分;如果是研究网络的,那就重点看内核协议栈的部分。
**开始阅读源码的时候不要每一行都搞清楚它是干什么的,而是聚焦于核心逻辑和使用场景。**当你 Linux 内核源码都看的差不多了,那么对于操作系统的原理,你应该掌握得比较清楚了。同时还可以将所看的东西和自己所做的东西结合起来。
推荐书籍
- 《Linux 内核源代码情景分析》,这本书最大的优点是结合场景进行分析、看得见、摸得着、非常直观。
5. 修改 Linux 内核源码
只看内核代码还是差了点意思的,假如此时让你去修改内核代码实现定制化的内容时,那么相信你相比看代码的时候会有不一样的感受。在实现定制化的内容时,比如自己实现一个系统调用、自己实现一个设备驱动、自己实现一个文件系统,那么其实可以参考现有的实现。但是一旦实现了,那你就是大牛了。
6. 落到生产实践上
最后在生产环境中实战了,真正的高手都是在实战中摸爬滚打练出来的。比如你是开发,需要对内核代码进行少量的修改,但是此时的修改需要考虑各种因素:并发与并行、锁与保护、扩展性和兼容性。这些都是真实项目才能练出来的。