作者:CoderCat
原文地址:https://www.coderscat.com/how-to-learn-linux
翻译:码农翻身,已获翻译授权
前言
我依然记得在2004年我刚开始使用Ubuntu 4.04的日子,作为学生,可以在Ubuntu网站上申请免费的安装盘,几天以后,一个包含CD的包裹就到了:
从那时候开始,我在Linux平台上度过了很多编程时光,从Linux和Linux社区中学到了很多,我必须得说,通过学习Linux,我变成了一个更好的程序员。
如果你有志于在计算机编程领域长久地发展,一定要学习Linux,但是到底学习什么?怎么学习?
这是一份给初学者从零开始学Linux的指南。
为什么要学习Linux?
也许你听说过Linux是黑客的一个很酷的工具,或者Linux对开发人员更加友好, 我认为学习Linux有三个原因:
1. Linux统治了服务器市场
大多数服务器都跑Linux, 程序员尤其是Web程序员,你的程序也会跑在Linux上,你需要在Linux上部署代码,维护服务器。
2. 学习系统级和底层编程
随着物联网的来临,更多的软件涉及到底层编程,使用C/C++编程是基本要求,这种开发通常需要精通Linux技能。
3. 通过Linux学习计算机的基础知识
Linux是个开源项目,全世界成千上万的人在维护它,有很多关于Linux内部知识的资源和优秀书籍,对学习操作系统有极大帮助。
Linux学习指南
对Linux的学习分为几个层次:
1. 日常使用
2. 在Linux上进行应用开发,操作和维护
3. 系统级开发
4. 内核开发
很明显,需要一层层地学习,越往下越难。
码农翻身注:
对于普通程序员来说,做到第二层就差不多了。
对于想成为某个领域专家的程序员,需要达到第三层。
最后一层可能只有少数人,他们可能是自由职业者,黑客,还有不少是大公司的员工。
在开始有趣的旅程之前,先来推荐一本Linus Torvalds的自传:
日常使用
这包括:
- 如何login , logout
- 如何联网
- 如何打开命令行窗口
- 如何使用命令行安装/卸载软件
- 如何编辑文本文件
- 如何创建,移动,删除文件
- 如何查看压缩文件,提取内容。
这个阶段最难的部分就是从图形界面转向命令行。我的建议是就像学游泳那样,把自己扔到水里。不入水永远都学不会游泳。
所以,一定要在你的PC上安装一个Linux。你可以使用多系统,但是不要尝试虚拟机,因为你很容易就会放弃Linux。
到底使用哪个版本的Linux呢?现在可能有十个常见的版本,选择最主流的就好,比如Ubuntu, CentOS等。他们直接的主要区别就是GUI和软件包管理方式。
Linux上的应用开发
Linux上有各种各样的应用开发,例如Web应用,桌面GUI应用,命令行等等。
你可能需要学习Web开发,C/C++/Python或者其他编程语言。
在Linux上做开发和在Windows上的体验不同,这里通常没有一个强大的IDE。大部分时候,你的工具链是一系列的小工具,你需要在shell中把他们“连”在一起。
你需要学习的是:
- 在一个编辑器中写代码, 常见的编辑器是Vim/Emacs/VSCode
- 如何编译你的程序
- 如何从命令行启动你的程序
- 使用调试器来寻找bug
学习一些Shell脚本编程必不可少, 至少你得学到能看懂常见Shell的水平。
现在很多程序员更喜欢Python/Ruby, 但是仍然有很多之前开发的shell脚本需要维护。
你需要建立属于你自己的Linux开发环境。把配置文件都记录下来(比如使用Git)。如果你的开发环境搞得很好,编程的效率会有五倍提升。
《Linux Bible》 and 《Linux命令行大全》会对命令行和开发环境有个非常好的介绍。
码农翻身注:在国内,自然是《鸟哥的Linux私房菜》了。
在这一阶段花费的学习时间比较长,要保持耐心。
系统级开发
如果你的目标是开发那些“底层”的软件,比如存储程序,网络程序,那必须要进入这一层次。
系统级编程和应用层编程大不相同,主要涉及操作系统和网络的东西。
你需要学习那些Linux内核对外提供的接口,由于历史和性能的原因,大部分都是C语言的。
使用GDB来调试程序也是必备的技能,你可以参考《Debuging with GDB》,Valgrind 是另外一个有用的内存检查工具。
《Linux 系统编程》,《Linux系统编程手册》都是非常好的书。
网络是系统编程的一个重要编程领域,《Unix网络编程》是你最好的选择。
能走到这个阶段可是不简单,只有很少程序员有使用C/C++编程的能力,现代的程序员一般使用更加高级的编程语言例如Python, Ruby ,Java。
技术潮起潮落,但是基础总是不变,系统编程的核心知识能提升你的技能,扩展你的设计能力。
内核开发
成为内核开发人员,那要求可是相当高,能走到这一步,你将是一位受人景仰的英雄人物。 在这个时候,你应该已经学过操作系统的课程了。
内核包含很多子模块:内存管理,进程调度,虚拟内存,文件系统,设备管理等。还有很多辅助开发的命令:readelf, nm, ipcs, iostat, objdump, free, chrt, pmap, uptime, top, pidstat, etc.
Robot Love写的《Linux Kernel Development》是讲述内核开发最好的入门书, 它会给你提供一个很好的内核概览。
中文版名称是《Linux 内核设计与实现》,由陈莉君教授翻译。
还有一些内核开发的好书:
《现代操作系统》
《深入理解LINUX内核》
《深入Linux内核架构》
切记,Linux内核开发的领域太多,初学者不可能同时涉及所有领域。你的学习策略应该是:
1. 获取Linux内核的概览。
一个好方法就是读《Linux 内核设计与实现》,或者去读一下Linux早期版本的源码,因为代码要少很多,这里有很多早期的版本:https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/old-versions/
大约两周的时间就可以完成。
码农翻身注:两周的时间太短了!
MIT开发的教学操作系统xv6也是一个不错的选择:https://pdos.csail.mit.edu/6.828/2012/xv6.html
2 专注在特定子模块
选一个你最感兴趣的模块,试图理解它的设计和细节,参与内核开发的社区,阅读相关的文档,加入Linux的mail list;查看别人的补丁,提交你的补丁。
Linux内核社区有自己的协作风格,你需要学习这些规则。
你的第一个被接受的补丁,将会是你的一个里程碑,当你在一个领域内有了足够的知识和技能后,切换到别的领域会变的简单。
成为内核开发的大师需要花费很多年时间,快乐地编程吧!
相关链接:
Linux 内核接口: https://en.wikipedia.org/wiki/Linux_kernel_interfaces
Valgrind : http://valgrind.org/
https://www.coderscat.com/to-be-a-programmer
Linux HowTo : https://www.kernel.org/doc/html/v4.16/process/howto.html
Linux 邮件列表 : https://lkml.org/
xv6阅读资料: https://pdos.csail.mit.edu/6.828/2019/reference.html
【本文为51CTO专栏作者“刘欣”的原创稿件,转载请通过作者微信公众号coderising获取授权】