怎样提升 Linux 水平?

针对你的问题,我觉得与其耗费大量时间在 Linux 系统上,不如花点时间把语言深层次的东西(Java知识点其实真的不少)和一些基础的工具和服务了解一下,完善自己的技术栈和工具栈,比如 Git RPC Mysql Redis Java 的 SSH 框架,MQ,Nosql等等,Linux 不过是一个生产环境,大部分操作都是十分基本的,相反这些技术栈是你要经常用到的,可以多深研究一些。

作为 Linux 多年用户,我来分几点简单说说:

  1. Why Linux ?

知乎上有个问题,一般人用 Linux 算是找虐吗? 我觉得提这种问题的人是很迷茫的,他迷茫就迷茫在不知道为什么要用 Linux ,因为我们知道在桌面操作系统,一般人的工作娱乐首选肯定是 Windows,这个毋庸置疑,当你有个想法要尝试一种新的操作系统,那么你的想法来源是什么呢?

想做个 Geek ,弄些高端的东西。 不否认从好几十年前比尔盖茨那个年代开始电脑黑客的厉害就深入了广大群众的内心,比如做个个人网站,使用 aircrack-ng 破解个Wi-Fi 密码之类的,那推荐使用 Ubuntu,开箱即用,搜索 『u 盘安装』估计就有推荐搜索 『u盘安装 Ubuntu』,作为Linux 新手,这个几乎是你的首选。

原因有很多,文档极其多,别管都是互相抄了多少遍,但是就是多的不行,各种问题都能找到解决的方案,Stack Exchange 甚至有专门的社区 Ask Ubuntu ,除此之外英文不好的国内中文用户一个极佳的选择,那就是 首页 • Ubuntu中文论坛 ,上面有一大堆网友自己的分享,Ubuntu 用户常搜的几个问题:换源,启动引导,网络配置,Wine,美化,安装 QQ,在这里都能找到一些帖子。

码农想提升自己对计算机,编程的整体认识。如果你对自己学习能力十分自信的话,直接上 Arch /ˈɑrtʃ/ linux,甚至可以尝试 Gentoo /’dʒentu:/。为什么不推荐 Ubuntu 了呢?因为这东西为了迎合更多桌面用户有的地方做的太方便甚至无脑了,比如 boot manager,kernel,driver, locale,fstab,File System ,package manager 的支持实在是太人性化了 ,想要知道更多细节,你需要自己配置一下 Linux,而且多年前我使用 Ubuntu 的时候,经常出现 Xorg 崩溃,很多 Ubuntu 用户都对其经常崩溃的 feature 诟病不已。

2. How to learn Linux?

无论是学习 Linux 还是一门新的编程语言,大胆的去用吧,『读万卷书,不如行万里路』,在我看来这句话想告诉我的是『实践才会理解地更深入』,作为一个技术人员,敢于折腾,善于折腾,从折腾中温故知新,是极其宝贵的品质。

  • 敢于折腾 -> 有勇气尝试新事物,未知事物
  • 善于折腾 -> 逐渐掌握一套系统解决问题的手段
  • 从折腾中温故知新 -> 你会明白之前一直用的东西为什么要这么设计,书中讲的经验原来这么有道理。

首先你要明白一点就是 Linux 严格的说是一个内核,只不过现在大都统一把基于 Linux 的完整操作系统叫做 Linux,下面接着之前的两个发行版来简单讲讲:

作为滚动升级 Linux 的代表发行版,Archlinux 和 Gentoo 会帮助你更理解(Linux)操作系统,Archlinux 无需编译内核,安装过程比起 Ubuntu 要繁琐一些,因为要从头配置系统,如果对于安装过程足够熟悉,而且网速好,1个多小时即可安装成功。

Archlinux 有一个相当优秀的中文社区 https://bbs.archlinuxcn.org/ ,上面有详细的安装教程和各种配置,硬件问题的讨论,详细到安装只需要 copy 命令即可,从安装开始你将逐渐理解 (Linux)操作系统的 UEFI 模式,硬盘分区,文件系统格式,mount,fstab,locale,hosts,用户管理,alsa等硬件驱动的安装, desktop environment 等等。

