Linux 系统管理的哲学(五)

原文:The Linux Philosophy for SysAdmins

协议:CC BY-NC-SA 4.0

二十二、跟随你的好奇心

人们谈论终生学习,以及这如何使人保持头脑清醒和年轻。系统管理员也是如此。总是有更多的东西需要学习,我认为这是让我们大多数人保持快乐并随时准备解决下一个问题的原因。持续的学习有助于保持我们的思维和技能敏锐,不管我们的年龄有多大。

我喜欢学习新东西。我很幸运,因为我的好奇心让我一生都在和我最喜欢的玩具——电脑打交道。关于计算机,当然还有很多新的东西要学;行业和技术都在不断变化。地球上和这个宇宙中有许多事情值得好奇。计算机和相关技术似乎是我最喜欢的东西。

我也假设你一定很好奇,因为你正在读这本书。但不是每个人都像我们一样好奇。

傻瓜

让我们乘坐我的时光倒流机到俄亥俄州托莱多的 1970 年旅行。我当时在一家化工厂做一份非常无聊的测试工作,和其他七八个人一起。我们会采用化学家们想出来的化学配方,将它们混合到乙烯树脂中,然后将其压制成各种类型的织物,用于汽车行业的座椅和乙烯树脂车顶。我们的工作是测试由此产生的原始乙烯基和涂层织物,看看它们是否符合订购它们的汽车公司提供的所有规格。

从没见过汽车上的乙烯基车顶?是啊,很久以前了!

我的一个同事查理是一个消极的人。他不停地抱怨。他会抱怨工作条件——我们周围有很多挥发性化学物质,如果你想要的话,很容易兴奋并停留在那里,但这也很危险。他抱怨这份工作有多危险,有多无聊,但我们都做了一些,这是那种工作的一部分。但是查理从他走进来的那一刻起,一直抱怨到下午比赛结束的哨声响起。

有一天,我们进行了一次谈话,大概是这样的。

一天早上八点半左右,查理对我说:“我讨厌这份工作。退出时间不能足够快地到达这里。”

我已经受够了他的消极,所以我说,“查理,如果你这么讨厌这份工作,为什么不另找一份工作呢?”

“我不知道还能做什么。”

所以我说,“那你为什么不学点新东西呢?下学期我将回到大学,拿到学位后我不会在这里呆太久。我打算找一份更好的工作。”

“这对你来说很容易,你还年轻。我老了,你不能教老狗新把戏。”

我问他:“你多大了,查理?”

“三十六岁,”他说。

即使在那时,我二十出头,在我自己的心目中似乎无懈可击,不朽,我知道三十六岁并不老。就在那时,我对自己发誓,我永远不会停止学习——我每天都要学习新的东西。我遵守了那个誓言。当然,在过去四十年的大部分时间里,我的职业和业余爱好都是计算机,所以这个誓言很容易遵守。

好奇心让我选择了 Linux

好奇心首先让我进入了 Linux,但这是一条漫长而曲折的道路。如果你愿意,你可以跳过这一长段,也许对你来说,这一段很无聊。我确实发现,描述我的旅程如何把我带到今天的位置,对一些人来说很有趣,也很有帮助。它确实表明,生活中两点之间的最短距离通常不是一条直线。在任何情况下,我都会尽可能地保持简短,并展示好奇心对我生活的影响。

从我学校成绩的标准意义上来说,我从来都不是一个特别好的学生。我倾向于跟随我的好奇心,而不是课程计划。大多数老师不喜欢这样。我对电学、电子学、数学和化学感兴趣。我很幸运有好的化学和数学老师,但在 1960 年,除非我去托莱多的职业技术高中,否则没有高中的电子学课程。我想去那里,但我的父母说服我,我可以以后学习电子学。

在我十几岁的时候,我对电子学的兴趣受到了我的 HO 轨距模型铁路的帮助和鼓励,它要求我至少学习电学的基础知识。所以我从图书馆借书来学习。我还在托莱多大学(UT)书店找到了我购买并学习的大学水平的练习册。我给我的模型铁路布线,当我学到新的东西时,我完全撕掉现有的布线,从头开始重新布线。

我们的电视坏了的时候,我也经常修理它。最终,邻居开始要求我在他们的电视和收音机坏了的时候帮他们修理。那时候这很容易,因为每个电子设备都有一个原理图,我所要做的就是找出要更换哪个真空管。有一些书用图片展示了各种症状,然后列出了失效时会导致这些问题的管子类型,这很有帮助。几乎每家药店和杂货店都有试管测试器和试管供应,这也很有帮助。这意味着我可以移除我怀疑是故障原因的一根或多根管子,然后走到一个地方进行测试并购买一个替代品。

1968 年夏天,我在洛杉矶的一个姑姑家度过。我的叔叔在航空航天行业担任计算机程序员,我在他们的车库里发现了一堆旧的自学手册。我没有像我计划的那样一直去海滩,而是在暑假的大部分时间里从那些旧课程中学习 IBM 大型机计算。

然后在 1968 年末,我在一份涉及大量数字运算的工作中,我们使用非常古老的机械计算器,做一次乘法需要几分钟。我建议我们买一台四功能电子计算器,当时这种计算器刚开始上市。我的主管认为这是个好主意,所以他让我研究一下这种可能性。我们联系的两个供应商有这些有趣的新设备,桌面可编程计算器。双方都愿意让我使用演示模型,这样我就可以在我们自己的环境中用我知道我们将要解决的问题来测试它们。

我能够说服财务人员,这台 3500 美元的计算器物有所值,所以我们购买了一台 Olivetti Programma 101。我花了几个月的时间编写这个程序,并想学习更多关于编程的知识。

我很快发现大学只开设了一门编程课程,所以我选了一门基础课程。这个班是托莱多大学在阿格分时系统上教的,大概是阿格-6002 系列,位于俄亥俄州哥伦布市。终端访问是通过 ASR 33 电传打字机在 300 波特的拨号电话线上进行的。

然后,我从使用 P-101 的工作岗位晋升到 IBM 1401 的夜班操作员,在那里我第一次直接接触到了大型计算机。这份工作我干了几个月才继续。

我是 1969 年初结婚的。虽然这还没有对我的职业道路产生直接影响,但它在以后将是至关重要的。

在我的下一份工作中,我没有直接接触电脑,但我也在晚上为一个乐队工作,担任他们的音响技术员和唯一的乐队指挥。乐队的鼓手有一个电子邮件课程,他已经支付了费用,但没有时间参加,所以他向我提供了这个课程。我抓住了这个机会,电子知识让我在托莱多的一家音响销售和维修店找到了工作,在那里我学到了更多。

那是在 1972 年左右,我和妻子从我岳父那里买下了以前的出租屋。原来我们的一个邻居在 IBM 工作。他问我是否有兴趣在 IBM 工作,但我对现在的工作很满意,所以我说我不感兴趣。

音频维修工作让我找到了另一份工作,成为一家新音响商店的服务经理,在那里我还花了一些时间学习电子工程课程。我擅长这些课程,因为我喜欢电子学。

当我被新的音响商店解雇时,我问我的 IBM 朋友他们是否还在招人。他给我安排了一次面试,我开始了在 IBM 的 21 年职业生涯。我在 IBM 的第一份工作是在通用系统部(GSD)做客户工程师,修理硬件。1978 年,IBM 把我调到他们在佛罗里达州博卡拉顿的工厂工作,为新产品编写培训课程。1981 年初,我被指派为最初的 IBM 个人电脑编写培训材料。 3

为了编写个人电脑的培训课程,我需要在我的办公室里放一个,这样我就可以方便地自己学习了。因为当时非常秘密,安保人员在我办公室的天花板上安装了铁丝网,门上也装了锁。我是大楼里唯一一个办公室门上有锁的非经理人员。我猜头顶上的铁丝网是为了防止一些邪恶的小偷爬过我办公室的墙,掉进里面。只有在那之后,我才能在办公室里拥有一台电脑。我的序列号是 00000001。

在编写培训课程时,我最初采用了一种更传统的 IBM 培训策略,但这并不适用于打字机部门的 CEs,他们的工资比我们在 GSD 时要低。使用打字机部门的 CEs 使其更具成本效益,但这意味着我们必须让这些 CEs 熟悉计算机概念和技术。我必须确保他们在培训期间亲自动手,但让他们去培训中心太贵了。

所以我完全重写了培训。我编写了一个完整的计算机化培训程序,它允许我编写课程内容,然后在我们运送到分公司进行培训的 IBM 个人电脑上将其提交给当地分公司的 CEs。然后我写了课程本身。尽管这绝对不是第一个计算机化的培训课程,但它是第一个用于 IBM PC 的培训软件和课件。

为了编写这份修改后的课程并保持我们的时间表与电脑发布日期一致,我要求允许我在家里拥有一台电脑,这样我就可以更容易地在晚上上课。经过几十个高层主管的签字同意后,除了我在办公室的那台电脑外,我还得到了一台可以带回家的电脑。据我所知,我是第一个在家里拥有 IBM 个人电脑的人。

当然,所有这些都让我对个人电脑产生了浓厚的兴趣。所以我通过员工购买计划给自己买了一个。扣除员工折扣后,这花费了 5000 多美元。该系统包括一对 160KB 的 5.25 英寸软驱,没有硬盘和 64K 的 RAM。当我们办公室的几个人一起去购买我们必须自己制作的第三方存储卡的零件时,我开始入侵 PC 硬件。

在经历了几次职业变动后,我在佐治亚州亚特兰大的 IBM PC 帮助中心找到了一份工作。那段时间我对操作系统非常感兴趣,并最终成为 OS/2 的主要支持人员之一。

在 1993 年搬到北卡罗来纳州的罗利后,我于 1995 年离开 IBM,创办了一家专门从事 OS/2 的咨询公司。到 1996 年,很明显 OS/2 不会存在太久。我被学习 Windows NT 的想法吓坏了。尽管我还没有听说过 Linux,但我认为我的未来在 Unix。

大约在这个时候,IBM 的一个朋友有一天打电话给我,问我是否知道有人在找工作,可以帮助 MCI(他现在在那里工作)使用他们的 OS/2 计算机。我接受了这份工作,条件是我必须学习 Unix。

在 MCI 的时候,我能够学习一些基本的 Unix 课程,这使我开始起步。我还听说了一个叫 Linux 的东西,它很像 Unix,我可以把它安装在我的个人电脑上。我认为我需要提高我的 Unix/Solaris 技能,但是我负担不起为家里购买一台 Sun 计算机和 Solaris。所以我在当地的电脑商店买了一份红帽 5.0(不是 RHEL)并安装在我的几台电脑中的一台上。我喜欢 Linux,在了解了更多之后,我发现我没有进步。我决定进行一次飞跃,除了一台之外,我把家里所有的电脑都升级到了 Linux。最后一步是将我的 web 和电子邮件服务器从 OS/2 迁移到 Linux。

所有这些学习的结果是,我能够在当地的 ISP 找到一份 Unix 工程师的工作。他们送我去上 Solaris 课程,我获得了 Sun 认证的系统管理员证书。在这里,我遇到了一些最好的导师。

我们中大约有 80 人被 ISP 解雇,我很快找到了一份承包商的工作。这是我负责修复运行在 Red Hat Linux 服务器上的所有 Perl 脚本的地方。我们还使用了一些需要清理的 bash shell 脚本。在那份工作中,我学到了更多关于 Linux 和 shell 脚本的知识。

这导致了一系列围绕 Linux 的工作,在大多数工作中,我至少接受了一些 Linux 培训。我发现我工作过的大多数地方都需要有人在 Linux 的各个方面培训其他管理员和用户。我组织了几个 Linux 课程和午餐学习会议,都很受欢迎。

我发现当我教别人的时候,无论是在课堂环境中还是在书籍和文章中,我自己学到的东西最多。我必须仔细研究事情,以确保我做对了。我还必须回答学生们提出的问题,这些问题是我在创作材料时从未考虑过的。我必须研究我没有答案的问题。

现在我在写关于 Linux 的文章,这需要更多的研究、测试和实验。

这只是我个人通向 Linux 和开源之路的一部分。有很多附带的旅行影响了我的一些决定,并改变了我生活中某些事件的时间,这样事情就为上面的故事展开做好了准备。

在我成长或上学的时候,找一份 Linux 方面的工作并不是我所能计划的,因为在我高中和大学的最初几年,Unix、Linux 和开源都不存在。我所做的选择,我遇到的人,我获得的知识,我住过的地方,我做过的一系列工作,都导致了我现在的地位,因为我一次又一次地选择追随我喜欢的和我有强烈好奇心的东西,技术,计算机,操作系统和 Linux。我的选择,不管是有意识的还是无意识的,带我走上了一条被好奇心驱使的道路。从很多方面来说,这都是令人愉快和有益的。

如果你有兴趣阅读一些其他人进入 Linux 和开源领域的故事,可以看看 Opensource.com 网站上标有“职业” 4 的文章列表。他们经常发表一些故事,讲述那些找到不同方法来到这里的人。并非列表中的所有文章都是关于“我如何在开源领域找到工作”的,但有些是。你可能会发现这些和其他带有这个标签的文章很有趣。

好奇心解决问题

有一句老话——我认为非常愚蠢——说“好奇害死猫”我小时候用过这个,幸运的是我父母没有用过。我认为这个愚蠢的说法主要是用来扼杀孩子,当他们的问题和好奇心把他们带到一些父母、老师和照顾者不愿花时间处理的地方时。这是我们周围建造盒子的方式之一。

我个人的说法是“好奇心解决问题。”跟随我们的好奇心会把我们带到盒子外面的地方,让我们用其他方式无法解决问题的地方。有时好奇心可以直接引导我找到问题的原因,而其他时候这种联系是间接的。

安全性

好奇心让我解决了许多问题,其中一些我最初甚至不知道存在。在这种情况下,计算机仍在运行,没有明显的症状,如崩溃或程序失败。没有明显的问题,一切似乎都很好。安全问题可以是这样的。

这一特殊的经历始于多年前的一天,当时我决定检查我的系统的安全性,尤其是我和外界之间的防火墙。我已经在防火墙上设置了一些防火墙规则和强密码。但是我很好奇我的安全状况,以及是否有一些我可以关闭的漏洞。我不是说代码漏洞,我是说程序和安全配置漏洞,那些我可以比当时做得更好的东西。一切都是从日志开始的。

当一切正常时,我喜欢观察 top、htop、iotop、glances 或任何其他系统监控工具,这样当它们看起来不一样时,我就知道可能有问题。我对我的日志文件也是这样。所以我花了大量时间扫描我的日志文件,看是否能发现任何异常。这总是一件非常耗时的工作,每天试图解释数百甚至数千行日志文件实在是太多了,而且很难将数据归结为可管理的东西。我需要找到一种方法来自动化这项任务,如果有潜在的问题,它会提醒我——是的,自动化一切。

日志监控

我读过 Logwatch,它就是这样做的,所以我花了一些时间研究它和其他可能对我有用的类似工具。每天,Logwatch 都会扫描前一天的日志文件,以查找 SysAdmin 应该看到的异常条目,从而确定是否存在问题。它非常适合我的需要。

我想我在用作防火墙的 Fedora 主机上安装了 Logwatch,因为它不是默认安装的。这是一段很长的时间,所以我不记得了,我的 postinstall.sh 脚本现在安装logwatch,如果它还没有安装的话。在 Fedora workstation 的当前版本中,Logwatch 肯定不是默认安装的。

Logwatch 通常由/etc/cron.daily 中的 cron 作业0logwatch运行,0logwatch 脚本配置为将结果作为电子邮件发送给 root 用户。我不想让 Logwatch 的输出进入 root,所以我在防火墙主机上的/etc/aliases 文件中添加了一行,并重新启动 sendmail。现在电子邮件会发给我。

logwatch程序也可以直接从命令行运行。在这种情况下,默认情况下将输出发送到 STDOUT,所以我没有等到第二天再查看 cron 作业发送给我的内容,而是从命令行运行了logwatch

实验 22-1 安装 Logwatch,然后让你从命令行运行它。我在我的防火墙上做了这个,有大量的数据。我已经删除了一些部分的大部分,只留下足够你看的部分

实验 22-1

这个实验必须以 root 用户身份进行。我们将首先安装 Logwatch,然后从命令行运行它。

[root@wally1 ~]# dnf -y install logwatch
Last metadata expiration check: 2:59:04 ago on Sat 07 Apr 2018 05:11:02 AM EDT.
Dependencies resolved.
======================================================================
 Package              Arch       Version             Repository  Size
======================================================================
Installing:
 logwatch             noarch     7.4.3-6.fc27        fedora     423 k
Installing dependencies:
 perl-Date-Manip      noarch     6.60-1.fc27         fedora     1.1 M
 perl-Sys-CPU         x86_64     0.61-13.fc27        fedora      19 k
 perl-Sys-MemInfo     x86_64     0.99-5.fc27         fedora      25 k

Transaction Summary
======================================================================
Install  4 Packages

