1 抛弃旧文化, 迎接 Linux 命令新文化
Linux 第一步, 从 Windows 思维, 切换到 Linux 的 "命令行 + 文件" 模式
在 Linux 中, 做什么都有相应命令. 一般就在 bin 或者 sbin 目录下, 数量繁多. 如果你事先不知道该用哪个命令, 很难通过枚举的方式找到. 因此, 在这样没有统一入口的情况下, 就需要你对最基本的命令有所掌握.
一旦找到某个命令行, 替代输入框的是各种各样的启动参数.
这些参数怎么填,
一般可以通过 -h 查看 help, 就能找到相应的配置项
还可以通过 man 命令, 查看文档
无论是什么命令行工具, 最终的配置一般会落到一个文件上, 只要找到了那个文件, 文件中会有注释, 也可以挨个儿看下去, 基本就知道如何配置了.
攻克了第一个困难了. 这个时候, 你能看到一些很美丽的风景, 例如一些很有技巧的命令 sed 和 awk, 很神奇的正则表达式, 灵活的管道和 grep, 强大的 bash. 你可以自动化地做一些事情了, 例如处理一些数据, 会比你使用 Excel 要又快又准, 关键是不用框框点点, 在后台就能完成一系列操作. 在处理数据的同时, 你还可以干别的事情, 半夜处理数据, 第二天早上发个邮件报告, 这都是 Excel 很难做到的事情.
2 通过系统调用或者 glibc, 掌握程序设计
命令行工具也是程序, 只不过是别人写的程序. 从用别人写的程序, 到自己能够写程序, 通过程序来操作 Linux, 这是第二个要攻克的困难.
用代码操作 Linux, 可以直接使用 Linux 系统调用, 也可以使用 glibc 的库.
Linux 的系统调用非常多, 而且每个函数都非常复杂, 传入的参数, 返回值, 调用的方式等等都有很多讲究.
这里面需要掌握很多 Linux 操作系统的原理, 否则无法理解为什么应该这样调用.
刚开始学 Linux 程序设计的时候, 你会发现它比命令行复杂得多.
因为你的角色再次变化.
如果说使用命令行的人是吃馒头的, 那写代码操作命令行的人就是做馒头的. 看着简简单单的一个馒头, 可能要经过 N 个工序才能蒸出来. 同样, 你会发现, 你平时用的一个简单的命令行, 却需要 N 个系统调用组合才能完成. 其中每个系统调用都要进行深入地学习, 读文档, 做实验.
经过一段时间的学习, 你攻克了这些东西. 这时候, 你已经很接近操作系统的原理了, 你能看到另一番风景了.
大学里学的那些理论, 你再回去看, 现在就会开始有感觉了.
进程树, 调用了 fork
进程同步机制, 调用信号量
网络应用层和传输层的分界线, 调用 socket
都明白了!
3 再三研究 Linux 内核
当你已经会使用代码操作 Linux 时, 你肯定很希望揭开这层面纱, 看看系统调用背后到底做了什么.
进一步了解内核的原理, 有助于你更好地使用命令行和进行程序设计, 能让你的面试及开发水平更上一层楼, 但是不建议直接看源码, 因为 Linux 代码量太大, 很容易迷失.
最好的办法是, 先了解一下 Linux 内核机制, 知道基本的原理和流程.
不过, Linux 内核机制也非常复杂, 而且其中相互关联.
比如说, 进程运行要分配内存, 内存映射涉及文件的关联, 文件的读写需要经过块设备, 从文件中加载代码才能运行起来进程. 这些知识点要反复对照, 才能理清.
但是一旦攻克! 你会发现 Linux 这个复杂的系统开始透明起来.
无论你是运维, 还是开发, 你都能大概知道后发生的事情, 并在出现异常的情况时, 比较准确地定位到问题所在.
Linux 内核机制是我们重点学习部分, 基于最新 4.x 的内核.
辅助学习, 推荐《深入理解 Linux 内核》.
这本书言简意赅地讲述了主要的内核机制. 看完这本书, 你会对 Linux 内核有总体的了解. 不过这本书的内核版本有点老, 不过对于了解原理来讲, 没有任何问题.
4 阅读 Linux 内核代码, 聚焦核心逻辑场景
在看内核原理的书的时候经常遇到这种问题, 有的地方实在是难以理解, 或者不同的书说的不一样, 这时候该怎么办呢? 其实很好办, Linux 是开源的呀, 我们可以看代码呀, 代码是精准的. 哪里有问题, 找到那段代码看一看, 很多问题就有方法了.
另外, 当你在工作中需要重点研究某方面技术的时候, 如果涉及内核, 这个时候仅仅了解原理已经不够了, 你需要看这部分的代码.
但是开源软件代码纷繁复杂, 一开始看肯定晕, 找不着北. 这里有一个诀窍, 就是一开始阅读代码不要纠结一城一池的得失, 不要每一行都一定要搞清楚它是干嘛的, 而要聚焦于核心逻辑和使用场景.
一旦爬上这个坡, 对于操作系统的原理, 你应该就掌握得比较清楚了. 就像蒸馒头的人已经将面粉加工流程烂熟于心. 这个时候, 你就可以有针对性地去做课题, 把所学和你现在做的东西结合起来重点突破.
研究虚拟化的, 就重点看 KVM
研究网络的, 就重点看内核协议栈
推荐《Linux 内核源代码情景分析》 https://book.douban.com/subject/1231584/
这本书最大的优点是结合场景进行分析, 看得见, 摸得着, 非常直观, 唯一的缺点还是内核版本比较老.
5 实验定制化 Linux 组件
从只看内核代码, 到上手修改内核代码, 这又是一个很大的坎.
因为 Linux 有源代码, 很多地方可以参考现有的实现, 定制化自己的模块.
例如, 你可以自己实现一个设备驱动程序, 实现一个自己的系统调用, 或者实现一个自己的文件系统等等.
6 面向实战开发
如果你是运维, 仅仅熟悉上面基本的操作是不够的, 生产环境会有大量的不可控因素, 尤其是集群规模大的更是如此, 大量的运维经验是实战来的, 不能光靠读书. 如果你是开发, 对内核进行少量修改容易, 但是一旦面临真实的场景, 需要考虑各种因素, 并发与并行, 锁与保护, 扩展性和兼容性, 都需要真实项目才能练出来.
7 总结
参考
Linux 命令行
趣谈 Linux 操作系统
X 交流学习
全是硬核干货的公众号交流
Java 交流群 https://jq.qq.com/?_wv=1027&k=5UB4P1T
博客 https://blog.csdn.net/qq_33589510
来源: http://www.bubuko.com/infodetail-3144453.html