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江湖中畅行无阻,光靠几本入门书是远远不够的,还得掌握适当的方法。我的方法论如下:
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查找软件包:
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首发于博客园,2015-01-08整理于BlogJava,转载请注明出处。)