Total download size: 1.6 M
Installed size: 12 M
Downloading Packages:
(1/4): perl-Sys-CPU-0.61-13.fc27.x86_  49 kB/s |  19 kB     00:00    
(2/4): perl-Sys-MemInfo-0.99-5.fc27.x 458 kB/s |  25 kB     00:00    
(3/4): logwatch-7.4.3-6.fc27.noarch.r 776 kB/s | 423 kB     00:00    
(4/4): perl-Date-Manip-6.60-1.fc27.no 1.8 MB/s | 1.1 MB     00:00    
----------------------------------------------------------------------
Total                                 1.8 MB/s | 1.6 MB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                              1/1
  Installing       : perl-Sys-MemInfo-0.99-5.fc27.x86_64          1/4
  Installing       : perl-Sys-CPU-0.61-13.fc27.x86_64             2/4
  Installing       : perl-Date-Manip-6.60-1.fc27.noarch           3/4
  Installing       : logwatch-7.4.3-6.fc27.noarch                 4/4
  Running scriptlet: logwatch-7.4.3-6.fc27.noarch                 4/4
  Running as unit:   run-r859e9a9c34c64b2280025d5d33b5a7ac.service
  Verifying        : logwatch-7.4.3-6.fc27.noarch                 1/4
  Verifying        : perl-Date-Manip-6.60-1.fc27.noarch           2/4
  Verifying        : perl-Sys-CPU-0.61-13.fc27.x86_64             3/4
  Verifying        : perl-Sys-MemInfo-0.99-5.fc27.x86_64          4/4

Installed:
  logwatch.noarch 7.4.3-6.fc27                                        
  perl-Date-Manip.noarch 6.60-1.fc27                                  
  perl-Sys-CPU.x86_64 0.61-13.fc27                                    
  perl-Sys-MemInfo.x86_64 0.99-5.fc27                                 

Complete!

安装完成后,我们运行不带选项的 logwatch 命令。为了节省空间,我在某些部分删掉了大量的行。我还在输出中插入了注释,以便在某种程度上描述结果。您的结果将与我的不同,但这将让您很好地理解为什么我让我的好奇心带我到安全的其他方面。

[root@testvm1 ~]# logwatch

 ################### Logwatch 7.4.3 (04/27/16) ####################
        Processing Initiated: Fri Apr  6 14:01:32 2018
        Date Range Processed: yesterday
                              ( 2018-Apr-05 )
                              Period is day.
        Detail Level of Output: 10
        Type of Output/Format: stdout / text
        Logfiles for Host: wally1.both.org
 ##################################################################

前一部分是描述运行命令的条件、日期和时间的标题。下一节包含内核信息,主要是各种服务的开始和停止条目,以及登录。请注意,Logwatch 已经将这一部分从 10,000 多行删减到只有 100 行。我把它砍得更低了。

 --------------------- Kernel Audit Begin ------------------------

 **Unmatched Entries** (Only first 100 out of 10226 are printed)
  audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=mlocate-updatedb comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
  audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=sysstat-collect comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
  audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=sysstat-collect comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'

<SNIP>

接下来的几个条目是一些成功登录的结果。

  audit[16590]: CRYPTO_KEY_USER pid=16590 uid=0 auid=4294967295 ses=4294967295 msg='op=destroy kind=server fp=SHA256:e9:53:4c:65:7f:a4:cb:6d:42:0c:40:a3:a4:a2:a9:d3:05:dd:4f:41:3b:26:ed:f6:02:ec:2b:4f:f9:a2:9d:5c direction=? spid=16590 suid=0  exe="/usr/sbin/sshd" hostname=? addr=? terminal=? res=success'
  audit[16590]: CRYPTO_KEY_USER pid=16590 uid=0 auid=4294967295 ses=4294967295 msg='op=destroy kind=server fp=SHA256:2d:39:44:81:f6:e0:47:1f:f3:b1:02:a1:76:73:2e:16:26:6f:d8:e5:7d:2a:4a:ab:76:17:dd:36:54:b1:e6:a5 direction=? spid=16590 suid=0  exe="/usr/sbin/sshd" hostname=? addr=? terminal=? res=success'
  audit[16590]: CRYPTO_KEY_USER pid=16590 uid=0 auid=4294967295 ses=4294967295 msg='op=destroy kind=server fp=SHA256:c4:2a:24:f1:0b:14:d4:4e:eb:33:6b:90:e0:84:c5:64:72:ec:30:72:3c:84:28:72:88:14:e3:1a:9d:d7:de:a9 direction=? spid=16590 suid=0  exe="/usr/sbin/sshd" hostname=? addr=? terminal=? res=success'
  audit[16589]: CRYPTO_SESSION pid=16589 uid=0 auid=4294967295 ses=4294967295 msg='op=start direction=from-server cipher=aes128-ctr ksize=128 mac=hmac-sha2-256 pfs=diffie-hellman-group-exchange-sha256 spid=16590 suid=74 rport=54280 laddr=24.199.159.59 lport=22  exe="/usr/sbin/sshd" hostname=? addr=109.228.0.237 terminal=? res=success'
  audit[16589]: CRYPTO_SESSION pid=16589 uid=0 auid=4294967295 ses=4294967295 msg='op=start direction=from-client cipher=aes128-ctr ksize=128 mac=hmac-sha2-256 pfs=diffie-hellman-group-exchange-sha256 spid=16590 suid=74 rport=54280 laddr=24.199.159.59 lport=22  exe="/usr/sbin/sshd" hostname=? addr=109.228.0.237 terminal=? res=success'

<SNIP>

接下来的几行只是大量登录失败中的两个。这是我第一次看到大量攻击的迹象。仅仅通过视觉扫描很难找到这些,所以我使用 grep 实用程序来找到更多。这种方法并没有给出问题有多糟糕的真实感觉,但是后面的其他部分给出了这种感觉。

  audit[16589]: USER_LOGIN pid=16589 uid=0 auid=4294967295 ses=4294967295 msg='op=login acct="(unknown)" exe="/usr/sbin/sshd" hostname=? addr=109.228.0.237 terminal=ssh res=failed'
  audit[16596]: CRYPTO_KEY_USER pid=16596 uid=0 auid=4294967295 ses=4294967295 msg='op=destroy kind=session fp=? direction=both spid=16597 suid=74 rport=41125 laddr=24.199.159.59 lport=22  exe="/usr/sbin/sshd" hostname=? addr=221.194.47.243 terminal=? res=success'
  audit[16596]: USER_LOGIN pid=16596 uid=0 auid=4294967295 ses=4294967295 msg='op=login acct="(unknown)" exe="/usr/sbin/sshd" hostname=? addr=221.194.47.243 terminal=ssh res=failed'

<SNIP>

 ---------------------- Kernel Audit End -------------------------

cron 部分显示每个 cron 作业在过去 24 小时内运行的次数。

 --------------------- Cron Begin ------------------------

 Commands Run:
    User root:
       /sbin/hwclock --systohc --localtime: 1 Time(s)
       run-parts /etc/cron.hourly: 24 Time(s)
       systemctl try-restart atop: 1 Time(s)

 ---------------------- Cron End -------------------------

下一节列出了大量的身份验证失败。它以一种明确的方式说明了未经授权的访问尝试的问题有多严重。它通过按尝试次数的顺序列出入侵尝试所源自的 IP 地址来做到这一点。

 --------------------- pam_unix Begin ------------------------

 sshd:
    Authentication Failures:
       root (123.183.209.135): 21 Time(s)
       unknown (14.37.169.239): 10 Time(s)
       unknown (85.145.209.59): 10 Time(s)
       unknown (116.196.115.44): 8 Time(s)
       unknown (212.129.36.144): 6 Time(s)
       unknown (84.200.7.63): 5 Time(s)
       root (218.65.30.25): 3 Time(s)
       root (84.200.7.63): 3 Time(s)
       unknown (103.99.0.54): 2 Time(s)
       unknown (196.216.8.110): 2 Time(s)
       ftp (116.196.72.140): 1 Time(s)
       ftp (118.36.193.215): 1 Time(s)
       operator (5.101.40.81): 1 Time(s)
       root (103.26.14.92): 1 Time(s)
       root (103.89.88.220): 1 Time(s)
       root (103.92.104.175): 1 Time(s)
       root (103.99.2.143): 1 Time(s)
       root (118.24.28.246): 1 Time(s)

<SNIP>

       unknown (91.121.77.149): 1 Time(s)
       unknown (95.38.15.86): 1 Time(s)
    Invalid Users:
       Unknown Account: 163 Time(s)
    Sessions Opened:
       root: 2 Time(s)

 systemd-user:
    Unknown Entries:
       session opened for user root by (uid=0): 3 Time(s)

 ---------------------- pam_unix End -------------------------

上面的“无效用户”行显示,在前一天,总共有 163 次尝试侵入我的防火墙主机系统。PAM 负责整体登录安全性,上一节从 PAM 的角度来看登录。下面的 SSHD 部分也是如此。这是几乎相同的信息,但呈现方式略有不同。

在这两个部分,我可以看到针对我的系统的 SSH 攻击的完整列表,这让我很好奇它们的来源以及如何防止它们。

 --------------------- SSHD Begin ------------------------

 Didn't receive an ident from these IPs:
    103.79.143.56 port 58313: 1 Time(s)
    103.79.143.56 port 61578: 1 Time(s)
    103.89.88.181 port 53906: 1 Time(s)
    103.89.88.181 port 57332: 1 Time(s)
    103.89.88.181 port 58951: 1 Time(s)

<SNIP>

    202.151.175.6 port 39552: 1 Time(s)
    217.61.5.246 port 44974: 1 Time(s)
    66.70.177.18 port 33668: 1 Time(s)
    87.98.251.208 port 56975: 1 Time(s)

 Failed logins from:
    5.101.40.81: 1 time
       operator/password: 1 time
    18.188.155.82 (ec2-18-188-155-82.us-east-2.compute.amazonaws.com): 2 times
       root/password: 2 times
    23.97.75.224: 1 time
       root/password: 1 time
    46.105.20.171 (vps16696.ovh.net): 1 time
       root/password: 1 time
    54.37.139.198 (198.ip-54-37-139.eu): 1 time
       root/password: 1 time

<SNIP>

    221.229.166.102: 1 time
       wp-user: 1 time

 Users logging in through sshd:
    root:
       192.168.0.1 (david.both.org): 2 times

 **Unmatched Entries**
 Disconnected from invalid user test 36.77.124.2 port 48914 [preauth] : 1 time(s)
 Disconnected from invalid user ubnt 103.99.2.143 port 55522 [preauth] : 1 time(s)
 Disconnected from authenticating user root 123.183.209.135 port 58498 [preauth] : 1 time(s)
 Disconnected from invalid user ftpuser 36.36.201.21 port 46357 [preauth] : 1 time(s)

<SNIP>

 Disconnected from invalid user avis 201.155.194.157 port 52769 [preauth] : 1 time(s)
 Disconnected from authenticating user root 23.97.75.224 port 1984 [preauth] : 1 time(s)
 Disconnected from authenticating user root 64.41.86.128 port 58134 [preauth] : 1 time(s)
 Disconnected from invalid user sybase 188.187.55.243 port 36344 [preauth] : 1 time(s)
 Disconnected from invalid user cron 221.145.180.62 port 37912 [preauth] : 1 time(s)

 ---------------------- SSHD End -------------------------

这些部分的其余部分是不言自明的,与安全性没有直接关系。因此,我没有对这个输出添加任何进一步的注释。我保留了这些部分,以便您可以看到 Logwatch 可能从典型防火墙的日志中创建的许多部分。

 --------------------- Systemd Begin ------------------------

 Reached target Shutdown: 3 Time(s)

 Started:
     Cleanup of Temporary Directories: 1 Time(s)
     Generate a daily summary of process accounting: 1 Time(s)
     LVM2 metadata daemon: 1 Time(s)
     Network Manager Script Dispatcher Service: 103 Time(s)
     Update a database for mlocate: 1 Time(s)
     User Manager for UID 0: 3 Time(s)
     dnf makecache: 23 Time(s)
     system activity accounting tool: 144 Time(s)
     update of the root trust anchor for DNSSEC validation in unbound: 1 Time(s)

 User Sessions:
     root:  66 68 70

 Slices created:
     User Slice of root 3 Time(s)

 **Unmatched Entries**
    Closed D-Bus User Message Bus Socket.: 3 Time(s)

 ---------------------- Systemd End -------------------------

 --------------------- Disk Space Begin ------------------------

 Filesystem                      Size  Used Avail Use% Mounted on
 devtmpfs                        3.9G     0  3.9G   0% /dev
 /dev/mapper/fedora_wally1-root  9.8G  173M  9.1G   2% /
 /dev/mapper/fedora_wally1-usr    35G  5.3G   28G  17% /usr
 /dev/mapper/fedora_wally1-home  4.9G  262M  4.4G   6% /home
 /dev/mapper/fedora_wally1-tmp    25G   45M   24G   1% /tmp
 /dev/mapper/fedora_wally1-var    30G  6.2G   22G  23% /var
 /dev/sda1                       2.0G  399M  1.5G  22% /boot

 ---------------------- Disk Space End -------------------------

 --------------------- lm_sensors output Begin ------------------------

 coretemp-isa-0000
 Adapter: ISA adapter
 Package id 0:  +82.0 C  (high = +85.0 C, crit = +105.0 C)
 Core 0:        +79.0 C  (high = +85.0 C, crit = +105.0 C)
 Core 1:        +83.0 C  (high = +85.0 C, crit = +105.0 C)
 Core 2:        +80.0 C  (high = +85.0 C, crit = +105.0 C)
 Core 3:        +80.0 C  (high = +85.0 C, crit = +105.0 C)

 ---------------------- lm_sensors output End -------------------------

 ###################### Logwatch End #########################

Logwatch 从日志中提取大量关于 Linux 主机的有用信息。它将系统管理员需要查看的信息量从数万行减少到仅仅几千行。好的方面是它聚集了相关的日志条目,所以它们都在最终报告中的一个地方,这使得扫描更加容易。

对日志观察结果的一些快速分析表明,绝大多数攻击是脚本小子。这些是使用简单脚本的自动攻击,通过简单地尝试登录一系列 IP 地址来定位开放的 SSHD 端口。一旦找到一个开放 SSHD 端口的 IP,脚本可能会花几分钟时间尝试使用随机但已知的用户 id 和基于字典的密码登录。目的是如果他们可以获得访问权,用一些恶意软件感染计算机。

脚本小子对破解受到良好保护的主机不是特别认真。他们在寻找容易得手的机会——管理不善、保护不力或根本没有保护的主机。严重的黑客,那些针对特定的人或企业,完全是另一回事。一个足够认真的黑客最终会找到进入你电脑的方法。

在我的情况下,这些不是严重的饼干。日志观察结果显示,我的防火墙每天被攻击数百次,有时甚至数千次。这些攻击是随机的,而且从来没有持续过。但是我仍然需要减少攻击次数来提高我的安全性。随着时间的推移,我使用了多种策略来做到这一点。每走一步,我的好奇心都被新的信息、对问题的新观点,或者仅仅是好奇心本身所点燃。

防火墙

为了阻止这种攻击,我首先求助于 iptables 防火墙,因为我对它已经很熟悉了。几个星期以来,我花了大量时间将最恶劣的罪犯的 IP 地址添加到我的 iptables 防火墙中。

出于好奇,我想确定源 IP 地址来自世界的哪个地方。所以我开始用whois来确定。如果地址来自某个我知道永远都不需要自己登录的地方,我就简单地屏蔽掉整个地址范围。

这很容易做到,但它确实阻止了一些想看我网站的人。当阻止整个 A 类 IP 地址时,这种方法是多余的,但手动添加单个地址会花费大量时间。因此,出于懒惰的管理员的真实态度,以及“自动化一切”,我对自动向我的防火墙规则添加 IP 地址感到好奇。

失败 2 班

经过一番探索和研究,我找到了 fail2ban,这是一款开源软件,可以自动完成我以前手动完成的工作。“使用开源软件.”

Fail2ban 有一系列复杂的可配置匹配规则和单独的操作,当试图侵入系统时可以采取这些操作。它针对许多类型的攻击制定了规则,包括 web、电子邮件和许多其他可能存在漏洞的服务。Fail2ban 的工作原理是检测攻击,然后向防火墙添加一条规则,在指定和可配置的时间内阻止来自该特定单个 IP 地址的进一步尝试。时间到期后,它会删除阻止规则。

当 IP 地址被阻止时,fail2ban 用来通知系统管理员的方法之一是发送电子邮件。默认情况下,电子邮件发送给 root 用户,但也可以进行配置。我没有配置许多不同的工具来发送电子邮件到我的个人地址,而是允许它们发送到 root 和/etc/aliases 文件(我已经配置好了),将所有电子邮件重新路由到 root 以发送给我。

出于好奇,我花了一些时间来调整规则,因为 Fail2ban 将在指定时间内进行指定次数的破解尝试后阻止一个 IP 地址。我发现——就我的环境和需求而言——在十分钟内尝试三次完全符合我的要求。我还发现,封锁一个 IP 地址至少 24 小时,而不是默认的 10 分钟,确实有助于阻止惯犯。因此,下面的示例清单 22-1 中的结果是基于那些过滤规则的。

示例清单 22-1

在安装了 fail2ban 并根据我的需要配置它几天后,我再次运行 logwatch,fail2ban部分如下所示。

 --------------------- fail2ban-messages Begin ------------------------------

 Banned services with Fail2Ban:                             Bans:Unbans
    my-sshd:                                                [ 35:35 ]
       123.183.209.135                                        17:17
       84.200.7.63                                             4:4  
       212.129.36.144 (212-129-36-144.rev.poneytelecom.eu)     3:3  
       218.65.30.25 (25.30.65.218.broad.xy.jx.dynamic.         3:3  163data.com.cn)
       18.188.155.82 (ec2-18-188-155-82.us-east-2.compute.     1:1  amazonaws.com)
       66.70.177.18 (ns545339.ip-66-70-177.net)                1:1  

