特别说明:要在个人随笔后写评论的小伙伴们请注意了,个人博客开启了 MathJax 数学公式支持,MathJax 使用
$
标记数学公式的开始和结束。若是某条评论中出现了两个$
,MathJax 会将两个$
之间的内容按照数学公式进行排版,从而致使评论区格式混乱。若是你们的评论中用到了$
,可是又不是为了使用数学公式,就请使用\$
转义一下,谢谢。html
什么状况下适合玩 Linux 桌面
个人这一个系列是讲 Linux 桌面的。Linux 系统开源、开放、稳定性强、软件丰富且性能颇高,在服务器领域占据了至关大的市场份额,可是在桌面领域,市场占有率仍是很是低。我为何把写做的重点放在 Linux 桌面呢?那是由于 Linux 服务器系统每每提供比较详细的文档,例如这个 Ubuntu官方文档,而 Linux 桌面的文档和教程却至关缺少,网上也只能找到一些零散的资料,这些资料每每内容陈旧,跟不上 Linux 桌面的发展,大部分又不能讲明白其背后的原理。因此我决定,将我多年使用 Linux 桌面的心得与体会拿出来与你们分享。喜欢的朋友请点赞。linux
什么状况下适合使用 Linux 桌面呢?首先,固然是程序员群体。这是由 Linux 特性决定的,无论怎么说,Linux 毕竟仍是一个专家系统和玩家系统,它的门槛比较高,就算是有图形化的桌面环境,没有必定的基础也玩不转。并且就算是有基础懂电脑,也必须得要有一个爱折腾的心,不然,极容易走上从入门到放弃的道路。Linux 对普通用户门槛高,可是对程序员却至关友好。不少编程工具几乎都是开箱即用的,例如 C/C++、Python、Java 啥的,还有最流行的 LAMP 组合(Linux+Apache+MySQL+PHP),因为目前的 Linux 发行版都有维护很好的软件源,因此当须要某些编程工具的时候,一条sudo apt-get install
命令就能够搞定整个工具链的安装。不少状况下,程序员的成果须要部署到服务器上运行,因此直接在和服务器同源的 Linux 系统下开发和测试,会更加方便。另外,Linux 系统中充斥着各类各样的微型语言,像正则表达式、Shell脚本、sed和awk、JavaScript、宏语言(tex、m4)、标记语言(Markdown、xml、css)等,这些语言会出如今使用 Linux 系统的整个过程当中,经过这些语言,能够学到各类闪光的思想,熟练使用这些语言,能够极大地提升咱们使用电脑的效率。git
另一个适合使用 Linux 桌面系统的人群就是装 B 犯,就像我这样的。虽然 Windows 系统好用,可是烂大街了不是吗?在你们都用 Windows 的时候,我忽然掏出来一个装着 Linux 桌面的笔记本,是否是 B 格爆棚?多年前,我使用 Linux 系统是偏心字符界面的。装 B 神器啊,无论是别人看起来仍是本身看起来,都显得特别的高大上。固然,字符界面用起来那也是至关舒服的,不过只是曾经。为何这么说呢,那是由于在 14 寸或 17 寸,分辨率限于 1024*768 的时代,使用字符界面,字体不大不小,也没有刺眼的强光,眼睛看着很是舒服。但是,自从液晶屏、高分屏时代来临以后,这种舒服感就一去不复返了。缘由何在?字过小。好比在我这个 15.6 寸 1920*1080 的 Dell XPS 15 上,使用纯字符界面根本无法看,必须使用 15pt 到 16pt 的 Dejavu Sans Mono 字体,眼睛看着才舒服。如今网络上,仍然有不少人问怎么把 Linux 设置成启动后自动进入字符界面这样的问题,我很想告诉他们:拉倒吧,仍是使用图形界面靠谱。对于确实没有图形界面的服务器系统,仍是老老实实使用 ssh 远程链接吧。程序员
在图形界面下,使用 gnome-terminal 依然能够模拟全字符界面,只要按一个 F11 键全屏便可。还能够设置为半透明背景,看起来更拉风。以下图,这个是用的 Vim,在我这一系列的后续随笔中,确定会有一篇专门讲 Vim 的:正则表达式
即便不是程序员,Linux 桌面也确实是能够用来工做的。写论文、作 PPT、讲课都不在话下,我已经用 Linux 桌面工做十几年了。个人笔记本电脑是 Dell XPS 15,系统是 Ubuntu 16.04,用的软件是 LibreOffice,无论是写论文,仍是作 PPT 课件,或者链接到大屏幕上进行 PPT 展现,都毫无压力。并且,Linux 还能够切换工做区,我能够在一个工做区中全屏播放 PPT,而后按一个快捷键,就切换到另外一个工做区,使用非播放状态的 LibreOffice 教别人怎么作 PPT。不得不认可,最好用的办公软件仍是 Microsoft 的 Office 2016,可是在 Linux 下,只能使用 LibreOffice 或者 WPS。这几个办公软件我都用过,得益于我不怕困难的精神,无论使用哪款办公软件,我都可以圆满地完成个人工做。其实仔细想一想,不少人使用 Word 时,也只是把它当成一个高配版的写字板,而 Excel 也只不过当成一个格子纸而已,并不必定须要最强功能的 Office 软件。至于更高级的数据处理需求,又怎么可以可贵倒咱们程序员呢,Python 和 Java 可不是吃素的。shell
在专业人士面前,使用 Linux 桌面也不掉价。我有个朋友,华科大的博士,南洋理工的博士后,目前在西班牙作研究。前段时间他回国,咱们坐着聊了一聊。他作的是数值计算和数据可视化方面的研究,模拟肿瘤生长什么的,论文发了很多,其中有一个计算,听说使用 128 核的服务器跑了一个多月。我羡慕得不得了,这样的项目和资源,我是不可能接触到的,这辈子都不可能了。我要看他的成果,他掏出了 MacBook Pro,给我看他的论文。咱们聊,用什么写论文啊?他说用 LaTeX。我说哎呀,LaTeX 我也会啊,不过基本不用,国内仍是 Word 用得多。而后他给我演示 LaTeX,结果中文碰到困难了,说在国外作研究写论文,用的全是英文,没碰到中文的问题啊。这时,我掏出个人 Dell XPS 15,说你看你看,我用的 TexLive 全家桶,使用 XeLaTeX 引擎,直接支持 Unicode 字符集和 UTF-8 编码,中文不是问题,哦对了,你在国内写文章的话,还有六种字体少不了,分别是宋体、楷体、黑体、仿宋、隶书和幼圆,你须要借用一下。而后再聊用什么编辑工具,我说我用 TexWorks,他说他用 TexStudio,还一再强调 TeXStudio 好用。我说那好,我也装一个吧。而后sudo aptitude install texstudio
,一条命令一分钟搞定。编程
这里我反复提到 Dell XPS 15,真的不是打广告,这款笔记本颜值真的是不输的,哪怕他用的是苹果。其实我使用的已是几年前的产品了,等我有了钱,必定买一个最新款的带 4K 屏的 XPS 15,以证明我之前说的,只要屏幕分辨率够高,字体渲染就不是事儿。而后我和我朋友接着聊,聊到数值计算的语言,我说我主要用 Octave 和 Python,他说哎呀,Octave 我知道,就是那个和 Matlab 语法如出一辙的开源版本吧,我说是呀,而后给他简单演示了一下。聊到数据可视化,他说他们用的是 NASA 出品的 ParaView,而后给我演示了一下。我说这玩意儿不错,要钱吗?他说不要钱,开源的。我说你等我一下,而后我sudo aptitude search paraview
,一看,软件仓库中还真有,再而后,sudo aptitude install paraview
,又是一条命令一分钟搞定。接着聊,我说你这论文中的图片不错啊,都是计算生成的吗?他说不全是,你看这个概念图,是我老板用 InkScape 画的。我说 InkScape 我也会用呃,不过没有你老板画得这么漂亮,你老板功力真深厚啊。接着给他展现了一下我系统中的 InkScape,虽然没有他老板用得好,可是比我朋友强,由于他根本不会用。我说除了 InkScape,我还会用 GIMP,P 图嘛,仍是咱们中国人强一点。ubuntu
聊着聊着,他说你这本子不错啊,用的什么系统啊,怎么感受比个人苹果还溜呢?我说是 Ubuntu,Linux 的一个发行版。他说 Linux 他知道,他们实验室虽然清一色的苹果,可是服务器上跑的是 Fedora。我笑了,Fedora 我多熟啊,虽然我和个人这个朋友之间,差了不止十个博士后的距离,可是 Linux 桌面系统让我收获了满满的优越感。vim
Linux 桌面系统的特色和现状
固然,Linux 桌面系统并非百分之百的好,它仍是有不少问题的,也仍是有不少困难的。在不少方面,它真的仍是比不过 Windows,特别是在如今 Windows 10 日新月异、新功能愈来愈多的状况下。可是 Linux 桌面绝对是一个值得一玩的系统。目前,Linux 桌面是个什么现状呢?
首先,我以为 Linux 发行版分化严重。Linux 发行版太多了,什么 ElementaryOS、ArcLinux、LinuxMint、Ubuntu、Fedora、Deepin、Zorin-OS 不一而足。除了发行版的分化外,还有桌面环境的分化,最大的两家分别是 Gnome 和 KDE,除此以外,还有 Xfce、Cinnamon、LXDE 等,而 Gnome 又分 Gnome 3 和 Gnome 2,还有至关多的人,停留在 Gnome 2 的时代不肯意升级,还把 Gnome 3 批评得体无完肤。Ubuntu 一直到 17.10 以前,都是使用本身开发的 Unity 桌面,虽然漂亮,可是也是对 Linux 桌面的一种分化。而后,Ubuntu 忽然宣布放弃 Unity 桌面,回归 Gnome 3,这也算是一件好事。如今,使用最新版的 Ubuntu 和最新版的 Fedora,终于没有太大的差异了,都是使用 Gnome 3 做为桌面,即便其界面风格不一样,可是使用思路和美化思路是同样的。在之后的随笔中,我只使用 Ubuntu 进行截图和举例,除非对于某些问题须要其它版本进行对比。
其次,Linux 桌面默认图形界面不够美观。若是一个系统看起来不顺眼,估计你们是没有心情继续用下去的。安装以后看一眼再卸载这种事不少人也没少干。有字体问题、主题问题、桌面壁纸问题、显卡驱动问题等等。安装 Linux 系统后,必须得很是有耐心地进行设置和美化,才能将它变成一个用起来舒服的系统。在这一篇以后,我可能须要使用至少两篇的篇幅来说 Linux 桌面的美化和字体,固然,仍是使用最新的 Ubuntu 发行版。并且 Linux 桌面光靠社区的力量,进步太慢了,Gnome 3 都有好多年了吧。还有 Wayland,提出概念也有好多年了,到如今还不能算是百分百成熟。而微软的 Windows 10 近几年日新月异,功能愈来愈强大,界面愈来愈美观,Windows 10 下的 Linux 子系统有了,到我写这篇随笔的时候,Windows 10 也能支持多个工做区了。
最后,就是生产力工具并非很容易找。前面说过,Linux 系统对程序员很友好。这个友好主要表现为编程语言多,开箱即用,但并不表明针对这些语言的 IDE 工具也完美。开源的工具虽多,可是比起 Microsoft 的宇宙最强 IDE——Visual Studio 来讲,一个能打的都没有。Vim 虽好,可是也不可能靠这一个锤子敲遍全天下全部的钉子啊。不少时候,我不得不寻找闭源的、甚至是收费的商业软件来进行工做。例如,Eclipse 写 Java 是不错,可是对 JavaScript 的支持就太差了,直到 2016 年过了一半才支持到 ECMAScript 5 不说,尚未智能提示。好在微软出了个 Visual Studio Code,该编辑器使用 electron 开发,JavaScript 是它的母语,因此它对 JavaScript 的支持是很完美的。可是若是写 Python,用 VS Code 的话,智能提示就又很差了,因此,我不得不上 PyCharm,你们知道,JetBrains 的全家桶是要收费的。再例如,想找一个可视化的网页设计工具,开源领域像 Dreamweaver 这样的一个都没有,每次找工具,推荐的都是 BlueFish,而其实 BlueFish 最多只能算一个支持 HTML 语言和 CSS 语言的文本编辑器,一点所见即所得的功能都没有。
我选择 Linux 系统的原则
Linux 的发行版这么多、桌面环境也这么多,咱们究竟应该选择哪个呢?我选择的是 Ubuntu,在我写这篇随笔的时候,它的最新版本是 18.04,不过 18.10 快出来了。Ubuntu 已经放弃了 Unity 桌面,回归到 Gnome 3了。另外,我偶尔用一用 Fedora,目前最新的是 Fedora 28,估计 Fedora 29 也快出了,我选择的依然是 Gnome 3 版本。
是否是 Gnome 3 必定就是最优秀的呢?不必定。从美观的角度看,Gnome 3 不是最漂亮的,从功能的角度看,Gnome 3 也不是最强大的,从轻量级的角度看,Gnome 3 也不是运行速度最快的。那我为何会选择它呢?我主要是从这样几个方面考虑。首先,市场占有率要大,这样,用这个版本的人就多,有问题也更容易被发现和修复。其次,要善于拥抱新技术、新观点,虽然 Gnome 2 的桌面可能用起来更顺手,某些程度上可能更漂亮,还可使用 Compiz 进行美化和加速,可是我认为这在某些程度上也会形成 GUI 程序的分裂,改 GUI 主题的时候,既要考虑 GTK2,又要考虑 GTK3,若是整个系统都是 Gnome 3,底层库都是 GTK 3 的话,则整个系统会更加统一。我我的认为技术路线要专注,避免分化。再说,若是长期不能拥抱新技术的话,很容易落伍。
选择了 Gnome 3,就要去发掘它的优势。首先是在使用上,要充分了解 Gnome Shell 的特色和设计思路,熟记快捷键,知道按下 Super 键就能够唤出 OverView 界面,知道按下 Ctrl+Alt+↑ 或者 Ctrl+Alt+↓ 能够切换工做区,并且 Gnome 3 具备动态工做区的功能,当你把现有的工做区都占用的话,它会自动建立一个新的工做区。还要去 Gnome 3 的官网看一看,特别是开发者中心看一看文档,就会发现,Gnome Shell 桌面环境只是冰山露在水面上的一角,在界面之下,还有一个完整的技术链,除了 GTK,还有文件处理库、多媒体库、文档排版库、矢量绘图库、XML 和 XLST 解析库、Webkit2GTK 库等等。还有各类语言绑定,除了 C/C++,还可使用 JavaScript、Python、Vala 等语言开发 GUI 程序。特别是 JavaScript 和 CSS,是咱们编写 gnome-shell-extension 和 gnome-shell-theme 的重要工具。
再说一次,我主要使用的是 Ubuntu 的最新版本,偶尔使用 Fedora。到目前为止,它们的技术路线基本重合了,只有界面风格、软件包管理工具等少许差异了,在这两个发行版之间切换,基本不须要额外的学习成本。另外,这两个版本背后都有大公司支持,维护的软件仓库质量可靠。横向比较的话,能够了解不一样流派 Linux 发行版的区别,纵向比较,能够了解不一样年代的技术特色。例如,Fedora 是 Red Hat 公司支助的,新技术的试验场,版本更新快,和 Ubuntu 差很少都是每半年一个版本。而 Red Hat 公司的 Enterprise Linux 则追求稳定,更新很慢,约两年一个版本。Redhat Enterprise Linux 5 就是一个很老的版本,它在技术选型上和最新的 Fedora 就有很大的差异。
为了比较不一样年代发行版、以及不一样流派发行版在技术选型方面的差别,我同时安装了如下发行版。首先,是 CentOS 5.10,它表明的是比较老的 Redhat Enterprise Linux 发行版。这里须要说一下,Redhat Enterprise Linux 是商业版本,须要购买受权,而 CentOS 是它的社区复制版,能够无偿使用,他们的内容是同样的。下图是CentOS 5.10:
下图是稍微新一点的 CentOS 6.11:
下图是最新的 CentOS 7:
下图是最最新的 Fedora 28:
下图是 Ubuntu 18.04:
从上面几个图能够看出,越老的版本,其界面越丑。CentOS 7 的发布时间和 Fedora 21 的发布时间是差很少的,可是界面仍是丑多了。只能说,Redhat Enterprise Linux 的重点仍是服务器版本,根本就没有对桌面作任何美化,无论什么年代,老是把桌面环境作成一坨翔。
玩转 Linux 系统的方法论
前面说了,Linux 系统是一个具备必定门槛的专家系统,使用 Linux 仍是有必定难度的。就算是有图形界面的桌面系统,也并不能彻底消除这些障碍。在这里,我结合我本身多年使用 Linux 系统的经验,谈一谈玩转 Linux 系统的方法论。
0一、从教科书开始学习,可是要注意与时俱进
如何使用 Linux 是一门比较系统的学问,因此教科书是颇有必要看那么几本的。我最开始学习 Linux,是十几年前,那时每天抱着一本《Redhat Linux 9宝典》啃,看清楚哦,是 Linux 9,而不是 Enterprise Linux 9。从那个版本后,Redhat 开始发行 Enterprise Linux,每两年一个版本,如今已经到第 7 版了。我后来也相继买了很多 Linux 方面的书,以下图,是我书柜一角的照片:
能够看到,那些书都是以第 5 版为蓝本进行讲解的。如今看来,这些内容应该过期了。目前市面上还有很多比较优秀的入门书籍,像《鸟哥的Linux私房菜馆》、《Linux就该这样学》,都可以与时俱进,它们都有针对 CentOS 7 的最新版。
除此以外,我再给你们推荐几本优秀的书籍。先看这两本:
这两本书重点讲的是全字符界面的 Linux,讲得特别好,特别系统。没有局限于哪个特定的发行版,可是它里面讲的知识在每个 Linux 发行版中均可以用到。对文件、用户、权限、Shell、管道这些知识讲得特别深刻。就是经过这两本书,我学会了使用man
命令。这两本书还包含一些我从未在别的 Linux 书籍中看到过的知识点,例如 tty。其实咱们在使用键盘和屏幕操做 Linux 的时候,系统的响应模式是在不断变化的。有时,咱们输入文字,立刻能够获得回显,像输入命令的时候;有时,咱们输入文字,彻底没有回显,像输入密码的时候;有时,咱们输入一行文字,按 Enter 键后,系统才执行咱们的命令;有时,只要敲一个字符,不须要按 Enter,就会当即获得系统的响应,。以上这一切,都是由 tty 控制的。上面两本书,就讲到了 Linux 中的stty
命令和 tty 编程。
除了教科书,咱们还能够从 Linux 系统编程的角度去揣摩 Linux 系统的用法,因此下面几本书也值得读一读:
Linux 内核和内核模块的知识也很重要,也有助于咱们对 Linux 桌面系统的理解。能够读一读下面这几本书:
软件技术无时无刻不在进步,教科书上的知识也有过期的时候,因此咱们必定要可以改变思想,拥抱新的变化。举几个常见的经典的例子。①如何使 Linux 系统开机后直接进入字符模式,不启动图形界面?教科书上的回答是:修改/etc/inittab
文件,将运行级别更改成 3。然而,这个回答只适用于 Redhat Enterprise Linux 5 及以前的老版本,由于它们的 init 使用的是 SysVinit 程序,而最新的几个发行版,它们的 init 使用的是 systemd,因此,正确的作法是sudo systemctl set-default multi-user.target
。②如何修改启动菜单,如何开启 Framebuffer,如何设置 Framebuffer 的分辨率?教科书上的回答是直接修改/boot/menu.lst
文件。然而,新的发行版已经再也不使用 Grub Legacy 了,而是使用 Grub2,在 Grub2 中,正确的作法是先修改/etc/default/grub
文件,而后再使用grub2-mkconfig
命令生成配置文件,Ubuntu 还提供了update-grub
命令,更加方便。
还有字体的进步。从上面展现的图片能够看出,早期的 CentOS 5 中,字体发虚比较厉害,并且没有好的黑体字。在早期的 Linux 版本中,字体配置也很复杂。后来,好用的黑体字愈来愈多,先有 Droid Sans Fallback,再有文泉驿系列,如今又有思源黑体。而字体的配置,基本上也被 Fontconfig 这个软件包统一了。在后面的随笔中,我会有一篇专门讲 Linux 桌面中的字体配置,将 Linux 桌面打形成一个养眼的系统。
0二、使用一个命令时,要知道该命令属于哪一个软件包
使用 Linux 时,本质是经过运行 Linux 下的软件来完成工做的。要作什么,运行相应的命令就能够了。而相同的命令,有可能属于不一样的软件包,不一样的软件包,就会有不一样的策略、不一样的文档。因此,知道一个命令属于哪一个软件包是咱们要学会的基本功。
仍是之前面提到的 init 程序为例进行讲解。先回顾一下 Linux 系统的启动过程:开机 → BIOS 启动 → BIOS 加载硬盘 MBR 中的 Grub → Grub 加载 Linux 内核和 initrd 镜像文件到内存中 → Grub 将控制权交给 Linux 内核,Linux 内核开始执行,进行初始化 → Linux 内核将控制权交给 init 程序 → init 程序负责启动后面的全部后台服务软件和前台界面软件。那么 init 程序怎么启动系统中那么多的服务和软件的呢?若是要增长开机启动的服务或者减小开机启动的服务应该怎么办呢?若是要中止某项服务或重启某项服务应该怎么办呢?这些功能取决于 init 所在的软件包提供的策略、脚本和命令行工具。因此知道 init 程序属于哪一个软件包很是重要。
怎么找到一个程序属于哪一个软件包呢?这个要因包管理软件而制宜。我上面介绍的系统能够分为两个流派,一个是 Red Hat 流派,包括 CentOS 和 Fedora,它们使用 rpm 包管理软件。一个是 Debian 流派,这里就是指 Ubuntu,它使用 dpkg 包管理软件。先看 CentOS 5,运行 which init
能够看到 init 程序的路径是/sbin/init
,而后使用rpm -qf /sbin/init
命令,能够看到它所属的软件包是 SysVinit。这是一个很是经典的软件包,不少 Linux 教程上都会讲。回忆一下 RedHat EL 5 以前的系统,要让某个服务在系统启动时运行,咱们须要把一些脚本文件放到/etc/rc.d/init.d
目录中,而后在相应的/etc/rc.d/rcX.d
目录中创建符号连接,而且这些脚本的命名还有讲究,脚本前的数字表明脚本启动或中止时的顺序什么的。同时,RedHat EL 5 以前的系统还提供了几个工具来简化咱们的工做,它们是service
命令和chkconfig
命令。
到稍微新一点的 CentOS 6,用和前面彻底相同的流程来了解一下 init 程序。运行which init
,获得它的路径是/usr/sbin/init
,再运行rpm -qf /usr/sbin/init
,能够看到它所属的软件包是 upstart。在老一点的 Ubuntu 版本,例如 Ubuntu 14.04 中,init 也是属于upstart
软件包。这个软件包相比 SysVinit 是有进步的,能够这么理解,在 SysVinit 时期,只能主动运行或中止服务脚本,而在 upstart 时期,能够经过捕捉硬件或内核发出的信号,动态地启动或中止服务脚本,并且这些服务在运行的时候,还能够发出信号,以便激活或中止其它的服务。upstart 教科书上讲得少,并且其管理工具每每设计得和 SysVinit 兼容,因此每每被学习 Linux 的人忽略。
在最新的 Ubuntu 18.04 和 Fedora 28 中,init 又属于哪一个软件包呢?Fedora 28 是 Redhat 流派的,因此其考察方法同前。Ubuntu 使用 dpkg 包管理软件,其考察流程是这样的:运行which init
,获得路径/sbin/init
,再运行dpkg -S /sbin/init
,获得其软件包是 systemd。从前面的截图可知,Fedora 28 的 init 程序也是属于 systemd。知道一个软件属于哪一个软件包,咱们才好作功课,不是吗?在这里,咱们能够用搜索引擎搜 systemd 关键字,也能够在系统中使用man systemd
查看它的文档。
经过文档可知,systemd 启动后,先根据default.target
配置文件中的规则初始化系统。其实default.target
是一个连接,若是它连接到multi-user.target
,则启动字符界面,若是它连接到graphical.target
,则启动图形界面。这个和传统的 SysVinit 中的运行级别有必定的类似性。systemd 中的 target 不少,它和传统的 SysVinit 中的运行级别对应关系以下:
SysVinit中的运行级别 | systemd中的 target | 意义 |
---|---|---|
0 | runlevel0.target, poweroff.target | 关闭系统。 |
1, s, single | runlevel1.target, rescue.target | 单用户模式。 |
2, 4 | runlevel2.target, runlevel4.target, multi-user.target | 用户定义/域特定运行级别。默认等同于 3。 |
3 | runlevel3.target, multi-user.target | 多用户,非图形化。用户能够经过多个控制台或网络登陆。 |
5 | runlevel5.target, graphical.target | 多用户,图形化。一般为全部运行级别 3 的服务外加图形化登陆。 |
6 | runlevel6.target, reboot.target | 重启。 |
emergency | emergency.target | 紧急 Shell。 |
SysVinit 和 systemd 软件包都有管理系统服务的功能,可是它们提供的命令是不一样的,其对好比下:
SysVinit 命令 | Systemd 命令 | 意义 |
---|---|---|
service foo start | systemctl start foo.service | 用来启动一个服务 (并不会重启现有的)。 |
service foo stop | systemctl stop foo.service | 用来中止一个服务 (并不会重启现有的)。 |
service foo restart | systemctl restart foo.service | 用来中止并启动一个服务。 |
service foo reload | systemctl reload foo.service | 当支持时,从新装载配置文件而不中断等待操做。 |
service foo condrestart | systemctl condrestart foo.service | 若是服务正在运行那么重启它。 |
service foo status | systemctl status foo.service | 汇报服务是否正在运行。 |
ls /etc/rc.d/init.d/ | systemctl list-unit-files --type=service | 用来列出能够启动或中止的服务列表。 |
chkconfig foo on | systemctl enable foo.service | 在下次启动时或知足其余触发条件时设置服务为启用。 |
chkconfig foo off | systemctl disable foo.service | 在下次启动时或知足其余触发条件时设置服务为禁用。 |
chkconfig foo | systemctl is-enabled foo.service | 用来检查一个服务在当前环境下被配置为启用仍是禁用。 |
chkconfig –list | systemctl list-unit-files --type=service | 输出在各个运行级别下服务的启用和禁用状况。 |
chkconfig foo –list | ls /etc/systemd/system/*.wants/foo.service | 用来列出该服务在哪些运行级别下启用和禁用。 |
chkconfig foo –add | systemctl daemon-reload | 当您建立新服务文件或者变动设置时使用。 |
telinit 3 | systemctl isolate multi-user.target | 改变至多用户运行级别。 |
在使用了 systemd 的系统中,电源管理也是由 systemd 接管的。systemd 电源管理的命令以下:
命令 | 操做 |
---|---|
systemctl reboot | 重启机器 |
systemctl poweroff | 关机 |
systemctl suspend | 挂起 |
systemctl hibernate | 休眠 |
systemctl hybrid-sleep | 混合休眠模式(同时休眠到硬盘并挂起) |
systemd 自带日志服务 journald,而且用二进制格式保存全部日志信息,用户使用journalctl
命令来查看日志信息。
不少人可能很是想了解 systemd 在系统启动时启动了哪些服务?这些服务的启动顺序如何?每一个服务启动花费了多少时间?若是单纯去查看 systemd 的文档和各个服务的脚本,是很是难以搞清楚以上问题的。幸亏 systemd 提供了一个很是好的分析工具 systemd-analyze,它能够帮咱们分析各个服务启动的顺序、时间等。这样运行该程序
systemd-analyze plot > init.svg
就能够以图形化的形式展现各服务启动的时间轴了,以下图:
0三、了解进程
在前面,我讲到了 Linux 系统的启动过程,可是讲到 init 就噶然而止了。init 以后呢?咱们的 Linux 桌面系统如此复杂,它又是由哪些软件组成的呢?这些软件之间是什么关系呢?谁先启动、谁后启动?谁管理谁?谁占用鼠标、键盘和显示器?要用好 Linux 桌面,这些关系最好都梳理清楚了,咱们能够经过分析系统中的进程来回答以上问题。
了解系统中的进程,能够经过ps
命令,ps
命令具备不少不一样的选项,我也是记不住的,可是不要紧,使用man ps
就能够查看它的文档。若是认真学过前面的教材,特别是编程手册的话,就会对进程的一些概念,例如,什么父进程、子进程、僵尸进程的概念,什么进程组、进程ID、组ID的概念,有更深入的理解。使用ps -ejH | less
命令的效果以下图:
另一个命令pstree
,能够显示系统中的进程树,以下图:
经过以上命令的输出,可让咱们对本身的系统有一个大概的了解。能够看到,有一些进程之间的关系是并列的,彼此之间没有父子关系,像系统中的各类服务进程。有一些进程具备严格的父子关系,像 systemd 就是全部其它进程的父进程,并且 systemd 的 PID 是 1。还能够看出,systemd 负责启动 GDM,GDM 负责启动 XServer 或 Wayland,GDM 也负责启动 Gnome Shell。经过这些信息,就能够大体分析出一个桌面系统由哪些组件组成,功力深厚的话,就能够本身定制 Linux 桌面系统。
说到 GDM,我就多谈几句。之前我使用 Linux 桌面的时候,老是有一个误区:认为只有 XServer 启动后,才可以访问到图形系统,不然只能访问字符界面。随着对 Linux 的认识逐步加深,才发现即便在 XServer 启动以前,图形界面也是无处不在的。例如,Grub 的系统启动菜单,能够是图形化的,还能够经过改背景和主题进行美化。再例如在 Linux 初始化过程当中,有一个 PlyMouth 软件,能够直接经过内核的 DRM 模块访问图形硬件,从而显示一个图形化的启动界面和进度条,同理,PlyMouth 也是能够经过更改主题进行美化的。最后,当 Linux 初始化完成后,会给咱们显示一个让咱们登陆的图形界面,这就是 DM(Display Manager),这个 DM 既是 XServer 的父进程,负责启动 XServer,又是一个 XClient,给出图形化的登陆接口。登陆成功后,它又是 Gnome Shell 的父进程,负责启动 Gnome Shell。我花了很长时间才理解什么是 DM (Display Manager,显示管理器),才把它和 Linux 桌面系统中的窗口管理器(Window Manager)区分开来。之前 Ubuntu 使用的 DM 是 lightdm,如今回归 Gnome 3 后,就统一使用 Gnome 的 GDM 了。我后面会有一篇随笔专讲 X Window,到时候再详细讲解 Display 的概念,理解了 Display,再理解 Display Manager 就不难了。还有,即便在纯字符界面下,也是可使用 FrameBuffer 得到图形功能的,我后面也会有一篇随笔,专讲 Grub二、字符界面、FrameBuffer。
0四、学会查找和管理软件包
前面提到了使用一个命令时,怎么找出这个命令属于哪一个软件包,并针对该软件包进行学习。这里反过来,若是知道一个软件包的名字,咱们应该怎样找到它、安装它,安装以后,怎么知道它安装到了文件系统中的什么地方,怎么知道这个软件包还提供哪些别的命令。
比较幸运的是,目前流行的 Linux 发行版都有比较好的软件包管理工具,并且有官方维护得比较好的软件仓库。例如,在 Ubuntu 中,可使用 apt 来安装软件仓库中的软件包。我喜欢用 apt 更高层次的一个包装 aptitude,因此安装完系统后,我老是先使用sudo apt-get install aptitude
安装 aptitude,之后统一使用 aptitude 管理软件包。以下图:
使用sudo aptitude search
查找软件包,使用sudo aptitude install
安装软件包,使用sudo aptitude source
下载某个软件包的源代码,使用sudo aptitude purge
删除软件包。在 RedHat 流派的 Linux 发行版中,也有专用的包管理软件,Fedora 21 以前是yum
,以后是dnf
。用法都是大同小异,我就不具体讲了。必要时可使用man dnf
查看它的文档。
安装某个软件包后,要可以找出文件都散落在系统中的哪些地方。可使用dpkg -L
命令来完成该工做。
0五、善于阅读软件的文档
要善于阅读软件的文档。在 Linux 中,阅读文档很是方便,几乎全部命令,均可以使用man
命令来查看它的命令行参数。一样,对于复杂的软件,使用man
也能够学到很是系统的知识。以下图,我在学习 Bash 的时候,使用man bash
命令阅读它的官方文档:
我学习 FontConfig 的时候,也是靠man fonts.conf
来学习关于字体配置的语法的,以下图:
对于一些 GNU 提供的软件,有时提供的是 Info 格式的文档,可使用info
命令阅读。下面是我学习 Grub 时的截图,使用info grub
就能够调出来。
有时候,我也会找一些 PDF 格式的文档,把它们下载到手机中,空闲时间读一读,很是方便。GNU Manuals Online 就是一个不错的地方,我常常在里面找 PDF 格式的文档下载,GCC、Octave、Bash、Grub 的文档,这里都有。还有,当我安装完 TexLive 全家桶后,也有海量的 PDF 文档,对 LaTeX 有兴趣的朋友不妨读一读。
0六、必要时参考软件的源代码
有时候,文档并非万能的,像某些软件的文档不够完善啦,或者咱们本身的需求超越了文档描述的范畴啦等状况。这时,咱们能够直接参看软件的源代码,这就是开源系统的优点。源代码有各类各样的,有 C 语言的,也有 Bash 脚本语言的,还有 XML、CSS、JavaScript 的。这篇随笔的第一张截图,展现的就是使用 Vim 阅读 Linux 内核的源代码。
有些软件是编译好的,因此咱们须要额外下载它的源代码包,下载源代码包可使用sudo aptitude source
命令。例如,在学习使用 OpenGL 的时候,必须使用 X Window 的 glx 扩展,可是 glx 的文档又语焉不详,怎么办呢?这时我就想到了 freeglut 这个库,能够参考一下这个库是如何实现的嘛。先使用sudo aptitude search freeglut
搜一下,发现官方仓库里面确实有 freeglut,并且软件包的名字是 freeglut3,而后使用sudo aptitude source freeglut3
命令就能够把它下载下来了。使用 Vim 阅读它的代码,我就不截图了。
须要注意的是,Linux 内核源代码是单独打包的,因此要下载 Linux 内核的源代码的话,须要使用sudo aptitude install linux-source
命令。
Linux 系统中还有一些功能是由脚本提供支持的,这些软件的源代码读起来更加方便。例如,制做 initrd 镜像文件的工具就是 Bash 脚本,在 Ubuntu 系统中,它在文件系统中的位置是/usr/sbin/mkinitramfs
,使用 Vim 就能够阅读,以下图:
FontConfig 的配置文件是 XML 格式的,分别是/etc/fonts/fonts.conf
文件和/etc/fonts/conf.d/
目录下的全部文件。也能够直接使用 Vim 进行阅读和修改,以下图:
最后,来看看 Gnome Shell 用来定义外观的 gnome-shell-theme 和 gnome-shell-extension。前者是 CSS 文件,后者是 JavaScript 程序。固然,这个 JavaScript 是专用于 Gnome 3 的 GJS,这里能够查看它的 wiki:GJS: Javascript Bindings for Gnome
进入/usr/share/gnome-shell
目录,能够看到这里有theme
目录和extensions
目录,分别看一下里面有哪些内容,以下图:
使用sudo vim /usr/share/gnome-shell/theme/gnome-shell.css
命令,能够查看这个 CSS 文件,以下图:
最后再来学习一下 Gnome Shell 的扩展怎么写,这里选择一个最简单的 Hide Activities,就是掩藏左上角的那个“活动”按钮。进入/usr/share/gnome-shell/extensions/Hide_Activities@shay.shayel.org
目录,使用 Vim 查看 extension.js,以下图:
能够看到,这个 Extension 很是的简单,其中的function enable()
和function disable()
是一个 Extension 最基本的框架,并且它也只是调用了indicator.container.hide()
和indicator.container.show()
方法。咱们能够先学这个简单的 Extension,再学别的复杂一点的 Extension,再结合 GJS 的 wiki 和 GTK 的文档,很容易就能够学会怎么编写 Gnome Shell 的 Extension。
0七、严重问题可查看 Log
这个就属于比较高级的技巧了,主要在出现严重问题的时候用。例如,图形界面启动不了啊、系统崩溃啊之类的,实在找不到缘由了,就去看看这些软件输出的 Log。这种事情我也不是常常碰到。因此这里就不深刻展开了。
总结
玩转 Linux 系统的方法论,主要包含如下内容:
- 从教科书开始学习,可是要注意与时俱进。
多读书,系统学习 Linux 的基础知识。多思考,想明白命令背后的根本原理。多实践,紧跟最新的 Linux 发行版不掉队。 - 使用一个命令时,要知道该命令属于什么软件包
充分认识到 Linux 的功能是由众多的软件构建起来的。使用一个命令时,要知道这个命令属于什么软件包,再用软件包的名称做为关键字去作功课。需使用到which
和dpkg -S
。 - 了解进程。
使用ps
命令和pstree
命令查看进程和进程之间的关系。经过系统中有哪些进程及这些进程之间的管理来分析复杂系统的构成。 - 学会查找和管理软件包
充分利用 Linux 发行版官方维护的软件仓库。使用sudo aptitude search
查找软件包,使用sudo aptitude install
安装软件包,使用dpkg -L
命令查看软件包安装后散落在文件系统的什么位置。 - 善于阅读软件的文档
遇到困难记得使用man
、info
等命令。空闲时间能够利用手机阅读 PDF 格式的文档进行学习。 - 必要时参考软件的源代码
编译过的软件包,可使用sudo aptitude source
命令下载源代码。脚本语言或标记语言编写的软件,可直接阅读它的代码。 - 严重问题可查看Log
高级技巧,我也没用过几次。图形系统启动不了或者系统崩溃的时候用。
版权申明
该随笔由京山游侠在2018年09月03日发布于博客园,引用请注明出处,转载或出版请联系博主。QQ邮箱:1841079@qq.com