使用 Linux 的一些困难和解决方法##

使用 Linux 的一些困难和解决方法##
完全使用 Linux 进行工作和娱乐是非常困难的。所以有很多 Linux 反对阵营的人就直接说你们那些所谓的 Linux 用户也不过是把它当成玩具而已玩一玩再删掉有什么意义呢这真的是一个问题对于普通用户来说使用 Linux 的难度还是太大了即使有很先进的图形界面如Gnome、KDE也不行。就算是程序猿们使用 Linux 也要经过很多波折而且需要很大的耐心才能最终把 Linux 从玩具变成神器。大家没有把 Linux 当成日常使用的工具并不是 Linux 系统或者 Linux 系统下的软件不能够胜任我们的工作而是被使用 Linux 的困难吓倒了。举例说明由于 Linux 是一个很“优秀”的多任务多用户操作系统“优秀”就意味着严格在 Linux 系统中由于用户权限的限制有些事情干起来就不是那么方便。所以使用 Linux 系统的第一步就是要了解 Linux 系统的用户管理方面的知识。第二步需要了解的是 Linux 的文件管理虽然没有像 Windows 中的 C 盘 D 盘这样的盘符概念但是文件和目录以树形组织起来还是比较容易理解的难就难在 Linux 系统中每一个文件或目录都有其所属的用户、用户组并且具有不同的权限位所以要学习 Linux 系统还要学习它的文件管理。第三步要了解的就是 Linux 系统的任务管理怎么运行一个程序怎么让程序在后台执行怎么向一个程序发送信号等等。可以这么说Linux 绝对是一个面向专家的系统对普通用户它有着天然的壁垒图形界面做得再好也无法跨越普通用户和专家之间的鸿沟。再来说说图形界面。Linux 有非常多的桌面环境可以使用如 Gnome、KDE、Xface 等等但是这些桌面环境也不是完全没有问题。什么界面不好看、字体不美观、没有相应的显卡驱动等等问题不一而足。而且这些桌面系统也并不是永远那么稳定极有可能哪天你安装一个软件包或者卸载一个软件包后图形界面就进不去了如果你不会在字符界面下配置网络无法重新修复相应的软件包就只剩下重装系统这一条路了。但是话说回来博客园中的用户都是程序员是不会被我上面说的那一点点困难吓倒的。即使有问题我们也要征服它。我在刚使用 Linux 的时候碰到问题总是不知道到哪里找答案有些东西书上没有网络上也难以查到查到的信息有时候也很过时。还有时候我按照书上或网络上的方法下载安装一个软件包却不知道这个软件包的文件都放到文件系统的哪个地方了程序在哪里、文档在哪里、配置文件又在哪里呢经过多年的使用我总结了《玩转Linux系统的方法论》按照这些方法论Linux 中的问题基本上都可以迎刃而解。下一个问题就是 Linux 下的默认图形界面不够美观。如果一个系统看起来不顺眼估计大家是没有心情继续用下去的。Fedora 默认主题就很丑Ubuntu 倒是做得不错。我拿到 Fedora 系统后第一件事就是换主题、换背景。Linux 系统下的字体配置也很成问题新安装的系统上网、办公都很不舒服。因此我总结了《Linux桌面系统字体配置要略》、《在Ubuntu 14.10中借用Windows的字体》、《桌面美化那点事儿》一步一步将 Linux 打造成自己顺手顺眼的工作环境。有时候我们还要切换到字符界面进行工作所以我总结了《全网络最正确的让Linux开机进入字符界面的方法及设置FrameBuffer分辨率的方法》这也是属于让 Linux 看起来更顺眼更舒服的范畴。Linux 系统的图形界面是基于 X Window 的所以对 X Window 也要有一定的了解。我又花时间探讨了《X Window的奥秘》。为了防止图形系统被玩坏了无法恢复我研究了《我该如何备份系统》不过在实际应用中因为我总是不断更新系统所以我只备份了我的一些配置文件和工作文件。然后对于安装显卡驱动我也有自己的总结《Fedora 21安装Nvidia驱动以及失败后的补救方法》。在 Linux 系统下工作需要一个好的输入法和编辑器吧。我在 Fedora 中使用 Intelligent PinYin 输入法这个输入法已经很不错了在 Ubuntu 中有更好用的搜狗输入法当然不能错过请看这里《在Ubuntu 14中使用搜狗拼音输入法》。然后对于文本编辑器我选择 Vim。Vim 要配到让自己顺手才行所以有了这篇《打造属于自己的Vim》。然后就是编程了C 语言是 Linux 系统的母语所以完善的 C 语言编程环境自然是必不可少。由于 C 语言相当简单很多时候使用 Vim 就足够了于是就有了《感悟GNU C以及将Vim打造成C/C的半自动化IDE》。有一段时间我非常热衷于编写自己的操作系统内核自制操作系统需要从 16 位的实模式写起然后再让 CPU 进入保护模式。几乎所有的书和网络教程一提到 16 位实模式代码都使用 NASM 编译器。我偏偏喜欢 GCC为了不使用 NASM我有了这一篇《使用GCC和GNU Binutils编写能在x86实模式运行的16位代码》。这也进一步说明使用 C 语言编程除了 GCCBinutils 也是一个很重要的工具包。除此之外Gnu autotools 也是很重要的工具包我在这一篇《使用Eclipse和Gnu Autotools管理C/C项目》中进行了展示。除了 C 语言脚本语言在 Linux 中的地位也很重要。这一篇《Bash脚本编程语言中的美学与哲学》总结了我对 Bash 语言的领悟。另外从我的随笔分类中可以看出我有时是需要写一些和数学、数值计算有关的东西的要写这些东西必须要有适当的工具关于工具的内容我后面再总结但是这一篇《适合数值计算的语言需要具备什么样的特色》要归纳到我对编程语言的理解这个类别中。然后就是和写文章、发博客、绘图、数学公式有关的一些工具了。它们是《优秀的文本化编辑思想大碰撞Markdown、LaTeX、MathJax》、《再来说说LaTeX》、《数值计算和符号计算》以及前面提到的《适合数值计算的语言需要具备什么样的特色》。当然还有画图工具《发博客必备的五大图片处理神器》。最后目前的虚拟化技术如火如荼再加上我折腾 Linux 系统有时也需要用到虚拟机所以对 Linux 系统下的几个主流虚拟机进行了探讨。它们是《虚拟机体验之QEMU篇》、《虚拟机体验之KVM篇》、《虚拟机体验之VirtualBox篇——性能强大的经典架构》、《虚拟机体验之Xen篇——令人脑洞大开的奇异架构》。有时不想用虚拟机就想办法把不同的 Linux 发行版安装到一台电脑上像这样《在同一个硬盘上安装多个Linux发行版及Fedora 21初体验》。回到顶部我眼中的 Linux 哲学总纲##《Unix 编程艺术》这本书中对 Unix 编程哲学的总纲总结为“K.I.S.S”即Keep it simple, stupid。对这个说法我深深地不以为然。当然你可以认为这是 Unix 环境编程的哲学而不是类 Unix 系统本身的哲学。事实上一个系统中的程序如何设计往往也影响到这个系统如何使用。例如Linux 系统中的程序设计时往往只让自己做到最少的功能并通过管道和其它程序配合使用从编程的哲学来讲这就叫只做一件事并做好从用户的角度来讲他就需要学习很多小工具并将这些工具配合起来使用。正是由于将各种工具搭配使用可以有各种各样的组合方式充满了创造性所以也就充满了乐趣。另外每一个小工具都是做得那么精湛因此它们的生命期会很长从用户的角度来讲就是学会一项技能以后很长一段时间不会过时。另外一个例子就是 Linux 程序设计时的最小立异原则它们几乎遵循同样的命令行参数、配置文件语法、正则表达式语法等等从用户的角度来看这个系统就会显得很整齐划一有时候不用看文档猜都能猜到某些工具怎么使用。既然我不赞同 Linux 的哲学是“K.I.S.S”那么我的答案是什么呢我认为Linux 哲学的总体纲领是“交流和共享”。这要从 Unix 和 Linux 以及和 Gnu 的历史说起。Unix 刚诞生的时候是不允许当作商业产品出售的为了交流Unix 系统的源码是完全公开的很多人都向 ATT 实验室索要 Unix 的源码。那时候Ken 伯伯是一包一包的磁盘往外寄但是他毫无怨言还在每一个包裹里附上一张纸条上写“爱你的Ken”。交流和共享的回报就是全世界那么多的聪明人为 Unix 系统添砖加瓦然后 Unix 系统飞速发展。至于 Unix 版本的分裂和最后标准的形成这样的过程我就不写了。再来说 Linux其内核诞生之初便放到网络上和大家交流然后借助网络协作飞速发展。Gnu 就更加不用说了那是开源界的鼻祖交流和共享是它的立身之本。我觉得“K.I.S.S”这个原则应该是有点过时了如果按人年计算Linux 的工作量已超过几千万人年它一点也不 Simple一点也不 Stupid。相反它还有那么一点 Complex而且还很 Brilliant它的复杂会把某些人拒之门外它闪光的思想又会把另外一些人紧紧吸引。这里不仅是指 Linux 内核而是指整个 Linux 系统包括其中的各种软件。其它的哲学应该都是从“交流和共享”这个总纲延伸而来的。其中一个结果就是在 Linux 系统下有着海量的软件、编程工具可以使用。因为每个人都可以向 Linux 贡献自己的东西嘛。而且 Linux 也是非常鼓励大家开发自己行业领域的专业软件鼓励大家设计适用于各种场景的专用编程语言。所以使用 Linux你一定会有一种感觉那就是一座大大的宝藏就放在自己眼前入宝山怎么可能空手而归呢另外一个结果就是在 Linux 系统中展现了很多非常闪光的思想因为交流那些不好的东西慢慢就被淘汰了留下的自然就是精粹。回到顶部我这一系列随笔中展现出的 Linux 哲学##在我的这一个系列中首先揭示的 Linux 哲学就是它的透明性和可用性。《Linux 就是这个范儿》这本书里面说 Linux 有四大笨分别是万般皆文本随处用脚本规律无处寻配置乱生根。我认为这“四大笨”正是 Linux 透明性的体现但是要改一个字不是“规律无处寻”而是“规律有处寻”。下面我来一一论证。首先来说万般皆文本。在 Linux 系统中不管是保存数据还是程序之间通讯首选纯文本格式。一提到纯文本格式大家首先想到的困难会有两点其一是占用的存储空间比较大其二是文本的解析比较困难。但是和二进制的存储格式相比纯文本最大的优点就是适合人类阅读。在 Linux 系统中很多程序都是基于行来解析文本文件的甚至包括那些版本控制工具它们也是基于行的比较来体现代码的变化。富文本格式往往也倾向于使用纯文本的方式来进行编辑和保存只是需要在进行显示或打印的时候再通过特定的工具转化成多媒体格式。在我的这一系列随笔中这两篇《优秀的文本化编辑思想大碰撞Markdown、LaTeX、MathJax》、《再来说说LaTeX》可以说是对这一个哲学进行了阐释。另外进程间通讯也是纯文本占优势因为那些专用的基于二进制的协议实在是太不透明了开发和调试都很困难也不是很健壮。以前在 Windows 下编程时COM 和 DCOM 都研究过写 Java 的时候也在 RMI 方面下过功夫现在仍然有很多编程语言在搞对象的序列化和反序列化这些都是基于二进制的不透明。后来逐渐接触到 JSON、XML以及面向服务编程是用到的 SOAP 协议才深深体会到纯文本格式的优美。其实目前网络上的用户层通讯协议比如 HTTP 协议之类的都是基于文本行的。其次来说说随处用脚本。关于脚本编程我这里不多讲这里只说脚本带来的好处。脚本的坏处大家也可以马上想到那就是运行速度确实不怎么样。但是脚本的好处是显而易见的那就是逻辑清晰、便于阅读。脚本就是一个纯文本随便找个编辑器打开就可以阅读如果有超级用户权限也可以随意修改。在我的这个系列中《Bash脚本编程语言中的美学与哲学》总结了我对 Bash 语言的领悟。而且有很多时候我是通过阅读脚本来理解问题和解决问题的如这一篇《全网络最正确的让Linux开机进入字符界面的方法及设置FrameBuffer分辨率的方法》通过阅读 lightdm 的启动脚本来找出让 Ubuntu 进入字符界面的方法还有这一篇《探索Linux系统的启动过程》通过阅读 lsinitrd 脚本来找到解包 initramfs 文件的方法。然后来看规律有处寻。对于 Linux 新手来说有时确实有点摸不着头脑感觉似乎找不到任何规律。事实上Linux 下的软件的文档是非常完善的。几乎每一个程序都有相应的手册页使用man命令就可以阅读如果是 Gnu 出品的可能还有info文档。另外几乎每一个程序都可以带--help选项。例如在《Fedora 21安装Nvidia驱动以及失败后的补救方法》这一篇中我通过带--help选项运行从 NVIDIA 官网下载的安装文件就得到了怎么把该安装文件解包的方法。除了手册页还有很多软件提供的文档是 PDF 格式的也有办法把它们找出来如《再来说说LaTeX》这一篇和《虚拟机体验之VirtualBox篇——性能强大的经典架构》这一篇找出文档后软件的使用就不再是无规律可循了。最后来分析配置乱生根的问题。配置文件、环境变量、命令行参数是我们定制软件行为的三驾马车。Linux 中有一个很讨厌的哲学——提供机制而不是策略为什么说它讨厌呢我后面再讲。在 Linux 中一个软件可以有很多选项可以表现出各种各样的行为这些都要靠配置文件、环境变量、命令行参数进行定制。配置文件本身是纯文本格式的阅读和修改都不是问题其透明性是很好的主要问题是“乱生根”有时候根本不知道配置文件放在什么地方、文件名叫什么。这个问题也不是没办法解决使用《玩转Linux系统的方法论》中介绍的方法很容易找到某个软件包的配置文件都放在什么地方。其实和透明性相关的还有一个硬货那就是源代码。Linux 可以说是开源软件的代表内核及其系统下的软件都是开源的源代码可以随意获得和阅读。但是能随意阅读源代码就说明透明性一定好吗那不见得因为源代码太复杂了就算让你随便读也不一定读得懂。所以我碰到问题后首先考虑的是读文档而不是读代码。Linux 内核的源码目录我也是经常逛但是主要还是以读文档居多基本没读代码最多也就是看了那基本经典的专著之后进代码瞅一眼验证验证而已。有时候源代码也可以提供一些参考比如 OpenGL 编程不知道它和 X Window 如何交互的话看一看 freeglut 的代码还是很有收获的。在《玩转Linux系统的方法论》这一篇中我有介绍获取源码包的方法。我这一个系列的随笔可以说是用最好的方式展现了 Linux 的透明性。掌握了我这一系列博客中提到的方法在 Linux 系统中碰到任何困难都可以找到解决方法。换一种说法其实 Linux 系统本来对用户就是非常透明的一点都没有遮遮掩掩如果你用不好 Linux那是因为你水平还不够而我的这一系列随笔就是教大家怎样去看穿它。说完透明性再来说说可用性。通过前面的阐释可以看出 Linux 系统是非常透明的所有困难都可以克服。另外一个问题就是 Linux 真的可以满足我们日常工作、娱乐的所有要求吗也就是说Linux 真的具有可用性吗我觉得我的这一系列随笔就是对这个问题最好的回答。在这一系列随笔中我展示了在 Linux 桌面环境中我的日常工作是没有问题的不管是编程、画图还是做数学工作很多软件都非常优秀功能强大、运行稳定且界面美观。在我没有展示的领域如写论文、做幻灯也是没有问题的LibreOffice 很强大和 MS Office 一样好用上淘宝、登网银也没有问题因为它们的插件都支持 Linux 系统下的 Firefox 浏览器。如果不要图形界面其在服务器领域占有的市场比例更是遥遥领先这个可用性就不需要我来废话了大家心知肚明。在我的这一系列随笔中有几篇还展示了 Linux 中某些软件前后端分离的策略以及其带来的优势。使用 Linux 系统有两种方式那就是 CLI 和 GUI。你即可以选择字符界面也可以选择图形界面它们各有优势。字符界面通过输入命令来执行程序通过脚本和管道让许多工具配合工作如果用得好可以获得非常高的效率。而且字符界面的程序非常适合进行脚本化和自动化如开机启动某任务、定时启动某任务等等。图形界面的优势呢就是使用起来非常方便有丰富的菜单提示用鼠标点点画画就可以完成工作但是要完成批量任务或定时任务就不是那么方便了。也不是没有解决办法MS Office 提供的宏就是一种解决办法Photoshop 也可以录制动作生成 Action 然后回放。这说明不管是在 Linux 环境还是在非 Linux 环境用户对自动化的需求都是一样的。有些工作非使用图形界面不可比如画图和在虚拟机中运行具有图形界面的客户机有另外一些工作则把图形界面当成累赘比如在没有图形界面的服务器中使用虚拟机并且要有开机自动启动、定时启动、远程管理、批量化管理这些功能。要解决这个冲突Linux 中广泛采用的是前后端分离的策略。在《数值计算和符号计算》中我介绍的 Octave、Maxima 等软件就都有在其命令行的版本上加上了一个 GUI 封装的图形化版本。还有《虚拟机体验之VirtualBox篇——性能强大的经典架构》中介绍的 VirtualBox 虚拟机就是一个经典的前后端分离架构VirtualBox 的图形界面就是对其命令行工具的 GUI 封装。回到顶部Linux 之得和 Linux 之失##Linux 还有一个很讨厌的哲学那就是提供机制而不提供策略而且这个策略还被很多人追捧对于这一点我是持反对意见的。提供机制而不提供策略的几个典型例子一是系统启动时的初始化Linux 只决定内核初始化完成后将控制权交给/init程序至于/init程序怎么启动其它的服务、怎么进入系统就看各个发行版各显神通了。二是 X Window 图形界面的实现只提供机制不提供策略在不同的发行版中可以使用不同的窗口管理器编程也可以使用不同的图形工具包。那么这是优点还是缺点呢不好说。支持者认为这是优点因为可以随时更换策略所以这些机制的生命期特别的长。就拿 X Window 来说已经有 30 多年的历史了但是依然没有被淘汰每次只要换个窗口管理器又可以生龙活虎好多年。支持者的另外一个观点就是只提供机制而不提供策略可以给用户提供更加丰富的定制空间正如 X Window可供用户选择的桌面环境就有 Gnome、KDE、XFace、Enlightment 等等一大堆还有 Ubuntu硬是在 Gnome 的基础上再次开发写出了一个 Unity 桌面。我认为它的缺点也很明显。其中一个缺点就是这个策略明显地造成了 Linux 发行版的分化。现在的 Linux 发行版太多了每一个都搞一套自己的启动机制每一个都搞一个自己的软件包管理机制每一个都说自己的策略怎么好怎么好最终想选择 Linux 的用户被逼成了选择障碍综合征不知道怎么选只好抛弃 Linux。即使是同一个厂家或同一个社区的发行版也分成不同的桌面定制版而且有时候有些软件专为某种桌面定制在其它的桌面环境中运行效果就很差或者很不稳定这造成了 Linux 用户的分裂同时也造成了 Linux 新手学习上的困难因为技能树的分支太多了不知道怎么攀。版本分化还不是 Linux 占领市场最大的问题。最大的问题还是出在提供机制而不是提供策略上因为当 Linux 允许用户自己指定策略的时候往往也意味着用户必须得自己指定策略。Linux 系统的发行者没有为大家提供一个可以让大部分人都满意的预先定制好的策略相反而是只提供基本可用的系统。几个比较明显的例子我装完系统后首先要做的事就是重新配置字体、选择系统主题对于常用的工具如 Vim 之类的还要自己修改它的配置文件。最终的结果就是刚接触 Linux 的用户如果不是专家或者特别有耐心很快就知难而退放弃了