<SNIP>
       183.230.146.26                                          1:1  

 Fail2Ban hosts found:
     my-sshd:
        103.20.149.252 - 2018-04-05 11:01:55 (1 Times)
        103.20.149.252 - 2018-04-05 11:01:57 (1 Times)
        103.26.14.92 - 2018-04-05 07:43:26 (1 Times)
        103.26.14.92 - 2018-04-05 07:43:28 (1 Times)
        103.28.219.152 - 2018-04-05 05:17:57 (1 Times)
        103.28.219.152 - 2018-04-05 05:18:00 (1 Times)
        103.89.88.220 - 2018-04-05 11:57:17 (1 Times)
        103.89.88.220 - 2018-04-05 11:57:19 (1 Times)
        103.92.104.175 - 2018-04-05 02:23:13 (1 Times)
        103.92.104.175 - 2018-04-05 02:23:14 (1 Times)
        103.99.0.32 - 2018-04-05 16:15:59 (1 Times)
        103.99.0.32 - 2018-04-05 16:16:01 (1 Times)
        103.99.0.54 - 2018-04-05 04:17:38 (1 Times)

<SNIP>
        88.87.202.71 - 2018-04-05 01:31:22 (1 Times)
        90.84.44.20 - 2018-04-05 19:01:06 (1 Times)
        90.84.44.20 - 2018-04-05 19:01:08 (1 Times)
        91.121.105.20 - 2018-04-05 14:21:39 (1 Times)
        91.121.105.20 - 2018-04-05 14:21:41 (1 Times)
        91.121.77.149 - 2018-04-05 04:28:28 (1 Times)
        91.121.77.149 - 2018-04-05 04:28:29 (1 Times)
        95.38.15.86 - 2018-04-05 22:13:11 (1 Times)
        95.38.15.86 - 2018-04-05 22:13:13 (1 Times)

 ---------------------- fail2ban-messages End -------------------------

寻找源头

出于对我的防火墙上的这些攻击的来源的好奇,我开始收集这些电子邮件以便分析它们。它们通常如清单 22-2 所示。这是电子邮件的完整来源,因此您可以详细检查它。

清单 22-2

Received: from wally1.both.org (wally1.both.org [192.168.0.254])
        by bunkerhill.both.org (8.14.4/8.14.4) with ESMTP id w34E9NnR002675
        for <dboth@millennium-technology.com>; Wed, 4 Apr 2018 10:09:23 -0400
Received: from wally1.both.org (localhost [127.0.0.1])
        by wally1.both.org (8.15.2/8.15.2) with ESMTP id w34E9NTA013030
        for <dboth@millennium-technology.com>; Wed, 4 Apr 2018 10:09:23 -0400
Received: (from root@localhost)
        by wally1.both.org (8.15.2/8.15.2/Submit) id w34E9NBq013023
        for dboth@millennium-technology.com; Wed, 4 Apr 2018 10:09:23 -0400
Message-Id: <201804041409.w34E9NBq013023@wally1.both.org>
Subject: [Fail2Ban] SSH: banned 123.183.209.135 from wally1.both.org
Date: Wed, 04 Apr 2018 14:09:23 +0000
From: wally1 <wally1@both.org>
To: dboth@millennium-technology.com
X-Spam-Status: No, score=-48 required=10.6 tests=ALL_TRUSTED,BAYES_00,USER_IN_WHITELIST
Content-Type: text/plain
MIME-Version: 1.0
X-Scanned-By: MIMEDefang 2.83 on 192.168.0.51

Hi,

The IP 123.183.209.135 has just been banned by Fail2Ban after
3 attempts against SSH.

Here is more information about 123.183.209.135:

GeoIP Country Edition: CN, China

Regards,

Fail2Ban

这是我收到的电子邮件类型的一个典型例子。主题行包含来源的 IP 地址、报告攻击的主机名称和 Fail2ban 规则,在本例中是 SSH。我想使用原始 IP 地址来识别来源国。Fail2ban 规则集包括一个使用 GeoIP 的选项,geo IP 是一个搜索 IP 地址及其分配到的国家的数据库的程序,以确定攻击来自哪个国家。这是一个有趣的侧游,我安装它没有太大的困难。对于 Fedora,这是我的防火墙所使用的,GeoIP 位于 Fedora 存储库中。对于 CentOS,它位于 EPEL 5 存储库中。

在收集了大量的 Fail2ban 邮件后,我把它们从雷鸟导出到一个主题行列表中。我编写了一个脚本来读取列表,并使用 GeoIP 来识别来源国家,并按频率生成国家列表。

最频繁和持续的攻击似乎来自亚洲的各个地区、东欧、南美的几个国家和美国。

收集电子邮件

为了收集这些邮件,我开始使用雷鸟中可用的过滤器来识别 Fail2ban 发送的邮件,并将它们移动到特定的文件夹中。这工作正常,但我发现雷鸟过滤器并不总是准确的。这并不是造成问题的唯一过滤器。

我决定我需要一些不同的东西来过滤和分类我的邮件——所有的邮件,而不仅仅是 Fail2ban 的邮件。

procmail

我以前听说过 procmail。它作为默认的本地传递代理(LDA)安装在所有基于 Red Hat 的发行版上。这让我在这个项目中使用 procmail 变得不需要动脑筋。该项目是,首先,将 Fail2ban 发送的电子邮件分类到一个专门为他们准备的文件夹中,其次,也对其他电子邮件进行分类。

我还想解决一个技术问题。客户端电子邮件过滤依赖于在邮件存入收件箱后对其进行扫描。由于某种未知的原因,有时客户端不会从收件箱中删除(清除)已移动的邮件。这可能是雷鸟的问题(也可能是我的雷鸟配置的问题)。我多年来一直致力于解决这个问题,但没有成功,甚至通过多次完全重装 Fedora 和 Thunderbird 也没有成功。

为了解决这些多重问题,我需要一种基于服务器而不是基于客户端的方法来归档电子邮件(即,将它们分类到适当的文件夹中)。这将意味着,没有必要为了执行电子邮件分类而保持雷鸟或任何电子邮件客户端运行。

在对 procmail 做了一些研究后,我能够创建一个 procmail 规则,将收到的 Fail2ban 电子邮件分类到一个特定的文件夹中。我还创建了一些其他规则,将其他类型的电子邮件分类到不同的文件夹中。

虽然我使用 SpamAssassin 来识别垃圾邮件,但我现在使用 procmail 规则将垃圾邮件归档到我的垃圾邮件文件夹中。我还收到了一些 SpamAssassin 规则似乎永远无法识别的垃圾邮件。在不久的某个时候,每当看到我的收件箱里那些特定的垃圾邮件时,我会创建一个或多个规则来过滤它们。我也对我的垃圾邮件过滤的功效感到好奇,所以我没有删除垃圾邮件,而是将它存储了几天,以防我需要查看 SpamAssassin 分数来改进这些规则。

2017 年 11 月,我为 Opensource.com 写了一篇关于使用 SendMail、SpamAssassin、procmail 对邮件进行分类整理的文章 6 。它比我这里讲的更详细,是关于解决多个问题,而不仅仅是将 Fail2ban 邮件分类到一个特定的文件夹。

rkhunter

在看到每天有多少人试图侵入我的防火墙后,我更加担心了。因此,我对如何进行的好奇心引导我发现了根工具包。我决定开始专门寻找 root kits,这是安装在被黑客入侵的主机上的软件包。他们允许黑客访问主机,并根据自己的目的控制它。

确保没有安装 root kit——至少没有已知的——是一个名为 rkhunter 的软件工具执行的任务。我安装了 rkhunter 并定期运行它,以确保没有安装任何已知的根工具包。

当然,最后一句话表明了任何旨在扫描计算机系统中任何类型恶意软件的软件的问题——它只能找到已知的恶意软件,并且已经为其开发了签名。当你发现一个根包的时候,损害已经造成了,是时候清除一切并重新开始了。

我确实使用 rkhunter,但我并不仅仅依赖它来保证我的网络安全。

我试图阻止的攻击是简单的脚本密码破解。因此,显而易见的步骤是确保密码基本上是不可破解的,并在我的网络内部使用 SSH 和公钥/私钥对(PPKP)进行系统间通信。

因此,我为所有内部系统设置了长度适中的密码,为防火墙主机设置了极长的密码。我一直使用 SSH 和 PPKPs 登录我网络上的其他主机,所以我在那里的操作程序没有重大变化。我不会在我的防火墙上描述这种设置的细节,因为它可能会为严重的黑客提供一些帮助。此外,这一部分更多的是关于我的好奇心带我去的方向,而不是关于我为保护我的系统所采取的所有步骤的细节。

所以这次对我的防火墙主机系统安全性的探索非常有启发性。我已经开始做一些非常基本的安全工作,但是直到我真正看到这个问题,我才完全理解这个问题的范围。一步一步,我的好奇心把我带进了保护我的系统的世界。我用这些知识来保护我和我的客户的系统。

如果这个问题没有被 Logwatch 清楚地提出来,我可能不会有足够的好奇心去探究安全和防火墙。因此,我的系统更加安全。

我还研究了我的系统上的一些其他安全选项,但是像各种形式的入侵检测这样的事情往往是在事后进行的,它们所带来的管理负载超过了我自己的系统所需要的。在这种情况下,风险降低并不能证明启用和维护风险所需的工作成本是合理的。

SELinux 7 也默认安装在所有基于 Red Hat 的发行版上,我的好奇心也曾多次带我走上这条路。我发现——在我的环境中——它不适合在我的所有主机上使用。我确实在我的防火墙上启用了限制模式,因为这是我获得最大成果的地方。任何严重的攻击者都需要首先突破防火墙,这样就会触发警告,有人正试图侵入我的网络。然后,我可以在违规行为实际发生之前采取适当的措施。但是,请记住,没有完美的安全性这种东西。任何一套安全防范措施的目的都是让入侵您的系统在时间和精力上比坏人愿意付出的代价更高。归根结底是你能承受多大风险的问题。

这一切都是从我的好奇心开始的。我原本打算简化检查日志文件中潜在问题的任务。这让我想到了一些非常有趣的方向,其中最主要的是我的网络安全,尤其是防火墙。它还带我去了一些其他地方,我甚至没有在这里介绍,只是因为你应该已经明白这一点。

跟随你自己的好奇心

我已经不止一次地提到过,你应该探索 Linux 的许多方面,并且去你的好奇心引导你去的任何地方。只是通过跟随我的好奇心,首先是关于电子学,然后是计算机、编程、操作系统、OS/2、Linux、服务器、网络等等,我才能够做这么多有趣的事情。

你心中可能有具体的个人和职业目标,这可能会激发你的好奇心,带你去能帮助你实现这些目标的地方。你也可能是一个天生好奇的人,更倾向于对你特别感兴趣的事情好奇,而不执着于特定的目标。你的好奇心如何被驱使并不重要。重要的是你要跟随它,不要让任何人或任何事挫伤你的好奇心。

成为一名作家

我目前为 Opensource.com8写了许多文章,无论我写什么,我总是能学到新的东西,甚至是我已经熟悉的东西。我写过的每一篇文章,无论是为 Linux 杂志Linux 杂志还是 Opensource.com 写的,都是满足我好奇心和了解更多 Linux 知识的机会。

写这本书也不例外。甚至当我研究这本书的各个方面时,我学到了更多我已经知道的命令,并且我学到了一些新的命令。我让我的好奇心带我走上了本书中永远不会出现的道路,只是因为学习关于 Linux 的新事物很有趣,而且有太多东西需要学习。

找到我想写的话题几乎从来都不是问题。我通常用最近发生的事情作为我文章的主题。值得写的事情总是在发生。这只是一个识别它们并把故事用语言表达出来的问题。在写这本书的过程中发生了许多事情,这些事情成为了这本书的一部分;我在几章中提到了这些。

有时,当我偶尔努力将我的哲学转化为语言时,我对这一哲学有了更多的了解,了解了我是如何使用它的,以及它是如何帮助和指导我的。我了解到,在许多方面,我的哲学不仅仅是关于 Linux。

失败是一种选择

我没有失败。我刚刚发现了一万种行不通的方法。

—托马斯·A·爱迪生

虽然在测试过程中,数千种个别材料和制造技术的特定组合都失败了,但爱迪生还是继续实验。正是如此,未能解决问题或创建执行其定义任务的代码并不意味着项目或总体目标会失败。这只意味着特定的工具或方法没有产生成功的结果。

我从失败中学到的东西比其他任何方式都多。我尤其为那些自己造成的失败感到高兴。我不仅必须纠正我自己造成的问题,而且还必须找到并解决最初的问题。这总是会导致大量的研究,使我学到比快速解决原始问题更多的东西。

这是我的天性,我认为这是所有优秀系统管理员的天性,将这些情况视为学习机会。如前所述,我已经当了很多年的培训师,一些最有趣的经历是当我在教学时,演示、实验和实验室项目失败了。对我和我班上的学生来说,这些都是很棒的学习经历。有时我甚至把那些偶然的失败融入到以后的课程中,因为它们使我能够教授一些重要的东西。

做就是了

每个人都以自己的方式学得最好。作为一名培训师,我每次上课都会看到这种情况,不管是什么科目。追随我们的好奇心是一样的——我们都有那种引导我们发现更多的火花。我们的方法可能不尽相同,但它们会引导我们获得更多的知识和技能。

我开始在家里所有的电脑上安装 Linux。这迫使我学习 Linux,不回头。只要我有办法回到我的老的和众所周知的做事方式,我就没有必要真正学习 Linux。当我决定学习 Linux 时,我就是这么做的,它教会了我很大一部分知识。我有几台电脑,并在我的家庭办公室创建了一个完整的内部网络。这些年来,我的人际网络不断发展变化,每一次变化都让我学到了更多。这很大程度上是由我的好奇心驱动的,而不是任何特定的需求。

我有来自 ISP 的静态 IP 地址和两个防火墙来提供外部访问和保护我的内部网络。其中一个防火墙是树莓 Pi,上面有 CentOS。这些年来,我一直用英特尔盒子装着 Fedora 和 CentOS。我学到了很多关于在防火墙和路由器的角色中使用这两者的知识。

我有一台运行 DHCP、HTTP、SMTP、IMAP、NTP、DNS 和其他服务的服务器,以便为我的内部网络提供这些服务,并使其中一些服务对外部世界可用,例如我的网站和接收的电子邮件。我学到了很多关于在服务器角色中使用 Linux 的知识。我学到了很多关于实现和管理这些服务的知识。

我有几个台式工作站,一台笔记本电脑,一个 EeePC,都连接到我的有线网络。EeePC 和笔记本电脑也可以使用我的一个无线路由器进行连接;由于每月费用的原因,我不使用 ISP 提供的无线网络,也没有机会学习如何配置无线路由器。我还有几部智能手机、一部 Kindle 和一部 iPad。学习如何设置我的电子邮件服务器来最好地使用这些工具,同时尽最大努力以安全的方式提供这些服务是一项挑战。

对我来说,好奇心是学习的动力。我不能只是坐在教室里,因为有人说我需要学习特定的东西,并在这方面取得成功。我需要对这个主题感兴趣,并且需要一些能激起我好奇心的东西。这种在我喜欢的科目上更加努力学习的倾向在我上学期间非常明显,因为我在吸引我的科目上表现很好。

摘要

通过利用我的家庭网络来满足我的好奇心,我有了很多安全的空间,可以在灾难性的失败中学习从失败中恢复的最佳方法。失败的方式有很多,所以我学到了很多。当我不小心打碎东西时,我学到了最多,但当我故意打碎东西时,我也学到了很多。在这种情况下,我知道我想学什么,并可以针对破损的方式,使我能够了解这些具体的事情。

我也很幸运,因为我有几份工作需要,或者至少允许我上 Unix 和 Linux 各方面的课。对我来说,课堂作业是一种验证和巩固我自己所学知识的方式。这让我有机会与大多数知识渊博的老师交流,他们可以帮助和澄清我对自己无法理解的零碎内容的理解。

做一个好奇的系统管理员。对我很有效。

Wikipedia,程序 101https://en.wikipedia.org/wiki/Programma_101

2

维基百科,【ge-600】https://en.wikipedia.org/wiki/GE-600_series

3

Wikipedia、 IBM PChttps://en.wikipedia.org/wiki/IBM_Personal_Computer

4

Opensource.com,标记职业https://opensource.com/tags/careers

5

EPEL——企业 Linux 的额外软件包(Linux,RHEL,Fedora)

6

都、大卫、 SpamAssassin、MIMEDefang、Procmail:2017 最佳三重奏【Opensource.com、 https://opensource.com/article/17/11/spamassassin-mimedefang-and-procmail

7

克里斯·聂斌,实用 Linux 话题,2016 年 4 月,91 页,

8

Opensource.com, https://opensource.com/

二十三、没有应该

直到我开始写这本书,尤其是关于我为 Opensource.com 创作的竞赛的部分,这才真正成为我的信条之一。当我在写这一节的时候,我突然意识到我已经不止一次地使用了“没有应该”这个短语。我甚至在第二章中简单地讨论过它,所以我开始以一种新的方式思考这个问题,并决定它真的应该成为一个信条。

