京山游侠

专注技术 拒绝扯淡
posts - 63, comments - 403, trackbacks - 2, articles - 0
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

玩转 Linux 系统的方法论

Posted on 2014-05-27 21:37 京山游侠 阅读(...) 评论(...) 编辑 收藏

Linus 说“Just for fun”,而我要说“Just for 折腾”。想知道我是怎样折腾 Linux 的,请看下面这个截图:

从这个截图可以看出,我为了“折腾” Linux 系统,在我的电脑上安装的 5 个不同的发行版。它们分别是 Ubuntu 14.04 桌面版、CentOS 5.10、CentOS 6.5、Fedora 20 和一个 Ubuntu 14.04 Server 版。在以上所有系统中,只有 Ubuntu 14.04 桌面版和 Fedora 20 开启了 GUI,其它的几个系统都使用字符界面。上面的截图就是我在 Ubuntu 14.04 桌面版中,使用 ssh 远程连接到另外四个系统时的情形。

关于字符界面和图形界面

多年前,我使用 Linux 系统是偏爱字符界面的。装 B 神器啊,不管是别人看起来还是自己看起来,都显得特别的高大上。当然,字符界面用起来那也是相当舒服的,不过只是曾经。为什么这么说呢,那是因为在 14 寸或 17 寸,分辨率限于 1024*768 的时代,使用字符界面,字体不大不小,也没有刺眼的强光,眼睛看着非常舒服。可是,自从液晶屏、高分屏时代来临之后,这种舒服感就一去不复返了。原因何在?字太小。比如在我这个 21.5 寸 1920*1080 的液晶显示器上,使用纯字符界面根本没法看,即使开启 FrameBuffer 也没办法把字体变漂亮。在我的显示器上,必须使用 15pt 到 16pt 的 Dejavu Sans Mono 字体,眼睛看着才舒服。现在在网络上,仍然有很多人问怎么把 Linux 设置成启动后自动进入字符界面这样的问题,我很想告诉他们:拉倒吧,还是使用图形界面靠谱。对于确实没有图形界面的服务器系统,还是老老实实使用 ssh 远程连接吧。

在图形界面下,使用 gnome-terminal 依然可以模拟全字符界面,只要按一个 F11 键全屏即可。甚至可以设置半透明背景,看起来更拉风。如下图:

Fedora 20 的图形界面也不错,如下图,在图形界面下使用 Vim 和 GVim 都很清爽:

为什么要装这么多不同的发行版

都是 Linux,为什么要装这么多的发行版呢?那是因为系统和系统之间是不一样的。不同流派的发行版不一样,同样流派的发行版,老系统和新系统也不一样。还是以上面提到的那个经典问题“怎么把 Linux 设置成启动后自动进入字符界面”为例。对于这个问题,教科书式的回答是:将 /etc/inittab 文件中的启动级别修改为3。但是,我可以很负责任地说:教科书过时了。

我最早是从 Red Hat Linux 9 开始接触 Linux 的,那时,天天抱着一本《Red Hat Linux 9 宝典》啃。很显然,这本书现在已经是古董级了,因为 Red Hat 后来就开始做 Enterprise Linux,每两年一个版本,现在已经到了 Enterprise Linux 6,马上就要出第 7 版了。在我安装的这些系统中,CentOS 等同于 Red Hat Enterprise Linux,Fedora 是 Red Hat 新技术的试验场,所以他们是一个流派的,Fedora 20 比 CentOS 5、CentOS 6 新,Ubuntu 则是另外一个流派,每半年出一个新版本,我用的是目前的最新版。

我想,我们中的很多人学习 Linux 都是从 Red Hat 开始的吧。就像我家里总有那么几本经典教材,如下图(我书柜一角的照片):

对于前面提到的那个经典问题,教科书式的回答仅适用于 CentOS 5 及其之前的版本,其它的系统则各有各的方法。我将在后面讲述方法论的时候详细说明。

折腾 Linux 系统的方法论

要想在 Linux 江湖中畅行无阻,光靠几本入门书是远远不够的,还得掌握适当的方法。我的方法论如下:

1.在使用一个命令的时候,最好要知道它属于哪个软件包;

2.会查找和安装软件包,安装软件包后,要能够找出文件都安装到哪里了;

3.要会阅读软件的文档;

4.实在不行了,那就看源代码吧。

使用我的方法论还是得有一定的 Linux 基础(比如如何进行用户管理、文件管理等,以及了解 Linux 究竟是个什么样的系统这样的基本哲学问题),所以教科书还是很有必要读那么几本的。过了基础阶段,折腾 Linux 其实就是折腾 Linux 系统下的各种软件,这个时候,掌握正确的方法论尤其重要。

举例说明

还是以前面提到的经典问题为例,究竟怎么样才能让 Linux 系统启动后自动进入字符界面呢?按我的方法论,我们还是得从软件分析起。Linux 系统的内核加载完毕后,第一个执行的进程是 init,是进入字符界面还是进入图形界面,当然是 init 说了算。不同的系统,启动的第1个进程都叫 init,可此 init 等于彼 init 吗?所以,1.我们要找到这个 init 属于哪个软件包;2.找到这个软件包的文件都安装在文件系统的哪些位置,这个软件包还包含哪些程序,包含哪些文档;3.阅读这个软件包的文档(当然,首先利用搜索引擎对该软件包做一些功课是必须的);4.实在不行就阅读源代码吧。

