个人表示只简单接触过Linux,如何从头学起,有什么好的学习路线吗?


大前提: 英语, 英语, 还是TMD英语!

首先是看你想学 Linux 干什么. 开发么? 运维么? 还是搞嵌入式? 还是研究 Android 以后做 Android 开发? 不同的方向对应不同的方法. 如果只是玩那你随便, 玩到恶心为止. 如果是开发, 那你应该把精力更多的放在提升代码的能力上面. 毕竟未来应用部署都是容器化的, 一个 dockerfile 解决一切问题. 过度的研究操作系统本身并没什么意义. 但是如果你是搞运维那就另说了. 跟 Linux 有关的大部分东西你都的学. 甚至还得了解不同发行版之间的差异, 开源协议等. 如果是嵌入式开发, 你得明白如何进行裁剪, 如何交叉编译等...

然后具体的学习过程要本著 "由浅入深", "由简到繁" 的原则. 不要上来就去搞什么 GTK, 不要上来就研究什么 Arch 配置之类的. 毕竟既然是刚开始学肯定有一些 "约定俗成", "习以为常" 的基本操作 (比如文件系统, SELinux 等) 你必然是不知道的. 在这种情况下遇到问题很容易被恶心到. 被恶心几次就把自己恶心到退坑了.

个人的建议最好是给自己一个平缓的学习曲线, 先从最简单的 Ubuntu / Manjaro / Deepin 等用户体验更佳的 Linux 发行版入手, 熟悉 Linux 的基本操作 (包括但不限于基本命令, 包管理, 定时任务, 用户等) 和一些基础概念 (如文件系统, 许可权系统等) 之后, 再去向更深层次挖掘. 不要去听一些人说的上来就去整什么很复杂的东西 (比如什么折腾 VIM 啊, 编译啊, 什么折腾 Arch 初始化之类的). 他们用惯了觉得很简单的东西不代表你可以直接上手. 你是菜鸡. 人家是大佬.

Linux 有些东西好是真的好, 但是难也真的是挺难的. 学习的过程遇到问题一定不要死磕, 去 google 上搜索, 去 ServerFault 而且一定要注意问问题的技巧. 用英语问, 而且切记态度好点不要怼人. 不要灰心. 新手能遇到的坑基本上别人都踩过几百遍了. 善用搜索引擎总能找到解决方案的.

当你用的多了, 踩的坑多了也自然就学差不多了. 等你自己觉得自己 "基本上" 会用了的时候, 再去根据自己的方向往对应方向走就行.


从ARCH开始,第一步Linux From Scratch,第二步:Beyond Linux From Scratch,坚持下来也就没什么难的了。


怎么学好Linux?天地会珠海分舵的视频 · 1487 播放

一个Linux老鸟说一下吧,首先声明,我不想好为人师,我这里只是根据我自己的经验来回答这个问题,所以不一定适合所有人。所以我建议你最好还是多参考下不同的答案,然后看下哪个才是你觉得最适合你自己的方法。

首先,你说要学好Linux,这个问题是非常广泛的,非常开放性的一个话题,我敢百分百保证没有人能给出你一个正确的答案!为什么呢?学好Linux这个话题可大可小,小,可以小到你把Linux下的Samba协议的服务源码吃透了,你就可以独当一面,傲视大部分同行!大,可以大到你把Linux最新的源码吃透了,然后根据已有的知识,响应国家号召,写出自己的一个纯国产自主知识产权的操作系统,为国家做出不可磨灭的贡献!

所以这里我需要稍微帮你细分一下你究竟是要怎么个学好Linux。按照我个人的理解,一般人说学好Linux,无非这几个方面:

  • 第一,运维层面的学好Linux,就是知道不同的Linux命令,然后对一些常用的服务的配置比较理解,如nginx,haproxy,ntp,samba,nfs之类的。
  • 第二,应用开发方面的学好Linux,就是可以在Linux下面进行编程,写出自己的应用,其实一般来说应该是可以在Linux下写服务端。
  • 第三,熟读Linux源码,让自己可以理解操作系统实现的原理。虽然不一定真的要自己去写一个新的操作系统,但是可以从中获得满足感,因为程序员的快乐往往很简单,了解一些运行原理会让我们很开心。或者说为了今后做驱动,做嵌入式系统深度定制等而去学好Linux源码。

那么先说第一种吧。运维层面应该怎么学好Linux呢?

首先,别的你都先别做,先去选定一个Linux发行版,因为不同的Linux发行版操作方式肯定是不一样的。这里建议你用Ubuntu吧,没有别的原因,就是因为我自己一直在用,什么fedora,redhat,centos,arch linux之类的,早被我抛弃多年了。