这个原则是关于可能性的。这也是本书所有章节中最具禅意的一章。它更多的是关于我们的大脑如何工作来解决问题,而不是特定的技术。这也是关于克服或至少认识到一些阻碍我们充分利用自身潜力的障碍。

总是有可能的

本书涵盖的每一个原则都揭示了一些关于 Linux 的基本事实,以及作为一名系统管理员,您可以如何与之交互。我并不是说这些事实是关于你“应该”如何与 Linux 交互的。在 Linux 中没有“应该”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在《卡恩之怒》中,斯波克说,“凡事皆有可能。”有了 Linux,总是有各种可能性——有许多方法来处理和解决问题。这意味着您可能以一种方式执行任务,而另一个系统管理员可能以另一种方式执行。没有一种“应该”完成任务的方法。只有你做这件事的方式。如果结果符合要求,那么达到要求的方式就是完美的。

我在第四章“转换数据流”的“管道挑战”一节中提供了一个很好的例子来自世界各地的 80 多名系统管理员提交了他们对我在 Opensource.com 竞赛中提出的一个问题的解决方案。一些解决方案非常接近相同,但是没有两个是完全相同的,许多是非常不同的。每个系统管理员都有一个独特的、创造性的解决方案来满足竞赛的要求。

一个单一的问题,在面对如此多不同的人时,怎么会产生如此广泛的解决方案呢?这里有两个因素在起作用。这是因为乍一看,Linux 表面上的复杂性实际上是其难以置信的灵活性。这个特定问题的许多不同解决方案是 Linux 系统管理员可以使用的许多不同命令和实用程序的直接结果。

第二个因素是,哪些 Linux 系统管理员通过许多不同的方式学习了 Linux,而我们的体验是如此不同。也正是这些经历让我们认识到,Linux 和开源软件不受限制的特性让我们对操作系统有了更充分的理解和推理。即使使用完全相同的命令,我们也可以找到不同的方法来解决手头的问题。

释放力量

我读到和听到很多人谈论“利用……的力量”,不管他们今天在宣传什么。这些都是多次营销活动。许多自助大师谈论驾驭心灵的力量,或“内在的力量”,尽管“内在的力量”从来没有确切的定义,也没有被提及。

我在谷歌上搜索了“驾驭 Linux 的力量”,找到了大约 14 篇关于这个短语的文章。我谷歌了一下“释放 Linux 的力量”,得到了六个结果。这对我说明了一个问题的角度。当我们谈论驾驭某物的时候,我们暗示我们想要包含某物或者把它置于控制之下;当我们谈论释放某物时,我们是从释放它的角度来思考的。

在某些方面,这是关于语义的 1 ,因为语义是我们如何思考的指示。语义学是对意义的研究,它考虑诸如词语选择及其对意义的影响。我们使用的词语对说话者或作者来说有不同于听者和读者赋予它们的意义。我认为在计算领域,尤其是在 Linux 领域,选择“释放”与“利用”是很有启发性的。

我非常不科学的观察让我得出了这样一个理论:我们这些 Linux 系统管理员倾向于更多地考虑“释放”或“释放”Linux 的力量。我相信,我们 Linux 系统管理员在解决 Linux 问题时,比那些似乎更多地考虑“利用”和“限制”的人对我们的思维限制更少我们有如此多简单而强大的工具可用,以至于我们不会发现自己受到操作系统或任何关于我们使用的工具或我们可能应用它们的操作方法的束缚。

当成千上万的人的想象力被释放到可以用开源软件解决的问题上时,就有了无法估量的力量。

问题解决

我们大多数人几乎不知道如何解决问题。这可能会削弱我们这样做的能力。解决问题是一门非常依赖科学方法和批判性思维的艺术。理解这个概念可以把我们从制度化思维强加给我们的认知限制中解放出来。

教育系统教导我们以特定的方式思考,似乎在宣扬当今解决问题的方法。例如,我用所谓的传统方法学习数学基础。我学习了数字系统,计算和与差的算法,包括位置值,进位和借位的概念;我记住了乘法表、除法的具体算法等等。我的孩子用不同的方法学习数学,这可能是“新数学”今天,我的孙子们正在学习新的数学。

读过一些关于当前数学教学的方法,我希望我也是这样学习的。我喜欢这样一个事实,学生们被教授定义明确的、可重复的、可教授的解决数学问题的过程。

在 2017 年发表在Journal of Physics:Conference Series、 3 、的一篇文章中,作者建立了学习数学的调查方法与批判性思维技能增加之间的正相关关系。批判性思维是系统管理员解决问题时的一项关键技能。

问题是,我喜欢用别人教我的方式做数学。对我来说,这比最近的方法更容易,尽管我现在对这些方法有了更好的理解,这是我为这一章所做研究的结果。我看过我的孙子们解决数学问题,我不知道他们在做什么,也不知道他们如何得出正确的结果。用我的“旧数学”方法检查他们的结果,我得到了相同的结果——除了他们出错的那些。或者是我犯了错误。主要是我的结果错了。但是当我们都答对的时候,答案肯定是一样的。

那么,谁是对的?我们中谁用了正确的方法来解决这些问题?当我们在学校的时候,得到正确的答案只是解决问题的一部分。另一部分是使用正确的算法,也就是今天教授的算法,来得出正确的答案。教授的是算法,以及我们如何选择正确的算法,并将其应用于手头的数学问题。在教育系统之外,在所谓的现实世界中,唯一重要的是计算的数字结果是正确的。

在 Linux 和计算机领域,最重要的是解决手头的问题。无论这是硬件问题、软件问题还是其他问题,都无关紧要。修复它是衡量系统管理员成功的标准。

打破机构教学方法教给我们的“应该”,特别是我们盲目遵循的死记硬背和算法,可以解放我们,让我们以新的方式思考解决问题。这并不意味着这些方法是错误的,只是其他方法也可以考虑,它们可能更适合特定的情况,特别是解决技术问题。

用“应该”囚禁我的不仅仅是机构。很多时候,是我自己。我发现自己在盒子里思考,因为那是我认为我“应该”在的地方。当我发现自己被“应该”困住时,有一些方法可以防止这种情况的发生并恢复过来。

在第二十四章,“指导年轻的系统管理员”,我们将详细探索一种植根于科学方法的解决问题的算法。现在,让我们来看看解决问题和避免思维受限所需的两项重要技能——批判性思维和推理。

批判性思维

早在第一章中,我简单提到了我在一些我工作过的地方参加了对潜在新员工的面试。我们会先问受访者一些基本问题,然后再问一些更难的问题,旨在探索他们知识的极限。我们考虑的大多数人都能相当容易地通过这一阶段的面试。

当我们开始问一些问题时,我们对许多潜在新员工产生了担忧,这些问题要求他们观察问题情况,并通过一系列步骤进行推理,使他们能够确定假设问题的原因。大多数人做不到这一点。他们解决问题的标准方法是重启计算机,而不做任何真正的问题分析。然后,他们通常的方法是在一个序列中使用一组特定的脚本动作,希望能够根据一组特定动作修复特定症状的概率来解决问题。从来没有人试图去理解为什么要采取具体行动的原因,或者找出问题的根源。

我称之为“症状-修复”方法。它基本上是一个脚本——一系列选择——可以在很少或根本不了解底层系统如何工作的情况下执行。当涉及限制性系统时,这是修复损坏的计算机和其他设备的常用方法。这是唯一真正有效的方法,因为限制性和封闭的系统不可能像开放系统那样真正为人所知,尤其是像 Linux 这样的操作系统。

那些能够通过我们为他们设置的麻烦场景进行推理的绝大多数人往往对 Unix 和 Linux 有丰富的经验。在我看来,这是因为 Unix 和 Linux 用户和系统管理员考虑解决问题的方式与那些使用限制性更强的操作系统的人不同。使用和管理 Unix 和 Linux 系统需要更高水平的推理技能。Unix 和 Linux 不受约束的特性也邀请我们学习和提高这些技能。凭借对功能强大的操作系统的深刻了解、对可用工具的透彻理解以及成熟的批判性思维技能, 4 Linux 系统管理员能够快速解决问题,并在选择和使用工具时拥有极大的自由度。

批判性思维是 Linux 和 Unix 系统管理员如此擅长我们工作的关键因素。它让我们能够观察问题的症状,确定什么是重要的,什么是不重要的,将这些症状与我们以前的经验或知识联系起来,并利用这些来确定问题的一个或多个可能的根本原因。

请不要误解我。有许多非常聪明的系统管理员使用 Windows 和其他封闭的专有操作系统。所有这些非常聪明的系统管理员也使用批判性思维和推理来解决问题。真正的问题是他们工作的系统的封闭性,这限制了他们可以利用的可能性。

解决问题的推理

另一项有助于系统管理员解决问题的技能是推理。 5 在我们的批判性思维使我们能够看待问题的症状之后,我们可以使用不同形式的推理来确定出现症状的一些可能的根本原因,以便确定下一步的步骤。

有四种被广泛认可的推理形式,我们系统管理员使用它们来帮助我们解决问题。我们使用归纳、演绎、溯因和综合推理 6 来引导我们得出结论,指出观察到的症状的一个或多个可能的原因。让我们简单看一下这些推理形式,看看它们是如何应用于问题解决的。

演绎推理

这是我们大多数人都知道的最常见的理性形式。它用于从大量更一般的观察中得出关于特定实例的结论,从而形成一般规则。例如,下面的三段论阐释了演绎推理——及其主要缺陷。

**一般规则:**电脑温度升高是由一个机械设备(风扇)故障引起的。

**观察实例:**我的电脑过热了。

**结论:**我电脑里的风扇坏了。

这种演绎推理多次成功地解决了过热问题。然而,结论完全取决于规则和当前观察的准确性。

考虑其他可能性。计算机房的环境温度可能非常高,导致计算机内部的温度更高。或者 CPU 上的散热片可能被灰尘堵塞,从而减少气流,从而降低冷却系统的效率。我也能想到其他可能的原因。

这个三段论和所有演绎推理一样,有一个巨大的谬误。为了使结论为真,规则和断言必须总是正确的。这种谬误并没有让使用这种类型的推理变得错误,但它确实告诉我们,我们确实需要小心。

归纳推理

归纳推理流向相反的方向。结论是从一些观察中得出的,有时只是一个观察。这个归纳推理的例子也显示了潜在的内在谬误。

**观察:**一个风扇的故障导致我的电脑过热。

**结论:**电脑总是因为风扇故障而过热。

实际上,从中可以得出更多同样糟糕的结论。一种是所有风扇故障都会导致电脑过热,这也是不正确的。另一个是所有电脑迷都失败了。还有一个原因是所有的电脑都会因为风扇故障而过热。

同样,我们必须小心我们得出的结论。在这种类型的归纳推理中,我们很可能会综合出一个一般规则,当我们把这个规则作为演绎三段论中的一个断言来应用时,这个规则会把我们引入歧途。

理性失败

演绎推理和归纳推理都包含着失败的种子,因为它们错误地假设所有的证据都是可用的,所有的断言都是正确的。这两种类型的推理都是僵化和不灵活的。演绎推理和演绎推理都不考虑可能性、概率、不完整的数据、不正确的断言、随机性、直觉或创造性。

让我们来探讨一下这个问题。首先,我声明在这个思维实验中,我们没有任何经验或训练来帮助我们确定问题的原因。

我的电脑过热了。我能感觉到箱子的顶部,它比我过去经历过的任何时候都要热。我关掉电脑,打开机箱后,我又把它打开了一会儿。我现在可以看到一个大型机箱风扇不旋转。

因为我没有理由认为故障的风扇是问题所在,所以我只是碰碰运气,换了一个新的可以正常工作的风扇。这解决了问题,计算机不再过热。

我用了一点归纳推理如下。

**观察:**我通过更换机箱风扇修复了一台过热的电脑。

**规则:**更换机箱风扇可以解决电脑过热问题。

我举了一个例子,并把它归纳成一条规则。现在我们来看另一个问题。在这种情况下,另一台计算机过热。下面是我的演绎逻辑。

**规则:**更换机箱风扇修复电脑过热问题。

**断言:**电脑过热。

**结论:**我应该换掉 case fan。

在这一点演绎逻辑中,我把我从过热的单一经验中创造的规则应用于计算机过热的第二个实例。我采用了一个通用规则,并将其应用于一个具体的实例。逻辑是正确的。逻辑上没有错误,但是更换机箱风扇并不能解决问题。为什么呢?因为在第二种情况下,电源过热,因为空气入口被环境中的灰尘堵塞。

这里的困难首先在于这样一个事实,即我们第一次过热经历所产生的规则是有缺陷的,因为它太笼统了。第二个问题是,基于这个单一的错误规则和这种推理形式强加的僵化,如果迫使我得出一个结论,那可能是问题的唯一可能原因,所以我停止寻找其他根本原因。这种逻辑导致我甚至懒得去检查风扇是否工作。

这一套僵化逻辑的另一个问题是,没有其他可能性的灵活性。我们的规则集太有限,无法解决这个问题。这就提出了一个问题:我们是否能有一个足够大的规则集来解决所有可能的问题,或者任何一个规则都可能足够复杂来解决任何时候的单一症状。你明白我的意思了吗?

溯因推理

溯因推理是第三种公认的推理形式,它更复杂,也更灵活。它允许不完全的信息和特定关系存在的概率。它还允许有时最好的方法是根据现有信息进行有根据的猜测。

溯因推理利用了所有可用的数据——我们的观察——并允许我们得出结论,指出所观察到的症状的一个或多个最可能的根本原因。无论我们是否掌握了所有的信息,溯因推理都会起作用。它允许我们根据手头的最佳信息得出结论。它允许灵活性,因为我们从以前的归纳推理中制定的任何规则,以及我们使用演绎推理从这些规则中得出的任何结论,都不是严格执行的。

有了溯因推理,我们不需要像归纳推理和演绎推理那样接受结论是唯一可能的结果。然后,我们可以自由地调整我们的规则,用新的数据重新开始我们的推理过程,也就是说,以前的推理是不正确的——,在这个例子中是。因此,我们现在拥有的推理自由是综合推理的基础。

综合原因

我相信系统管理员使用前面讨论的所有三种推理形式来解决问题。事实上,我们做得如此天衣无缝,以至于很难确定我们思维过程中代表三种公认推理形式之一的特定部分。事实上,这种类型的组合推理是成功的系统管理员所使用的,而不是单一的风格。这叫综合理性。

例如,我已经有了关于过热的规则,用来推断可能的原因。这个例子说明了灵活性和使用有限的信息来分析问题,并使用额外的测试来获得更多的数据。它还考虑到了归纳过程,这种过程可以向我们在演绎过程中使用的规则集添加更多的规则。也有可能忽略和抛弃明显不正确、过时或不再需要的规则。

综合推理对我来说感觉天衣无缝,也许对你来说也是如此。例如,当我在解决问题的过程中从演绎推理转换到溯因推理时,我几乎不知道我正在做这件事,而且几乎没有任何迹象表明我在做这件事。综合推理,有意或无意,有意识或无意识,帮助我避免“应该”的陷阱。不总是,但肯定是大部分时间。通过理解我自己的推理过程,我可以更容易地认识到我什么时候陷入了“应该”的陷阱,并且更容易地找到摆脱它的方法。对于我们过热的计算机,这可能意味着一个更像这样的推理过程。

电脑过热,我从以前的经验知道,至少有两种可能的原因。我检查了电脑,发现没有一个风扇出现故障,电源也没有过热。由于我已经知道的两个可能原因都不是当前问题的根源,我使用hddtemp命令和 touchy-feely 方法做了一些进一步的检查,这两种方法都显示了一个硬盘非常热的事实。

我可以更换硬盘,但我发现硬盘周围没有气流。进一步研究发现,有一个地方可以安装一个风扇,在硬盘上产生冷却气流。我安装了一个新风扇。然后我检查硬盘,它的温度现在低多了。

在这个实际问题的情况下,我不只是盲目地更换过热的组件。硬盘本身不是问题的原因,尽管可以观察到它非常热。缺少风扇来提供冷却气流也是一个原因,还有其他因素。首先,尽管风扇提供了足够的气流将驱动器冷却到正常水平,但我很好奇,所以我使用 System Activity Reporter–SAR 检查了它的使用模式。SAR 日志显示该驱动器一直处于频繁使用状态。使用htopglances进行的额外调查显示,/home 文件系统被一个名为 baloo 的程序频繁访问。

我的文件系统分布在两个物理硬盘上,但是最常用的两个/home 和/var 在同一个硬盘上。为了减少硬盘上的压力,我的第一步是安装一个新的硬盘来分散负载,并将最常用的/home 文件系统移到这个新的硬盘上。然后,我对 baloo 做了一些研究,它是一个文件索引器,是 KDE 桌面环境的一部分。我想出了如何关闭它,这将/home 中的磁盘活动减少到几乎为零,除了我自己的工作。

事实上,这种过热的单一症状有多种原因,我实施的所有修复都是适当的。根本原因是一个流氓程序在单个文件系统中产生大量活动。这导致了高水平的磁盘活动,从而使磁盘驱动器过热。由于没有冷却风扇,硬盘上的气流不足,这加剧了问题的严重性。

是的,这是一个真实的事件,并不罕见。遵循严格的逻辑形式永远不会把我们带到真正解决问题的地方,并减少问题再次发生的机会。溯因推理让我们既有逻辑又有创造力,并能跳出所谓的框框去思考。它还允许我们采取预防措施,以确保相同或相关的问题不再发生。

