前言html
我依然记得在2004年我刚开始使用Ubuntu 4.04的日子,做为学生,能够在Ubuntu网站上申请免费的安装盘,几天之后,一个包含CD的包裹就到了:linux
从那时候开始,我在Linux平台上度过了不少编程时光,从Linux和Linux社区中学到了不少,我必须得说,经过学习Linux,我变成了一个更好的程序员。 ios
若是你有志于在计算机编程领域长久地发展,必定要学习Linux,可是到底学习什么?怎么学习?程序员
这是一份给初学者从零开始学Linux的指南。shell
为何要学习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内核社区有本身的协做风格,你须要学习这些规则。
你的第一个被接受的补丁,将会是你的一个里程碑,当你在一个领域内有了足够的知识和技能后,切换到别的领域会变的简单。
成为内核开发的大师须要花费不少年时间,快乐地编程吧!