版本的话你就挑个最新的吧,好像现在都到了20.10了吧?可怜我自己一直在用的还是16.04。不过我一直都是ssh进去用命令行的,基本不用Desktop,所以无球所谓了。

说到这个,那下一个你需要做的就是别去用什么Linux Desktop。不客气的说,你把Linux桌面玩得更溜,其他人都不会觉得你对Linux有多了解,要玩就完命令行。

那么命令行怎么玩,很简单,我立刻根据我现在脑海里面能想到的给你列个清单,其实这个也是我以前给新入职程序员面试的时候考的一些点:

  • 第一,熟悉最基本的ls,ps,cd,cat,sed,awk, apt-get这些命令,你不知道这些东西的话,进入到Linux你就会云山雾罩的找不著北,狂呼:我是谁?我在哪?我在干什么?
  • 第二,先去了解下Linux的文件系统层级结构,术语叫做Filesystem Hierarchy Standard,中文应该叫做文件系统层次标准之类吧。网上找个资料,大把的。这个主要是要让你了解Linux下的文件层级,从根目录开始,显示了解目录树是怎么回事,然后了解根下面各个文件夹如etc,var,proc这些主要是做什么用的。这里会有不少知识点,特别是proc这些,够你学一段时间的了。
  • 第三,学会vim命令。不要求你能配起ctag之类的代码跳转插件,但是vim的一些常用快捷方式你需要懂,比如dd是什么?yy是什么?cc是什么?shift+$是什么,这么进入交互模式,怎么插入,如此这般。自己去尝试编辑一篇文章出来吧,1000字吧,等你完成了,也就是熟练了。记得不懂就去查,别拷贝一行跟我来个滑鼠操作,要完全放弃掉滑鼠!
  • 第四,搭建samba和nfs网路文件共享服务。主要会用到上面所有的知识点,你需要知道去哪里找配置文件,需要知道怎么编辑,需要知道服务启动关闭是怎么被管理起来的,同时,作为新的知识点,你会知道配置文件一般是长什么样子的,到时你碰到个.conf结尾的你就会立刻反应过来知道这是个配置文件,然后看到里面的项目你就会大概知道应该怎么去配。
  • 第五,把sshd配置起来,直到可以从另外一台机器ssh进去。这里主要是上面一点的实操。同时也是为了让你学习方便。因为一般都是装个虚拟机之类的玩Linux,不需要每次都进入到虚拟机里面,直接在你host上面通过ssh进去就完了。
  • 第六,把nginx从源码开始make然后搭建起来,写一个简单的html,直到能通过http和https在外网访问到你的html网页。内网穿透的话有很多免费的,自己去找,没人给我钱,我不想给他们打广告。
  • 第七,学会fdisk,mkfs和dd等这些磁碟和块设备操控命令,运维的话会经常碰到。
  • 第八,手动安装个nodejs。nodejs + express应该是现在服务端最热的搭配,做运维的必须要知道
  • 第九,熟练一些网路工具。比如netstat,nslookup之类的,方便你调试问题。

以上就差不多了。等你做完这些之后,后面的我相信都不需要我去教你了,你自然而然就会遇神杀神,遇佛杀佛,遇到问题找谷歌了。经历过一段时间的迭代之后,相信下次在这里去指导后辈怎么去学好Linux的就是你了。但要记得到时不要捏捏藏藏的,要勇于秉承开源精神,把自己的知识分享出去。

我们上面说了还有Linux软体开发和Linux源码阅读,我感觉战线拉的有点长了,现在时间已经很晚了。我加快点速度,看能说多少就多少把。

第二个,应用开发怎么学好Linux?首先,这里你要确定你最终想要做什么。你是想要开发一个终端应用呢,还是想要开发一个app的服务端?

如果你是想要开发一个终端应用或者一个daemon服务之类的,用c/c++吧。如果是需要console的,我以前用过ncurse库,非常不错的。但是开始之前最后你去买本Linux c/c++编程入门的书籍看一下,然后去了解下make以及makefile应该怎么去写。

别担心,真的不难。只要你花个一头半个月的时间进去,基本上你就能写出自己的一个应用出来了。所以针对怎么学好Linux开发,最重要的一点应该是耐心,沉得住气!

如果你是想做个app的服务端的,去学习以下这几个东西,足够了。

  • 第一,nodejs + express。这是你写服务端的主要框架。
  • 第二,mongodb。这是你的资料库。
  • 第三,redis。这是你鉴权即用户登录需要用到内存资料库。你总不能每次验证用户有效性的时候都去mongodb对比用户名密码吧?搞个access token,session什么的,保存到redis上。