溯因推理允许我们从经验中学习。这不仅在事情进展顺利并且我们解决了问题的时候是正确的,尤其是在事情进展不顺利并且我们没有把事情做好的时候。

自我认知

当然,这些推理风格是人工结构,旨在使哲学家、心理学家、精神病学家和认知科学家拥有一个词汇和共同的结构参照,以讨论和探索我们如何思考。

这些纯粹人为的结构不应该被解释为对系统管理员应该如何工作的限制。它们仅仅是帮助我们了解自己和思考方式的工具。一点自省可以帮助我们在工作中做得更好。

寻找你的中心

作为一名瑜伽学生,当我开始(几乎)每天的练习时,无论是在我自己的小瑜伽室还是在课堂上,我做的第一件事就是找到我的中心。现在是时候做自己了,用我的思维去探索我存在的物质层面,同时敞开心扉去体验仅仅存在的体验。

根据我自己的经验,我认为这是探索我们作为系统管理员的思维和推理的一个极好的方法。这并不是说我使用这种技术来解决问题,而是探索我自己解决问题的方法。

很多时候,在解决了一个问题之后,尤其是一个新的或者特别困难的问题,我会花一些时间去思考这个问题。我从症状、我的思考过程以及这些症状把我引向何处开始。我会花时间思考是什么最终引导我找到了解决方案,哪些事情我本可以做得更好,哪些新东西我想学。

它给了我一个机会,作为一个个人,在我以前工作的地方进行我们过去称之为“经验教训”的会议。这是一个机会,看看我们作为一个团队做对了什么,我们可以做得更好。现在最棒也是最难的是,我没有其他人来帮助我理解我本可以做得更好。这使得尽可能多地做这件事对我来说更加重要。

没有必要为了做到这一点而练习瑜伽。只要留出一些时间,找一个你不会被打扰的空旷地方,闭上眼睛沉思。在回顾事件之前,深呼吸,放松,让你的心平静下来。从头开始,思考整个事件。回顾事件的完整顺序和您用来最终找到解决方案的步骤。你需要知道和学习的事情会让你明白的。我发现这种形式的自我评估非常有效。

我也喜欢在开始处理一个新问题之前花点时间让自己集中注意力。这让我对各种可能性敞开了心扉。首先是代表问题可能原因的可能性。然后是代表我必须找到问题原因的方法和工具的可能性。最后,这些可能性代表了解决问题的方法。

多样性的含义

作为个体,我们的推理过程是复杂多样的。我们每个人都有不同的经历,这些经历构成了我们在推理中使用的结构和过程的基础。由于这些差异,我们中没有两个人会以相同的方式解决问题。

我不可能要求比我为 Opensource.com 创建的命令行挑战更好的说明这个特殊的原则,“没有应该”,我们在第 4 “转换数据流”中探索过思想、创造力和解决问题的方法的多样性令人难以置信,其范围令人震惊,其影响令人振奋。

挑战的结果说明了将一些小的、普通的实用程序组合起来产生正确结果的各种方法。在使用 Linux 时,这是需要记住的重要一点。有多少系统管理员、开发人员、开发人员等等,就有多少解决问题的正确方法。重要的是结果。

测量狂热

技术由两类人主导:一类人了解他们不管理的东西,另一类人管理他们不了解的东西。

—archibald putt, Linux Journal

我仍然听到 PHB 谈论 KLOCs、 7 击键、错误计数和其他类型的数字测量,这些数字测量被设计为低级别 PHB 用来向高级 PHB 报告结果,并且旨在表明正在取得进展。这些量化开发人员和系统管理员执行的工作的质量和数量的尝试完全没有抓住要点,并且可能导致开发人员的代码膨胀。如果你付我钱,让我每天写 X 行代码,我会写,不管它们是否是执行程序设计的任务所需要的。

对于系统管理员来说,这种尝试性的量化只能解决症状,而不能解决问题的根本原因。在特定时间段内获取和解决的票据数量是一种极其无知的绩效衡量方式。生产率测量概念基于时间和运动研究 8 实践,由泰勒、吉尔布雷斯和吉尔布雷斯在 19 世纪中期开发,并在当时的实业家管理中流行开来。维基百科有一篇关于时间和运动的简短但有趣的文章。 9

像这样使用超过 150 年历史的度量策略,贬低了系统管理员和开发人员所做的工作。他们关注错误的事情。他们以一种 PHB 可以理解的方式创造了应该包含我们的界限,PHB 不知道如何与我们打交道。

在这本书里,我们已经看到了懒惰的系统管理员。衡量一个有思想的头脑的生产力是不可能的。我希望这样的事情永远不会成为可能。然而,系统管理员思维的结果可以根据从该思考得出的结论所实现的生产率来间接测量。例如,每一个新的脚本——在我们深思熟虑的状态下构思的脚本,每一种安装和管理计算机及其操作系统的新的和改进的方法,以及每一种为寻找更好的方法而分析的故障模式,都提高了整体生产力,并减少了将来系统管理员和其他人干预的需要。这使得系统管理员有更多的时间进行无拘无束的思考。

在本书中,我一直以贬损的方式谈论 PHB。多亏了《呆伯特》连环漫画,PHB 现在成了真正糟糕的经理的同义词。我遇到过一些这样的经理,他们对优秀的团队和有创造力的成功的系统管理员来说是毁灭性的。我见过许多优秀的系统管理员因为有毒的管理者而离开组织。

好经理

尽管现实世界中有许多博士,但也有许多真正优秀的经理,我很幸运在我的职业生涯中有一些这样的人。优秀的员工——那些了解技术并知道如何管理直接与技术打交道的员工的员工——通常是少数从普通员工中脱颖而出的人。他们在以前的工作中是 CEs,开发人员,系统管理员,测试人员,甚至是黑客。

这些令人惊叹的经理知道,与我们这些正在工作的人打交道的最佳方式是问一些有见识的问题,以了解情况,然后让我们解决任何问题,同时尽可能让更高级别的经理和 PHB 了解情况。他们明白,没有持续的微观管理,我们工作得最好,做必要事情的自由是这种管理者的标志。

一起工作

现在我已经让你相信了“没有应该”并且用你自己的方式去做每一件事是很好的,这给我们留下了一个问题。我们这些完全不同的系统管理员如何在团队中一起工作?

团队?!什么团队?我们不需要讨厌的团队。

事实上,我们确实需要团队,我们确实需要在这些团队中一起工作。我们有一些优秀的团队例子,以及他们在几乎所有开源软件中的成果。

由来自世界各地的开发人员组成的团队一起工作,生产我们都使用和欣赏的开源软件。一些团队成员可能有报酬,但大多数没有,他们自愿付出时间和精力来编写代码。其他志愿者扮演系统管理员的角色,帮助开发系统保持正常运行。其他人测试生成的代码,还有一些人开发文档。

团队在地理上是多样化的,因为组成团队的个人在工作方式上是独一无二的。这种人才的地理分散给团队工作带来了一些有趣而重要的限制。

2012 年,Ryan Tomayko 根据他作为 GitHub 早期员工的经历写了一篇博文。这篇文章的标题是,“你的团队应该像一个开源项目一样工作”,这篇文章的前提是,地理上兼容并能在同一办公空间工作的团队,如果地理上对广泛分散的开源团队施加的通信和人际互动的约束类型相同,将会工作得更好。根据 Tomayko 的说法,“……为符合开源约束而设计的过程会产生一个运行良好的项目,吸引人们的注意,并且似乎会自我延续,而同样的项目结构更传统地需要更多的手动协调和权威激励……[它]创造了在没有协调的情况下合作的可能性。…"

我强烈建议你看一下 Tomayko 的帖子。它有一些有趣的事情要思考。他列举了一些限制因素,并表示办公室作为一个工作空间正在减少,将主要用作专门为移动工作者设计的空间,提供在像你最喜欢的咖啡馆这样的地方工作所需的相同服务。

作为系统管理员,我们经常被要求跨时区工作,并与我们只通过电子交互认识的团队成员一起工作。我自己的经验与 Tomayko 的一致,并表明这比每个人都是本地人并应用传统的所谓管理更有效。显然,大多数开放源码项目都是这种成功的极好例子。

筒仓城

我在一个组织工作了大约一年,这是传统团队方法走向极端失败的一个极好的例子。最糟糕的是,这也是一个可怕的日常通勤。

在这个组织中,管理层创造了非常窄、非常高的筒仓来容纳一切。有多个团队,Unix 团队、应用团队、网络团队、硬件团队、DNS 团队、机架团队、电缆团队、电源团队——几乎是你能想到的任何团队。

手术过程令人难以置信。例如,我的一个项目是在几台服务器上安装 Linux,这些服务器将用于组织网站的各个方面。第一步是订购服务器,但这一请求需要几周时间才能通过行政官僚程序。

服务器交付后,Unix 团队会将它们安装在安装实验室中,并安装操作系统。我们很好地完成了那部分。但是首先我们必须请求一个 IP 地址。在我们交付服务器之前,我们不能这样做,因为请求 IP 地址需要服务器的序列号和网卡的 MAC 地址。

这里的问题是,每个孤岛必须与其他所有孤岛签订服务级别协议(SLA ),并且 SAL 定义的响应时间至少为两周。并且每个筒仓花费的响应时间不低于 SLA 中指定的时间。

但是,在服务器机房中分配了机架位置之前,我们无法获得 IP 地址,因为 IP 地址是按机架和机架中的位置分配的。因此,我们必须发送一个机架分配请求,并等待两周才能提供。

因此,获取 IP 地址后的下一步是将其发送到处理 DHCP 配置的思洛存储器。然后,在获得 IP 地址至少两周后,我们必须等待 DHCP 设置完成。

只有在 DHCP 服务器上配置了服务器的网络配置数据后,才能发送将服务器从我们的机架移动到服务器机房的请求。又是两周的转机。

在移动请求获得批准后,我们才可以发送将计算机安装到机架上的请求。安装完成后,我们可以发送请求,为服务器连接网络和电源。只有当这一步完成后,我们才能向服务器发送加电请求。

除了安装操作系统,我们碰不到服务器。我们甚至不被允许进入服务器机房。永远不会。

不用说,安装每台服务器、让它运行并为生产团队接管做好准备需要几个月的时间。我还可以举出更多的例子来说明这个地方是一场功能性灾难,但我想你已经明白了。他们所谓的团队只是政治领地,被密不透风的筒仓保护着。

简单的方法

我和布鲁斯在思科的经历要好得多。在下一章你会学到更多关于布鲁斯的知识。他和我设计了一个非常棒的系统。

服务器通常在我们订购后不到一周就送到了。布鲁斯和我会在早上将其中的四个装上机架,分配 IP 地址,配置它们所连接的交换机,将它们添加到 DNS 和 DHCP 服务器上,并在其上安装 Linux。下午我们会再做四个。

不同之处在于所有的团队都在一起工作。处理网络寻址和配置的团队已经编写了脚本(自动化所有工作),并给予我们访问权限,以便我们可以使用这些脚本来完成 DHCP 和 DNS 的所有网络配置。我编写的脚本用于执行 Linux 安装。

BRuce 和我完全负责机架和其中与启动和运行服务器有关的一切。他和我作为一个团队工作得很好,因为我们每天都花一点时间来确定需要做什么,并决定我们中的哪些人将承担我们需要完成的各种任务。这不是一次会议;这一点也不正式。没有人根据某种武断的标准给我们分配任务。布鲁斯和我都是个性很强的系统管理员。当我们独自做自己的工作时,我们做得又快又轻松。我们只是在我们之间分配任务,因为我们都觉得合适,然后开始做我们的事情。很多时候,我们需要本地和远程的其他系统管理员的帮助,我们只是继续进行我们的小晨会讨论来决定一天的工作,根据我们的人数,在三到四个人之间分配。我们与其他团队合作得很好,通常会在服务器交付到实验室的当天晚些时候将它们移交给开发人员或测试人员。

管理层在这一方法上给予了合作。我们只是被告知,一个新项目正在启动,或者需要对现有项目进行更改。我们将与项目负责人协商,确定他们的需求和目标。正如你将在下一章中看到的,有时 BRuce 和我不得不努力获取我们需要的信息,但是一旦我们得到了信息,我们就很少或根本没有管理层的干预或监督来处理剩下的事情。

思想

我们中那些在 Unix 和 Linux 系统管理方面取得成功的人天生就好奇和善于思考。我们抓住一切机会扩大我们的知识基础。

出于好奇和“因为它就在那里”,我们喜欢尝试新知识、新硬件和新软件当电脑坏掉时,我们享受着向我们敞开的机会。每一个问题都是学习的新可能。我们喜欢参加技术会议,因为可以接触到其他系统管理员,也因为我们可以从预定的演示中收集到大量的新信息。

僵化的逻辑和规则没有给我们系统管理员足够的灵活性来有效地执行我们的工作。我们并不特别关心事情“应该”怎么做。系统管理员不容易被别人试图约束我们的“应该”所限制。我们使用灵活的逻辑和批判性思维,并产生出色的结果。我们用独立的、批判性的思维和综合的推理创造自己的做事方式,这使我们在做的时候能够学到更多。

我们系统管理员是个性很强的人——为了做好自己的工作,尤其是以“正确”的方式做事,我们需要这样。这不是关于我们“应该”如何执行我们需要做的任务,而是关于使用最佳实践并确保最终结果符合那些实践。

我们不只是跳出框框思考。我们是破坏别人试图让我们在里面工作的盒子的人。对我们来说,没有“应该”

维基百科,语义https://en.wikipedia.org/wiki/Semantics

2

我没有得出任何结论的科学依据,但我当然可以根据我的观察进行推理。

3

N Sumarna、Wahyudin 和 T Herman,通过数学调查方法增加批判性思维技能,《物理学杂志:会议系列》,第 812 卷,第 1 期,第 012067 篇, http://iopscience.iop.org/article/10.1088/1742-6596/812/1/012067/meta

4

网站需要的技能,批判性思维技能https://www.skillsyouneed.com/learn/critical-thinking.html

5

维基百科,原因https://en.wikipedia.org/wiki/Reason

6

孤山学院,*演绎,归纳,*溯因推理, http://www.butte.edu/departments/cas/tipsheets/thinking/reasoning.html

7

KLOC 是“千(K)行代码”的首字母缩写,IT 经理使用它来衡量绩效。

8

时间和运动研究。BusinessDictionary.com。网络金融公司 http://www.businessdictionary.com/definition/time-and-motion-study.html (访问时间:2018 年 04 月 01 日)。

9

维基百科,时间与运动研究, https://en.wikipedia.org/wiki/Time_and_motion_study

10

托迈科、瑞安、你们的团队应该像开源项目一样工作https://tomayko.com/blog/2012/adopt-an-open-source-process-constraints

二十四、指导年轻的系统管理员

这些年来,我参加了许多培训课程,大多数课程都非常有用,帮助我了解了更多关于 Unix 和 Linux 以及许多其他主题的知识。但是培训——尽管有用和重要——不能涵盖履行系统管理员职责的许多基本方面。

我参加的所有课程都是几天,通常是四五天。关于命令、过程、文件系统、进程以及本书中提到的许多东西,信息太多了,无法涵盖您需要了解的一切。并不是所有的东西都可以在教室里教授。有些事情只能在现实世界的环境中由一个好的导师来教授,通常是在你处于极端压力下解决一个关键问题的时候。

没有什么比让 PHB 或一个或多个奴才在你身后监视并批评你的每一个举动和决定更好的了。它发生了。这些提供每小时进度报告的压力,回答诸如“什么时候能修好”等愚蠢问题的压力,抵制 PHB 试图在一个人的任务上增加三个人的压力,等等,不仅浪费了我们的时间,还打断了我们的思路,降低了我们的整体效率。大多数时候我们知道该做什么和怎么做,我们只是需要一个能让我们相对平静地工作的环境。

一个好的导师会让你在这些情况下做实际的工作,这样你就可以有一个有价值的学习经历,同时避免陷入困境,在不受干扰的情况下承受压力。一个伟大的导师也能够在任何情况下创造学习的机会,不管情况有多危急。

刚开始的时候,我是一个年轻天真的系统管理员。我很幸运,因为我做过几份不同的工作,其他经验丰富的系统管理员愿意指导我,鼓励我。当我问在他们看来答案显而易见的问题时,他们没有一个人嘲笑我。这些耐心的系统管理员从来没有告诉我 RTFM。

雇佣合适的人

指导合适的人从来都不简单也不容易;指导错误的人是不可能的。考虑到这一点,让我们来看看如何雇用合适的人。

作为一名系统管理员,特别是如果你是一名高级系统管理员,你的部分工作应该是帮助你的团队雇佣合适的人。如果你的 PHB 让你在招聘过程中孤立无援,你应该尽你所能改变这种情况。幸运的是,在我的大部分工作生涯中,这很少成为问题。聪明的经理会让整个团队参与招聘新成员。

我经历过的最好、最愉快的面试之一是我申请思科公司的测试员和兼职实验室系统管理员的工作。我和经理呆了一会儿,然后部门里的其他人跟了我大约五个小时。他们三三两两地来了,问了我各种各样的问题。每个小组给我一些假设的情况来解决,他们问我一些技术性的问题,并且测试我的耐心。实际上,我在那次面试中很开心,因为每个面试我的人都是他们被雇佣来做的工作的合适人选。我确实得到了那份工作。我不是什么都知道。我确实告诉了面试官那个事实,当它是真实的时候。