在Red Hat流派的系统(CentOS、Fedora)中,软件的包管理器是 RPM。先看CentOS 5.10,首先,使用 which init 命令,可以查出 init的完整路径为 /sbin/init;然后使用 rpm -qf /sbin/init 命令,可以查出 init 程序所在的软件包为 SysVinit;最后,使用 rpm -ql SysVinit 命令,就可以看到这个软件包里面还有哪些程序、哪些文档以及它们分别位于文件系统的什么地方了,如下图:

而Ubuntu属于另外一个流派。它的包管理器为 dpkg。在 Ubuntu 中,首先,使用 which init 命令,可以查出 init 的完整路径为 /sbin/init;然后使用 sudo dpkg -S /sbin/init 命令,可以查出 init 程序所在的软件包为 upstart;最后,使用 sudo dpkg -L upstart 命令,就可以看到这个软件包里面还有哪些程序、哪些文档以及它们分别位于文件系统的什么地方了,如下图:

用同样的方法研究一下CentOS 6.5,发现其 init 程序也是属于 upstart 软件包,如下图:

究竟是什么样的优势使得 upstart 软件包取代了传统的 SysVinit 软件包呢?很显然,有了以上信息,我们在 Google 上以 upstart、SysVinit 作为关键字搜索一下又有何难。另外,还会有更先进的软件包取代 upstart 吗?让我们看看 Fedora 20 用的什么,如下图:

原来 Fedora 20 用的是 systemd。使用 cat /etc/inittab 命令可以显示 inittab 文件里面的内容,从其提示可以看出 Runlevel 的概念早已无影无踪。由此可见,inittab、RunLevel 都不是 Linux 本身的哲学,只是软件层面的定义而已。

查找和安装软件包

使用 Ubuntu、CentOS、Fedora 等 Linux 发行版有一个很省心的地方,那就是它们都具有官方的软件包仓库,只需要一个命令,就可以从仓库中查找、安装相应的软件包。Ubuntu 系统使用的是 apt-get 或 aptitude,Red Hat 流派的系统使用的是 yum。如下图,在 Ubuntu 中使用 aptitude 查找软件包:

在 CentOS 5 中使用 yum 查找软件包:

怎么查看软件的文档

Linux 就是一座宝藏,其中有汗牛充栋的精心编写的文档,一辈子都学不完。要发掘这座宝藏,有两把钥匙必不可少,它们就是 man 和 info。比如,想学习 bash 编程,可以尝试输入 man bash 来查看 bash 的文档,如下图(后面的截图都是将 gnome-terminal 全屏后的效果,完全模拟全文本界面,没有设置半透明背景):

而对于 GNU 出品的软件,往往都提供 info 格式的文档,可以通过 info 命令阅读。例如,想了解 Grub 怎么安装和配置,可以输入 info grub 查看其文档,如下图:

需要提一下,在 Ubuntu 中,很多软件的文档是单独打包的,可以通过 aptitude search 命令搜索,通过 aptitude install 命令安装相应的文档包。有些软件的文档可能不是 man 格式或 info 格式,而是 html 格式或 pdf 格式,这时,可以通过前面提到的方法找到这些文件都安装在文件系统的什么地方,然后使用相应的阅读器打开阅读。

阅读源代码

通过查找软件包、无所不能的搜索引擎和精心编写的文档,我们基本上可以解决 Linux 系统下绝大部分的问题。只有极少数情况下,可能需要阅读源代码。

在 Ubuntu 系统下,可以通过 sudo apt-get source 命令获取某一个包的源代码。比如要想学习 getty 是怎么写的,想看它的代码,使用如下图命令:

在 Ubuntu 中,Linux 内核的源代码是特例,它单独打包。可以使用如下命令搜索内核的源代码:

yum 自己并没有下载安装源代码包的功能。

但是 yum-utils 软件包中的 yumdownloader 工具可以让人下载源代码包。命令为 yumdownloader --source package-name。下载的源代码包是 .src.rpm 格式。如果只想阅读源代码,而不是想重新编译源代码的话,可以使用 rpm2cpio 命令和 cpio 命令对该源代码包进行解包。截图如下:


源代码下载和安装后,如果仅仅只是阅读,使用 Vim 足以。在“Linux江湖”系列的后续随笔中,我肯定会有一篇讲如何折腾 Vim 的,所以不在这里继续啰嗦。

总结

掌握了以上方法论,当在Linux中碰到困难时,即使没有书本或别人的指导,也可以通过自己的努力找到解决问题的办法。前面提到的命令如下:

  Ubuntu系统:
    which
    dpkg -S
    dpkg -L
    aptitude search
    aptitude install
    apt-get source
    man
    info

  CentOS、Fedora系统:
    which
    rpm -qf
    rpm -ql
    yum list
    yum install
    yumdownloader --source
    rpm2cpio
    cpio
    man
    info

(京山游侠于2014-05-27发布于博客园,转载请注明出处。)

 

从 Fedora 22 开始,DNF 全面取代 YUM 成为 Feora 系统上的软件管理工具。DNF 同样不提供下载源码包的功能,但是通过 DNF 的插件可以下载源码包。先安装 DNF 的插件:

sudo dnf install dnf-plugins-core

然后这样查看文档:

sudo rpm -ql dnf-plugins-core

man dnf.plugin.download

这样下载源码包

sudo dnf download package-name --source

(京山游侠于2016-10-04更新于博客园,转载请注明出处。)