说完Linux应用和服务端开发,下一个怎么学好Linux的命题就到了怎么学好Linux源代码的。这个我自己都没有完全看完Linux源码。但是根据我之前学习的经验,我已经写过对应的一篇回答叫做《Linux内核代码大佬们如何观看的?》的了。看点赞数的,应该很多人认为该方法是可行的。感兴趣的可以关注我到我空间下去看下吧,我就不重新写一遍了。

新手阅读Linux源码的正确姿势天地会珠海分舵的视频 · 2.4 万播放

好了,时间已经很晚了,明天还要搬砖,就先写到这里吧。没有什么时间校验错别字之类了,如果有朋友看到哪里写错之类的,请评论给出来,我再进行修改吧。

最后感谢大家的时间观看,喜欢的欢迎点个赞关注下吧。当前粉丝太少了,我都有点丧失创作动力了。


看你的现状和未来想用 Linux 干什么吧。我是在大三的暑假想给自己增加点技能,学一些课程里没有,但有的确有用的东西。Linux 是接触 Unix 最便捷的途径(20 多年前了,那时候还是 RedHat 6.0 刚出没多久。

为什么不是 FreeBSD?和 Linux 同期出来的。要论可学的内容,及讨论热度,Linux 更多一些。如果一个领域内都是大牛,很少小白,那么能看到的问题就会很少,后面的内容里提到的学习方法就比较难推进。学会了 Linux 再反推 FreeBSD 的学习,在很多基础知识已经具备的前提下,就没什么难度。

核心思路是多动手

刚开始感觉无门而入,装上以后看著那个老旧的 X 界面,还不支持中文,打开 console 界面发现想干什么都不会。就去学校的 BBS 看 Linux 版精华区,自己学校里的看完了就去水木清华(现在也还存在著,感谢 KCN),里面有师兄们写出来的各种经典问题和回答,然后从标题里看到了好多 Linux 命令,就在自己的电脑里看 man page(有问题找男人),到现在也还是英文版的居多,其实看多了就会有感觉,专业英语里用到的英文单词并不多,大不了试试嘛,系统玩挂了就重装。那个暑假重装过不知道多少次,以及,一块硬碟里装 10 个不同版本的发行版,互相之间 chroot 什么的。如果是学生,我会建议也这么多来几遍,如果已经工作了想要拓展自己的职业能力,我不建议在这方面多花时间,某个周末把俩虚拟机的硬碟文件挂一起试试看怎么修改启动菜单,启动以后怎么 chroot 也就差不多了。

后来就主要是关注各种 shell 命令了,vim 不说了(emacs 也有很多人用,这两种编辑器的各有阵营,选自己觉得喜欢的就好),grep/ sed / awk,然后发现正则表达式是个绕不开的问题,就去研究了一下正则表达式(regexp) ,后来实习的时候刚好遇到一本书是讲正则表达式的,有两包烟那么厚。

自己想要去遇到问题然后解决,会比较慢。这时候 BBS(现在是各种专项论坛)的重要性就体现出来了,天天跑去学校 BBS 上帮别人解决问题。因为 100 个人遇到的问题,比自己去探索要迅猛的多了,这是重点,有点像「分散式问题发现」,因为未来那些问题都有可能是自己会遇到的。用问题帮自己打开门

现在当然有很多书、线上的或者印刷版的可以看了。这方面我感觉,如果想走捷径,不想吃苦,那干脆就放弃了算了。成书的通常是比较常规的操作教学,分两类,笼统的 Linux 学习的书,因为内容长度限制,会把常规操作、问题列出来,就想数学书里会讲怎么解方程,但还是要自己会做应用题,会去用哪些方法。另一类是专项的书籍,像我上面提到的正则表达式那一大本。

入门时,全系统教学的那类选一两本就好,比如鸟哥 Linux 那本也盛行了好多年了吧,现在也经常见到有人推荐,坦白说我没看过,因为那本书出来的时候我已经不用看那类(第一类)教学书籍了。然后就回去选各种专项书籍看看,不好推荐,因为分支和方向太多。图书馆和书店是好东西,以及各种别人总结出来的文章(用了 20 多年 vim,现在我在知乎上看 vim 相关的问题和回答,依然能学到好多东西,是版本更新和自己以前忽略过的)。

中间尝试翻译一些 man page,和写一些经验总结的文章,因为在写文章的时候需要全面、具体,能促进自己把某件事情学透,所以写东西是个不错的学习方式,即使你觉得自己很菜,总有比你更菜的人需要你再往前走的时候总结的经验。有点记不清了,记得写过一篇 X Window 的配置文件详解,怎么在各种显卡的机器上获得最好的显示效果(是的,那时候大部分台式机都是自己攒的,什么显卡都有,支持和配置都会比较麻烦),还有一篇我确实忘了,因为那两篇对现在的 Linux 发行版都已经用不上了。

熟读对自己很很有用的文档,会遇到很多自己不知道的名词,而且是很有用的名词,比如 regexp。

  • 比如当时觉得 bash 内置命令、参数、环境变数,以及写脚本遇到的问题,对自己有困扰,就把 bash 的 man page 通读了一遍,很长,但花费的时间,让我在未来的若干年里都受益(写了个 shell 脚本,挂在 inetd 下面做服务,快速解决问题)。
  • 再比如 vim 的初学者都觉得很难用,那我就打开它,进入帮助页,挨个试。比较耗时,因为很多时候都需要先把那些命令或操作键需要的编辑内容写出来(比如写一段代码什么的)。
  • 再比如各种网路配置,怎么通过配置文件完成各种设置,然后不重启系统让那些配置生效。
  • 如果将来想做运维,还可以去熟悉各种伺服器软体的配置,比如 bind(域名解析)、apache、nginx(这俩是 Web 伺服器)、proftpd(ftp 伺服器)、sendmail、postfix(这俩是邮件伺服器)。
  • 如果对安全感兴趣,可以学习 SELinux,PAM 认证,ssh server 配置。

即使一些东西自己仅仅是浅尝则止,但是未来在需要用到的时候你能知道有那样一个东西存在,再去深挖找答案,都好过在遇到问题的时候茫然不知所措

回答这个问题到现在的话,总结出来就是发现自己的未知,然后找答案,是最好的学习方式。

现在的学习、提问途径已经比以前丰富太多了,如果 google 搜索用不了,那也百度,面试人的时候我会问到对方找答案的方式。国外的 stackoverflow 上有好多问题和答案,GitHub 上也有好多学习资源,各种 awesome- 打头的项目。

找问题,找答案,别提问。因为你问的问题,都是好多人早就问过,也有好多人都已经回答过的

还有一点是,如果你不做嵌入式,不是想要改造系统,没有写驱动的需求,从实际需要的角度出发,就先别尝试阅读 Linux Kernel 源码,及内核研究领域。现在的 Linux 源码已经足够复杂了,得不偿失。如果是出于个人兴趣,那就请随意。

-- 补充 --

后来我在这样的基础上,利用 Linux 的网路知识,首先是混成学校 BBS 管理员,一起改进代码。然后更重要的是,搞懂了 HTTP、SMTP、POP3、IMAP 这些基础协议。邮件现在用的少了,而且不能随意架设伺服器。但 HTTP 相关的知识,不管 Web X.0,都依然很有用。


10年运维 安全 网路 搬砖工大概总结下

希望能可以更多人带来帮助

先观其大略,再不求甚解。

1.学习的流程入门,进阶,高级,任意发挥

入门篇:大概就是Linux前世今生,基础命令,系统文件操作,网路设置操作,开关机自动化简单命令,这部分枯燥但是以后天天会用,一定要了如指掌。切勿死记,要学会用man help 等。

进阶篇: web dns ftp database php java 等各种开发环境的搭建,日志分析,拍错理解各自之间的关系。一定要多会用搜索引擎,因为目前只要能出现的错误,不像10年前,一搜1页,还得去国外找e版本,所以的报错前辈们都基本上有解决办法。

高级篇:一般到高级服务的时候,公司或者运行的环境已经10+以上设备了。前端集群,中间件,缓存,资料库,日志分析,大数据分析,虚拟化平台,这部分的时候一定要熟悉改服务的整套运作模式。

任意发挥: 武功最高境界是无招胜有招,出什么错排什么错。自己不会就借力。借朋友,借圈子,这时候就呈现出来的是资源的重要性。

2.技术圈内圈外论

圈子,决定高度,圈子不同,不能硬融。

一定要会分析属于自己的圈子

找到适合自己的技术圈

避开锋芒,学会错位和自己的定位

找本地的技术论坛峰会报名参加

兵法曰 知己知彼 百战不殆

3.找领地 深耕细作

如果经过了5-8年以上,还在整天孤岛web db

拆硬碟,剪网线,那索性就放弃这个行业吧!

技术领域是真正属于那些勇于探索的小伙伴

你们加油,俗人只喜欢搞钱。

所以放弃了这个圈圈!


推荐阅读:
相关文章