有许多方法可以用来雇佣合适的人,但没有万无一失的方法。然而,我发现,合适的面试官和合适的问题对实现这一点大有帮助。

正如我之前提到的,很多面试系统管理员类职位的人都没有准备好,因为他们不知道如何解决问题。有时候,直到你雇佣了这个人,你才能知道这一点,而且在那个时候很难“解雇”他们。我工作过的一个地方采用了动手测试。我们的测试很简单。我们设置了一个 Linux 主机,其中有三个具体但相当简单的问题,申请人必须在指定的时间内解决。

虽然这个测试是关于发现和解决问题,我们也看了申请人完成任务的方式。那些惊慌失措或或多或少随机前进、漫无目的地挣扎的人很快就被我们排除在外了。即使他们没有解决所有的问题,那些带着某种目的感,带着成熟的问题解决算法前进的人,是我们认为最有可能在我们现有的工作中取得成功的人。我们可以轻松地教授技术,但我们不容易教授解决问题的技巧和禅。

测试可能存在法律问题,但是,如果测试真正代表了申请人将要从事的工作类型,并且所有申请人都需要参加测试,那么(请咨询您的律师)应该可以使用测试。

指导

一个人如何指导一个年轻的系统管理员?银河系中有多少颗恒星?每个系统管理员都有自己的指导方式,每个年轻的系统管理员都需要不同的知识和不同的方法。

当我有一个优秀的老师时,学习起来更容易,但我发现,当我喜欢一门学科并对它感兴趣时,我的老师的质量几乎没有影响。最好的导师允许甚至鼓励我追随自己的好奇心。即使我没有完成目标,他们也会在我尝试的时候奖励我。

然而,一个真正糟糕的老师不仅可以摧毁学习的欲望,还可以摧毁学习的能力。一个非技术性的例子是我的高中英语文学老师。很明显,她真的很喜欢我们应该学习的书籍、故事、诗歌和其他文学作品。不幸是,她不知道如何教学,也不知道如何将对这门学科的热爱传递给我们这些学生。除了别的以外,我们还学习了莎士比亚,我简直烦透了。

第二年夏天,因为我参加了一些学校的戏剧演出,戏剧老师喜欢我的作品,她把我推荐给爱尔兰山剧院的一名招聘人员,这是一个在密歇根州南部演出莎士比亚剧目的夏季剧团。哇哦!莎士比亚的整个夏天?是的,我很喜欢。那年夏天,作为一名学徒,我对莎士比亚的了解比我在课堂环境中学到的更多,就像我在文学课上遇到的老师一样。

那个夏天,我有几个很好的导师。他们为我们所有人举办了培训班。他们帮助我们学习材料的意义以及表演的技巧。对我来说,理解是最有帮助的。我认为理解是导师可以帮助的最重要的事情之一。死记硬背不是关键——理解、批判性思维和解决问题的技能是我的技术导师赋予我的最重要的东西。

导师布鲁斯

我很幸运有许多非常优秀和耐心的导师,他们允许我失败,以便我可以学习。特别是有一个人,布鲁斯,因为他喜欢在他的电子邮件上签名,所以他确保我接受了必要的培训,但他也允许我很快地运用这些培训。他马上给我分配了困难的任务,这些任务迫使我运用新获得的知识,突破自我舒适和自我限制的界限。

布鲁斯和我在两家不同的公司共事多年,这两家公司都需要深厚的 Unix/Linux 知识和技能。我们合作得很好,因为我们都非常擅长我们所做的事情。他理解我开始时的技能水平不如他,但他尊重我所拥有的技能,并给我很多机会去使用这些技能和学习新的技能。

从很多方面来说,BRuce 都是典型的坏脾气系统管理员——这是有充分理由的。我这么说的意思是,当与技术含量较低的人打交道时,如营销人员和 PHB,关于他们想在我们负责的实验室中做的事情,他的第一反应几乎总是一个干脆、明确的“不”。这总是因为项目,无论是什么,都会在实验室中引起问题,因为它们最初是构想出来的,因为它们都没有经过深思熟虑,没有什么可以做,什么不可以做的概念。然后,布鲁斯问了提出请求的人一系列问题,最终让我们知道他们真正想做什么。似乎提出这些请求的大多数人也在尝试设计支持这些项目的基础设施,而这是我们的专业领域,不是他们的。他们也没有很好地考虑他们的项目会如何影响其他使用实验室测试他们项目的人。

布鲁斯并不像有些人想的那样是个混蛋。他在做他的工作,那就是确保实验室对每个使用它的人来说都是完全正常的。我们收到的大多数初始请求都有明显的缺陷。我们有责任确保这些缺陷不会影响实验室的其他部分。BRuce 非常直率,因为我们没有时间处理其他人引起的问题,当时只有我们两个人在实验室中处理超过 15 排 24 个机架,所有这些机架都装满了运行测试的设备,如果有人的实验失控,实验室网络将不得不重新启动。

在那种环境中,不能容忍任何错误。布鲁斯和我只是在执行旨在保护所有用户的实验室准则。作为我的导师,这也是布鲁斯试图帮助我理解的事情——这是一个多数人的利益压倒少数人的利益的时候。实验室的运行方式必须防止一些用户干扰其他用户的工作。

解决问题的艺术

我的导师帮助我做的最好的事情之一是制定一个明确的过程,我可以用它来解决几乎任何类型的问题。在我看来,它与科学方法密切相关。

在我为这本书做研究的过程中,我发现了一篇名为“科学方法是如何工作的”的短文,它用一张图表描述了科学方法,这张图表与我为解决问题的五个步骤创建的图表非常相似。因此,作为一名导师,我将此传递给你们,这是我对所有年轻系统管理员的贡献。我希望你和我一样觉得它很有用。

解决任何类型的问题都是艺术、科学,有些人会说,或许还有一点魔法。解决技术问题,如计算机出现的问题,也需要大量的专业知识。

解决任何性质问题的任何方法——包括 Linux 问题——必须不仅仅包括症状列表以及修复或规避导致症状的问题的必要步骤。这种所谓的“症状修复”方法在理论上对管理者来说很好,但在实践中却很糟糕。解决问题的最好方法是拥有大量的相关知识和强大的方法论。

解决问题的五个步骤

问题解决过程涉及五个基本步骤,如图 24-1 所示。这种算法与脚注 1 中提到的科学方法非常相似,但专门用于解决技术问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 24-1

解决问题的五个步骤与科学方法非常相似

当您对某个问题进行故障诊断时,您可能已经遵循了这些步骤,但您甚至没有意识到这一点。这些步骤是通用的,适用于解决几乎任何类型的问题,而不仅仅是计算机或 Linux 的问题。多年来,我在各种问题中使用这些步骤,却没有意识到这一点。为我整理它们让我在解决问题时更加有效,因为当我陷入困境时,我可以回顾我采取的步骤,验证我在过程中的位置,并在任何适当的步骤重新开始。

在过去,你可能听过几个用于解决问题的其他术语。这个过程的前三个步骤也称为问题确定,即找到问题的根本原因。最后两步是问题解决,实际上就是修复问题。

接下来的部分将更详细地介绍这五个步骤。

知识

了解你试图解决问题的主题是第一步。我看到的所有关于科学方法的文章似乎都把这作为一个先决条件。然而,知识的获取是一个持续的过程,由好奇心驱动,并通过使用科学方法探索和通过实验扩展现有知识而获得的知识来增强。这是我在本书中使用术语“实验”而不是“实验室项目”的原因之一。

您必须至少了解 Linux,甚至更多,您必须了解能够与 Linux 交互并影响 Linux 的其他因素,例如硬件、网络,甚至环境因素,例如温度、湿度和 Linux 系统运行的电气环境如何影响它。

通过阅读关于 Linux 和其他主题的书籍和网站可以获得知识。你可以参加课程、研讨会和会议。你也可以在一个网络环境中,通过与其他有知识的人交流,设置一些 Linux 计算机。当你解决一个问题并发现一个特定类型问题的新原因时,你就获得了知识。当试图解决问题导致暂时失败时,您也可以找到新的知识。

课堂在为我们提供新知识方面也很有价值。我个人的偏好是玩——呃,尝试 Linux 或者某个特定的东西,比如网络、名称服务、DHCP、Chrony 等等,然后上一两堂课来帮助我将学到的知识内化。

记住,“没有知识,抵抗是徒劳的,”套用博格人的话。知识就是力量。

观察

解决问题的第二步是观察问题的症状。记下所有的问题症状非常重要。观察什么在正常工作也很重要。现在不是试图解决问题的时候;只是观察。

观察的另一个重要部分是问自己关于你看到什么和没有看到什么的问题。除了你需要问的特定问题之外,还有一些一般性的问题。

  • 这个问题是由硬件、Linux、应用软件引起的,还是由于缺乏用户知识或培训引起的?

  • 这个问题和我见过的其他问题类似吗?

  • 是否有错误信息?

  • 是否有与该问题相关的日志条目?

  • 错误发生前,计算机上发生了什么?

  • 如果错误没有发生,我期望会发生什么?

  • 最近系统硬件或软件有什么变化吗?

当你努力回答这些问题的时候,其他的问题也会显露出来。这里要记住的重要事情不是具体的问题,而是尽可能多地收集信息。这增加了您对这个特定问题实例的了解,有助于找到解决方案。

当你收集数据时,永远不要假设从别人那里获得的信息是正确的。自己观察一切。如果你和一个在远处的人一起工作,这可能是一个大问题。仔细询问至关重要,当试图确认提供给您的信息时,允许远程访问相关系统的工具非常有用。当在远处询问一个人时,不要问引导性的问题;他们会尽力帮助你,用他们认为你想听的话来回答。

在其他时候,你得到的答案将取决于这个人对 Linux 和一般计算机知识的多少。当一个人知道——或者认为他们知道——计算机时,你得到的答案可能包含难以反驳的假设。而不是问。“你检查了吗……”最好让对方实际执行检查物品所需的任务。与其告诉用户他们应该看到什么,不如让用户向你解释或描述他们看到了什么。同样,远程访问机器可以让您确认提供给您的信息。

最好的问题解决者是那些从不认为任何事情是理所当然的人。他们从不认为他们拥有的信息是 100%准确或完整的。当你所掌握的信息似乎与症状本身相矛盾时,从头开始,就好像你什么信息都没有一样。

在我从事的几乎所有计算机行业的工作中,我们总是试图互相帮助,我在 IBM 的时候也是如此。我一直非常擅长解决问题,有时当另一个客户很难找到问题的根源时,我会出现在客户面前。我要做的第一件事是评估形势。我会问基层行政长官,他们至今已采取了甚么措施去找出问题所在。之后我会从头开始。我一直想亲眼看看结果。很多时候这样做是有回报的,因为我会观察到一些其他人没有注意到的东西。在一次非常奇怪的事件中,我坐在一台大型电脑上修理它。

坐下来工作

这发生在大约 1976 年,当时我还是俄亥俄州利马的一名 IBM CE。我们中的两个人正在安装一台 IBM System 3,它比 IBM 大型机小,比如 360 或 370,但仍然足够大,需要一个自己的房间、高压电源和大量的空气冷却。

当我们遇到问题时,我们已经组装了主 CPU,并开始连接 IBM 1403 行式打印机控制器。打印机控制器安装在 CPU 左侧稍低于桌面高度的位置。那个漂亮的大工作台面的高度正好适合坐着。

我们刚刚把打印机控制器用螺栓固定在 CPU 的框架上,正在做安装说明中的众多检查之一。我们将欧姆表的引线连接在 CPU 的框架和打印机控制器电源的特定端子之间。结果应该是开路,即无穷大电阻,这将表明电源的热引线没有短接到框架。在这种情况下,有一个短-零电阻-这是不好的。不会像你在电视上看到的那样出现壮观的噪音和焰火,但这会是一个问题,因为它会阻止计算机启动。最好在它还在组装的时候就抓住它,而不是以后。

经过一个小时的努力寻找问题,我们无法这样做。我们致电佛罗里达州 Boca Raton 的 System/3 支持中心,并在他们的指导下完成了几个不成功的进一步问题确定步骤。

有点沮丧,我坐在打印机控制单元上。我用眼角的余光看到欧姆表上的指针摆动,表示开路。我向另一位 CE 和 Boca Raton 的 Vern 提到了这一点,后来当我作为课程开发代表(CSR)去那里工作几年时,他成了我的导师之一。

我们从控制器上取下了我曾栖息过的顶盖,幸运的是,我们发现将顶盖固定在打印机控制器框架上的一个螺栓松了,掉进了电源中,导致了短路。当我坐在控制器的顶部时,框架移动了足够的距离,导致螺栓不再接触,从而产生短路。从电源上取下那个松动的螺栓就解决了这个问题。

当时负责 System/3 支持的 Vern 对说明做了一些修改,以覆盖这个问题,以防再次发生。他还与制造人员合作确保这种情况不会再次发生,进行检查以确保螺栓在制造过程中正确拧紧。

要记住的事情是真正观察系统的所有部分发生了什么。注意一切,不要忽略丝毫线索。有时,观察 top 或用于监控内核或网络内部功能的其他实用程序可以提供一些线索,让我们朝着正确的方向开始。

有时需要一点运气,比如坐在打印机控制单元上。

论证

运用推理技巧从你对症状的观察和你的知识中获取信息,以确定问题的可能原因。我们在第二十三章中详细讨论了不同类型的推理。通过你对问题的观察、你的知识和你过去的经验进行推理的过程是艺术和科学相结合产生灵感、直觉或其他一些神秘的心理过程,这些过程提供了对问题根源的一些洞察力。

在某些情况下,这是一个相当容易的过程。您可以看到一个错误代码,并从可用的资源中查找其含义。或者你观察到一个熟悉的症状,你知道该采取什么措施来解决它。然后,您可以应用您通过阅读 Linux、本书和 Linux 提供的文档所获得的大量知识来推断问题的原因。

在其他情况下,这可能是问题确定过程中非常困难和漫长的一部分。这些是最困难的案件类型。也许是你从未见过的症状,或者是你用过的任何方法都无法解决的问题。正是这些困难的问题需要更多的工作,尤其是更多的推理。

记住症状不是问题是有帮助的。问题导致了症状。你想解决真正的问题,而不仅仅是症状。

行动

现在是执行适当的修复操作的时候了。这通常是简单的部分。困难的部分是之前发生的事情——弄清楚该做什么。知道问题的原因后,就很容易确定要采取的正确修复措施。

您采取的具体措施将取决于问题的原因。请记住,我们正在修复根本原因,而不仅仅是试图摆脱或掩盖症状。

一次只做一个改变。如果可以采取多种措施来纠正问题的原因,那么只进行一种改变或采取最有可能解决根本原因的一种措施。选择最有可能解决问题的纠正措施是您在这里要做的事情。无论是你自己的经验告诉你该采取什么行动,还是其他人的经验,从最高到最低优先顺序,一次一个行动。每次行动后测试结果。

试验

在采取一些公开的修复措施后,应该对修复进行测试。这通常意味着首先执行失败的任务,但也可能是说明问题的一个简单的命令。

我们在第十一章讨论了测试以及为 shell 脚本编写代码,这里的过程是一样的。我们做一个单一的改变,采取一个潜在的纠正措施,然后测试该措施的结果。这是我们可以确定哪个纠正措施解决了问题的唯一方法。如果我们要做几个纠正措施,然后测试一次,没有办法知道哪个措施负责修复问题。如果我们想在找到解决方案后退回那些无效的改变,这一点尤其重要。

如果修复操作不成功,您应该重新开始该过程。如果你可以采取额外的纠正措施,回到那个步骤,继续这样做,直到你用尽了所有的可能性,或者确信你已经走上了错误的道路。

测试时一定要检查原来观察到的症状。它们可能由于您采取的行动而发生了变化,您需要意识到这一点,以便在流程的下一次迭代中做出明智的决策。即使问题没有得到解决,症状的改变对于决定如何继续进行也是非常有价值的。

例子

我自己解决问题的一个例子发生在我作为一名兼职 Linux 系统管理员的时候。它相当简单,但对于说明我所概述的步骤的流程非常有用。

我收到了一封来自我们一位测试人员的电子邮件,指出他在测试中安装的一个应用崩溃了。它给出了错误消息,表明交换空间不足。这是用户执行的初始观察并传送给我。

我的知识告诉我,用于测试这个应用的系统有 16GB 的 RAM 和 2GB 的交换空间。以前的经验**(知识)**告诉我,这些计算机中的交换空间几乎从未使用过,RAM 使用率通常远远低于这些机箱中 16GB RAM 的 25%。

在这一点上,我推断这个问题实际上不是交换空间的问题,因为这看起来不太可能。我仍然保留着这种可能性,尽管可能性很小。你会发现程序提供的许多错误信息可能会误导人,用户的观察甚至会更误导人。

我做了一些自己的观察。我登录到机器上,使用 free 命令作为查看内存和交换空间的工具。我可以观察到有很多空闲内存,交换空间使用率为零。我知道如果交换空间的使用实际上为零,那么很可能没有可用的交换空间被分配,并且自上次引导以来没有发生分页。

我还从以前的经验**(知识)**中推理出在那个错误信息中可能有真理的内核。也就是说,它很可能是出于某种资源或其他。其他主要消耗资源是 CPU 周期和磁盘空间。

这似乎不是 CPU 问题,所以我使用 df 命令观察了磁盘空间,这表明/var 文件系统已满。我推断文件系统已满是问题的原因。对/var 的一点探索表明,测试人员的软件确实位于那里,并且已经填满了文件系统。