Gentoo 也有一个比较详细(和前几个不能比)的 wiki,Gentoo Wiki,和(就那么几个人的)论坛 https://forums.gentoo.org/ ,由于 Gentoo 几乎是最接近于底层的 Linux 发行版,所以先说明,坑很多,甚至网上无答案,得看源码,需要耐心,解决问题能力极强的人,但是 Gentoo,却是能帮助你进一步理解 Linux 内核的。

从头编译内核,你需要看硬件

然后根据硬件信息,到内核中找到驱动

你会明白内核中需要配置 64-bit kernel, File systems ,Device Drivers,Network,CPU,各种支持,以及引导过程中的 kernel 和 initrd 是如何生成以及加载的,当然要想知道具体的内容,你只能耗费大量时间去看源码。

同时你会发现 Linux 中的包管理器是可以自定义每个软件的依赖支持,以及如何编译安装的

对于 Linux kernel,有一张不错的漫画生动地描述了 kernel 中几个部分是如何工作的,可以看一下

3. Tools

图中给了大量 Linux 常用的性能观测工具,其中有系统安全方面的神器 lsof(当你遇到 Linux 病毒的时候,它会帮你大忙),网络监控相关的 netstat,tcpdump,iptraf等等,io相关的 iostat,功能较多的 dmesg(显示linux内核的环形缓冲区信息,比如系统架构、cpu、挂载的硬件,RAM等多个运行级别的系统信息),sar等等。

如果你的工作是基础架构那么这些命令可能会用到,否则的话,可能只是偶尔才会用到。

4. Some advice(折腾了无数次得来的经验)

  • 勤备份,Linux 有『一切皆文件』的设计哲学,不要把 Linux 想得过于复杂,当你想要折腾的时候,比如升级内核,从 udev 切到 systemd,记得备份,备份是当你发现问题的时候的救命稻草。下面是一个备份和恢复的命令 (需要安装 pv 包)

BACKUP

tar cpf - <some_folder> | pv -s $(du -sb . | awk '{print $1}') | gzip > backup.tar.gz

RESTORE

pv backup.tar.gz | tar xzpf - -C <some_folder>

5. 其它帮助资料(基本都是书籍,别去看视频了,看书吧)

  • 《鸟哥的Linux私房菜》通俗易懂
  • 《Linux 内核设计的艺术》从最初的不是十分复杂的内核讲起
  • 《UNIX环境高级编程》 巨作

6. Linux 带给我什么?

刚开始玩 Linux 的那几年,电脑上多系统共存很多年,如此迷恋 Linux 带来的是什么呢?我觉得它带来的是一种全新的思维理念。

它就像积木

我们常用 Free 形容 Linux,这里的重点当然不是指免费,而是『自由』。那么对应的做一个比喻的话,我觉得它就像积木,Linux 的内核,驱动,文件系统,上层应用等等都好比是积木的一块,它们之间通过约定的接口相互契合,协同工作,共同搭建了这样一个高效稳定的系统,积木的另一个特点就是灵活,很多积木的接口都是一致的,使用接口相同的其它积木也有可能带来意想不到的效果,比如你把 File system 从 ext4 换成了 Btrfs 或者 ZFS(不建议这么做),可能会带来某些特性(和很多坑),又或者你把 Linux 的 desktop environment 从臃肿的 KDE 换成了 XFCE,或者命令党的你直接使上了 awesome ( Window manager )。

这些都说明了 Linux 的灵活,那么放到编程的领域,这其实又和编程的接口理念一致。

只做一件事,把它做好

Linux 中有大量极为优秀的包,它们有可能是系统管理命令,监控命令,或者是生产力工具,提起它们的名字,都会让你想到输入命令后的结果,每个东西只负责一小块,这又和编程中的『高内聚,低耦合』的理念不谋而合,还有后来提出的 『微服务』的概念,这样你就会在写程序的过程中不断反思,不断重新审视代码,哪些部分是需要抽象出来的,哪些会被大量反复的使用,这就会帮助你养成良好的编码习惯和思维习惯,对后续的维护和重构,优化都有极其明显的帮助。

来源:知乎 www.zhihu.com

作者:

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载

此问题还有 25 个回答,查看全部。