所有系统都是以 1.5GB 的/var 文件系统启动的。策略是将应用安装在/opt 中,这是我们要测试的应用的设计安装位置,它被配置为占用所有剩余的磁盘空间,因此大小很容易达到 100GB 或更大,对于任何被测试的应用来说都绰绰有余。

我与测试人员讨论了这个问题,并被告知他确实在/var 中安装了应用。我告诉他从那里卸载新程序,并在/opt 中安装应用。在采取这个行动之后,我让他通过执行之前失败的操作来测试纠正行动。测试成功,问题得以解决。

循环

当你解决一个问题时,至少有必要重复一些步骤。例如,如果执行给定的纠正措施不能解决问题,您可能需要尝试另一种已知的措施来解决问题。图 24-1 显示你可能需要重复到任何先前的步骤才能继续。

可能有必要返回到观察步骤,收集有关问题的更多信息。我还发现,有时回到知识阶段,收集更多的基础知识是个好主意。后者包括阅读或重读手册,手册页,使用谷歌,任何必要的获取知识的方法,以继续越过我受阻的地方。

灵活一点,如果没有其他方法可以产生一些进步,不要犹豫退一步重新开始。

结束语

在这一章中,我们看到了一种解决问题的方法,这种方法适用于许多非技术性的东西,也适用于计算机硬件和软件。我们在这里讨论的是如何在一个算法的框架内使用特定的推理方法来解决问题。这种特殊组合的灵活性非常强大。

我不是告诉你你应该使用这种方法。然而,如果你全力以赴,分析你自己解决问题的方法,你很可能会发现它已经非常接近我在这里描述的算法了。作为一名导师,我建议你花时间分析你自己的方法。我想你会发现这是一次富有成效的时间利用,会很有启发性。

我也恳求你去指导别人。传递知识、技能和你自己的哲学。对于有经验的系统管理员来说,没有什么比这更重要的了。我们的技能是惊人的,我们并不是靠自己取得的。我们很了不起,因为那些指导我们的人,他们认为我们具备成为伟大的系统管理员的素质。我们有责任将这一点传递给年轻的系统管理员。

最后,我有一些了不起的导师,他们知道学习——真正的学习——需要什么,并允许我这样做。你们都给了我从失败中学习的机会。你帮我找到了问题所在,让我重回正轨。你们是我的英雄。敬你,李斯琦,布鲁斯,弗恩,丹,克里斯,希瑟,罗恩,唐,戴夫,厄尔和帕姆。对于你们这些默默无闻的导师,你们真棒!感谢您的支持和指导。

哈里斯,威廉,科学方法如何运作, https://science.howstuffworks.com/innovation/scientific-experiments/scientific-method6.htm

二十五、支持你最喜欢的开源项目

Linux 和我们在其上运行的大部分程序都是开源程序。许多较大的项目,如内核本身,是由专门为此目的而建立的基金会(如 Linux 基金会)和/或对此感兴趣的公司和其他组织直接支持的。

作为一名系统管理员,我写了很多脚本,我喜欢这样做,但我不是一名应用程序员。我也不想成为系统管理员,因为我喜欢系统管理员的工作,这允许不同类型的编程。因此,在很大程度上,为开源项目贡献代码对我来说不是一个好的选择。还有其他贡献的方式,我使用这些选项。本章将帮助你探索一些你可以做出贡献的方式。

项目选择

在我们讨论我们为开源项目做贡献的不同方式之前,我们将看看如何选择我们想要贡献的项目。这可能看起来令人生畏,因为许多项目需要这样或那样的支持。

我主要考虑的是我是否使用项目生产的软件或硬件。比如我每天都用 LibreOffice。我依赖它,并发现它对我的工作效率非常有用。所以我支持的一个项目是 LibreOffice。

我也支持高层次的组织,那些监督开源的某些方面的组织,比如 Linux 基金会,它支持并鼓励开源软件的使用,并且支持许多不同的开源社区。

选择一些对你有意义的项目并支持它。但是不要忘记“隐藏”的项目。其中一些项目对开源软件的成功至关重要,但是没有人知道它们,所以它们得不到支持。几年前的 Heartbleed 1 漏洞就是这类项目的一个例子。由于只有一个维护者和很少的预算,几乎在每个 Linux 发行版和其他操作系统中使用的 OpenSSL 软件都有一个缺陷——一个漏洞——危及每台使用 OpenSSL 的计算机。这个漏洞从 2012 年2开始就存在了,但直到 2014 年才被发现。

这个漏洞很快就被修复了,一些组织参与了这个项目,以确保开发人员可以继续工作,并帮助确保代码中不存在其他漏洞。

无论你选择什么,找一些你能支持的项目,并以对你有意义且有趣的方式去做。应该一直都很好玩吧!

密码

仅仅因为我选择不向开源项目贡献代码,并不意味着你也应该避免。我知道许多系统管理员都是优秀的程序员,他们可能对数百个开源项目中的一个或多个非常有帮助。没有编码员,一开始就不会有项目。

许多项目有很大的开发团队,而其他项目则很小,有时只有一个开发人员,他将开源项目作为第二份无报酬的工作。其他开发人员为更大的组织工作,这些组织付钱给他们为开源项目编码,通常是因为组织对那个项目有一些特别的兴趣。在大多数情况下,小项目的新开发人员是非常受欢迎的,但是大项目也非常欢迎新开发人员。

不同的项目使用不同的编码语言。许多项目是用 C 或 C++编写的,而其他项目则使用解释语言,如 Perl、PHP、Python、Ruby、bash 或其他 shell 脚本语言。

无论你的技能水平如何,你都可以找到一个有大量任务需要你去完成的项目。

试验

代码写好之后,需要有人来测试。测试和编写代码一样重要。我们在第十一章“尽早测试,经常测试”中详细讨论了测试,由于它的重要性,我们为它单独指定了一章。

一些项目需要专门的测试人员,他们在开发人员完成代码后立即获取代码,并通过一系列正式的测试来运行代码。这和我在思科工作时的一半职责非常相似。这种类型的测试需要写一个正式的测试计划,然后系统地完成这个计划。失败的测试被报告给开发人员来修复。

您还可以下载和测试许多常见和流行的软件包的测试版。这些测试版中的大部分都是公开发布的,目的很明确,就是为了引出错误报告——如果你愿意的话,还有修正。这种类型的测试通常不太严格。项目领导使产品可以在现实世界中使用,并可能提供一些指导,例如测试特定的功能。您可以像使用最终版本一样使用该产品,但是当您发现一个 bug 时,您可以将其报告给项目进行修复。

提交错误报告

提交 bug 报告是支持开源项目的一种非常重要的方式。我已经做了一些,这很容易做到。

大多数项目都有定义良好并记录在案的报告 bug 的方法。许多项目使用 Bugzilla 报告 bug,有些项目使用其他工具,包括一些自主开发的工具,甚至只是给开发人员发电子邮件。如何提交 bug 的细节通常可以通过项目主页上的链接找到。

在这种情况下,我们不像上一节那样讨论 beta 测试。这里我们使用的最终发布代码已经通过了所有的 alpha 和 beta 测试。这是真实世界,“生产中的测试”类型的测试;因为生产是最好的,也是最后的检验。

当我们在生产产品中发现一个 bug 时,即使这不是任何类型的官方测试程序的一部分,我们也有责任向项目提交一份 bug 报告。几乎每个项目都有报告 bug 的方法。

向开发人员请求更多信息是很常见的,这样他们就可以缩小问题的来源。这些请求很重要,快速响应非常有帮助。大多数情况下,这些请求是为了澄清错误发生的条件,例如操作系统版本,或者故障发生时可用的空闲内存、交换空间和磁盘空间的数量。有一次,一个内核开发人员要求我安装一个带有检查点的内核版本,这些检查点旨在帮助开发人员定位存在问题的代码部分。

报告生产软件中的错误有助于使它对所有用户都更好,而不仅仅是我们自己。

文件

不管我们是否编码,文档是我们许多人都可以参与的领域。虽然有很多关于人们不读文档(RTFM)的笑话,但是文档非常重要。

有不同类型的文件。从命令行实用程序和工具的手册页,到大型应用(如 LibreOffice)的完整在线手册。LibreOffice 有一系列精心编写的手册,可以下载为 PDF 文件,也可以通过浏览器在线使用。

LibreOffice 还有一个非常好的帮助工具,包括目录、索引和搜索工具。图 25-1 显示了 LibreOffice 帮助工具的第一页。它有明确的使用说明和不同的查找信息的方法。这是我见过的最好的帮助设施之一。

对于我们这些喜欢写作的人来说,创建和维护文档是一种很好的贡献方式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 25-1

LibreOffice 帮助工具的主页提供了多个选项来查找有关当前应用的信息。大卫两个,抄送。

帮助

帮助他人是支持开源软件的另一个好方法。这种类型的参与提供了许多不同的选择。

一种选择是参加本地聚会,在那里开源爱好者与不熟悉开源的人讨论开源的优势。在许多这样的聚会中,有时被称为安装节,有经验的用户帮助新手安装 Linux 并从基础开始。另一个选择是简单地向你的朋友和家人介绍 Linux,并帮助他们入门。一些 Linux 用户喜欢逛各种论坛和 IRC 聊天室,通过回答问题来帮助人们。

我有时会这样做,但这不是我最擅长的。

我喜欢教书。根据这些年来我收到的课程评估表,我很擅长。自从 1978 年我开始在 IBM 担任课程开发代表以来,我已经教授了许多不同的硬件和软件课程。

在过去的 15 年里,我编写了关于 Linux 的课程,并为我工作过的各种组织教授这些课程。后来,当我创办了自己的 Linux 咨询公司(几年前我关闭了它)时,我写了三个为期几天的课程,涵盖了从入门到高级系统管理的所有内容。

如果你有这样的倾向,并且你有一些做演讲的技巧,教书可能很适合你。会议时间可能从一小时到一周不等。在我的两个雇主那里,我参加了长达一小时的午餐和学习会议,这些会议只是对 Linux 和其他开源软件各个部分的概述。在其他地方,我参加了一两天的课程,旨在向 Windows 管理员介绍一些基本的 Linux 命令和文件系统之类的东西。

这是我做出贡献的主要方式之一——传播我的知识。我还设法加入了一些关于我的 Linux 哲学的指导和信息。无论你教别人做什么,都是在帮助他们学习 Linux 和开源软件。

我也喜欢写作。这本书只是我的写作项目之一,其他的是我经常为 Opensource.com3和我自己的网站写的文章,尤其是 Linux DataBook 4 网站。DataBook 网站是我尝试记录我学到的很难找到的东西。

DataBook web 站点起源于我在 IBM 工作的时候,是一个关于 OS/2 的信息数据库。该数据库的设计允许我和其他 OS/2 支持人员快速找到关于 OS/2 的信息。我还用它来确保一旦我发现了如何做某事,或者发现了一个特别难以捉摸的信息,我就不必再花时间去获取它。它对我来说基本上是一种记忆辅助工具。许多关于 OS/2 的信息也出现在硬拷贝书《OS/2 Warp 内部的的第六章“文件系统”和第二十二章“故障排除”中。 5 “在我离开 IBM 之后,这些信息成为了 OS/2 的 DataBook 的基础,它和它的前身一样,是我在我的独立咨询公司的记忆工具。

在 OS/2 被 IBM 放弃后,我开始写两本新书,Linux 管理员数据手册Linux 用户数据手册。这两本新书是分别为系统管理员和用户收集的关于 Linux,尤其是 Fedora Linux 的资料。它们包含了我在使用 Linux 的这些年中发现的信息,我需要为自己维护这些信息——再次作为记忆辅助。我也想让每个人都能得到这些信息,所以我把它们都放在了我的网站上。

我为 Opensource.com 写了许多文章,这些文章大多深入一些重要的主题,如文件系统、各种服务器软件、桌面以及其他 Linux 和开放源码软件。

撰写文章和书籍来帮助系统管理员和其他想成为系统管理员的人是我自己回报开源社区的主要方式,也是提供某种程度的指导,即使这与预期的接收者有些距离。

同样,如果你擅长写作,你会发现写关于 Linux 和开源的文章是一个很好的帮助方式。

捐赠

最后,大多数项目接受货币捐赠。乍一看,这似乎是为开源项目提供支持的一种相当笨拙、不干涉的方式,但是所有的项目都需要资金支持。我选择了三个,我会时不时地给它们捐点钱。

因为它在我日常工作中的重要性,我用小额捐款支持图书馆办公室。我也支持一些高层组织。我向 Linux 基金会 7 捐款,因为他们支持 Linux 基础设施,他们直接支持 Linus Torvalds,付钱让他继续他在内核方面的工作,他们还支持其他对 Linux 的健康和发展很重要的开源社区。我还向开源倡议组织 8 捐款,该组织负责批准各种许可证,并证明它们符合开源原则。

还有许多其他开源组织和项目需要资金。你的捐款可以直接支持那些站在开源运动最前沿的人的工作。

思想

开源就是以这样或那样的方式做出贡献。我的主要贡献是在教学和写作方面。我喜欢做这两件事,而且我很擅长。

我不打算在这里列出一堆项目。主要原因是有太多,我肯定会错过一些。此处打印的任何此类列表都将是某个时间点的快照——即使我可以列出所有列表——并且在我将第一稿提交给出版商之前就会过时。在撰写本文时,我只是简单地列出了我支持的几个例子。

因此,如果你想支持一个项目,选择一个你熟悉的、对你有影响的项目,找到它的主页,在那里找到如何以对你有意义的方式做出贡献。

那就投稿吧!

心出血网站, http://heartbleed.com/

2

维基百科,【heartbleed】https://en.wikipedia.org/wiki/Heartbleed

3

Opensource.com, https://opensource.com/

4

Linux 数据手册, http://www.linux-databook.info/

5

马克·米纳西等人,《OS/2 Warp 内部的*》,新骑手出版社,1995 年*

*  6

书店网站,【支持书店】https://www.libreoffice.org/donate/

7

Linux 基金会,捐赠给 Linux 基金会https://www.linuxfoundation.org/about/donate/

8

开源倡议,https://opensource.org/civicrm/contribute/transact?reset=1&id=2

*

二十六、真相

在这本书的大部分时间里,我们都心不在焉。毕竟,这是一本通常不太实用的技术哲学书。我只是想借此机会在这本书结束之前把我们带回现实世界。

这里有“真相”。现实每天都以多种方式强加给系统管理员。总是能够遵循本书之前提出的每一个原则是可能的——但这是不太可能的。在“真实”世界中,我们系统管理员面临一些难以置信的挑战,仅仅是为了完成分配给我们的工作。截止日期、管理和其他压力迫使我们每天多次决定下一步做什么和如何做。会议通常会浪费我们的时间——不总是,但通常是。寻找时间和金钱进行培训在许多组织中是闻所未闻的,并且需要在其他组织中推销您的系统管理员灵魂。

找到时间来记住并运用这一哲学是最大的挑战。然而,从长远来看,坚持这一理念确实会带来高额回报。

尽管如此,现实总是侵入如此完美的哲学领域。没有灵活性的空间,任何哲学都仅仅是教条,这并不是针对系统 管理员Linux 哲学。在这一章中,我们将探讨现实的某些方面如何影响作为系统管理员的我们。

电脑容易,人难

-布里奇特·琼斯

系统管理员必须工作并与人互动。这可能很难,但我们确实需要不时这样做。

从 1969 年我第一次坐在电脑前开始,我就一直喜欢电脑的一个特点是,当我写程序时,它完全按照我告诉它的那样去做。我可以让它做我想做的任何事情——在它的能力范围内——通过输入一系列组成程序的命令。如果我想改变它的功能,我所要做的就是改变程序。很简单。

人一点都不简单。我不仅无法访问他们的程序,他们也不总是关注他们自己的程序,或者其他人认为他们拥有的程序。人一点都不简单。如果我是每个人的老板,他们都会按照我的方式去做,那么事情可能就简单了。但事实并非如此。

因此,在我们努力成为最有禅意的系统管理员的过程中,我们遇到了人。他们通常是善意的,甚至是大多数 PHB。问题是很多不懂技术。

微观管理者

我曾经遇到过这样的情况,在我做志愿者工作的地方,某个有权威地位的人给我发了一封电子邮件,说我需要尽快把一份文件放到网站的新闻提要上。他们还说硬拷贝在办公室的桌子上。他们想让我扫描硬拷贝,并把它作为一个图像。我回答说我想看这个文件,在我有机会看硬拷贝之前,我可以把它放上去。

这个人回复我说,他们(意思是现在有两个人以上)想让我看硬拷贝,因为这是一个奇怪的尺寸,他们不希望它“太大”。不管那是什么意思。但是,哦,顺便说一句,他们确实有一份发送到打印机的 PDF 的副本。不幸的是,没有附上 PDF。对此我回应说,我不在乎硬拷贝的大小,因为我会使其大小适合网站新闻提要上的可用空间,请将 PDF 发送给我。

我收到的下一封邮件附有一份 PDF 文件,并附有几句话,大意是说,如果文件在网站上太大,很多人会很不高兴。什么事?!

我从 PDF 复制粘贴到网站上的 WordPress 帖子上,并在文档上添加了他们想要的图像副本。它看起来真的很好,但是当你读到这封信的时候它已经不见了,所以我不会告诉你去哪里找它。

但是等等!还有呢!

到目前为止,这已经花了大约三天的时间。如果他们在第一封邮件中发送了 PDF 文件,我本可以在收到文件二三十分钟后将文件上传到新闻订阅源上。

为了确保相关人员之间的和谐,我们第二次见面时,我与电子邮件的作者进行了交谈,表明我对他们的语气不太满意。然后,我简要地解释了我这样做的四个理由,以及为什么在网站上直接使用 PDF 不如使用我复制的原始文本好。我相信你能想到很多原因,所以我在这里就不赘述了。

我与之交谈的那个人看起来很困惑,他说,“我一点也不明白你刚才说的话。”我说我只是想确保文档在网站上看起来尽可能的好,然后就此结束了谈话,留下了我当时想的一些事情没有说出来。

那就是与人打交道。这是我们的现实。

我知道参与其中的人只是想让一切看起来都很好,给网站的访问者留下一个好印象。我知道。但是知道这一点并不会使处理多人试图微观管理一项根本不需要管理的任务的挫折变得更容易。

多即是少

如果你不能用才华蒙蔽他们,就用废话迷惑他们。

—厕所场地

我曾经有一件又旧又丑的 t 恤,上面用非常醒目的字体印着这句话。我听到许多系统管理员对与他们一起工作的非技术人员说类似的话。这种态度可能适用于 t 恤,但不适合真正专业的系统管理员。

我们系统管理员必须与其他人互动,无论他们是用户、其他团队的技术专家、同事还是管理层。我们需要和其他知识水平不同的人讨论我们的工作。知识不是二元状态;它是模拟的。人们对计算机和技术的了解程度差异很大。这包括从看似一无所知到知识渊博。他们的知识水平对我们如何与他们互动很重要。

我发现的一件事是,无论人们对计算机和技术的知识水平如何,当我详细解释事情时,他们几乎总是反应良好。在这种情况下,我假设我向其解释事情的人足够聪明,能够理解我说的一切,如果他们不理解我说的话,他们会要求澄清。

当我这样做时,有两种不同的反应。第一种反应是来自那些对技术不太了解的人。在我走得很远之前,他们通常只是说他们不明白。在这种情况下,我尽我所能总结,让它去了。在许多情况下,这些人对我试图告诉他们的东西感到困惑,但感觉很好,因为我假设他们应该被视为知识渊博。这有助于产生好感,并为你们双方的积极体验创造条件。第二种反应来自有见识的人。他们很感激我愿意给他们详细的解释,但通常只是想很快切入正题。

这种方法让对方在谈话中设定自己的限制。他们可以随时告诉我们他们想要更多或更少的信息。我发现,从长远来看,给人们更多的信息意味着更少的麻烦。

技术支持恐怖

我也是一个人。当我为我的网络连接打电话寻求技术支持时,在我说“我确实重启了调制解调器”之前,我甚至不让第一级支持人员问我他们脚本上的第一个问题。我没有重启我的电脑,因为它是 Linux,不需要重启。我想和第三级支持人员通话。”

他们讨厌我打电话。我知道我给他们打电话后,他们会谈论我好几天。然而,当我打电话时,我已经做了他们在与一级支持人员的脚本对话中试图让我做的所有事情。我不能忍受不得不通过各种级别的支持来提升自己。我要花时间完成工作。

然而,有时候,他们可以马上把它修好。有时候,谈话另一端的人实际上有一些相关的知识。

所以我问自己,“自我——当别人需要我的帮助时,他们是如何看待我的?”答案并不好。我问了我的妻子,她没有犹豫。这不太好。我可以傲慢,居高临下,唐突,同时又是一个真正的混蛋。这当然不是我的意图,但事实就是如此。

对我来说,这可能完全是对其他事情感到沮丧的结果,我被打断了,我多次听到同样的问题,我只是累了,或者其他什么。所有这些对正在发生的事情的情绪反应都会阻碍问题的解决。

这是我的现实——双向的。所以我个人的任务是对需要我帮助的人和我试图帮助的人更友好。

你应该按我的方式做

我记不清在这本书里说过多少次了,在 Linux 中做任何事情都没有唯一正确的方法。我甚至写了一章题为“没有应该”,来表达我的观点。

然而,如果我屈服于自己的冲动,告诉人们按照我的方式去做,一切都会简单得多。我只知道如果他们按我的方式做,一切都会好的。看着一个新的系统管理员为一些我可以快速修复的东西而苦苦挣扎,是令人沮丧和艰难的。我作为导师很难让他们犯错。我认为这对我来说是最难的事情,看着并让年轻的学习艰难的方式。

我从我的飞行教练那里学会了如何做这件事。许多年前,我上过飞行课。这个过程花了我几个月的时间,我已经进行到一半了,在和我的教练进行飞行训练之前,我正在对一架塞斯纳 152 飞机进行预演。我已经完成了整个外部清单,上了飞机,坐在左手边的座位上。我检查了小屋的清单和启动清单。清单对飞行员来说是件大事。一直以来,我的教官只是坐在副驾驶的位置上看着。

在检查清单的最后,我松开了驻车制动,并稍微推进了一下油门。飞机没有移动。我把油门踩得更大一点,但还是没有反应。发生这种情况只有一个原因。我从侧窗向外看,以确认我确实把楔块留在了原处。那架飞机不会去任何地方——这正是轮挡应该做的。

我检查了停机清单,离开飞机,拉上轮挡,回到飞机上,第二次检查了启动清单。这一次,飞机确实自由移动了。我滑行到跑道尽头,起飞开始我们的训练飞行。

我的教练对此只字未提。她不必这样做,因为我知道我遗漏了清单上的一个步骤。我很好地吸取了教训。我教练的工作是教我如何自己驾驶飞机,而不是为我做事。如果她做了我为我忘记的事情,我怎么能学会呢?我再也不坐飞机了,但是当我坐飞机的时候,我总是,总是记得执行清单上的每一项,并确保我检查了轮挡已经被拉上。

这些绝对是最好的教学时刻。当你看到年轻的系统管理员显然正在犯一个错误,而你一句话也没说就让他们继续。

在这些情况下,还需要注意其他一些事情。观察你正在训练的系统管理员的行为举止。如果他们感到沮丧和愤怒,责怪你没有告诉他们他们知道你看到了什么,如果他们把他们的问题归咎于别人,他们可能不适合系统管理员的工作。

可以说不

有时候系统管理员不得不说不。平坦的,笔直的,没有其他选择,不。布鲁斯和我不得不完全拒绝一些想使用我们实验室的项目。那些项目会在我们平稳运行的实验室中产生巨大的动荡,破坏其他几个项目的工作。

我的意思是,我们确实解释了为什么我们不能承担这些项目。我们花了一些时间与提出这些项目的工程师在一起,帮助他们理解为什么他们的项目与我们实验室已经在做的工作不相容。他们不高兴,但他们最终理解了为什么我们不能在实验室做他们需要的事情。在这两种情况下,我们都提出了替代方案,包括建立自己的实验室,但我不知道他们最终做了什么。

有时一个强烈的“不”是正确的答案,不管它是否被欣赏。

科学方法

我们已经研究了使用基于科学方法的算法来执行问题确定和解决。有效。你的算法可能和我的有些不同,但是如果你成功了,就坚持下去。使用某种形式的这种算法将使问题的解决更加严格和可重复。

然而,有些问题就是难以解决。虽然如果有足够的时间和算法中各种循环的迭代,它们可能会被解决,但从头开始可能更有意义。毕竟,在生产环境中工作时,有必要将停机时间降至最低。

我有时会将硬盘从一个有故障的系统转移到一个正常工作的系统。Linux 现在处理硬件的方式是使用 dbus 和 udev 在/dev 中自动添加设备专用文件,这使得移植硬盘的系统很容易启动并运行,没有任何问题。一旦新系统启动并运行,我就可以在有故障的硬盘上安装另一个硬盘,并试图找到问题的根源。在其他情况下,最快的解决方案是重新安装操作系统。

有时,即使我有足够的时间和大量的谷歌搜索,我仍然无法解决问题。这是我发现有必要重新安装操作系统的又一次,以便回去做更有效率的工作。我不喜欢这样做,因为我可能永远也找不到问题的根源。

先说清楚,科学方法确实有效。然而,有时需要修理电脑并让它再次工作意味着我们只需要振作起来,做任何必要的事情让它再次运行。如果我们以后能找出根本原因,那就太好了,对我们未来有帮助。如果没有,我们只能带着未被满足的好奇心前行。

了解过去

我发现学习 Unix 和 Linux 的历史既有趣又有教益。在本书的前面,我特别提到了两本书,它们对我理解 Linux 及其哲学很有帮助。

迈克·甘卡兹的《Linux 和 Unix 的哲学》在哲学方面特别有趣。第二本书是 Eric S. Raymond 所著的《Unix 编程的艺术》2,提供了关于 Unix 和 Linux 编程和历史的有趣的内幕历史观点。这第二本书的全文也可以在网上免费获得。 3

*如果你还没有读过这两本书,我建议你都读一读。它们为我在本书中所写的大部分内容提供了历史和哲学基础。

最后的想法

这是一本有趣的书。当我第一次概述这些章节时,我想我可能找不到太多关于其中一些章节的内容。看来我真的有很多话要说。所以我会尽量缩短最后一部分。

  • 电脑坏了。

  • 系统管理员修复损坏的计算机。

  • 人很难。

  • 系统管理员与各种类型的人打交道。

  • 阅读我在这本书里提到的书。它们是令人惊奇的资源,可以为成为 Linux 系统管理员提供强有力的见解。

  • 永远不要停止学习新事物。每天都有更多的东西要学。

  • 遵循哲学。

  • 使用算法。有效。

最后,你应该在这本书里找到的唯一“应该”。

             ___________________
            < It should be fun! >
             -------------------
                   \   ^__^
                    \  (oo)\_______
                       (__)\       )\/\
                           ||----w |
                           ||     ||

甘卡兹,迈克,“Linux 和 Unix 哲学”,数字出版社-爱思唯尔科学出版社,2003 年,ISBN 1-55558-273-7

2

《Unix 编程的艺术》,Addison-Wesley,2003 年 9 月 17 日,ISBN 0-13-142901-9

3

Eric s . raymond,《Unix 编程的艺术》, http://www.catb.org/esr/writings/taoup/html/index.html/

*

第一部分:简介

Introduction

的第一部分面向系统管理员的 Linux 哲学向您介绍了 Unix 哲学和最初的 Linux 哲学,它直接来源于 Unix 哲学。您将了解一些关于 Unix 和 Linux 发展的历史和参与者,以及他们是如何首先带来 Unix 哲学,然后是 Linux 哲学的。

你也会了解到我设定自己哲学的原因和动机。这在很大程度上是由于最初的 Linux 理念在应用于系统管理员时的不足。

在这本书里,你会发现动手实验可以实现大多数系统管理员最喜欢的学习方式——边做边学。在第一部分中,您将为这些实验做准备。你将得到一套运行实验的 Linux 计算机的最低规格,你将准备一个 USB 记忆棒用于一些实验。

本书中的实验旨在简短明了。它们的主要目的是帮助系统管理员理解 Linux 的哲学。

第二部分:基础

Foundation

用户可以充分利用 Linux 命令行的强大功能。今天的图形用户界面(GUI)使得许多人不需要使用命令行,他们只想使用一些相对简单的工具来浏览网页、使用电子邮件,或者阅读或编写文档。大多数 Linux 用户无法想象 GUI 背后隐藏的强大功能。然而,允许更多用户轻松访问计算机能力的 GUI 隐藏了这些计算机交给我们的大部分能力。

有一群人特别容易成为命令行的主要用户:系统管理员,也称为系统管理员。系统管理员是命令行的最终超级用户,因为它提供了对全部可用功能的直接访问。

这并不是说普通的非 root 用户不使用命令行。很多人会这样做,但通常是在 GUI 无法满足他们需求的时候。大多数 Linux 发行版都有安装程序的图形化工具;管理用户和组及其权限;移动和管理文件;处理电子邮件;浏览网页;管理进程和 CPU 功能;限制某些用户对系统资源的访问;还有更多。但是如果命令行界面(CLI)的普通用户进行足够深入的探索,他们会发现 Linux 提供了许多文本模式和命令行工具来执行每一个可以在 GUI 中执行的任务——以及许多不能在 GUI 中执行的任务——通常速度更快,具有更多的特性和功能。

作为一名系统管理员,我的需求包括能力、速度、灵活性以及对操作系统的全面控制。满足所有这些需求的唯一方法是不受限制地访问 Linux 命令行,在那里所有的能力和速度都暴露无遗。作为一名系统管理员,我发现自己在管理任务中使用 CLI 的次数远远多于使用 GUI。在很大程度上,这是因为我更喜欢 CLI,但也有许多 Linux 计算机没有安装任何类型的 GUI,即使那些安装了 GUI 的计算机在试图通过任何远程桌面工具执行远程管理时也会非常慢。如果你有一个到远程计算机的非常快的互联网连接,这些远程 GUI 工具可能是有用的,但是它们永远不会像一个好的老式终端会话那样快,因为 GUI 数据的网络开销会耗尽带宽。

我并不是说我不使用 GUI 桌面,它们是“坏的”事实上,我发现 GUI 桌面可以提高我在 CLI 上的工作效率。我使用 GUI 通过同时打开多个终端会话来利用我的 CLI 访问,从而为多个 Linux 主机上的多个用户提供对 CLI 的同时访问。

我在 GUI 桌面上使用图形工具。我用 LibreOffice Writer,一个强大的,图形化的,免费的,开源的文字处理程序来写这本书。我欣赏并利用 CLI 和 GUI 各自的优势。然而,Linux 的真相是 CLI 为那些愿意使用它的人提供了最强大的功能。

系统管理员的 Linux 哲学的这一部分将向你介绍哲学的基本原则。这些原则是 Gancarz 书中记录的 Unix/Linux 哲学原则的发展体现,我们将在这一部分看到更多。这种对 Unix 和 Linux 的基本设计的哲学方法,为这两种操作系统的稳定性、优雅性、简洁性和内在功能做出了贡献。

这不是偶然的。Linus Torvalds 最初开发 Linux 是作为一种爱好,但有意将其基于 Unix。他采用免费提供的 GNU 实用程序,然后针对 Linux 重新编译,并将它们添加到他的操作系统中,当结合在一起时,纯化论者称之为 GNU/Linux。

任何操作系统的个性和可用性都是设计者所做的假设的函数。Linux 也不例外。它从一开始就被设计成类似 Unix 的,Unix 开发者已经决定 Unix 将允许它的用户访问它所设计的每一点功能。不仅如此,他们还为用户提供了获得这种能力所需的工具。毕竟,设计一个操作系统——或任何其他相关的东西——然后限制对它的访问有什么好处呢?GNU/Linux 是免费的自由开源软件——FLOSS——在理念和实现上很像 Unix。

由于它们的重要性和对 Linux 个性的深远影响,我在本书中花了大量的篇幅用文字解释这些基本原则,并用动手实验来说明它们。我相信,只有对这些原则有了坚定的理解,功能原则才能得到理解,它们对系统管理员的日常任务的适用性才能得到更全面的认识。

在本书的第二部分,我们的启蒙始于哲学的最基本层面。我们将了解“Linux 真相”、数据流、标准 IO (STDIO)、转换数据流以及“一切都是文件”的含义随着我们的工作生活开始有所启发,我们发现自己正在学习许多新的命令,如何在简单的命令行程序中有效地使用它们,以及如何利用一切都是文件的事实。

第三部分:功能

Function

在第三部分中,我们的启示不仅仅是在键盘上敲击命令,我们开始以更高级的方式应用基础知识。为了更好地利用命令行,我们开始扩展我们的命令行程序,并创建经过测试的、可移植的和可维护的 shell 程序,我们保存这些程序并可以重复使用,甚至共享。我们变成了“懒惰的管理员”,开始自动化一切。我们使用 Linux 文件系统层次结构以开放格式存储数据。

对于系统管理员来说, Linux 理念的这一部分是关于让我们的工作更容易。我们使用命令行的功能,并应用一些新的原则来利用我们在第二部分中学到的东西,尽可能多地实现自动化,并创建适合我们的程序。

系统管理员的自动化不是编译程序,因为创建、测试、发布和维护这些程序需要太多的时间和精力。面向系统管理员的编程是关于 shell 程序的,比如 BASH 编程,它是快速、开放和可移植的。

一些业内人士会认为 shell 编程不如用编译语言编写程序那么费力。这是不正确的,虽然我在某些地方使用了术语脚本和脚本,但是编写 shell 脚本和使用 c 一样是编程。shell 编程的优势是多方面的,我们将在本节中详细讨论这些优势。

让我们同意“脚本”和“程序”这两个词是可以互换的。所以当我说“程序”时,您可以理解为 shell 脚本,尤其是 BASH 脚本,因为 BASH 是几乎所有 Linux 发行版中的默认 shell。

第四部分:成为大师

Becoming Zen

本书的第四部分把我们从作为一名系统管理员的日常实践带到了更深奥的禅宗世界。我们着眼于面向系统管理员的 Linux 哲学的各个方面,这些方面是关于做出我们自己的选择,以对我们有意义的方式做事,与包括 PHB 在内的所有合作者打交道并尊重他们,以及回馈社区。

在这本书的这一部分,你只会发现几个实验。然而,你会发现一些我通常试图传授给学生和新的系统管理员的建议和意见——那些我曾经是他们导师的人。

进入并和我一起成为禅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值