Linux-系统管理实践指南-全-
Linux 系统管理实践指南(全)
原文:
zh.annas-archive.org/md5/0eacddeb7ec71870cbf564f905eb1eea译者:飞龙
前言
我喜欢教书。我最早的记忆之一是教其他孩子做一些事情——比如下棋、画画或为动作人物建造堡垒。我在高中和大学时期也教过其他学生。教书是我自然而然的事情。当我写文章、白皮书或书籍时,我扮演教师的角色。我把读者放在教室里,教他们任务或概念,比如更改文件权限或向系统添加新用户。这就是我的思维方式。这本书,就像我几乎写的每一件事情一样,体现了我几乎与生俱来的教书欲望,传递一些知识,并播下一颗好奇心的种子,它生长、开花并传播给其他人。我希望你能从这本书中获得灵感,带领你做同样的事情。
谁应该阅读本书
本书适合想要首次探索 Linux 作为系统管理员的任何人,或者希望转向这样的角色来工作或作为严肃的爱好的人。它还适用于那些准备参加需要一些 Linux 知识的认证考试的人。
我为什么写这本书
我写这本书是为了填补系统管理员现有知识空白。在我职业生涯早期,我肯定会买下这本书,并把它放在我的办公桌上作为参考。当然,这本书中有大量的技术信息,正如你所期望的,但也包括职业指导和一些非技术方面的内容,这些对于成为系统管理员很重要。
浏览本书
本书的组织结构如下:
-
第一章 介绍了 Linux 安装和初始设置。
-
第二章 探索了命令行界面,这是系统管理员工作中必不可少的部分。
-
第三章 演示如何定制用户体验,并向你介绍全局系统配置文件。
-
第四章 专注于用户管理。
-
第五章 是关于 Linux 网络的概述。
-
第六章 是关于软件管理的操作指南。
-
第七章 讨论存储概念。
-
第八章 是关于保持系统健康的讨论。
-
第九章 为你提供一些系统监控工具。
-
第十章 探讨脚本编写和自动化。
-
第十一章 讲解使用 Samba 套件实现 Windows 互操作性。
-
第十二章 教授了一些实用的故障排除技术。
-
第十三章 帮助你保护你的系统。
-
第十四章 总结了您应该探索的教育机会,以保持自己的最新状态并提升技能。
-
第十五章 提供了帮助您推动职业生涯的建议。
本书使用的惯例
本书中使用了以下排版约定:
斜体
表示新术语,URL,电子邮件地址,文件名和文件扩展名。
等宽字体
用于程序清单,以及段落中引用程序元素,例如变量或函数名称,数据库,数据类型,环境变量,语句和关键字。
等宽斜体
显示应由用户提供值或由上下文确定值替换的文本。
提示
此元素表示提示或建议。
注意
此元素表示一般注释。
警告
此元素表示警告或注意。
使用代码示例
补充材料(代码示例,练习等)可在https://oreil.ly/practical-linux-system-admin-code下载。
如果您在使用代码示例时遇到技术问题或困难,请发送电子邮件至bookquestions@oreilly.com。
本书旨在帮助您完成工作。一般情况下,如果本书提供了示例代码,您可以在您的程序和文档中使用它。除非您复制了代码的大部分内容,否则无需征得我们的许可。例如,编写一个使用本书多个代码片段的程序不需要许可。销售或分发 O’Reilly 书籍中的示例代码则需要许可。通过引用本书并引用示例代码回答问题不需要许可。将本书的大量示例代码整合到您产品的文档中则需要许可。
我们欣赏,但通常不需要,署名。署名通常包括标题,作者,出版商和 ISBN。例如:“实用 Linux 系统管理 作者 Kenneth Hess(O’Reilly)。版权所有 2023 年 Hess Media and Consulting, LLC,978-1-098-10903-5。”
如果您认为您使用的代码示例超出了合理使用范围或上述权限,请随时通过permissions@oreilly.com联系我们。
O’Reilly 在线学习
注意
超过 40 年来,O’Reilly Media已经提供技术和业务培训,知识和见解,帮助公司成功。
我们独特的专家和创新者网络通过书籍、文章和我们的在线学习平台分享他们的知识和专业知识。O’Reilly 的在线学习平台为您提供按需访问实时培训课程、深度学习路径、互动编码环境以及来自 O’Reilly 和其他 200 多个出版商的广泛文本和视频资源。有关更多信息,请访问https://oreilly.com。
如何联系我们
请将有关本书的评论和问题寄给出版商:
-
O’Reilly Media, Inc.
-
1005 Gravenstein Highway North
-
加利福尼亚州塞巴斯托波尔 95472
-
800-998-9938(在美国或加拿大)
-
707-829-0515(国际或本地)
-
707-829-0104(传真)
我们有一个本书的网页,我们在那里列出勘误、示例和任何额外信息。您可以访问https://oreil.ly/practical-linux-system-admin。
发邮件至bookquestions@oreilly.com评论或询问有关本书的技术问题。
有关我们的书籍和课程的新闻和信息,请访问https://oreilly.com。
在 LinkedIn 上找到我们:https://linkedin.com/company/oreilly-media
在 Twitter 上关注我们:https://twitter.com/oreillymedia
在 YouTube 上观看我们:https://www.youtube.com/oreillymedia
致谢
成为 Linux 系统管理员需要你和你的家庭做出牺牲。我经常说系统管理员的整个家庭为一家公司工作。这对任何工作可能都是真实的,但似乎对系统管理员尤为相关。Linux 系统管理是一个很好的职业选择,但要为自己、配偶和子女留出时间。记住你工作是为了生活,而不是为了活着。你不能把错过的时刻拿回来——里程碑、事件和庆祝活动创造了一个会被温暖地记住的存在。
感谢我的妻子梅丽莎,她始终支持我的创意追求。
我也想感谢以下帮助使这本书成为可能的人:
-
约翰·戴文斯,O’Reilly 收购编辑
-
杰夫·布莱尔,O’Reilly 开发编辑
-
格雷戈里·海曼,O’Reilly 制作编辑
-
技术审阅员丹尼尔·巴雷特和亚当·麦克帕特兰
第一章:起步使用 Linux
Linux 系统管理对不同的人来说意味着不同的事情。在这本书中,管理指的是 Linux 系统管理员(sysadmin)每天必须采取的行动,以管理和支持用户,维护系统健康,实施最佳安全实践,安装软件并执行系统维护任务。本章涵盖了 Linux 安装、初始设置以及使用简单的 Shell 命令进行系统探索。
您将会在命令行中花费大部分时间,也称为命令行界面(CLI)。Linux 系统管理员很少在其支持的服务器系统上安装或使用图形用户界面(GUI)。本章介绍了 CLI 以及一些简单的命令,用于导航文件系统、定位重要文件并熟悉 Linux 的 CLI。
安装 Linux
每个 Linux 系统管理员最先学习的事情之一是如何安装 Linux。安装 Linux 没有单一的正确方法,但一些指南和建议会在您用户需求变化时让您的生活更轻松。
虽然本节不会详细介绍如何安装 Linux 的逐步说明,但基本步骤在这里概述。对于大多数初级系统管理员来说,系统安装通常是通过自动化手段进行,例如 Kickstart 或其他企业级交付系统。
准备您的 Linux 系统
如果这是您第一次安装 Linux,建议您将其安装到虚拟机(VM)中。这样,您不必将整个硬件设备用于学习系统,并且您不会通过尝试并行安装 Linux 而使您的系统无法运行,从而创建一个多启动计算机。(设置多启动是一个更高级的概念,超出了本书的范围。)
如果您尚未安装,建议您从VirtualBox的最新版本开始进行虚拟化。VirtualBox 是一个应用程序,允许您的当前计算机充当虚拟机主机系统,在其上安装诸如 Linux 之类的虚拟客户机,形成一个独立的、运行正常的计算机系统。VirtualBox 可以运行在各种主机操作系统(OS)上,并支持各种客户机操作系统,包括 Linux。主机 OS 和客户机 OS 可以彼此不同。您的计算机(主机 OS)可以是基于 Windows、Mac 或 Linux 的系统,但可以在其上安装作为 VirtualBox 虚拟机的 Linux 客户机。
下载并安装 Linux
接下来,您需要选择一个 Linux 发行版(distro)进行安装,以便您可以练习发出命令、更改配置、重新启动、安装软件、创建用户等等。建议您选择一款与您当前雇主使用的发行版类似的 Linux 发行版。如果您的公司尚未使用 Linux,或者您还没有在系统管理员角色上工作,那么可以从以下几种流行的发行版中进行选择:
Debian 是一个顶级发行版,许多其他发行版都源自它。Debian 得到社区支持,是开源且免费的。
OpenSUSE 是一个得到社区支持的顶级发行版,在全球拥有许多忠实的追随者。其商业版本 SUSE Linux Enterprise 有广泛的采用。
Red Hat 是一款得到商业支持的 Linux 发行版,广受全球企业采纳,现在由 IBM 拥有。
Ubuntu 非常受欢迎,既有(基于 Debian 的)社区版也有商业支持的发行版。Ubuntu 还提供了预制的 VirtualBox(和其他)虚拟机,帮助您快速启动。
下载的 ISO 文件是一个可引导的 Linux 镜像。如果您使用它创建虚拟机,无需进行任何操作。虚拟机将从 ISO 镜像启动,并开始安装过程。在 VirtualBox 中配置您的虚拟机后,从 Oracle VM VirtualBox 管理器中选择“设置”,如图 1-1 所示。

图 1-1. Oracle VM VirtualBox 管理器应用程序和配置的虚拟机
接下来,选择存储,如图 1-2 所示。

图 1-2. 带有已选择存储设置的虚拟机设置
在存储设备窗格下选择空的光学磁盘驱动器,然后在属性窗格中选择光学盘图标以浏览您的 ISO 镜像文件。图 1-3 显示了此菜单中可用的多个 ISO 文件。

图 1-3. 从列表中选择 ISO 镜像
选择 ISO 镜像后,单击“确定”以继续。当您启动虚拟机时,它将从此 ISO 镜像启动,开始安装到虚拟磁盘上。
当系统启动时,您可以接受默认设置。如果您有安装 Linux 的经验,可以更改默认设置以适应您的需求。在提示时创建用户帐户。如果您的发行版提示您为 root 帐户设置密码,请设置密码。您必须记住此密码,否则您将不得不重新安装 Linux 虚拟机或尝试恢复它。安装 Linux 可能需要几分钟,并且在安装过程结束时需要重新启动。
认识您的新 Linux 系统
安装完成后,首先需要使用安装过程中创建的用户名和密码登录。登录后,你将进入一个 shell(或操作环境)的主目录。你的主目录(/home)是/目录的子目录。Linux 文件系统是层级文件系统,类似于 Microsoft Windows。顶层是根目录,用/符号表示。Windows 使用诸如C:之类的驱动器号表示根目录。在 Windows 中,你可以有多个驱动器号及其自己的根级目录,如C:、D:、E:等等。在 Linux 中,只有一个根目录,即/。所有其他目录都是根目录的子目录。以下目录树展示了 Linux 根目录及其子目录:
/
│─ bin
│─ dev
│─ etc
│─ home
│─ lib
│─ media
│─ mnt
│─ opt
│─ proc
│─ root
│─ run
│─ sbin
│─ srv
│─ sys
│─ tmp
│─ usr
└─ var
请注意,/(根)文件系统下只有目录,没有单独的文件,尽管某些 Linux 发行版在/中有一些符号链接文件。所有文件都保存在目录中。本书的其余部分将探索许多这些子目录。表 1-1 提供了每个目录中文件和信息的简要概述。
表 1-1. Linux 文件系统
| 目录 | 描述 |
|---|---|
| / | 根文件系统仅包含其他目录,没有单独的文件。 |
| /bin | 二进制文件目录包含可执行文件。指向/usr/bin。 |
| /dev | 设备目录包含用于访问外围设备的设备文件。 |
| /etc | 包含用户和服务的系统配置文件。 |
| /home | 用户的主目录。 |
| /lib | 系统库文件。指向/usr/lib。 |
| /media | 用于挂载 USB 驱动器或 DVD 光盘等介质的目录。 |
| /mnt | 挂载远程文件系统的挂载目录。 |
| /opt | 第三方软件安装目录。 |
| /proc | 虚拟文件系统,跟踪系统进程。 |
| /root | 根用户的主目录。 |
| /run | 变量和易失性运行时数据。 |
| /sbin | 系统二进制(可执行)文件。 |
| /srv | 可能包含系统服务的数据。 |
| /sys | 包含内核信息。 |
| /tmp | 存储会话信息和临时文件的目录。 |
| /usr | 用户和用户相关程序的程序和库。 |
| /var | 变量文件,如日志、队列和队列文件。 |
系统文件受到用户修改的保护。只有根(管理员)用户才能修改系统配置文件和设置。用户通常只能对自己的主目录、/tmp目录以及管理员专门创建和修改的共享目录具有写访问权限。
在下一节中,您将学习如何在命令行中与您的新 Linux 系统进行交互。
学习命令行界面(CLI)
命令行界面,或 CLI,是大多数系统管理员与其 Linux 系统进行交互的方式,因为服务器系统通常没有图形界面。在 Microsoft Windows 术语中,仅支持 CLI 的系统,如 Linux 服务器,等效于只能访问命令行实用程序的 Windows Server Core 系统。
正如名称所示,你使用键盘或标准输入(stdin)输入的命令与 Linux 系统进行交互。来自 stdin 的源也可以是文件重定向、程序和其他来源,但在本书的上下文中,stdin 指键盘输入,除非另有说明。许多命令是信息性的,将系统或系统活动的数据显示到屏幕或标准输出(stdout)。有时你会从系统收到一个错误,称为标准错误(stderr)。在本文和其他与 Linux 相关的文档中,你会看到这些术语的完整和缩写版本交替使用。
你必须学习一些命令才能成功地与文件系统交互。所谓“学习”,是指记住而不是在线查找。像这样的命令只有几个,还有一些选项你也应该记住,这样你与系统的交互就变得自然而高效。不要担心使用我介绍的任何命令会对系统造成损害——当我覆盖一个命令应谨慎使用时,我会提醒你。
在开始发出命令之前,你需要了解几件事情。首先是 Linux 不使用文件扩展名。这意味着文件 filename.exe 对于 Linux 来说与 Financial_Report.txt 或 Résumé.doc 没有更多的意义。它们都是文件,可能不可执行或文本文件。在 Linux 中,你几乎可以为文件命名任何你想要的(有一些限制),但在文件名中使用空格需要谨慎,因为这样做需要在文件名周围使用引号。
Linux 的第二个要知道的事情是文件名区分大小写。换句话说,filename.txt 和 filename.TXT 是两个不同的文件。这一点我会在本章后面证明。暂时请相信我的话。第三个要知道的是,文件的权限确定了你是否可以执行文件、编辑文件,甚至查看文件的内容。第四,Linux 中每个位置都通过其从根目录(/)开始的路径唯一命名。例如,如果在 Linux 中提到密码文件,显示为 /etc/passwd。这被称为绝对路径,是关于系统上文件的说法或引用的标准约定。第五,Linux 假定你在发出命令时知道自己要做什么,并且拼写都是正确的,所以要小心,因为某些操作是不可逆转的。
最后,Linux(如 Unix 或更广义上的“*nix”系统)不像 Windows 操作系统那样“啰嗦”。例如,Linux 系统在删除文件时不会提示“你确定吗?”的消息。再次强调,如果你正确拼写命令的所有部分,Linux 系统会假定你要执行你发出的命令。在 Linux 命令行中,拼写很重要。
浏览 Linux 文件系统意味着探索各种系统目录,学会返回主目录,并以不同方式列出目录内容。如果你是 Windows 用户,并且在该平台上的命令提示符(cmd)或 PowerShell 提示符(PS)上工作过,那么 Linux 命令行对你来说将是熟悉的。
下面几节中的简短命令清单将使你熟悉 Linux 文件系统、文件以及你的主目录内容。
pwd
pwd(打印工作目录)命令显示你在文件系统中的位置。如果现在输入pwd命令,然后按 Enter 键,命令会显示/home/*your_login_name*。确保在每个命令后按 Enter 键,以便接收响应:
$ pwd
/home/student1
$是你的 shell 提示符,显示你作为用户登录到系统中。稍后在本章中你会更多地使用这个命令。
cd
cd(更改目录,或当前目录)命令将你置于一个新目录中,返回到你的主目录,并移动到更高级别或子目录中。cd命令类似于 Windows 的cd命令:
$ cd /etc
$ pwd
/etc
只需输入cd,无论你在文件系统的哪个位置,都能返回到你的主目录,如下所示:
$ pwd
/etc
$ cd
$ pwd
/home/student1
当你cd到一个目录时,请使用它的绝对路径:
$ cd /usr/bin
如果你当前在父目录,可以不使用绝对路径cd到子目录:
$ cd
$ pwd
/home/student1
$ cd /usr
$ cd bin
$ pwd
/usr/bin
cd命令是你每次连接到 Linux 系统时都会使用的命令之一。
ls
ls(列出)命令显示你指定位置的文件和目录列表。如果你不指定位置,ls将显示当前目录中的文件和目录列表:
$ cd
$ pwd
$ /home/student1
$ ls
你的主目录中还没有可见的文件,因为你尚未创建任何文件,而默认情况下也没有文件。不过,你可以通过指定目录列表的绝对路径来列出其他目录中的文件。在/usr/bin 目录中有太多文件无法列出,因此我截取了其中的几个:
$ ls /usr/bin
a2x getcifsacl p11-kit snmpping
a2x.py getconf pack200 snmpps
ac getent package-cleanup snmpset
...
你的主目录中有文件,但它们因命名方式而被隐藏。以点(.)开头的文件在普通ls命令中是隐藏的。要查看这些文件,必须使用命令选项以允许你查看所有文件:
$ ls -a
. .. .bash_history .bash_logout .bash_profile .bashrc .gnupg .zshrc
你的清单可能与这个略有不同,但请理解,所有以点开头的目录和文件在使用ls命令而不带选项时都被隐藏。你可以cd到隐藏目录或列出其中的文件:
$ ls .gnupg
private-keys-v1.d pubring.kbx
ls 命令是您每次登录 Linux 系统时都会使用的命令,确实是您希望记住的命令之一。我将在本书中反复使用 ls 命令,并在途中向您介绍更多选项。现在您已经学会了基本的文件系统导航,是时候学习如何重新启动和关闭系统了。
启动、重新启动和关闭 Linux 系统
任何 Linux 系统管理员面临的最基本任务是启动、重新启动和关闭系统。如果您有计算机经验,您会知道未发出关闭命令而关闭系统是不好的。这样做是不好的,因为这可能会损坏打开的文件,使打开的文件保持“打开”状态,中断正在运行的服务,并导致数据库事务日志问题,可能导致数据丢失。
熟练掌握如何启动、重新启动和关闭系统对系统管理员非常重要。
启动系统
对于物理系统,您按下电源按钮并释放它以启动系统。这将开始电源自检(POST)和引导过程。在引导过程中仔细观察控制台非常重要,因为系统在启动时会通知您并记录任何问题。请注意屏幕上的任何错误或异常情况。 (在引导过程中可能遇到的最严重消息是“内核恐慌”,这将在本书后面进行讨论。)希望您的系统一切正常,并且进程以登录提示符结束。
启动过程非常简短,但可以识别内存、磁盘、文件系统和网络问题等系统性问题。我将在后面的章节中介绍故障排除,但现在要注意的是,您应该仔细观察引导过程,并记录以后调查的任何问题。
重新启动系统
重新启动或重启系统是标准的系统管理员实践。尽管您可能会读到或听到相反的意见,但重新启动系统并没有什么不好。出于前面章节中提到的所有原因,您应该定期这样做。重新启动系统会清除内存,刷新连接,并确保系统健康。良好的重新启动可以暂时解决某些令人困扰的问题,例如耗尽系统内存的应用程序。
任何通过重新启动解决的问题在系统稳定后应进行更彻底的调查。重新启动系统可以让您在应用程序问题、日志问题或网络问题再次使系统需要重新启动之前进行故障排除。
关闭系统
关闭意味着发出一个命令,适当地关闭所有程序,并最终关闭系统的电源。这种温和的关闭还会警告 shell 用户系统即将关闭,以便每个人都可以保存工作并退出登录。
系统关机应保留用于硬件维护、迁移或停用。某些企业政策要求系统每年进行一次完全关机,以识别可能仅通过完全系统故障才能显现的硬件问题。技术人员和系统管理员通常利用这个机会同时进行硬件维护或检查。
摘要
本章带您上手了一个实时的 Linux 系统,涵盖了一些 Linux 基础知识,探索了一些基本命令,并指导您如何启动、重启和关机系统的方法及原因。在第二章,您将进一步了解如何使用 CLI 以及如何使用命令来创建、删除和修改文件。您还将学习 Linux 权限,如何设置和解释它们,以及如何为用户设置全局默认权限。
第二章:使用权限和特权帐户
对于系统管理员,命令行界面(CLI)是家园。在键盘上打字是标准操作。您需要熟悉命令行及其特殊性和快捷方式——是的,有命令行快捷方式。关于 Linux 命令行有很多要学习的内容。有数十个命令,每个命令有数十个选项。当然,您只会使用少量命令和每个命令的有限选项,但是当需要时,您需要知道如何找到所需的选项并如何使用它们。
CLI 的真正强大之处在于其易用性。CLI 是用户和程序员首次与其操作环境交互的界面。事实上,CLI 至今仍在使用,这证明了它对系统管理员和用户的强大和实用性。本章教您如何作为普通用户和 root 用户在命令行上工作。您还将学习设置和修改文件权限以及这些权限对文件的影响。
作为普通用户工作
Linux 系统上有两种用户类型:普通用户和 root(管理员)用户。普通用户每个人都有自己的主目录和有限的系统使用权限。root 用户也有一个主目录(/root)。普通用户在自己的主目录中几乎具有无限的权限来创建、修改、删除和操作文件,但在该单一位置之外几乎没有权限。许多系统命令对普通用户可用。相比之下,其他命令则限制于通过sudo命令或直接访问 root 用户帐户的限制性 root 用户访问。
注意
一般而言,最注重安全性的规则是,除非某些任务需要特权(root 用户)访问,否则应始终作为普通用户工作,这将在下一节中介绍。
作为 Root 用户工作
root 用户是任何 Linux 系统上的超级账户。root 用户可以创建、编辑、移动或删除系统上的任何文件。root 用户可以重启、更改运行级别和关闭系统。有三种方法成为 root 用户:
-
以 root 用户身份登录
-
使用
su(切换用户)命令 -
使用
sudo命令
以 Root 身份登录
在某些 Linux 发行版上,您可以通过网络或交互式控制台直接作为 root 用户登录系统。一些 Linux 发行版默认禁止 SSH root 登录,而其他发行版则由管理员决定。不建议通过 SSH 登录系统并以 root 身份登录。主要原因是,如果允许跨网络 root 访问系统,则可能会有恶意用户尝试暴力破解 root 登录。您不希望这种情况发生。本书稍后将向您展示如何在您的发行版上禁用 SSH root 登录(如果尚未禁用)。
不应直接在控制台上以 root 身份登录,因为这样做会阻止系统记录登录并成为 root 的用户。记录使用 root 用户帐户的人很重要,因为出现问题时,您希望知道哪位管理员执行了操作。这种记录的目的不是为了归咎。但它是必要的,以满足一些监管要求,并纠正需要可教授时刻或一些高级培训的系统管理员的行动。我们接下来讨论的两个选项是更好、更安全的成为 root 用户的方法。
使用 su 命令
成为 root 用户的适当方法之一是使用su(替代用户)命令。使用su的一个注意事项是用户必须知道 root 用户的密码。如果管理用户知道 root 密码,很难防止这些管理员直接以 root 身份登录。使用su命令成为 root 是可以接受的,但前提是每次使用后 root 密码都要更改。在大型企业中,安全组维护 root 密码,系统管理员可以临时检出 root 密码进行维护。
root 用户可以在系统上su到任何其他用户帐户而无需知道用户的密码。这种权限允许管理员以故障排除为目的登录或成为任何用户,因为用户往往难以准确描述他们遇到的问题。它还防止用户向管理员透露其密码,这应促使用户更改其密码。
要su到另一个帐户是一个简单的过程。发出su命令和您希望su到的用户帐户。在本示例中,我使用完整提示而不仅仅是$来演示用户更改:
[bjones@server1] $ su root
Password:
#
#提示符通知您现在已作为 root 用户登录。在本书中,用户提示符为$,而 root 提示为#,以区分标准用户的提示符和 root 用户的提示符。现在发出的任何命令都具有 root 权限,这意味着您必须小心,因为账户没有限制。
使用 su 的更好方法是使用su -命令,因为-表示您还想采用 root 用户的完整环境,而不仅仅是账户权限。显示的内容太长,无法在此处显示,但如果发出env命令,您将看到原始用户的环境变量,而不是 root 的环境:
# env
使用exit命令返回原始用户帐户,如下所示:
# exit
[bjones@server1] $
现在使用带有-选项的su命令。在此命令中无需指定 root,因为默认是 root:
[bjones@server1] $ su -
Password:
# env
现在显示 root 用户的环境变量。使用su -命令相当于以 root 用户身份登录控制台。任何用户都可以su到任何其他用户帐户,这需要知道另一个用户的密码:
[bjones@server1] $ su cdavis
Password:
[cdavis@server1] $
使用 sudo 命令
获得 root 访问权限的最佳方法是使用“替代用户执行”或“作为另一用户执行命令”(sudo)命令。sudo 命令允许适当配置的用户帐户以 root 用户身份发出单独的命令。每个发出的命令必须在 sudo 命令之前。首次使用 sudo 命令要求 sudoer(为 sudo 使用配置的用户帐户)提供他们自己的密码,如下面的代码清单所示。不需要知道 root 密码。
$ sudo env
[sudo] password for bjones:
bjones is not in the sudoers file. This incident will be reported.
[bjones@server1 ~]$
警告显示用户不在 sudoers 文件中意味着用户帐户 bjones 未在 /etc/sudoers 文件中配置。在下一节中,我将演示如何设置用户为 sudoer。
注意
sudo 命令、/etc/sudoers 文件和 sudoer 用户标签非常有趣,因为它们有独特的发音。sudo 的接受发音是“soodoo”,sudoer 是“soodooer”。一些系统管理员将其发音为“soodoe”和“soodoe-ers”,但这两种发音都没有问题。
创建一个 sudoer
您必须具有 root 用户访问权限才能编辑 /etc/sudoers 文件,并使用 visudo 实用程序,其唯一目的是编辑 /etc/sudoers 文件。不应直接使用 vi、Emacs 或任何其他文本编辑器编辑 /etc/sudoers 文件。要编辑 /etc/sudoers 文件,请作为 root 无选项地发出 visudo 命令:
# visudo
/etc/sudoers 文件是描述用户、组和可以使用 root 或其他用户权限运行命令的简单文本文件。您可以创建一个具有非常限制性权限(即仅运行单个命令作为 root)或宽松权限(即以 root 身份运行任何命令而无需输入密码)的 sudoer。我更喜欢配置两者的混合,通过创建可以作为 root 运行任何命令的 sudoer,但必须提供其密码。
/etc/sudoers 文件和 sudoers 存在数百种可能的配置方案。本书的范围仅限于此处的示例。在第一个示例中,我演示了如何设置我的用户帐户来使用 sudo。我的设置要求在使用 sudo 时输入密码:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
khess ALL=(ALL) ALL
我复制了 root 用户的设置,并将我的用户帐户插入其中。设置立即生效。不建议设置用户帐户以不需要输入密码就能使用 sudo。在发出命令时使用密码是为了在行使 root 权限时更难出错。sudo 命令本身也是如此。理论上,如果管理员必须发出 sudo 命令,他们会因为需要具体思考命令动作及其结果而在 root 身份下犯的错误会更少。
读取和修改权限
本节教你如何读取和修改文件权限。 您必须了解文件权限,以适当地设置和修改对文件和目录的访问权限。 知道文件权限有助于在用户无法访问文件或目录时进行故障排除。
文件权限简单而又关键于 Linux 安全性。 它们的简单性可能导致忽视和配置错误。 沮丧的系统管理员有时会放宽权限以解决问题,但从不回头或将权限重置为其正确设置。
读取、写入和执行
三种 Linux 文件权限或模式是读取(r)、写入(w)和执行(x):
读取
查看文件或列出目录内容。
写入
创建和修改文件或在目录中复制、移动和创建文件。
执行
执行/运行文件或cd进入目录。
如第一章中所述,文件的名称不确定是否可执行,这与 MS Windows(.exe文件等)的情况不同。 Linux 文件的可执行性取决于其权限。
使用权限中的 rwx 指示被称为符号模式。 符号模式是识别权限的两种方法之一。 另一种是数字模式,它为 rwx 权限分配值。
数值权限值
每种权限模式都有其分配的数值。 这种快捷方法使系统管理员更容易设置权限。
读取权限的值为4,写入权限的值为2,执行权限的值为1。 权限值范围从0到7。 零权限值表示无权限。 表 2-1 总结了这个概念。
表 2-1. 数值权限值
| 权限模式 | 数值 |
|---|---|
| 读取 | 4 |
| 写入 | 2 |
| 执行 | 1 |
| 无 | 0 |
在下一节中,您将了解这些权限如何与组权限一起创建一个简单但完整的文件安全系统。
组权限
四个文件权限适用于用户的组:用户、组、其他人和所有人。 “所有人”组包括用户、组和其他人。 这是一种简化的方法,用于全局分配文件或目录的权限。 每个组也有一个简写标识,如表 2-2 所示。
表 2-2. 组权限
| 权限组 | 值 |
|---|---|
| 用户 | u |
| 组 | g |
| 其他 | o |
| 所有 | a |
用户和系统管理员可以分别为每个组或同时为所有组设置文件权限。 每个 Linux 文件和目录都为每个组分配了读、写和执行权限。 下一节将为您整理所有权限设置。
引入权限的焦点
在本小节中,我将创建一个简单但完整的文件安全系统,展示我们讨论过的所有权限是如何一起工作的。本节中的示例将使用文件file.txt。如果您想要按照示例操作,请执行以下命令设置您的文件:
$ touch file.txt
这个命令会为您创建一个名为file.txt的空文件。接下来,请使用带有-l(长格式)选项的ls命令查看文件权限:
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 19 17:35 file.txt
图 2-1 说明了位置及其指定(用粗体表示)。第一个位置用于特殊文件类型,例如在该位置带有d的目录(dr-xr-xr-w)。常规文件具有-(-rw-rw-rw-),表示它们不是目录或其他特殊文件。接下来的九个位置是用户、组和其他用户权限的位置。第一个“三元组”或三个位置是给用户的,第二个是给组的,最后三个是给其他用户的。

图 2-1. 特殊字符位置及用户、组和其他权限位置
图 2-2 展示了每个列表的数字权限,以及用户(u)、组(g)和其他(o)三元组的显式标签。

图 2-2. 数字权限值及用户、组和其他(ugo)指定
如图 2-2](#numerical_permission_values_and_usercom)所示,数字权限对每个三元组进行累加,以创建文件的权限配置文件。例如,具有-rw-rw-r--权限的文件具有数字权限值664。读取权限的值为4,加上写入权限的值2,总和为6。所有三种可能的权限rwx总和为7。
如果一个文件的权限等于750,则其 rwx 表示为-rwxr-x---。这意味着指定用户和组之外的其他用户对该文件没有权限。
注意
其他组通常被称为world。例如,如果文件的权限为-rw-rw-r--,则该文件被称为world readable,而不是other readable。“其他”组的权限尤其敏感,因为允许其他人(世界)对文件和目录进行写入或执行权限可能会造成安全风险。
接下来,您将学习如何使用多种方法设置和更改文件权限。
更改文件权限
设置和更改文件权限或模式是常见的系统管理员任务。文件系统上的每个文件都有权限,允许或拒绝用户、组和其他人的访问。要更改文件权限,你使用chmod(更改模式)命令。你可以使用chmod命令以多种方式设置或修改权限。你不必保持一致。你可以使用chmod命令使用数字表示或 rwx 和 ugo 表示,但不能在同一条命令中混合使用。我在以下几节中展示了几种可能性和实际示例。
注意
一些系统管理员认为符号(rwx 和 ugo)方法比数字(0、1、2、4)方法更容易掌握。你可以使用任一或两种方法,因为它们是等效的。
符号模式
使用符号模式方法更改权限非常简单。参考你在之前示例中创建的原始file.txt文件,使用ls -l命令查看原始权限:
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 19 17:35 file.txt
当前文件权限不足。你需要限制除你之外的任何人甚至是读取这个文件。你该如何做呢?你需要从其他人那里移除读权限。移除等同于减法,因为你在当前给予文件的权限中减去了一个权限。所以,要从文件中移除读权限,你可以使用chmod命令:
$ chmod o-r file.txt
$ ls -l
-rw-rw----. 1 khess khess 0 Jun 19 17:35 file.txt
你已经从文件中为其他人移除了读权限。现在,除了你之外没有人能够读取(或写入)这个文件。
当你创建一个 shell 脚本并尝试用./file.sh执行它,但什么也没有发生时,你应该检查文件的权限,看看你是否已经添加了执行权限:
$ touch file.sh
$ echo "echo Hello" > file.sh
$ ./file.sh
-bash: ./file.sh: Permission denied
权限被拒绝?但是我刚刚在我的主目录中创建了这个文件!检查权限会揭示问题:
$ ls -l
-rw-rw-r--. 1 khess khess 11 Jun 29 19:58 file.sh
文件file.sh以.sh扩展名命名。请记住,在 Linux 中扩展名不起作用,并且意识到file.sh当前不可执行,因为它没有执行权限。当尝试执行它时,会收到“Permission denied”消息。要解决问题,请为自己添加执行权限:
$ chmod u+x file.sh
$ ls -l
-rwxrw-r--. 1 khess khess 11 Jun 29 19:58 file.sh
现在,file.sh是可执行的:
$ ./file.sh
Hello
你可以向文件中添加或移除多个权限,甚至可以在同一条命令中添加和移除权限。以下是每种操作的示例。第一条命令从任何先前示例中删除(rm file.txt)文件。
要向文件中添加多个权限:
$ rm file.txt
$ touch file.txt
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 29 20:13 file.txt
$ chmod ug+x,o+w file.txt
-rwxrwxrw-. 1 khess khess 0 Jun 29 20:13 file.txt
若要从文件中减去多个权限:
$ ls -l
-rwxrwxrw-. 1 khess khess 0 Jun 29 20:13 file.txt
$ chmod a-x,o-rw file.txt
$ ls -l
-rw-rw----. 1 khess khess 0 Jun 29 20:13 file.txt
现在为所有组添加执行权限并移除其他人的读权限:
$ rm file.txt
$ touch file.txt
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 29 20:13 file.txt
$ chmod a+x,o-r file.txt
$ ls -l
-rwxrwx--x. 1 khess khess 0 Jun 29 20:23 file.txt
警告
要明确指定要为哪个 ugo 组添加或移除权限。仅提供+x或-r默认适用于所有人。
如果你没有指定想要添加权限或者减少权限的组,系统会默认你是指 所有 组。从安全角度来看,这可能是危险的。除非这正是你想要做的事情,否则永远不要向所有组授予权限。在下面的示例中,由于你没有明确定义哪个组应该接收它,所有组都被授予了执行权限:
$ rm file.txt
$ touch file.txt
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 29 20:34 file.txt
$ chmod +x file.txt
$ ls -l
-rwxrwxr-x. 1 khess khess 0 Jun 29 20:35 file.txt
注意
要执行一个不在你的路径中的可执行文件或脚本,你必须提供文件的显式路径。如果文件在当前目录中,你必须告诉 shell 它在你的当前目录,并且你想要执行它。使用 ./script_name.sh 告知 shell 文件是可执行的,并且在你的当前目录中。这里,script_name.sh 是你希望执行的文件。
数值模式
为了清晰和比较,在本节中的示例与上一节中的示例是重复的。但这里我们使用数值模式(而不是符号模式)来更改权限。
创建一个新文件并检查其权限:
$ rm file.txt
$ touch file.txt
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 29 21:12 file.txt
使用数值方法从其他组中删除读权限。首先,计算文件的当前权限值,然后计算你想要的新值。目前,文件的权限值是 664。期望的值是 660:
$ chmod 660 file.txt
$ ls -l
-rw-rw----. 1 khess khess 0 Jun 29 20:12 file.txt
使用数值方法,没有添加或减少权限。你只需将一个权限值重新分配给文件。下面显示的代码是前面一页你所做的重复,是一个符号化的例子。你向所有人添加了执行权限,并从其他人那里减少了读权限:
$ rm file.txt
$ touch file.txt
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 29 20:13 file.txt
$ chmod a+x,o-r file.txt
$ ls -l
-rwxrwx--x. 1 khess khess 0 Jun 29 20:23 file.txt
将原文件 (664) 的数值重新分配给新文件 (771) 的数值等同于数值模式:
$ rm file.txt
$ touch file.txt
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 29 20:13 file.txt
$ chmod 771 file.txt
$ ls -l
-rwxrwx--x. 1 khess khess 0 Jun 29 20:23 file.txt
更改权限的任何方法都完全可以接受;使用哪种方法并不重要。像大多数系统管理员一样,我可以交替使用这两种方法。更多取决于上下文和我想要快速完成任务的速度。通过一些实践和一些错误,更改权限将对你来说变得自动化。
解释默认权限:umask
你可能已经注意到,当你创建一个新文件时,它会以特定的权限创建:664 或者 -rw-rw-r--。对于根用户,新文件的默认权限是 644 或者 -rw-r--r--。你可能现在想知道这是怎么发生的。一个称为 umask(用户文件创建掩码)的全局设置会默认屏蔽或过滤某些文件的权限。执行权限默认不会被赋予,因此 umask 设置并没有明确屏蔽它。要查看你的用户帐户的默认 umask 值,使用 umask 命令:
$ umask
0002
您可能会想知道为什么umask报告四个数字;我们到目前为止只使用了三个。第一个(最左边的)数字用于特殊权限,例如setuid,setgid和sticky,我将在后面的章节中介绍。现在只关注最右边的三个数字:002。这三个数字分别对应于用户、组和其他的 rwx 权限。当您创建一个新文件时,某些权限会被过滤掉。对于002 umask,写(w)权限被过滤掉,因此新文件被创建为-rw-rw-r--。2表示写权限。创建新文件时,“其他”组的写权限被屏蔽,因此不会授予新文件。
对于根用户,在我的系统上,默认的umask是0022。写(w)权限被同时屏蔽了组和其他。umask的原因是安全性。当普通用户创建文件时,您不希望其他人能够写入它,您必须显式授予此权限。对于根用户,umask防止根组和其他用户默认写入某些敏感文件,例如/etc/passwd文件。每个人都可以读取文件,但只有根用户可以写入它。
您可以通过发出umask命令和一个新值来更改您的umask值。这将在您当前的登录会话期间暂时更改umask:
$ umask 006
$ touch test.txt
$ ls -l test.txt
-rw-rw----. 1 khess khess 0 Jun 29 22:16 test.txt
要使此更改永久生效(稍后可更改),请按以下步骤将新的umask追加到位于您主目录中的.bashrc文件末尾:
$ echo umask 006 >> ~/.bashrc
$ source .bashrc
$ umask
0006
每次登录时,您的umask设置为006或0006(二者等效),并生成更安全的-rw-rw----新默认文件权限。
概要
在本章中,您获得了更多在命令行上工作的经验,学习了一些新命令,也许更重要的是,学会了阅读和修改文件权限。在第三章,您将学习一些文件编辑基础知识以及如何修改用户的默认环境。
第三章:定制用户体验
本章讨论了为自己和您的用户定制用户体验。系统管理员经常需要对用户环境进行微小更改或对系统上所有用户的默认环境进行全局更改(后者称为全局更改)。只要任何请求的更改和增强不会损害系统安全或违反公司政策,那么进行符合用户需求和工作流的更改就没有坏处。作为系统管理员,我们的职责首先是对公司负责(然后才是对用户负责)。用户就是您的客户。
全局定制默认用户环境会更改系统上所有用户的环境。但是,您或用户可以覆盖某些全局参数。在第二章中,当您为用户账户添加新的 umask 时,您就做了这样的覆盖。通过在设置全局 umask 之后设置个人 umask 偏好,您超越了系统设置的 umask。用户定制他们可以控制的环境是一个常见的做法。
本章将通过编辑每个用户家目录中的关键文件,讨论如何定制您和您的用户的环境。作为系统管理员,您还将探索这些环境文件的“全局”版本,这些文件可以进行更改或添加,从而为您的用户创建特定的体验。
更改家目录选项
在每个用户的家目录中,几个隐藏文件控制着大部分用户的环境。由于许多 Linux 用户使用 bash,因此本章节将重点讨论默认和自定义用户环境的相关内容。(其他如 ash、zsh、csh 和 ksh 等 shell 也可供选择,它们的隐藏、可编辑文件在名称、功能和结构上相似。)
由于一些用户没有足够的技能来进行必要的更改,您可能需要代表用户进行更改。相关文件如下:
-
.bashrc
-
.bash_logout
根据您的 Linux 发行版和之前的配置更改,您的家目录中还可能会看到名为 .profile、.bash_profile、.bash_login 和 .bash_history 的文件。
您不必对它们都进行更改。例如,.bash_history 文件不需要任何更改。它记录了发出的命令,没有用户可配置的项目。当您登录 Linux 系统时,.bashrc 文件首先执行,然后执行 .bash_profile。.bash_logout 文件在注销时执行。
警告
在您的启动文件中放置的程序、脚本和消息要小心,因为如果它们损坏、损坏或部分打开,您可能会发现您的登录要么延迟,要么您完全无法登录,需要其他系统管理员进行救援。也把这个警告传递给您的用户。
当您交互登录到 Linux 系统时,一组文件会自动执行,以构建您的用户环境,如以下部分所述。
登录与非登录 Shell
您会听到和阅读关于两种类型的交互式 shell:登录和非登录。交互式登录 shell 是您通过 SSH 登录或直接输入用户名和密码或 SSH 密钥登录的 shell。交互式非登录 shell 是您从命令行调用子 shell 的 shell:
$ bash
$ echo $SHLVL
2
$SHLVL 是一个跟踪您的 shell 级别的变量。当您首次使用用户名和密码或密钥交互式登录 shell 时,您的$SHLVL 为1。调用第一个之后的子 shell 会增加SHLVL 变量。以这种方式调用的子 shell 是交互式的非登录 shell,因为它是交互式的,但不涉及新的登录。
/etc/bashrc
当您交互登录到 Linux 系统时,/etc/bashrc 是第一个执行的个性化文件。/etc/bashrc 文件还会在交互非登录 shell 上执行。/etc/bashrc 文件是一个全局的个性化文件,为您的登录 shell(bash)提供函数和别名。这个文件应该保持不变——即使作为系统管理员,您也不应该编辑它。
此处显示的信息和警告重新列印自/etc/bashrc 文件。如果您尝试编辑文件,您会看到它们:
# System-wide functions and aliases
# Environment stuff goes in /etc/profile
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
/etc/bashrc 文件类似于您家目录中的.bashrc 文件。如果需要更改函数和别名,请在那里更改。
/etc/profile
/etc/profile 文件是一个系统范围的启动文件。它为所有用户提供通用的变量、路径和其他设置。该文件中的警告如下代码清单所示,指出除非您知道自己在做什么,否则不应编辑此文件:
# System-wide environment and startup programs for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
正如警告所述,最好编辑用户家目录中的个性化文件,或在/etc/profile.d 下创建其他全局个性化文件。
然而,这些全局设置可以被位于家目录中的个人化启动文件覆盖。这是您登录 Linux 系统时执行的第二个环境个性化文件。奇怪的是,它也调用/etc/bashrc 文件,因此/etc/bashrc 被执行两次。
/etc/profile 文件类似于您家目录中的.bash_profile 文件。在那里更改任何环境设置。
.bashrc
.bashrc文件是您家目录中的一个隐藏文件。它是隐藏的,因为在使用通配符重命名或删除文件时,您不希望直接访问它。您可以完全拥有该文件,并可以随意编辑它。该文件用于设置和包含您可能需要的任何函数,并为命令设置别名。全局个性化文件执行后,.bashrc文件将执行。.bashrc文件与其全局类似,在交互式非登录 shell 中执行。以下是未更改的.bashrc文件的列表。您应该在此文件中增加或更改您的PATH,以便您的 shell 在登录和非登录实例中表现类似:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
别名是对命令及其选项的有用快捷方式。例如,如果您希望常用命令的“啰嗦”版本,在您的.bashrc文件中创建以下别名:
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
-i 选项意味着交互式,并要求您在执行命令之前进行确认。当您发出新的别名rm命令时,您将收到一个验证消息。这个选项特别适用于破坏性命令,比如rm,因为 Linux 并不“啰嗦”。例如,当您删除文件时,它不提供任何反馈。-i 选项通过提示您确认操作,提供了更类似于 Windows 命令的体验:
$ rm file4.txt
rm: remove regular empty file 'file4.txt'?
如果您经常运行相同的命令和选项,别名非常方便。例如,我在使用的每个系统上都创建了几个默认别名。我最有用的一个是用于长列表:
alias ll='ls -l'
您还可以按会话创建别名。这意味着您可以简单地在命令行上发出别名命令,而无需将其保存到文件中,并且它保持有效,直到您注销或终止当前 shell。
提示
许多来源建议将所有定制内容放在.bashrc文件中,因为它适用于交互式登录和非登录 shell。在.bashrc文件中进行 shell 定制可以保证 shell 的一致性。
.bash_profile
在交互式登录上执行的最后一个文件是您的家目录中的.bash_profile文件:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
你可以在此文件中放置定制内容,这些内容将在交互式登录 shell 中运行,但在交互式非登录 shell 中不可用。
.bash_logout
在注销时执行的最后一个文件是.bash_logout文件。此文件是可选的。它仅存在以允许用户在退出时清理临时文件。您还可以使用它来使用 shell 记录时间或在注销时发送消息。
在下一节中,您将了解这些 shell 个性化文件的起源,以及如何为每个用户更改默认设置。
/etc/skel目录
/etc/skel 目录是一个特殊目录,用于保存您希望在创建用户账户时每个用户都收到的文件。您在 /etc/skel 中创建的文件不必是隐藏文件,尽管默认是这样。这些文件在创建账户时会被复制到用户的主目录中。这些是环境个性化文件的全局副本。Red Hat Enterprise Linux 系统上的 /etc/skel 默认文件列表如下所示:
# ls -la /etc/skel
total 28
drwxr-xr-x. 2 root root 76 Jul 4 12:45 .
drwxr-xr-x. 144 root root 8192 Jul 4 11:07 ..
-rw-r--r--. 1 root root 18 Apr 21 10:04 .bash_logout
-rw-r--r--. 1 root root 141 Apr 21 10:04 .bash_profile
-rw-r--r--. 1 root root 376 Apr 21 10:04 .bashrc
-rw-r--r--. 1 root root 658 Mar 3 2020 .zshrc
如果您在 /etc/skel 目录中创建文件,则在创建账户时,这些文件将被复制到新用户的主目录中。已存在的用户在您创建他们的账户后,将不会接收到放置在 /etc/skel 中的文件。您需要手动将这些文件复制到每个用户的主目录,并更改权限,以便用户完全控制它们。
注意
Linux 有一个称为手册页或简称 man 页 的本地帮助系统。如果您需要有关命令、配置或系统设置的帮助,请输入 man 和关键字以查看是否存在相关文档。例如,要获取 ls 命令的帮助,您可以使用 $ man ls。您可以使用 vi(Vim)导航命令浏览 man 页。
自定义 Shell 提示符
通常,用户接受系统呈现的默认提示符。通常,它看起来像 [username@hostname pwd]$,或者在我的具体情况下,像 [khess@server1 ~]$。波浪号 (~) 表示用户的主目录。例如,在前面讨论个性化脚本的部分中,它们通常表示为 ~/.bashrc 和 ~/.bash_profile,以说明这些文件位于用户的主目录中。
要设置自定义提示符,Shell 提供了一组转义字符,表示位置、用户名、时间、回车等。例如,提示符环境变量 (PS1) 的默认提示符由以下代码给出:PS1="[\u@\h \W]\\$ "。系统在 /etc/bashrc 文件中设置此默认提示符。您可以在您的 ~/.bashrc 文件中覆盖它。
Bash 允许通过插入多个反斜杠转义的特殊字符来定制这些提示字符串,如 表 3-1 所示解码。
表 3-1. 反斜杠转义的特殊字符
| 特殊字符 | 描述 |
|---|---|
\a |
ASCII 响铃字符(07) |
\d |
“星期 月份 日期” 格式的日期(例如,“周二 5 月 26 日”) |
\D{format} |
格式将传递给 strftime(3),并将结果插入到提示字符串中;空格式将得到本地化的时间表示。大括号是必需的。 |
\e |
ASCII 转义字符(033) |
\h |
直到第一个 '.' 的主机名 |
\H |
主机名 |
\j |
当前由 Shell 管理的作业数 |
\l |
Shell 终端设备名称的基本名称 |
\n |
换行符 |
\r |
回车符 |
\s |
Shell 的名称,即$0的基本名称(最后斜杠后的部分) |
\t |
当前时间,24 小时制的 HH:MM:SS 格式 |
\T |
当前时间,12 小时制的 HH:MM:SS 格式 |
\@ |
当前时间,12 小时制的上午/下午格式 |
\A |
当前时间,24 小时制的 HH:MM 格式 |
\u |
当前用户的用户名 |
\v |
Bash 的版本(例如,2.00) |
\V |
Bash 的发布版本,版本+补丁级别(例如,2.00.0) |
\w |
当前工作目录,以$HOME用波浪号缩写(使用PROMPT_DIRTRIM变量的值) |
\W |
当前工作目录的基本名称,以$HOME用波浪号缩写 |
\! |
此命令的历史编号 |
\# |
此命令的命令编号 |
\$ |
如果有效 UID 为0,则为#,否则为$ |
\nnn |
对应于八进制数字nnn的字符 |
\\ |
一个反斜杠 |
\[ |
开始一系列非打印字符,可用于将终端控制序列嵌入提示符 |
\] |
结束一系列非打印字符 |
默认提示符对大多数用户来说足够了,但一些用户和系统管理员可能希望有所不同,因此他们可以自由更改它。一些聪明的用户已经设计出了彩色和艺术风格的提示符代码,例如这个圣诞主题的提示符:
PS1="\[\e[33;41m\][\[\e[m\]\[\e[32m\]\u\[\e[m\]\[\e[36m\]@\[\e[m\] \
\[\e[34m\]\h\[\e[m\]\[\e[33;41m\]]\[\e[m\] "
在网上搜索“有趣的 Linux 提示符”,尽情享受。玩耍后,您可以注销并重新登录以重置您的提示符,或输入PS1="[\u@\h \W]\\$ "以恢复默认设置。
摘要
在本章中,您学习了如何通过个性化文件编辑用户环境,并了解了添加更多文件到新帐户的默认位置和配置。您还学习了这些文件的位置、加载顺序以及应该为特定效果编辑哪些文件。最后,您对 shell 提示符有了简要的概述以及如何修改它。
在第四章中,您将获得有关用户管理的概述,从用户帐户创建到通过组管理用户,再到如何授予资源访问权限。
第四章:管理用户
作为系统管理员,您将花费大部分时间管理用户。您还将花时间解决与账户或权限无关的用户问题,如连接问题、应用程序故障、数据损坏、培训问题、安全问题和用户创建的问题。
用户管理涵盖以下任务:
-
创建用户账户
-
修改用户账户
-
移除用户账户
-
授予对文件和目录的访问权限
-
限制对文件和目录的访问
-
强制执行安全策略
-
对文件和目录设置权限
本书可以学到一些用户管理任务,而其他任务则纯粹是您的经验和在职培训。没有两个用户环境完全相同,没有两个用户体验完全相同。在本章中,您将学习一些预防性的用户管理方法,但问题仍然会发生。本章中学到的技术将帮助您开始处理各种与用户相关的问题。
用户和组 ID 编号约定
在 Linux 系统上创建和维护用户账户有一些指导原则,如表 4-1 所示。这些不是硬性规定,但通常在大多数企业系统中遵循。
表 4-1. 用户和组账户编号约定
| UID | GID | 描述 |
|---|---|---|
| 0 | 0 | Root |
| 1–999 | 1–999 | 系统/服务账户 |
| 1000+ | 1000+ | 用户账户 |
用户账户的 UID 和 GID 通常从 1000 开始,每新增一个账户递增一个数。root 用户的 UID 和 GID 始终为 0;系统上没有其他用户拥有这些用户和组 ID。
系统和服务账户不是人类用户账户,通常没有关联的交互式 shell。这些账户的 UID 和 GID 范围从 1 到 999。这些分离使得系统维护比随机分配 UID 和 GID 给用户账户要容易得多。
创建用户账户
像 Linux 中的大多数任务一样,创建用户账户有多种方法。对于本书,我坚持使用两种主流方法来创建账户:useradd 和 adduser。
使用 useradd 添加用户
useradd 命令是在 Linux 系统中添加新用户的标准命令行方法。useradd 命令很简单;您真正需要提供的只是一个用户名作为参数:
# useradd jsmith
这将创建主目录 /home/jsmith,填充默认的隐藏环境文件,并将条目添加到 /etc/passwd 中。当我使用 useradd 创建用户账户时,我只需提供一个参数和一些信息(用户的全名),否则需要编辑 /etc/passwd 文件:
# useradd -c "Jane Smith" jsmith
-c 选项将您提供的信息写入到 /etc/passwd 文件的第五个字段中。如果您希望提供更多信息,例如电话号码、电子邮件地址或其他任何您想包含的信息,请使用逗号(,)来分隔这些信息:
# useradd -c "Jane Smith,Room 26,212-555-1000,jsmith@example.com" jsmith
新用户的 /etc/passwd 条目:
jsmith:x:1007:1007:Jane Smith,Room 26,212-555-1000,jsmith@example.com:/home/
jsmith:/bin/bash
用户的 /etc/passwd 条目中各个字段依次是(从左到右):
-
用户名
-
/etc/shadow 密码字段
-
用户 ID
-
主组 ID
-
注释字段
-
家目录
-
默认 shell
密码不存储在 /etc/passwd 文件中。/etc/shadow 字段指的是包含每个用户加密密码的 /etc/shadow 文件,只有 root 用户可以读取。请注意,在基于 Red Hat Enterprise Linux 的系统中,/etc/shadow 文件的权限为 000。在不同的发行版中,文件权限会有所不同,但从不允许普通用户读取该文件:
----------. 1 root root 1547 Jul 17 10:55 /etc/shadow
尽管 Jane Smith 的用户账户已经创建,她的家目录也存在,并且在 /etc/passwd 文件中有一个条目来表示该账户,但是 Jane 无法登录系统。知道为什么吗?因为这个账户没有密码。作为系统管理员,您需要为 Jane 提供一个初始密码,以便用户可以登录。由于您尚未为该账户提供密码,因此 /etc/shadow 条目显示没有密码:
jsmith:!!:18825:0:99999:7:::
使用 passwd 命令为账户设置密码:
# passwd jsmith
Changing password for user jsmith.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
现在,您必须在 Jane 成功登录系统之前为她设置密码。
使用 adduser 添加用户
在一些 Linux 发行版中,adduser 是指向 useradd 的符号链接:
lrwxrwxrwx. 1 root root 17 Oct 26 2020 /usr/sbin/adduser -> /usr/sbin/useradd
在其他发行版中,adduser 是一个交互式 Perl 脚本,引导您逐步添加新用户,而 useradd 是一个独立的实用程序,带有其标准开关和参数。
修改用户帐户
几乎不存在静态用户账户。因此,usermod 命令存在以帮助您进行这些必要的更改,而无需编辑 /etc/passwd、家目录或配置文件。usermod 命令是用于更改与用户账户相关的所有内容的综合命令。以下是您可以使用 usermod 命令进行的修改的简要列表:
-
将用户添加到附加组
-
更改 /etc/passwd 中的用户注释字段
-
更改用户的家目录
-
设置账户过期日期
-
删除过期日期
-
更改用户的登录名(用户名)
-
锁定/解锁用户账户
-
移动用户家目录的内容
-
更改用户的登录 shell
-
更改用户的 ID
这些选项中有些比其他选项更常用。例如,更改用户的登录 shell、锁定和解锁账户、设置或删除过期日期或将用户添加到附加组是完全合理的。一旦在账户创建过程中设置了用户的 ID,很少会再次更改用户的 ID,就像很少会重新定位用户的家目录一样。
在接下来的章节中,我将给出用户账户最常被请求修改的示例。如果你需要改变用户账户的其他方面,请查阅手册获取详细信息。
添加一个附加组
当你创建一个新用户账户时,系统会分配给用户一个用户 ID(UID)和一个主组 ID(GID)。它们可以是相同的连续号码,但并非总是如此。例如,对于之前为简·史密斯创建的账户,UID 是1007,GID 是1007:
jsmith:x:1007:1007:
简的主要 GID 是1007,但她可能还在公司的 IT、工程或应用开发等领域工作,需要访问一个由组拥有的目录。在这个案例中,简在工程部门担任副工程师。工程部门的共享目录 GID 是8020。使用usermod,以下是如何授予简访问该组共享目录的方法:
# usermod -a -G 8020 jsmith
这将简的用户账户添加到/etc/group文件中的工程组:
engineering:x:8020:bjones,kdoe,vkundra,adundee,jsmith
现在简可以访问工程组的共享目录了。为了正确地将简的账户添加到一个新组中,使用-a(追加)和-G(附加组)选项一起使用。例如,如果你希望简访问财务部门的共享目录,你必须将她追加到该组中。在添加用户时,你可以使用 GID 号码或组名:
# usermod -a -G finance jsmith
警告
你必须同时使用-a(追加)和-G(附加组)选项。如果你不使用-a选项,你的用户将从所有其他附加组中删除,并且只添加到你指定的一个组中。
用户可以是多个其他组的成员。例如,用户可能在财务部门(GID 8342)工作,但也需要访问人力资源(GID 8901)信息。你也可以一次性将用户添加到多个组中:
# usermod -a -G 8342,8901 jsmith
使用此命令,可以一次性将简·史密斯添加到财务和人力资源组中。
更改用户注释字段
更改用户注释(GECOS)字段是一个常见的任务。你可以直接编辑/etc/passwd文件,但这样做存在很大的风险。经验法则是,如果有工具可以执行某个操作或任务,你应该使用它而不是直接编辑配置文件。你可以使用usermod命令和-c选项轻松更改 GECOS 字段。
假设公司最近雇佣了另一位名叫简·史密斯的员工,因此你需要通过在第一位简·史密斯的 GECOS 字段中添加中间名来区分它们:
# usermod -c "Jane R Smith" jsmith
此命令将简·史密斯替换为简·R·史密斯。
-c选项告诉usermod命令,你正在编辑“注释”字段。你也可以使用chfn命令更改这些信息:
# chfn -f "Janie Smith" jsmith
chfn 命令更改你的 finger 信息。Finger 是早期 Unix 系统和一些 Linux 系统上运行的一个旧守护程序,提供有关用户的信息。由于安全问题,现在几乎没有人再使用它,但信息仍被称为 finger 信息。 -f 选项为指定的账户更改用户的全名字段。还有其他选项用于办公室(-o)、办公室电话(-p)和家庭电话(-h)。通常,只使用用户的全名或服务的名称和目的用于 GECOS 字段。
设置账户过期日期
如果用户在公司给出通知、转移到不同的业务单位或休产假,系统管理员可能决定出于安全原因禁用该用户的账户,直到该人返回或在从系统中移除账户之前:
# usermod -e 2021-07-23 rsmith
罗布·史密斯的账户将在指定的 YYYY-MM-DD 格式日期上失效(过期)。 -e 选项设置账户过期。
更改用户登录 shell
默认的 Linux shell 是 bash,但一些用户更喜欢使用其他可用的 shell,因此他们请求将其默认 shell 更改为其中一种。有三种方法可以更改用户的默认 shell:usermod、chsh 和直接编辑 /etc/passwd。不建议直接编辑 /etc/passwd 文件。
usermod 命令方法使用 -s 选项、新 shell 和用户名来进行更改:
# usermod -s /bin/sh jsmith
更新后的 /etc/passwd 文件显示如下:
jsmith:x:1007:1007:Janie Smith:/home/jsmith:/bin/sh
只有具有 root 权限的用户才能编辑 /etc/passwd 文件或使用 usermod 命令。但是,任何用户都可以使用 chsh 命令更改其 shell:
$ chsh -s /bin/zsh
Changing shell for jsmith.
Password:
Shell changed.
结果为 /etc/passwd 的条目如下:
jsmith:x:1007:1007:Janie Smith:/home/jsmith:/bin/zsh
对于其他更改,请参阅 usermod 的 man 手册。
注意
在任何 man 手册的末尾,你会找到相关的替代命令列表、外部文档链接以及“参见”部分引用的配置文件。这些都很方便探索,并且可能在进行更改时更有效。以下是从 usermod man 手册 中摘录的“参见”部分:
参见
chfn(1)、chsh(1)、passwd(1)、crypt(3)、gpasswd(8)、groupadd(8)、groupdel(8)、groupmod(8)、login.defs(5)、useradd(8)、userdel(8)。
现在你已经学会了如何创建和修改用户账户,让我们讨论如何移除用户账户。
移除用户账户
幸运的是,系统管理员和开发人员命名命令时考虑了使其易于记忆的方式。命令名称通常描述其功能。useradd 命令就是一个例子。要从系统中移除用户账户,可以使用 userdel 命令,它像 useradd 一样易于使用。
要从系统中移除用户账户,使用 userdel 命令并提供账户的用户名:
# userdel jsmith
此命令从/etc/passwd和/etc/shadow中删除用户条目,但保留用户的主目录(/home/jsmith)不变。您认为这是一个好选择的原因是什么?系统管理员通常在用户离开公司或在公司内部更换工作但不再需要访问系统时保留用户的主目录。保留用户的主目录确保只有根用户可以访问用户可能留下的对公司重要的任何文档。
如果您每晚备份用户的主目录,您不一定需要保留用户的主目录。以下userdel命令将删除用户的主目录及其中的所有文件:
# userdel -r jsmith
警告
userdel和rm等破坏性 Linux 命令是不可逆的,一旦执行就无法撤销。在按下回车键之前,请务必确认您选择了正确的用户账户,并且进行了良好的备份。
当需要更改密码时,您需要知道如何强制用户执行此操作。我们的下一节将向您展示如何操作。
强制密码更改
当您为用户提供初始密码时,用户更改其密码是基于信任的问题。定期审核用户密码的系统管理员意识到这种“诚信制度”的信任并非始终有效。您可以使用chage命令轻松审核用户账户设置。-l选项列出指定用户账户的当前设置:
# chage -l rsmith
Last password change : Jul 17, 2021
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
如您所见,此账户的密码永不过期,这是一个安全违规,需要修复。除了定期强制更改外,您还应设置最小更改周期。例如,如下代码所示,我将rsmith账户设置为每 90 天强制更改密码(-M 90),并设置最小更改天数为 1 天(-m 1)。设置最小更改天数可确保用户不会多次更改密码(或者无论系统设置的记忆密码数量是多少),以将其重置为原始密码,这实际上没有净密码更改。
# chage -m 1 -M 90 rsmith
# chage -l rsmith
Last password change : Jul 17, 2021
Password expires : Oct 15, 2021
Password inactive : never
Account expires : never
Minimum number of days between password change : 1
Maximum number of days between password change : 90
Number of days of warning before password expires : 7
系统设置的到期日期是最后一次密码更改后的 90 天。如果最后一次密码更改是在过去,用户必须在下次登录时更改其密码。
注意
来自chage man page:“chage命令用于更改密码更改之间的天数和最后一次密码更改日期。系统使用此信息确定用户何时必须更改密码。”
密码是一种弱身份验证形式,因为它们可以被猜测、破解或者如果用户将其写下,可以以纯文本形式读取。因此,您必须确保密码经常更改且不重复使用。
处理服务账户
没有什么比服务账户的提及更能激起系统管理员和安全管理员之间的争议了。我不确定所有争议的原因,因为每个 Linux 系统都有超过 30 个服务账户。
服务帐户的一个例子是nobody帐户,这是内核溢出用户帐户:
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
通常,你可以通过/etc/passwd文件来识别服务帐户,看到用户帐户没有分配的 shell。服务帐户有/sbin/nologin,用户的 shell 应该在那里。这意味着服务帐户没有交互式 shell 或密码。这并不意味着他们的密码是空白或 null,它们根本不存在。换句话说,如果一个用户帐户的 shell 是/sbin/nologin,他们无法使用任何密码登录系统。甚至 root 用户也不能通过su或sudo切换到这些帐户:
# su - nobody
This account is currently not available.
因为服务帐户没有交互式 shell,也没有通过su或sudo切换到交互式 shell 的方法,所以在系统上拥有服务帐户不会导致安全违规。争议来自于一些系统管理员不知道服务帐户通常没有交互式 shell 或密码。某些服务可能需要一个交互式 shell 帐户才能使其服务正常运行。对于这些服务,应该采取极端审查和其他安全措施来阻止潜在的秘密登录。
管理组而不是用户
在管理一组用户的权限时,定义和管理一个组比单独管理每个用户更方便。组管理允许你做以下事情:
-
管理资产(如文件夹和文件)的权限
-
根据工作职能管理权限
-
更改大量用户的权限而不是为每个用户单独更改
-
轻松地将用户添加到组的共享文件夹和文件中,并从中删除用户
-
限制对敏感文件夹和文件的权限
对于单个用户管理权限非常困难,因为如果这些权限需要更改,你必须在用户在每个拥有帐户的系统上追踪该用户的权限。管理组的权限允许系统管理员在更全局的层面上管理细粒度的用户访问。
例如,如果你有一个在人力资源(HR)部门工作的用户,然后转移到财务部门,很容易将该用户从 HR 组中移除并添加到财务组中。用户立即可以访问所有其他财务组成员可以访问的共享文件和文件夹。而且用户不再可以访问 HR 文件和文件夹。
在本章的前面,你学习了如何将用户添加到附加组中。你应该练习将目录添加到系统中,添加一个组帐户,将该特定组的所有权设置为该目录,然后将用户添加到该组中。然后你可以su - *用户名*,成为该用户以测试你的权限设置。
下面是一个你可以通过学习来了解组管理的可能场景。这个例子假设你已经有一个财务组,并且分配了用户给它。请注意,在这个例子中,root 用户退出并返回到一个属于财务组的普通账户。用户可以改变他们拥有的文件的组所有权和权限:
$ su - root
Password:
# mkdir /opt/finance
# chgrp finance /opt/finance
# ls -la /opt
total 0
drwxr-xr-x. 3 root root 21 Aug 11 21:56 .
dr-xr-xr-x. 18 root root 239 Aug 11 21:08 ..
drwxr-xr-x. 2 root finance 6 Aug 11 21:56 finance
# chmod 770 /opt/finance
# ls -la /opt
total 0
drwxr-xr-x. 3 root root 21 Aug 11 21:56 .
dr-xr-xr-x. 18 root root 239 Aug 11 21:08 ..
drwxrwx---. 2 root finance 6 Aug 11 21:56 finance
# exit
logout
$ cd /opt/finance
$ touch budget.txt
$ ls -la
total 0
drwxrwx---. 2 root finance 24 Aug 11 21:58 .
drwxr-xr-x. 3 root root 21 Aug 11 21:56 ..
-rw-rw-r--. 1 khess khess 0 Aug 11 21:58 budget.txt
$ chgrp finance budget.txt
$ ls -la
total 0
drwxrwx---. 2 root finance 24 Aug 11 21:58 .
drwxr-xr-x. 3 root root 21 Aug 11 21:56 ..
-rw-rw-r--. 1 khess finance 0 Aug 11 21:58 budget.txt
$ chmod 660 budget.txt
$ ls -la
total 0
drwxrwx---. 2 root finance 24 Aug 11 21:58 .
drwxr-xr-x. 3 root root 21 Aug 11 21:56 ..
-rw-rw----. 1 khess finance 0 Aug 11 21:58 budget.txt
如果你理解这个例子中发生的一切,那么你已经准备好进入下一章了。如果你还没有掌握这些概念,请再次通过章节示例进行学习,然后返回到这个练习。请记住,创建用户、组和目录以及更改权限是系统管理员的日常任务,练习这些技能是掌握它们并且熟练使用它们的唯一途径。
总结
本章教会了你如何创建、删除和修改用户账户。你还学习了如何设置服务账户,并简要介绍了管理组的概述。在下一章中,你将学习关于 Linux 网络的知识,从网络的重要性基础到网络故障排除等更复杂的概念。
第五章:连接到网络
独立的 Linux 系统功能强大,但其最终能力范围有限。只有一个操作员或管理员可以同时使用独立系统。虽然系统仍然可以运行多个工作负载,但其服务仅限于本地访问。
Linux 是一种多任务、多用户操作系统。它最突出的价值之一是能够与其他计算机联网,允许多用户同时运行各种工作负载。将 Linux 系统连接到网络使其能够成为本地网络、网格、云或全球互联网的一部分。
在本章中,您将学习如何为您的网络选择 IP 寻址方案以及静态和动态选项的一些优缺点。您还将了解将系统连接到网络的安全影响。您将学习如何通过实施良好的安全实践,如使用安全协议、关闭不必要的服务和守护程序,以及保持系统的补丁和更新,尽可能地防止安全漏洞。
连接到网络
将服务器系统连接到现有网络不需要太多技能。如今,一旦新系统上线,动态主机配置协议(DHCP)服务器将为其提供 IP 地址、子网掩码、网关、域名系统(DNS)服务器和一些基本的路由信息。关于 DHCP 和服务器有两种思想流派。一种认为所有服务器系统都应具有静态 IP 地址,另一种则认为所有系统都应使用 DHCP 进行 IP 地址分配和管理。我一直将服务器、打印机和网络设备配置为静态 IP 地址,这些 IP 地址接近 IP 地址池的下端。对我来说,这样做比依赖 DHCP 和 DNS 服务来维护用户非常依赖的服务的秩序更有组织性。
在接下来的章节中,我将描述两种 IP 寻址方案——静态和动态——以及各自的优缺点。每种情况下的示例网络具有以下 IP 寻址信息:
-
网络:192.168.1.0/24
-
网关:192.168.1.254(静态 IP 地址)
-
DNS:192.168.1.1, 192.168.1.2(静态 IP 地址)
此示例网络仅用于学习目的,仅适用于最小的公司或用户组。因为在这个网络上只有 251 个可用的 IP 地址(254 - 3 = 251,扣除网关地址和两个 DNS 服务器地址),所以这种方案只适用于小型公司。用户可能有多达五个消耗 IP 地址的设备,很容易看出这样一个小的地址池很快就会被用完。
分配静态 IP 地址在 Linux 发行版中有所不同。在这些示例中,我使用 Debian 和 CentOS 发行版。
静态 IP 地址分配
静态 IP 地址是嵌入到配置文件中的“硬编码” IP 地址。除非手动更改,否则该 IP 地址不会变化。静态 IP 地址不依赖于或使用 DHCP 服务。在为系统分配静态 IP 地址时,您应该决定一个保留的 IP 地址块,用于服务器、网络设备(交换机、路由器、WiFi 接入点)、打印机以及任何不可移动的 IP 可能系统。工作站、笔记本电脑、平板电脑、手机和其他移动设备应使用 DHCP。
例如,在前一节提到的网络参数中,我保留了 192.168.1.1 到 192.168.1.25 用于服务器、网络设备、打印机和其他固定系统。正如您所注意到的,地址 192.168.1.1 和 .2 已在此保留列表中使用。您可以在 DHCP 配置中排除一段 IP 地址范围,以使这些地址不成为可用 IP 地址池的一部分。
使用静态 IP 地址池的一个优点是网络服务稳定。如果在您的网络上设置了一些库存服务和监视,我强烈建议您,拥有这些静态寻址系统将为您节省一些麻烦。您将能够随时间比较库存、看到发生了什么变化、测量增长并计划变更。另一个优点是,即使 DNS 和 DHCP 失效,您也可以找到关键系统。静态 IP 地址为您提供了所需的稳定性,无论其他服务的状态如何。
一些网络服务要求服务器系统具有静态 IP 地址。FTP、Web、VPN、数据库、Active Directory 和 DNS 等服务需要静态 IP 地址或建议具有静态 IP 地址。静态 IP 地址分配的主要缺点和反对观点是管理。争论是管理静态 IP 地址是费时费力的,可能会在网络的其他地方引起冲突。对于大多数系统管理员来说,我不认为这是一个问题,因为您为静态 IP 地址分配的设备使用年限长,它们的位置是稳定的。您通常不会将服务器移动到公司内的不同位置;您不会像笔记本电脑、平板电脑和手机一样将它们移动到外部使用,然后归还。从 DHCP 池中排除的保留池可以防止与其他系统的潜在冲突。
动态 IP 地址分配
使用 DHCP 服务可以消除在 DHCP 之前困扰系统管理员的许多 IP 地址管理问题。为超过几个系统分配静态 IP 地址并跟踪它们变成了管理噩梦。在桌面系统唯一存在的时代,静态 IP 地址有点合理。但如今,有了笔记本电脑、平板电脑和手机,静态 IP 地址可能意味着用户只能在其企业网络上访问,如果他们连接到另一个网络,可能会遇到 IP 冲突,或者他们必须知道如何每次连接到不同网络时将其系统从静态分配 IP 地址改为动态分配 IP 地址。
例如,如果您的笔记本电脑在公司网络上有一个静态 IP 地址 192.168.1.50,而您带着笔记本电脑去家里或其他远程地点工作,那么您家里必须使用与您的办公室相同的 IP 地址方案。如果是这样,您的笔记本电脑可能与电视、某人的手机或其他支持 IP 的设备的动态分配 IP 地址发生冲突。在家里可能会解决这个问题,但是当您将同一台笔记本电脑带到酒店并尝试连接公司 VPN 时,很可能由于静态分配的 IP 地址而无法连接。酒店可能使用 10.0.1.0 IP 地址方案,因此您的笔记本电脑将永远无法连接。
设备的移动性是 DHCP 的一大优势。用户无论在笔记本电脑连接到另一个网络或互联网的任何地方,都无需重新配置任何内容。另一个优势是,一旦您配置了一个 DHCP 地址池,您就不需要做太多维护工作。您将需要确定哪种租约持续时间最适合您的用户。我见过的租约持续时间范围从 24 小时到 30 天不等。我没有特别偏爱,但如果您使用长租约(超过几天),您可能会偶尔需要通过删除重复、过期的租约等来进行一些清理工作。DHCP 应该在自身之后进行清理,但并非总是如此。
是否使用静态 IP 地址分配、DHCP 或两者混合取决于您个人对 IP 地址管理的偏好。您仍然可以使用纯 DHCP 方案,并通过输入 MAC 地址保留 IP 地址,使其静态分配。唯一的问题是如果您更改了网络接口卡(NIC),您必须记住使用新 NIC 的 MAC 地址更新 DHCP 预留列表。
Tip
如果更改网络接口卡(NIC 或适配器)设置,例如从 DHCP 更改为静态 IP 地址,则需要重新启动适配器才能使这些更改生效。通过发出以下命令重新启动适配器:
$ sudo ifdown *adapter_name*
$ sudo ifup *adapter_name*
适配器名称因系统而异,但一些示例是 eth0 和 enp0s3。
接下来的部分讨论了将系统放置在网络上的安全相关后果,以及如何在您的系统上应用最佳安全实践。
网络和安全
可以认为两种类型的 Linux 系统是安全的:一个是关闭电源的系统,另一个是开机但未连接到网络的系统。关闭电源的系统免受网络攻击,非网络化系统同样如此。关闭电源的系统唯一的安全漏洞是物理安全性。有人可以物理访问系统,窃取、拆解或损坏它。虽然非网络化系统在本章开头提到过,仍然有一定的用处,但除了单个操作员之外的用途有限。
一旦您将系统网络化,就暴露于网络攻击之下。恶意行为者不断扫描 IP 地址范围,寻找可利用的易受攻击系统。尽管许多服务器通过非军事区(DMZ)暴露在互联网上,或者位于企业或家庭防火墙保护的网络内部,它们仍然容易受到攻击。一旦进入您的网络,恶意行为者可以对所有连接的系统执行自动扫描,寻找漏洞。
此外,在您的系统上创建用户账户会降低安全性,因为密码弱、存在路径攻击的潜在风险,以及社会工程学攻击可能会向恶意行为者泄露其凭据。
由于这些原因,管理员必须采取以下措施:
-
仅授予用户必要的工作权限(最小特权原则)
-
强制执行强密码、密钥或多因素认证的安全策略
-
定期打补丁和更新系统
-
对所有系统、网络设备和访问企业资源的设备定期进行安全审计
为网络连接准备系统
当系统管理员为新系统提供配置并将其安装到机架中时,插入网络电缆或将虚拟机连接到虚拟网络是标准做法。我们经常依赖他人来审查系统的功能、目的和安全选项。然而,并非总是如此。新系统安装通常是通过从准备好的操作系统镜像中提供“标准构建”自动执行的,这些镜像可能已有几个月或几年之久。使用旧镜像是一种糟糕的安全实践。如果在系统完全更新和安全保护之前立即将其连接到网络,则在正式开始在网络上执行常规任务之前,它可能会容易受到攻击和妥协。
一个解决方案是在私有网络上为新系统提供配置,这样它们可以从内部仓库接收更新、补丁和安全配置,然后再放入生产网络中。
修剪您的系统
精简意味着从系统中删除任何不必要的服务和守护程序。没有必要通过运行生产系统中没有人使用但可能使系统容易受攻击的多个服务来给自己制造问题。只安装您需要为用户或其他系统提供服务的内容。
至少,您需要在系统上运行 SSH 守护程序,以便远程登录和管理系统。如果发现某些用户需要的特殊服务仅偶尔使用,或者使系统处于不太安全状态,则在需要时打开服务,不再使用时关闭,或将服务放置在只能从受限制的系统访问的安全网络上。
安全的网络守护程序
确定安装和支持哪些网络守护程序通常很容易,因为每次构建系统时您都知道系统的预期用途。如果是 Web 服务器,您知道会安装诸如 Apache 或 NGINX 之类的 Web 服务。如果系统是数据库服务器,则会安装 MySQL、MariaDB 或其他一些数据库软件。问题在于,为了使系统有用,必须暴露其服务的相应 TCP 端口。这些网络守护程序容易受到攻击,因此必须加以保护。
保护网络守护程序和服务有多种方法,但安装所需提供的服务的安全版本是最简单的方法。例如,如果您的新系统是 DNS 服务器,请使用 DNSSEC。如果配置轻量级目录访问协议(LDAP)服务器,请使用 LDAPS。对于通过证书保护的 Web 服务器,请始终使用 HTTPS。表格 5-1 显示了安全服务的部分列表。
表格 5-1. 安全服务示例
| Protocol | Port | 描述 |
|---|---|---|
| https | 443/tcp | TLS/SSL 上的 HTTP 协议 |
| https | 443/udp | TLS/SSL 上的 HTTP 协议 |
| ldaps | 636/tcp | SSL 上的 LDAP |
| ldaps | 636/udp | SSL 上的 LDAP |
| imaps | 993/tcp | SSL 上的 IMAP |
| imaps | 993/udp | SSL 上的 IMAP |
| pop3s | 995/tcp | SSL 上的 POP-3 |
| pop3s | 995/udp | SSL 上的 POP-3 |
使用安全协议和加密并不能保证安全性,但比起使用没有加密的非安全协议要好得多。即使是安全的应用程序和协议也经常会出现漏洞。保持系统更新和打补丁有助于防止安全漏洞。安全补丁通常在造成广泛破坏之前就可用,但并非总是如此,因此您必须保持警惕以维护安全性。
安全外壳守护程序
几乎每个 Linux 系统上都有的最常见的网络守护程序是安全外壳(SSH)守护程序。SSH 通过网络为 Linux 系统提供安全(加密)连接。尽管 SSH 守护程序(SSHD)通过其加密通道具有内置安全性,但其通信仍然容易受到攻击。有多种方法可以增强 SSH 的安全性,以减少攻击者的成功几率。
限制从特定主机访问 SSHD
管理员可以使用两个文件来限制对任何守护程序的访问:/etc/hosts.allow和/etc/hosts.deny。它们不需要服务重启,因为它们不是配置文件,系统在每次客户端访问服务时检查它们。/etc/hosts.allow文件比/etc/hosts.deny文件更重要,因为其设置会覆盖后者的设置。
显示了一个允许从单个 IP 地址(192.168.1.50)启用 SSH 连接的/etc/hosts.allow文件条目:
sshd: 192.168.1.50
sshd: ALL: DENY
此条目仅接受来自 192.168.1.50 的 SSH 连接,并拒绝来自所有其他 IP 地址的连接。如果您发现在/etc/hosts.allow中设置这样的条目对您无效,则需要使用以下命令检查sshd中的tcp_wrapper集成:
$ sudo ldd /path/to/binary | grep libwrap
如果未收到响应,则您的sshd未启用tcp_wrappers,并且可能已被您的发行版淘汰。很遗憾,这在许多打包的sshd安装中是这样的。您希望看到的响应类似于以下内容:
$ sudo ldd /usr/sbin/sshd | grep libwrap
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007fc6c2ab2000)
如果您的sshd不支持tcp_wrappers,您有三个选项:
-
使用其他方法保护
sshd(firewall规则,iptables,nftables)。 -
使用启用了
tcp_wrappers的openssh_server进行编译。 -
查找并替换您当前的
sshd为已启用tcp_wrappers的openssh_server软件包。
为了为firewalld、iptables和nftables提供选项,请考虑执行以下命令,这些命令执行与将条目添加到/etc/hosts.allow和/etc/hosts.deny相似的功能。
实施firewalld规则
如果您使用firewalld,首先从firewalld的规则中删除ssh服务:
$ sudo firewall-cmd --permanent --remove-service=ssh
添加一个新的zone,而不是使用默认的zone:
$ sudo firewall-cmd --permanent --new-zone=SSH_zone
$ sudo firewall-cmd --permanent --zone=SSH_zone --add-source=192.168.1.50
$ sudo firewall-cmd --permanent --zone=SSH_zone --add-service=ssh
必须重新加载firewall以使新配置生效:
$ sudo firewall-cmd --reload
如果您使用iptables,可以使用单个命令将ssh访问限制为单个 IP 地址:
$ sudo iptables -A INPUT -p tcp -s 192.168.1.50 --dport 22 -j ACCEPT
对于 netfilter(nft),您可以添加一个新的rule:
$ sudo nft insert rule ip filter input ip saddr 192.168.1.50 tcp dport 22 accept
但是,如果您收到以下错误消息,则必须为规则创建新表和链,或使用现有链:
Error: Could not process rule: No such file or directory.
使用以下命令创建一个名为input的新表和链:
$ sudo nft add table ip filter # create table
# next, create chain
$ sudo nft add chain ip filter input { type filter hook input priority 0\; }
$ sudo nft insert rule ip filter input ip saddr 192.168.1.50 tcp dport 22 accept
注意链名区分大小写。例如,如果您使用了现有的输入链INPUT,您将不会收到错误:
$ sudo nft insert rule ip filter INPUT ip saddr 192.168.1.50 tcp dport 22 accept
在进行更改后重新启动nftables:
$ sudo systemctl restart nftables
nftables 系统取代了 iptables,并将 iptables、ip6tables、arptables 和 ebtables 的功能合并到一个单一的实用程序中。您可以在 netfilter 主页 上了解更多关于 nftables 的信息。
您现在有多种方法可以限制 SSH 守护进程从随机主机的访问。如果不想单独指定特定 IP 地址,您可以使用 192.168.1.0/24 代替单个 IP 地址来隔离目标系统。
注意
注意,如果从整个子网打开访问权限,仍可能使您的系统处于显著的危险中,如果入侵者渗入您的网络。理想情况下,您应该将访问限制在一到两台主机上,以便日志和监控系统更容易检测到入侵。
您还可以通过修改 /etc/ssh/sshd_config 文件来配置 SSH 守护进程,限制对特定用户的访问。您必须阻止根用户使用 SSH。您将在下一节学习如何防止根用户通过 SSH 访问。
拒绝根用户通过 SSH 访问
安装后,您应该禁止根用户通过 SSH 访问。一些 Linux 系统默认禁止根用户通过 SSH 登录,而其他系统允许此操作。根用户绝不能通过 SSH 登录任何系统。普通用户应通过 SSH 登录,然后成为根用户或使用 sudo 命令以根用户身份执行任务。
您需要检查 /etc/ssh/sshd_config 中的以下行:
PermitRootLogin yes
将 yes 改为 no,然后重新启动 SSH 服务:
$ sudo systemctl restart sshd
根用户不能通过 SSH 登录。根用户可以直接登录控制台。
使用密钥而不是密码进行身份验证
密码认证是验证用户身份最不安全的方法。使用密钥文件更安全和高效。您必须对 /etc/ssh/sshd_config 文件进行以下更改,并重新启动 sshd 以使新配置生效:
PasswordAuthentication yes
将 yes 改为 no,然后查找以下两个条目,确保它们被取消注释并设置如下所示:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
重新启动 sshd 以启用新的设置:
$ sudo systemctl restart sshd
在客户端(本地系统)上,用户需要执行以下操作来设置密钥对认证。本示例适用于用户 tux,远程目标系统为 192.168.1.99:
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tux/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/tux/.ssh/id_rsa.
Your public key has been saved in /home/tux/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:NVweugZXvDitzl0JGypcWTJOww/F54vmHUbX7r4U2LQ tux@server1
The key's randomart image is:
+---[RSA 2048]----+
| . += |
| .B=+.. |
| .o*@.+ ..|
| +*o* * +|
| .S.o+ B E |
| o.o + * o|
| + + + + |
| o o o .|
| oo|
+----[SHA256]-----+
将生成的密钥复制到远程主机:
$ ssh-copy-id tux@192.168.1.99
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/tux/...
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to f...
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are ...
tux@192.168.1.99's password:
Number of key(s) added: 1
现在尝试使用 ssh tux@192.168.1.99 登录目标系统,并确保只有您想要的密钥存在于目标系统上:
$ ssh tux@192.168.1.99
Last login: Sun Sep 26 13:48:19 2021 from 192.168.0.10
[tux@server1 ~]$
用户 tux 已成功使用安全密钥对而非密码登录到远程主机 server1 (192.168.1.99)。
远程连接:客户端到服务器
当连接到安全协议服务时,您的客户端软件与服务守护进程在安全通道上通信。您无需让用户执行任何特殊操作来在客户端和服务守护进程之间协商安全通信链接。
让客户端软件保持更新就像让您作为管理员更新服务器软件一样重要。我建议您在每个用户系统上设置cron任务来自动下载和安装更新,并配置每个新系统以接收定期更新,无需用户交互。请确保将任何必需的重新启动安排在夜间或用户系统处于空闲状态时进行。
总结
在本章中,您学习了为您的网络选择 IP 地址方案以及静态和动态选项的一些优缺点。您现在还了解了将系统连接到您的网络的安全影响。您应该了解到安全漏洞的危险以及如何尽可能通过实施一些良好的安全实践来预防安全漏洞,例如使用安全协议、关闭不必要的服务和守护程序,并保持系统的补丁和更新。
在下一章中,您将学习如何通过软件包管理器安装软件,更新系统,并从源代码安装软件。
第六章:安装和卸载软件
安装和卸载软件是基本的系统管理员任务。你可能不会每天执行这些任务,但这些是你和你的团队需要完成的常规任务。通常情况下,你会安装更新,这可以自动化进行。任何新安装的软件都应附有业务正当性、变更控制记录,并且从请求方获取的安全影响的书面理解(如果有的话)。安装已知存在漏洞的软件是恶意行为者侵入系统的一条简单路径。
卸载软件同样需要变更控制记录,因为移除某些其他关键系统或服务功能所需的包、目录或库可能会造成潜在危险。
有三种软件安装方法:使用包管理器从软件仓库安装、下载到本地文件系统的单独软件包安装,以及编译源代码。本章涵盖了这三种方法。卸载软件有两种标准方法:使用包管理工具和在编译软件情况下使用卸载过程。第三种非标准的卸载方法是通过移除目录、库和二进制文件手动卸载软件。
手动卸载软件是只有高级系统管理员才能执行的繁琐任务。本章的各节将教会你如何通过特定方法安装软件,然后使用相同方法卸载软件。
在讨论安装和卸载软件之前,我将向你展示如何更新你的系统。因为更新如此重要,值得优先讨论,并且你应在执行其他任务之前更新系统,因为更新系统的价值很高。在排查问题时,应始终更新系统,以检查简单的更新是否解决了你的问题。快速的系统更新可能会减轻需移除或安装新软件来解决问题的需求。
注意
本章中的所有演示和示例均使用 CentOS 8.3(server1)和 Ubuntu Server 20.04 LTS(server2)。我首先在 server1 上执行所有任务,然后在 server2 上执行,并注意两个系统之间的任何差异。示例中使用的软件包是 Lynx,一个轻量级的基于文本的浏览器。
更新你的系统
我在本书中多次提到保持系统更新。这是一个重要的任务要记住。这应该是你的首要任务之一。更新是标准维护的一部分。许多系统管理员每周应用更新,这是一个良好的做法。但在需要时不要犹豫去应用补丁、更新和升级,以减轻漏洞的影响。安全是你的首要任务。接下来的两节说明了如何向你的系统应用更新。
应用基于 Red Hat Enterprise Linux 的系统更新
基于 Red Hat Enterprise Linux 的系统使用 YUM/DNF 实用程序来维护来自仓库的更新和软件安装。来自官方 Red Hat 文档:
YUM/DNF(yum/dnf)是获取、安装、删除、查询和管理来自官方 Red Hat 软件仓库以及其他第三方仓库的 Red Hat Enterprise Linux RPM 软件包的主要工具。YUM/DNF 用于 Red Hat Enterprise Linux 5 及更新版本。
DNF 是这个实用程序的最新版本,所以我已将两者结合起来。根据文档,DNF 是 YUM 的第四版,是从 Red Hat Enterprise Linux 版本 8 开始使用的工具。要开始更新,请发出yum或dnf命令:
$ sudo yum update
Last metadata expiration check: 1:52:37 ago on Sun 07 Nov 2021 07:14:51 PM CST.
Dependencies resolved.
=================================================================================
Package Architecture Version Repository Size
=================================================================================
Installing:
kernel x86_64 4.18.0... baseos 5.9 M
kernel-core x86_64 4.18.0... baseos 36 M
kernel-modules x86_64 4.18.0... baseos 28 M
Upgrading:
NetworkManager x86_64 1:1.30... baseos 2.6 M
NetworkManager-config-server noarch 1:1.30... baseos 129 k
NetworkManager-libnm x86_64 1:1.30... baseos 1.8 M
NetworkManager-team x86_64 1:1.30... baseos 146
Removing:
kernel x86_64 4.18.0... @BaseOS 0
kernel-core x86_64 4.18.0... @BaseOS 60 M
kernel-modules x86_64 4.18.0... @BaseOS 20 M
Transaction Summary
=================================================================================
Install 21 Packages
Upgrade 256 Packages
Remove 3 Packages
Total download size: 404 M
Is this ok [y/N]:
同意在此安装,以便将您的目标软件包升级到最新的稳定版本。为了自动化后续更新,使用-y选项来回答任何提示时选择“是”。以下演示了如何在dnf命令中使用-y选项:
$ sudo dnf -y update
这将自动接受安装而不会与您进行交互。这是在脚本中使用的一个很好的选择。接下来的部分将为您提供在基于 Debian 的系统上进行等效更新操作的方法。
应用基于 Debian 的系统更新
对于基于 Debian 的系统,您可以使用类似于 Red Hat Enterprise Linux 系统中使用的 DNF 命令的命令来应用更新,使用 Debian 的apt实用程序,如下所示。如果您的系统需要更新,您也将收到类似的响应。
$ sudo apt update
如果您的系统不需要更新,apt的响应将类似于以下内容:
Hit:1 http://us.archive.ubuntu.com/ubuntu focal InRelease
Get:2 http://us.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB]
Get:4 http://us.archive.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Fetched 328 kB in 52s (6,311 B/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
对于补丁、安全更新或应用程序版本升级没有特别的更新命令;此单一命令将处理所有类型或优先级的更新。您的系统将从所有配置的仓库检查更新,并在可用时应用它们。定期每周或更频繁地检查更新,并在计划的维护时间窗口内应用更新或根据关键的安全更新需要进行应用,是一种良好的做法。
本章的其余部分侧重于根据您的用户、管理或其他来源的按需服务请求安装软件。
从仓库安装软件
从仓库安装软件是在 Linux 系统上安装软件的最简单方法。之所以它是最简单的方法,是因为仓库会自动满足您的依赖关系,您无需做任何事情,只需请求安装。例如,如果您想在系统上安装 Apache HTTP 服务器,则需要满足几个依赖项才能安装。仓库包含所有依赖包,根据需要调用并安装它们以支持您的主要软件包。我将使用基于文本的 Lynx 浏览器进行以下安装演示。
安装一个应用程序
在 CentOS 系统中,输入以下命令:
$ sudo yum install lynx
Last metadata expiration check: 1:00:58 ago on Fri 05 Nov 2021 10:50:41 AM CDT.
No match for argument: lynx
Error: Unable to find a match: lynx
如果你收到此错误,意味着该软件包,比如lynx在这种情况下,不以该名称存在。你需要搜索软件包名称或包含你所需软件包的存储库。例如,我必须执行以下步骤来安装lynx:
$ sudo dnf install dnf-plugins-core
这安装了三个软件包:dnf-plugins-core、python3-dnf-plugins-core和yum-utils。然后,使用以下命令来启用 PowerTools 存储库,其中包含lynx:
$ sudo dnf config-manager --set-enabled powertools
现在,继续安装lynx及其依赖项:
$ sudo dnf install lynx
CentOS Linux 8 - PowerTools 2.4 kB/s | 2.4 MB 16:50
Last metadata expiration check: 0:14:39 ago on Fri 05 Nov 2021 12:09:08 PM CDT.
Dependencies resolved.
=================================================================================
Package Architecture Version Repository Size
=================================================================================
Installing:
lynx x86_64 2.8.9-2.el8 powertools 1.6 M
Installing dependencies:
centos-indexhtml noarch 8.0-0.el8 baseos 246 k
Transaction Summary
=================================================================================
Install 2 Packages
Total download size: 1.8 M
Installed size: 6.5 M
Is this ok [y/N]:
同意安装以继续:
Is this ok [y/N]: y
Downloading Packages:
(1/2): lynx-2.8.9-2.el8.x86_64.rpm 208 kB/s | 1.6 MB 00:07
(2/2): centos-indexhtml-8.0-0.el8.noarch.rpm 30 kB/s | 246 kB 00:08
---------------------------------------------------------------------------------
Total 207 kB/s | 1.8 MB 00:09
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : centos-indexhtml-8.0-0.el8.noarch 1/2
Installing : lynx-2.8.9-2.el8.x86_64 2/2
Running scriptlet: lynx-2.8.9-2.el8.x86_64 2/2
Verifying : centos-indexhtml-8.0-0.el8.noarch 1/2
Verifying : lynx-2.8.9-2.el8.x86_64 2/2
Installed:
centos-indexhtml-8.0-0.el8.noarch lynx-2.8.9-2.el8.x86_64
Complete!
这个过程安装了 Lynx 应用程序及其依赖项centos-indexhtml。
在 Ubuntu 系统上,输入以下命令:
$ sudo apt install lynx
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libidn11 lynx-common
The following NEW packages will be installed:
libidn11 lynx lynx-common
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,586 kB of archives.
After this operation, 5,731 kB of additional disk space will be used.
Do you want to continue? [Y/n]
注意两个依赖项:libidn11 和 lynx-common。系统会先安装这些依赖项,然后再安装目标软件包。继续回答提示时输入是 (y) :
Do you want to continue? [Y/n] y
Get:1 http://us.archive.ubuntu.com/ubuntu focal/main amd64 libidn11 amd64 1.33...
Get:2 http://us.archive.ubuntu.com/ubuntu focal/universe amd64 lynx-common all...
Get:3 http://us.archive.ubuntu.com/ubuntu focal/universe amd64 lynx amd64 2.9....
Fetched 1,586 kB in 4min 29s (5,890 B/s)
Selecting previously unselected package libidn11:amd64.
(Reading database ... 107982 files and directories currently installed.)
Preparing to unpack .../libidn11_1.33-2.2ubuntu2_amd64.deb ...
Unpacking libidn11:amd64 (1.33-2.2ubuntu2) ...
Selecting previously unselected package lynx-common.
Preparing to unpack .../lynx-common_2.9.0dev.5-1_all.deb ...
Unpacking lynx-common (2.9.0dev.5-1) ...
Selecting previously unselected package lynx.
Preparing to unpack .../lynx_2.9.0dev.5-1_amd64.deb ...
Unpacking lynx (2.9.0dev.5-1) ...
Setting up libidn11:amd64 (1.33-2.2ubuntu2) ...
Setting up lynx-common (2.9.0dev.5-1) ...
Setting up lynx (2.9.0dev.5-1) ...
update-alternatives: using /usr/bin/lynx to provide /usr/bin/www-browser ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for mime-support (3.64ubuntu1) ...
apt软件包管理器安装了lynx软件包及其依赖项。这就是从存储库安装的全部内容。使用软件包安装程序命名你想要安装的应用程序软件包,软件包管理器会为你处理一切。在下一节中,你将学习如何卸载软件包。
卸载应用程序
以下是在基于 Red Hat Enterprise Linux 系统上使用软件包管理器卸载目标软件包的简单过程。Red Hat 包管理器rpm用于安装、卸载和查询各个软件包及其依赖关系。选项-e用于从系统中擦除(移除)目标软件包。接下来你将看到,当移除软件包时没有错误时,系统不会给出任何响应。autoremove步骤会自动删除未使用的依赖项。你的系统可能有多个未使用的依赖项。通常情况下可以安全地移除它们。
$ sudo rpm -e lynx
$ sudo dnf autoremove
Last metadata expiration check: 0:31:32 ago on Fri 05 Nov 2021 01:52:28 PM CDT.
Dependencies resolved.
=================================================================================
Package Architecture Version Repository Size
=================================================================================
Removing:
centos-indexhtml noarch 8.0-0.el8 @baseos 505 k
Transaction Summary
=================================================================================
Remove 1 Package
Freed space: 505 k
Is this ok [y/N]: y
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Erasing : centos-indexhtml-8.0-0.el8.noarch 1/1
Verifying : centos-indexhtml-8.0-0.el8.noarch 1/1
Removed:
centos-indexhtml-8.0-0.el8.noarch
Complete!
这个过程移除了lynx软件包及其依赖项centos-indexhtml。
以下过程使用 Ubuntu 的apt和purge选项:
$ sudo apt purge lynx
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
libidn11 lynx-common
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
lynx*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 1,992 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 108095 files and directories currently installed.)
Removing lynx (2.9.0dev.5-1) ...
(Reading database ... 108082 files and directories currently installed.)
Purging configuration files for lynx (2.9.0dev.5-1) ...
purge选项会移除lynx软件包但不会移除依赖项。如前所示的输出,你必须运行sudo apt autoremove来从系统中擦除这些文件。如果你使用remove选项,那么apt仅会从系统中移除二进制文件,而保留配置文件和其他文件不变。在下一节中,你将学习如何使用系统的软件包管理器安装和卸载单个软件包。
安装和卸载单个软件包
你需要从其他来源获取软件包,如供应商网站、GitHub 和 SourceForge,这些软件包不属于任何存储库。你必须在命令行手动安装这些单独的软件包。而不是使用存储库命令来安装这些软件包,你可以使用本地软件包管理器工具,如rpm和dpkg。
提示
在尝试安装目标软件包之前,请确保阅读任何附带的文档。检查依赖项、配置以及任何安全警告。您需要先满足依赖关系,然后再安装目标软件包。
手动安装单个软件包
本节中的示例使用 downloadonly 选项从仓库下载而不安装软件包,以简化演示中软件包的定位。软件包的来源无关紧要,只要您已将它们下载到系统并在命令行手动安装即可。
在 CentOS 系统上,输入以下命令:
$ sudo dnf --downloadonly install lynx
Last metadata expiration check: 0:20:15 ago on Sat 06 Nov 2021 08:11:31 AM CDT.
Dependencies resolved.
=================================================================================
Package Architecture Version Repository Size
=================================================================================
Installing:
lynx x86_64 2.8.9-2.el8 powertools 1.6 M
Installing dependencies:
centos-indexhtml noarch 8.0-0.el8 baseos 246 k
Transaction Summary
=================================================================================
Install 2 Packages
Total download size: 1.8 M
Installed size: 6.5 M
DNF will only download packages for the transaction.
Is this ok [y/N]:y
Downloading Packages:
(1/2): lynx-2.8.9-2.el8.x86_64.rpm 287 kB/s | 1.6 MB 00:05
(2/2): centos-indexhtml-8.0-0.el8.noarch.rpm 37 kB/s | 246 kB 00:06
---------------------------------------------------------------------------------
Total 252 kB/s | 1.8 MB 00:07
Complete!
The downloaded packages were saved in cache until the next successful transact...
You can remove cached packages by executing 'dnf clean packages'.
使用此方法下载软件包时,它们存储在 /var/cache/dnf 目录的子目录中。软件包下载到的子目录取决于软件包的来源仓库。例如,在我的 CentOS 系统中,软件包可以下载到以下任何一个位置:
/var/cache/dnf/appstream-a520ed22b0a8a736
/var/cache/dnf/AppStream-a520ed22b0a8a736
/var/cache/dnf/baseos-929b586ef1f72f69
/var/cache/dnf/BaseOS-929b586ef1f72f69
/var/cache/dnf/epel-6519ee669354a484
/var/cache/dnf/epel-modular-95d9a0c53e492cbd
/var/cache/dnf/extras-2770d521ba03e231
/var/cache/dnf/powertools-25a6a2b331e53e98
在此示例中,lynx 包下载到 /var/cache/dnf/powertools-25a6a2b331e53e98/packages,而 centos-indexhtml 下载到 /var/cache/dnf/baseos-929b586ef1f72f69/packages。
我将首先尝试安装 lynx 包,但会因为依赖于 centos-indexhtml 包而失败:
$ sudo rpm -i lynx-2.8.9-2.el8.x86_64.rpm
error: Failed dependencies:
redhat-indexhtml is needed by lynx-2.8.9-2.el8.x86_64
注意
由于 CentOS 是与 Red Hat Enterprise Linux 兼容的二进制分发,我们的 centos-indexhtml 包相当于 redhat-indexhtml 包。它将正常工作,因为包名称是类似的。
根据前面的错误提示,首先安装 centos-indexhtml 包,然后再安装 lynx 包:
$ sudo rpm -i centos-indexhtml-8.0-0.el8.noarch.rpm
该软件包安装时没有错误:
$ sudo rpm -i lynx-2.8.9-2.el8.x86_64.rpm
lynx 包已成功安装。rpm 开关 (-i) 的意思是 install。
对于 Ubuntu 系统,手动下载和安装过程如下:
$ sudo apt install --download-only lynx
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libidn11 lynx-common
The following NEW packages will be installed:
libidn11 lynx lynx-common
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 960 kB/1,586 kB of archives.
After this operation, 5,731 kB of additional disk space will be used.
Do you want to continue? [Y/n]y
Get:1 http://us.archive.ubuntu.com/ubuntu focal/main amd64 libidn11 amd64 1.33...
Get:2 http://us.archive.ubuntu.com/ubuntu focal/universe amd64 lynx-common all...
Get:2 http://us.archive.ubuntu.com/ubuntu focal/universe amd64 lynx-common all...
Fetched 214 kB in 2min 24s (1,491 B/s)
Download complete and in download only mode
在 Ubuntu 等基于 Debian 的系统上,通过这种方式下载的文件存储在 /var/cache/apt/archives 中,格式为 .deb 包,您可以从该位置安装它们。请注意,apt 实用程序对话框显示软件包将被安装,但最终消息“Download complete and in download only mode”表示软件包已下载但未安装。在以下示例中,我尝试安装 lynx 并忽略与其一同下载的依赖项:
$ sudo dpkg -i lynx_2.9.0dev.5-1_amd64.deb
Selecting previously unselected package lynx.
(Reading database ... 108026 files and directories currently installed.)
Preparing to unpack lynx_2.9.0dev.5-1_amd64.deb ...
Unpacking lynx (2.9.0dev.5-1) ...
dpkg: dependency problems prevent configuration of lynx:
lynx depends on libidn11 (>= 1.13); however:
Package libidn11 is not installed.
lynx depends on lynx-common; however:
Package lynx-common is not installed.
dpkg: error processing package lynx (--install):
dependency problems - leaving unconfigured
Errors were encountered while processing:
lynx
系统不允许您在没有与 lynx 同一目录中下载的依赖项的情况下安装:
$ ls -1 /var/cache/apt/archives
libidn11_1.33-2.2ubuntu2_amd64.deb
lynx_2.9.0dev.5-1_amd64.deb
lynx-common_2.9.0dev.5-1_all.deb
首先安装依赖项,然后再安装 lynx:
$ sudo dpkg -i libidn11_1.33-2.2ubuntu2_amd64.deb
Selecting previously unselected package libidn11:amd64.
(Reading database ... 108039 files and directories currently installed.)
Preparing to unpack libidn11_1.33-2.2ubuntu2_amd64.deb ...
Unpacking libidn11:amd64 (1.33-2.2ubuntu2) ...
Setting up libidn11:amd64 (1.33-2.2ubuntu2) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) …
$ sudo dpkg -i lynx-common_2.9.0dev.5-1_all.deb
Selecting previously unselected package lynx-common.
(Reading database ... 108044 files and directories currently installed.)
Preparing to unpack lynx-common_2.9.0dev.5-1_all.deb ...
Unpacking lynx-common (2.9.0dev.5-1) ...
Setting up lynx-common (2.9.0dev.5-1) ...
Processing triggers for mime-support (3.64ubuntu1) ...
Processing triggers for man-db (2.9.1-1) ...
$ sudo dpkg -i lynx_2.9.0dev.5-1_amd64.deb
(Reading database ... 108136 files and directories currently installed.)
Preparing to unpack lynx_2.9.0dev.5-1_amd64.deb ...
Unpacking lynx (2.9.0dev.5-1) over (2.9.0dev.5-1) ...
Setting up lynx (2.9.0dev.5-1) ...
update-alternatives: using /usr/bin/lynx to provide /usr/bin/www-browser ...
dpkg 命令的 -i 开关表示安装,就像 rpm 实用程序一样。接下来,我们将手动卸载相同的软件包。
卸载单个软件包
要卸载手动安装的软件包,您必须反向进行。这意味着您需要按照安装顺序的相反顺序进行卸载,即首先卸载所有依赖项,然后再卸载软件包本身。如果存在依赖项,系统会指示您它们是哪些。
在 CentOS 系统上,输入以下命令:
$ sudo rpm -e centos-indexhtml
error: Failed dependencies:
redhat-indexhtml is needed by (installed) lynx-2.8.9-2.el8.x86_64
$ sudo rpm -e lynx
$ sudo rpm -e centos-indexhtml
您已成功卸载 lynx 及其依赖项 centos-indexhtml。
在 Ubuntu 系统上,当您尝试卸载手动安装的软件包时,不会有关于依赖关系的警告。要在 Ubuntu 上卸载 Lynx,有三个软件包,lynx 和其两个依赖项:libidn11 和 lynx-common。
查看在尝试从 Ubuntu 系统中分别卸载 lynx 及其依赖项时的差异。这里展示了三个分开的命令,演示了使用不同命令时如何移除或不移除软件包和依赖项。我在这个演示中对每个命令都选择了否 (n):
$ sudo apt purge lynx
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
lynx*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 1,992 kB disk space will be freed.
Do you want to continue? [Y/n]
$ sudo apt purge lynx-common
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
lynx* lynx-common*
0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded.
After this operation, 5,481 kB disk space will be freed.
Do you want to continue? [Y/n]
$ sudo apt purge libidn11
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
libidn11* lynx*
0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded.
After this operation, 2,242 kB disk space will be freed.
Do you want to continue? [Y/n]
如果只移除系统上的 lynx,lynx_common 和 libidn11 将被保留。执行命令 sudo apt autoremove 不会像在从仓库安装 Lynx 时那样移除未使用的依赖项。接下来的部分描述了如何查找特定软件包的依赖关系。
查找软件包依赖关系
在安装之前了解软件包的依赖关系很有帮助。以下是在基于 Red Hat Enterprise Linux 的系统上查找它们的方法:
$ dnf deplist lynx
CentOS Linux 8 - AppStream 37 kB/s | 9.6 MB 04:28
CentOS Linux 8 - BaseOS 39 kB/s | 8.5 MB 03:44
CentOS Linux 8 - Extras 7.8 kB/s | 10 kB 00:01
CentOS Linux 8 - PowerTools 121 kB/s | 2.4 MB 00:20
Extra Packages for Enterprise Linux Modular 8 - x86_64 20 kB/s | 955 kB 00:48
Extra Packages for Enterprise Linux 8 - x86_64 29 kB/s | 11 MB 06:08
package: lynx-2.8.9-2.el8.x86_64
dependency: libc.so.6(GLIBC_2.15)(64bit)
provider: glibc-2.28-151.el8.x86_64
dependency: libcrypto.so.1.1()(64bit)
provider: openssl-libs-1:1.1.1g-15.el8_3.x86_64
dependency: libcrypto.so.1.1(OPENSSL_1_1_0)(64bit)
provider: openssl-libs-1:1.1.1g-15.el8_3.x86_64
dependency: libdl.so.2()(64bit)
provider: glibc-2.28-151.el8.x86_64
dependency: libncursesw.so.6()(64bit)
provider: ncurses-libs-6.1-7.20180224.el8.x86_64
dependency: libssl.so.1.1()(64bit)
provider: openssl-libs-1:1.1.1g-15.el8_3.x86_64
dependency: libssl.so.1.1(OPENSSL_1_1_0)(64bit)
provider: openssl-libs-1:1.1.1g-15.el8_3.x86_64
dependency: libtinfo.so.6()(64bit)
provider: ncurses-libs-6.1-7.20180224.el8.x86_64
dependency: libz.so.1()(64bit)
provider: zlib-1.2.11-17.el8.x86_64
dependency: redhat-indexhtml
provider: centos-indexhtml-8.0-0.el8.noarch
dependency: rtld(GNU_HASH)
provider: glibc-2.28-151.el8.i686
provider: glibc-2.28-151.el8.x86_64
正如本章前面提到的,系统已安装了大多数所需的依赖项。所需的 centos-indexhtml 并没有特别突出。我知道的唯一方法是尝试安装目标软件包以隔离系统所需的任何依赖项。
以下清单展示了在 Ubuntu 系统上执行相同依赖列表查询的过程:
$ sudo apt show lynx
Package: lynx
Version: 2.9.0dev.5-1
Priority: extra
Section: universe/web
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Lynx Packaging Team <pkg-lynx-maint@lists.aliot...
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 1,992 kB
Provides: news-reader, www-browser
Depends: libbsd0 (>= 0.0), libbz2-1.0, libc6 (>= 2.15), libgnutls30 (>= 3.6.12...
Recommends: mime-support
Conflicts: lynx-ssl
Breaks: lynx-cur (<< 2.8.9dev8-2~), lynx-cur-wrapper (<< 2.8.8dev.8-2)
Replaces: lynx-cur (<< 2.8.9dev8-2~), lynx-cur-wrapper (<< 2.8.8dev.8-2)
Homepage: https://lynx.invisible-island.net/
Download-Size: 626 kB
APT-Manual-Installed: yes
APT-Sources: http://us.archive.ubuntu.com/ubuntu focal/universe amd64 Packages
Description: classic non-graphical (text-mode) web browser
In continuous development since 1992, Lynx sets the standard for
text-mode web clients. It is fast and simple to use, with support for
browsing via FTP, Gopher, HTTP, HTTPS, NNTP, and the local file system.
如果您是 Linux 纯粹主义者,并且喜欢编译软件以便拥有最大的控制权,下一节演示了如何从源代码安装软件包。
从源代码安装软件
一些系统管理员喜欢从源代码安装所有软件(也称为“源码”),因为这是最灵活的软件安装方法。从源代码安装允许您为特定需求自定义安装。您可以更改安装路径、启用功能、禁用功能,并对应用程序的每个可能的配置选项进行微调。
从源代码安装存在一些缺点。主要的缺点是您必须满足所安装软件的依赖关系。这可能是令人沮丧、耗时和乏味的。我个人曾追踪递归依赖性,直到忘记原本需要安装的应用程序名称为止。另一个缺点是必须在系统上安装一整套开发工具,这将消耗大量磁盘空间。还有一个缺点是,从源代码安装的软件升级到新版本与安装原始版本一样困难和耗时。如果之前的版本没有完全被覆盖或删除,则可能会遇到相当难以解决的版本冲突。
满足前提条件:构建开发环境
在从源代码安装任何应用程序之前,您需要通过安装代码编译器和支持软件来设置开发环境。最简单的方法是从您的 Linux 供应商的存储库安装一组软件包。
对于基于红帽企业 Linux 的系统,使用groupinstall选项并将"Development Tools"标识为安装目标组是最佳选择。不幸的是,此组选择会安装许多不必要且潜在非安全的软件包,用于在命令行编译源代码,例如一系列图形工具。因此,通常希望设置一个专门用于软件开发的特定系统。要创建软件开发系统,请使用以下命令:
$ sudo dnf groupinstall "Development Tools"
Last metadata expiration check: 2:41:45 ago on Sun 07 Nov 2021 09:57:05 AM CST.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Upgrading:
automake noarch 1.16.1-7.el8 appstream 713 k
binutils x86_64 2.30-93.el8 baseos 5.8 M
cpp x86_64 8.4.1-1.el8 appstream 10 M
elfutils-libelf x86_64 0.182-3.el8 baseos 216 k
elfutils-libs x86_64 0.182-3.el8 baseos 293 k
gcc x86_64 8.4.1-1.el8 appstream 23 M
...
xorg-x11-font-utils x86_64 1:7.5-40.el8 appstream 103 k
xorg-x11-fonts-ISO8859-1-100dpi noarch 7.5-19.el8 appstream 1.1 M
xorg-x11-server-utils x86_64 7.7-27.el8 appstream 198 k
zlib-devel x86_64 1.2.11-17.el8 baseos 58 k
zstd x86_64 1.4.4-1.el8 appstream 393 k
Installing weak dependencies:
gcc-gdb-plugin x86_64 8.4.1-1.el8 appstream 117 k
kernel-devel x86_64 4.18.0-305... baseos 18 M
Enabling module streams:
javapackages-runtime 201801
Installing Groups:
Development Tools
Transaction Summary
================================================================================
Install 159 Packages
Upgrade 23 Packages
Total download size: 219 M
Is this ok [y/N]:
在 Ubuntu 系统上,等效安装使用build-essential选项在您的系统上安装所有必要的开发工具:
$ sudo apt install build-essential
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
binutils binutils-common binutils-x86-64-linux-gnu cpp cpp-9 dpkg-dev fakero...
g++ g++-9 gcc gcc-9 gcc-9-base libalgorithm-diff-perl libalgorithm-diff-xs-per...
libasan5 libatomic1 libbinutils libc-dev-bin libc6-dev libcc1-0 libcrypt-dev l...
libctf0 libdpkg-perl libfakeroot libfile-fcntllock-perl libgcc-9-dev libgomp1 ...
libitm1 liblsan0 libmpc3 libquadmath0 libstdc++-9-dev libtsan0 libubsan1 linux...
make manpages-dev
Suggested packages:
binutils-doc cpp-doc gcc-9-locales debian-keyring g++-multilib g++-9-multili...
gcc-multilib autoconf automake libtool flex bison gdb gcc-doc gcc-9-multilib g...
bzr libstdc++-9-doc make-doc
The following NEW packages will be installed:
binutils binutils-common binutils-x86-64-linux-gnu build-essential cpp cpp-9...
fakeroot g++ g++-9 gcc gcc-9 gcc-9-base libalgorithm-diff-perl libalgorithm-di...
libalgorithm-merge-perl libasan5 libatomic1 libbinutils libc-dev-bin libc6-dev...
libcrypt-dev libctf-nobfd0 libctf0 libdpkg-perl libfakeroot libfile-fcntllock-...
libgcc-9-dev libgomp1 libisl22 libitm1 liblsan0 libmpc3 libquadmath0 libstdc++...
libtsan0 libubsan1 linux-libc-dev make manpages-dev
0 upgraded, 41 newly installed, 0 to remove and 0 not upgraded.
Need to get 43.0 MB of archives.
After this operation, 189 MB of additional disk space will be used.
Do you want to continue? [Y/n]
确认安装并继续。安装软件包组可能需要几分钟时间。一旦设置好开发环境,您将需要为 Lynx 下载源代码。从源代码安装的指令对任何 Linux 发行版都是相同的;但是,我将在 CentOS 和 Ubuntu 系统上执行此安装,并注意文本中的任何差异和错误。用户可以下载、编译和制作二进制文件,但只有 root 用户可以将二进制文件安装到系统目录。
下载、解压、编译和安装您的软件
使用诸如wget之类的实用程序下载您的压缩源代码:
$ wget https://invisible-mirror.net/archives/lynx/tarballs/lynx2.8.9rel.1.tar.gz
从压缩存档中提取源代码:
$ tar zxvf lynx2.8.9rel.1.tar.gz
切换到由提取过程创建的lynx源代码树目录中:
$ cd lynx2.8.9rel.1
在运行 configure 之前,请花几分钟查找并阅读通常存在于源代码树中的 README 文件。这个文件包含有关源代码和安装说明的有价值的指导和信息。README 文件通常引用描述安装选项的 INSTALLATION 文件。出于演示目的,我接受所有默认设置,并简单地运行了配置脚本。如果所有依赖项都满足,配置检查将顺利进行,创建 makefile,然后将您退回到您的 shell 提示符。这个过程可能需要几分钟来完成:
$ ./configure
两个配置脚本都因以下错误而失败:
checking for screen type... curses
checking for specific curses-directory... no
checking for extra include directories... no
checking if we have identified curses headers... none
configure: error: No curses header-files found
当你遇到错误时,配置脚本(configure)会停止,但会保留其位置,这样你可以通过再次运行脚本来满足依赖项并继续之前的工作。为了满足当前的依赖关系,我在 CentOS 系统上安装了 ncurses-devel 包(sudo dnf -y install ncurses-devel)。配置脚本成功完成。对于 Ubuntu 系统,我安装了 lib32ncurses-dev 包(sudo apt install lib32ncurses-dev),配置脚本也成功完成。
根据 INSTALLATION 文件,现在您必须运行 make 命令来编译源代码。这个过程将需要几分钟的时间来完成:
$ make
在满足配置脚本中的失败依赖项后,两个编译过程都成功完成。要将 Lynx 安装到正确的位置并设置正确的权限,请运行 sudo make install:
$ sudo make install
/bin/sh -c "P=`echo lynx|sed 's,x,x,'`; \
if test -f /usr/local/bin/$P ; then \
mv -f /usr/local/bin/$P /usr/local/bin/$P.old; fi"
/usr/bin/install -c lynx /usr/local/bin/`echo lynx|sed 's,x,x,'`
/usr/bin/install -c -m 644 ./lynx.man /usr/.../man1/`echo lynx|sed 's,x,x,'`.1
** installing ./lynx.cfg as /usr/local/etc/lynx.cfg
** installing ./samples/lynx.lss as /usr/local/etc/lynx.lss
Use make install-help to install the help-files
Use make install-doc to install extra documentation files
在这一点上,大多数指令建议您运行 make clean 来从系统中删除所有的对象代码和其他临时文件:
$ make clean
rm -f WWW/Library/*/*.[aoib]
rm -f WWW/Library/*/.created
cd ./WWW/Library/Implementation && make DESTDIR="" CC="gcc" clean
make[1]: Entering directory '/home/khess/lynx2.8.9rel.1/.../Implementation'
rm -f core *.core *.leaks *.[oi] *.bak tags TAGS
rm -f dtd_util
rm -f ./*.o
make[1]: Leaving directory '/home/khess/lynx2.8.9rel.1/.../Implementation'
cd ./src && make DESTDIR="" CC="gcc" clean
make[1]: Entering directory '/home/khess/lynx2.8.9rel.1/src'
rm -f lynx core *.core *.leaks *.i *.o *.bak tags TAGS test_*
cd chrtrans && make DESTDIR="" CC="gcc" clean
make[2]: Entering directory '/home/khess/lynx2.8.9rel.1/src/chrtrans'
rm -f makeuctb *.o *uni.h *uni2.h *.i
make[2]: Leaving directory '/home/khess/lynx2.8.9rel.1/src/chrtrans'
make[1]: Leaving directory '/home/khess/lynx2.8.9rel.1/src'
rm -f *.b ./src/lynx *.leaks cfg_defs.h LYHelp.h lint.*
rm -f help_files.sed
rm -f core *.core
运行这个命令是个人喜好问题。如果您需要从系统中删除编译的软件,下一节将引导您完成此过程。
卸载源码安装的软件包
如果你的源代码树中还存在原始的 makefile,你可以相当轻松地卸载一个软件包,但你必须有 makefile 才能这样做。如果你不想为每个编译的程序保留所有的源代码树在你的系统上,那么请备份 makefile,例如将其复制到一个名为 makefile.lynx289r1 或类似的备份目录中。在卸载时,makefile 必须位于你当前的目录中:
$ sudo make uninstall
rm -f /usr/local/bin/`echo lynx|sed 's,x,x,'`
rm -f /usr/local/share/man/man1/`echo lynx|sed 's,x,x,'`.1
rm -f /usr/local/etc/lynx.cfg
rm -f /usr/local/etc/lynx.lss
/bin/sh -c 'if test -d "/usr/local/share/lynx_help" ; then \
WD=`cd "/usr/local/share/lynx_help" && pwd` ; \
TAIL=`basename "/usr/local/share/lynx_help"` ; \
HEAD=`echo "$WD"|sed -e "s,/${TAIL}$,,"` ; \
test "x$WD" != "x$HEAD" && rm -rf "/usr/local/share/lynx_help"; \
fi'
/bin/sh -c 'if test -d "/usr/local/share/lynx_doc" ; then \
WD=`cd "/usr/local/share/lynx_doc" && pwd` ; \
TAIL=`basename "/usr/local/share/lynx_doc"` ; \
HEAD=`echo "$WD"|sed -e "s,/${TAIL}$,,"` ; \
test "x$WD" != "x$HEAD" && rm -rf "/usr/local/share/lynx_doc"; \
fi'
/bin/sh -c 'if test -d "/usr/local/share/lynx_help" ; then \
WD=`cd "/usr/local/share/lynx_help" && pwd` ; \
TAIL=`basename "/usr/local/share/lynx_help"` ; \
HEAD=`echo "$WD"|sed -e "s,/'${TAIL}'$,,"` ; \
test "x$WD" != "x$HEAD" ; \
cd "/usr/local/share/lynx_help" && rm -f COPYING COPYHEADER ; \
fi'
如果你没有你的 makefile 或它不在你当前的目录中,你会收到以下错误:
$ sudo make uninstall
make: *** No rule to make target 'uninstall'. Stop.
如果要重新创建 makefile,请提取与之前使用的相同版本的源代码树,并记住你的配置选项。否则,你可以使用前面卸载的结果来指导手动卸载。
摘要
本章指导你如何从不同来源(仓库、本地软件包文件和源代码)安装软件。你会发现,通过一些练习,安装软件是相当容易的。请记住,保持系统平稳运行和安全的责任在于你。仅仅因为安装软件快捷简单,并不意味着你应该忽视它对系统性能、安全性和磁盘使用的影响。
下一章将教你如何向系统添加磁盘空间。
第七章:管理存储
在本章中,你将学习如何向系统添加存储空间。你将看到如何向系统添加新的磁盘驱动器并使其可用。你还将探索逻辑卷管理器以及如何操作逻辑卷,以及了解磁盘格式化、分区和挂载。
在第一节中,我涵盖了一些与磁盘、文件系统、卷、分区、目录和文件系统挂载相关的一般概念。
管理 Linux 存储
近年来,磁盘空间的价格大幅降低,因此空间不再是一种高价值商品。你可以以每千兆字节几美元的价格购买多 TB 的磁盘。因此,系统管理员很少需要威胁实施磁盘空间配额或其他任意限制。工作站和笔记本电脑通常拥有与服务器一样多的空间,因此空间不再是稀缺资源,管理起来也比几年前容易得多。例如,许多系统管理员现在放弃了像磁带这样的旧备份方法,转而使用更快更便宜的磁盘对磁盘备份。
尽管磁盘空间便宜且充足,系统管理员仍然需要监控用户的磁盘使用情况。你不希望个人在共享磁盘空间或主目录中填满他们的音乐、视频或其他大文件,因为这会浪费公司拥有的空间并延长备份时间。本节讨论与磁盘相关的术语及 Linux 系统管理员如何解释这些术语。如何处理每个条目的具体细节将在本章后面介绍。
磁盘
硬盘(磁盘驱动器)是我们称为硬盘驱动器或硬盘驱动器(HDD)的设备,但磁盘也可以指固态硬盘(SSD)和 USB 闪存驱动器。系统管理员通过内部连接、USB 连接或以太网或光纤电缆等网络技术将整个磁盘提供给 Linux 系统。在 Linux 系统上访问磁盘之前,系统管理员必须将磁盘挂载到一个目录上。例如,要挂载系统标识为/dev/sdd的新磁盘,系统管理员会创建一个新目录,例如/software,并将整个磁盘挂载到该目录或挂载点上:
$ sudo mount /dev/sdd1 /software
磁盘设备 /dev/sdd1 现在挂载在目录 /software 上并且可以访问。
小贴士
整个磁盘设备是/dev/sdd,但初始化磁盘至少需要一个分区,因此如果磁盘/dev/sdd只有一个分区,其名称将为/dev/sdd1。本章后面会详细介绍这个过程。
一旦管理员通过分区并在其上建立文件系统准备好磁盘,用户可以访问提供给他们的空间。
文件系统
文件系统 是操作系统允许进行文件存储和检索的组织结构。文件系统是操作系统用来跟踪磁盘或分区上文件的数据结构。它决定了文件在磁盘上的组织方式。文件系统可以是一个分区或整个磁盘,用来存储文件。
当代 Linux 系统为管理员提供了广泛的文件系统选择,尽管许多系统管理员在创建新分区时仍然选择 ZFS、XFS 或 ext4。还有许多其他适用于特定需求和应用程序的文件系统。
挂载和挂载点
只有根用户或具有sudo权限的用户可以挂载文件系统。在目录上挂载文件系统大致相当于在 Windows 中给磁盘分配驱动器号。Linux 使用目录而不是驱动器号,这些目录被称为挂载点。例如,在“Disks”章节的示例中,一个新的磁盘 /dev/sdd 被挂载在目录 /software 上。/software 就是挂载点。
Linux 系统提供一个通用的挂载点 /mnt,您可以暂时将磁盘挂载到此处。不应该将 /mnt 目录用作永久挂载点,因为另一个系统管理员可能会在其上挂载另一个文件系统,隐藏原始内容。
挂载点不必是根目录下的目录,它们可以是子目录。例如,您可以将 /dev/sdd 磁盘挂载到 /opt/software:
$ sudo mount /dev/sdd1 /opt/software
小贴士
在挂载磁盘或文件系统之前,必须存在挂载点(目录)。
挂载点目录并没有什么特别之处,它与文件系统上的任何其他目录一样。创建一个新目录,设置其权限,然后将文件系统或磁盘挂载到该目录上。
警告
不要将文件系统或磁盘挂载到现有的系统目录,如 /tmp、/var、/usr、/etc 等。这样做会导致系统行为不稳定,可能会造成灾难性故障。
要使磁盘在启动时自动挂载,必须在 /etc/fstab 文件中创建一个条目,包括新磁盘或文件系统以及挂载点。例如,要将 /dev/sdd1 分区自动挂载到 /opt/software 目录,/etc/fstab 条目如下所示:
UUID=324ddbc2-353b-4221-a80e-49ec356678dc /opt/software xfs defaults 0 0
如果您不创建这个条目,/dev/sdd1 将不会在重新启动时自动挂载。如果这是您的意图或者只有少量系统,这不是问题,但如果您管理数十或数百个系统,则需要为希望自动挂载的每个文件系统或磁盘设置 /etc/fstab。
物理和逻辑卷
当系统管理员谈论物理和逻辑卷时,他们指的是逻辑卷管理(LVM)。Figure 7-1 展示了逻辑卷管理器的视觉参考。物理卷是由逻辑卷管理的分区或磁盘。物理卷看起来和磁盘分区完全一样。例如,分区 /dev/sdd1 也是物理卷 /dev/sdd1。

图 7-1. 逻辑卷管理器
卷组包含物理卷。逻辑卷相当于磁盘上的分区,但您可以从卷组创建逻辑卷分区。逻辑卷包含命名的文件系统,这些名称可以是描述性的。
另一种思考逻辑卷的方式是卷组类似于磁盘,逻辑卷类似于磁盘分区。
将物理卷抽象为逻辑卷的优点在于,您可以跨多个磁盘创建大型卷组,并且可以动态调整(缩小和扩展)逻辑卷的大小,而无需将系统脱机执行此操作。
检查空间
系统管理员应密切关注磁盘空间使用情况。如果系统出现问题,例如缓冲区溢出,日志文件可能会增长以填充文件系统。用户经常使用非工作文件填充文件系统和共享空间。开发人员也经常下载吉字节的代码和其他文件,而没有与系统管理员或其他人讨论他们的需求。您可以使用磁盘空闲(df)命令快速检查磁盘空间:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 6.2G 3.3G 3.0G 53% /
/dev/sdb1 1.5G 43M 1.4G 3% /opt/software
/dev/sda1 976M 250M 660M 28% /boot
df命令可以一目了然地了解挂载文件系统上的可用空间。-h选项表示人类可读,即M表示兆字节,G表示千兆字节等。监控系统或您自己的脚本可以提醒您文件系统是否超过了给定的阈值。例如,设置 90%的阈值将触发警报,指示特定文件系统的容量达到或超过 90%。
使用du命令非常方便,可以检查单个目录,并提供空间消耗的详细信息。例如,以下命令检查/var/log目录消耗的空间:
$ sudo du -h /var/log
0 /var/log/private
0 /var/log/samba/old
0 /var/log/samba
36K /var/log/sssd
28K /var/log/tuned
2.3M /var/log/audit
0 /var/log/chrony
3.3M /var/log/anaconda
10M /var/log
您可以一目了然地查看哪些目录占用了最多的磁盘空间。如果您在删除不需要的文件之前对系统的磁盘空间进行审计,这一点非常重要。
交换空间
交换空间是 Linux 特殊类型的磁盘分区,可以将系统的内存扩展到物理随机存取内存(RAM)的限制之外。系统内核使用交换空间将内存中的非活动程序写入磁盘,为活动程序释放内存。如果用户或进程激活这些被交换的程序,系统会从磁盘将它们写回内存。
扩展交换空间不是解决内存问题的良方。如果您的系统存在内存限制,一个被接受的解决方案是增加物理 RAM,而不是增加交换空间或添加另一个交换分区。系统过度使用交换空间会导致一种称为抖动的情况。抖动发生在运行太多程序时,交换分区太小,或系统的物理 RAM 不足以支持其进程时。
本章后面将讨论如何创建和管理交换空间。
基于 RAM 的临时空间(ramfs 和 tmpfs)
Ramfs 和 tmpfs 是一种将文件保存在内存中而不写入磁盘的文件系统。tmpfs 是较新且首选的基于 RAM 的临时文件系统,也是所有现代 Linux 发行版的默认选择。ramfs 转向 tmpfs 的一个原因是 ramfs 允许自身填满到容量限制。tmpfs 通过限制检查来防止达到最大容量。tmpfs 还增加了将文件写入可用交换空间以节省资源的功能。
以下清单分别显示了 CentOS 和 Ubuntu 系统上 tmpfs 的挂载信息:
$ mount | grep tmpfs
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=397220k,nr_inodes=9930...
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=828...
$ mount | grep tmpfs
udev on /dev type devtmpfs (rw,nosuid,noexec,relatime,size=456144k,nr_inodes=1...
tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=100480k,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
tmpfs on /run/snapd/ns type tmpfs (rw,nosuid,nodev,noexec,relatime,size=100480...
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=100480k,mode...
tmpfs 的目的是将临时文件和缓存写入内存而不是磁盘,因为 RAM 与磁盘之间的速度差异。RAM 比最快的 SSD 快得多。tmpfs 的缺点是,如果重新启动或卸载 tmpfs,则在其中存储的数据将丢失。程序、进程和用户都可以向这个临时空间写入数据。类似于基于磁盘的文件系统,当文件来自任何来源填满分配的空间时会出现 “设备上没有剩余空间” 的警告。
向系统添加新磁盘
在本节中,我将向您展示添加新磁盘到系统并准备磁盘以供使用所需的步骤。首先,我描述了如何向物理系统添加磁盘。然后,我演示了使用虚拟磁盘执行相同过程的方法。您还将学习如何在磁盘上创建文件系统,并将其挂载为一个可用的单一目录。我还展示了如何在磁盘上设置逻辑卷。
注意
执行这些系统级功能必须具有 root 权限。
安装磁盘
对于具有热插拔磁盘接口的物理系统,您可以在不关闭电源的情况下简单地连接硬盘。如果您的系统没有热插拔接口,请在添加新磁盘之前关闭系统。一旦物理添加了磁盘,请打开系统(如果需要),并登录以设置它。
对于使用虚拟机(VM)的用户,关闭您的虚拟机,添加新磁盘,然后重新启动它。此后,对于物理和虚拟系统,流程是相同的。
注意
我无法演示添加新虚拟磁盘,因为可供选择的虚拟平台太多。通常涉及选择存储、将虚拟磁盘附加到虚拟控制器、调整磁盘大小并保存配置。
准备磁盘以供使用
您必须首先确定新磁盘的设备名称。系统会自动分配设备名称。使用 fdisk 命令显示所有已附加的磁盘和分区:
$ sudo fdisk -l
Disk /dev/sda: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x38e117ab
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 2099199 2097152 1G 83 Linux
/dev/sda2 2099200 16777215 14678016 7G 8e Linux LVM
Disk /dev/sdb: 1.5 GiB, 1550843904 bytes, 3028992 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd268486b
在上述清单中,系统将新的磁盘设备标识为 /dev/sdb。现在,您已经识别出磁盘的设备名称,可以开始使用 fdisk 命令初始化它:
$ sudo fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): <ENTER>
Partition number (1-4, default 1): <ENTER>
First sector (2048-3028991, default 2048): <ENTER>
Last sector, +sectors or +size{K,M,G,T,P} (2048-3028991, default 3028991): <EN...
Created a new partition 1 of type 'Linux' and of size 1.5 GiB.
Command (m for help): w
The partition table has been altered.
Failed to add partition 1 to system: Device or resource busy
The kernel still uses the old partitions. The new table will be used at the ne...
Syncing disks.
$ sudo fdisk -l
Disk /dev/sda: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x38e117ab
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 2099199 2097152 1G 83 Linux
/dev/sda2 2099200 16777215 14678016 7G 8e Linux LVM
Disk /dev/sdb: 1.5 GiB, 1550843904 bytes, 3028992 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd268486b
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 3028991 3026944 1.5G 83 Linux
您可以忽略 Failed to add partition 1 to system: Device or resource busy 的消息。您可以看到系统上确实存在分区 /dev/sdb1。您已初始化了磁盘并创建了分区 /dev/sdb1。现在必须创建文件系统。以下命令使用 XFS 格式化 /dev/sdb1 分区:
$ sudo mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=94592 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=378368, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
以下命令列出所有块设备和文件系统:
$ sudo lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
loop0 squashfs /var/lib/snapd/snap/asciinema/16
loop1 squashfs /var/lib/snapd/snap/core/10577
loop2 squashfs /var/lib/snapd/snap/core/10583
sda
├─sda1 ext4 1825fee2... /boot
└─sda2 LVM2_member PqHcgi-X...
├─cl-root xfs 41b93d34... /
└─cl-swap swap 6b31789a... [SWAP]
sdb
└─sdb1 xfs ca2701e0...
sr0
lsblk 命令还显示设备的通用唯一标识符(UUID),这是磁盘准备过程的最后一步:挂载文件系统。
提示
您还可以通过将设备名称作为参数发出 blkid 命令来显示 UUID:
$ sudo blkid /dev/sdb1
接下来,在你想要挂载新分区的目录上创建一个目录。在本例中,我使用 /opt/software 作为挂载点:
$ sudo mkdir /opt/software
将 /dev/sdb1 分区挂载到 /opt/software 目录:
$ sudo mount /dev/sdb1 /opt/software
通过不带任何开关的 mount 命令检查上述 mount 命令是否正常工作:
$ mount | grep sdb1
/dev/sdb1 on /opt/software type xfs (rw,relatime,seclabel,attr2,inode64,logbuf...
分区 /dev/sdb1 成功挂载到 /opt/software。现在你需要使这个挂载“永久”,也就是在系统重启后仍然存在。编辑 /etc/fstab 文件并输入以下信息:
UUID=ca2701e0-3e75-4930-b14e-d83e19a5cffb /opt/software xfs defaults 0 0
保存文件。/dev/sdb1 分区将在系统重启后自动挂载。基于 Debian 的系统对 /etc/fstab 语法处理略有不同。在 Ubuntu 系统上,此 /etc/fstab 条目如下所示:
/dev/disk/by-uuid/ca2701e0-3e75-4930-b14e-d83e1... /opt/software xfs defaults 0 0
若要允许用户访问驱动器,请修改 /opt/software 的权限或创建具有适当权限的子目录。
实施逻辑卷
逻辑卷在分配磁盘空间方面提供了很大的灵活性。可以调整在线分区大小的能力是一个重要特性,因为添加或删除分区的磁盘空间不需要系统停机。但在调整逻辑卷大小时,仍然应该安排维护窗口,因为在过程中仍存在潜在的问题可能性。如果出现错误,可能会丢失数据或可能不得不重建整个逻辑卷。灾难发生的可能性虽小,但确实存在。
调整大小并不是逻辑卷的唯一显著特征。逻辑卷可以跨磁盘扩展,这意味着您可以从多个磁盘创建非常大的逻辑卷。几年前,管理员不愿创建跨多个磁盘的卷,因为旋转机械硬盘容易出现故障。但使用 SSD 降低了“不跨越”的规则。SSD 也会出现故障,但它们的寿命和可靠性使必要时跨越变得更加合理。
本节演示如何从原始磁盘设置逻辑卷。(您可以将当前使用的磁盘转换为逻辑卷,但这将导致数据丢失。)
识别可用磁盘
要检查系统中可用的(未使用的)磁盘或要转换为逻辑卷的磁盘,请使用 lsblk 命令:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 8.5M 1 loop /var/lib/snapd/snap/asciinema/16
loop1 7:1 0 97.9M 1 loop /var/lib/snapd/snap/core/10577
loop2 7:2 0 97.9M 1 loop /var/lib/snapd/snap/core/10583
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 7G 0 part
├─cl-root 253:0 0 6.2G 0 lvm /
└─cl-swap 253:1 0 820M 0 lvm [SWAP]
sdb 8:16 0 1.5G 0 disk
sr0 11:0 1 1024M 0 rom
从列表中,包含磁盘的那一行显示,sdb在线并可供使用:
sdb 8:16 0 1.5G 0 disk
首先,您必须创建物理卷(PV),这是您将构建逻辑卷的基本块设备。使用pvcreate命令和设备名称初始化磁盘作为物理卷:
$ sudo pvcreate /dev/sdb
WARNING: dos signature detected on /dev/sdb at offset 510\. Wipe it? [y/n]: y
Wiping dos signature on /dev/sdb.
Physical volume "/dev/sdb" successfully created.
使用pvs(PV Show)命令列出所有物理卷,并确认/dev/sdb是否在其中:
$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 cl lvm2 a-- <7.00g 0
/dev/sdb lvm2 --- 1.44g 1.44g
使用pvdisplay命令查看有关物理卷的详细信息:
$ sudo pvdisplay /dev/sdb
"/dev/sdb" is a new physical volume of "1.44 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 1.44 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID yl6k0u-cymt-p4jd-VXro-Lit1-EkLe-Jqjc94
警告
如果在尝试使用pvcreate时您的磁盘或文件系统已经被挂载,您将收到以下错误:
$ sudo pvcreate /dev/sdb
Can't open /dev/sdb exclusively. Mounted filesystem?
在继续之前,您需要卸载/dev/sdb(umount /dev/sdb)。
第二步是使用vgcreate命令从物理卷/dev/sdb创建卷组(VG)。像我在这里用vgsw这样的名称给 VG 一个名称:
$ sudo vgcreate vgsw /dev/sdb
Volume group "vgsw" successfully created
$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
cl 1 2 0 wz--n- <7.00g 0
vgsw 1 0 0 wz--n- 1.44g 1.44g
$ sudo vgdisplay vgsw
--- Volume group ---
VG Name vgsw
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 1.44 GiB
PE Size 4.00 MiB
Total PE 369
Alloc PE / Size 0 / 0
Free PE / Size 369 / 1.44 GiB
VG UUID AsQkWT-UpSu-3dYk-5EWT-DbQR-SovE-2oAmlR
如图 7-1 节 所示,您可以从物理卷创建卷组。在这个演示中,我只使用了一个物理卷。现在您有了一个卷组,必须创建逻辑卷。创建逻辑卷是此过程的第三步。
对于此演示,我首先决定分配给逻辑卷多少空间。我决定使用 1.5 GB 磁盘的 1 GB 空间。现在是使用lvcreate命令创建逻辑卷的时候了。
lvcreate命令的一般语法如下:
$ sudo lvcreate -L *size* -n *lvname* vg
您必须以 GB 或 MB 的形式提供大小参数,分别添加后缀G或M。 lvname是您要为此逻辑卷使用的名称(software-lv),您必须提供要从中创建逻辑卷(software-lv)的卷组名称(vgsw):
$ sudo lvcreate -L 1G -n software-lv vgsw
WARNING: xfs signature detected on /dev/vgsw/software-lv at offset 0\.
Wipe it? [y/n]: y
Wiping xfs signature on /dev/vgsw/software-lv.
Logical volume "software-lv" created.
根据前面的消息,您可以看到磁盘或分区之前曾拥有xfs signature,这意味着它不是新磁盘或分区,而是重新利用的磁盘。
注意
使用先前使用的磁盘没有问题,但请意识到在此过程中,所有信息都将被覆盖且无法恢复。
使用lvs和lvdisplay命令列出有关您的逻辑卷的详细信息:
$ sudo lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log ...
root cl -wi-ao---- <6.20g
swap cl -wi-ao---- 820.00m
software-lv vgsw -wi-a----- 1.00g
$ sudo lvdisplay /dev/vgsw/software-lv
--- Logical volume ---
LV Path /dev/vgsw/software-lv
LV Name software-lv
VG Name vgsw
LV UUID ebB3ST-3E7k-BShG-8oPi-sj0c-yXXr-C7EgAw
LV Write Access read/write
LV Creation host, time server1, 2021-12-10 07:34:56 -0600
LV Status available
# open 0
LV Size 1.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
注意
当您按逻辑卷名称筛选时,必须使用逻辑卷设备的完整路径(/dev/vgsw/software-lv):
$ sudo lvs /dev/vgsw/software-lv
LV VG Attr LSize Pool Origin ...
software-lv vgsw -wi-a----- 1.00g
此过程的第四步是在您的逻辑卷上创建文件系统。您通过使用与任何分区相同的命令来执行此任务:
$ sudo mkfs.xfs /dev/vgsw/software-lv
meta-data=/dev/vgsw/software-lv isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
为您的文件系统创建挂载点:
$ sudo mkdir /sw
挂载文件系统到挂载点:
$ sudo mount /dev/vgsw/software-lv /sw
$ mount | grep software
/dev/mapper/vgsw-software--lv on /sw type xfs \
(rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
检查设备上的可用空间:
$ df -h /sw
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgsw-software--lv 1014M 40M 975M 4% /sw
最后一步是将文件系统及其挂载点添加到/etc/fstab,以便在启动时自动挂载逻辑卷。我的条目看起来如下:
/dev/vgsw/software-lv /sw xfs defaults 0 0
注意
不要在/etc/fstab中使用 UUID 来定义逻辑卷,而是使用设备名称(/dev/vgsw/software-lv)。
逻辑卷将在重新启动时自动挂载。下一部分描述如何增加或扩展逻辑卷的大小。
扩展逻辑卷
对于我在此场景中配置的逻辑卷,我使用了总磁盘大小为 1.5 GB 中的 1 GB 用于 /dev/vgsw/software-lv。要扩展此卷,您可以使用以下一般命令之一:
$ sudo lvextend -L +size(M or G) *lvname*
$ sudo lvextend -l +100%FREE *lvname*
在本例中,我将使用-l(extent)选项而不是特定大小来使用设备上剩余的空闲空间:
$ df -h /sw
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgsw-software--lv 1014M 40M 975M 4% /sw
$ sudo lvextend -l +100%FREE /dev/vgsw/software-lv
$ sudo lvextend -l +100%FREE /dev/vgsw/software-lv
Size of logical volume vgsw/software-lv changed from 1.00 GiB (256 extents)
to 1.44 GiB (369 extents).
Logical volume vgsw/software-lv successfully resized.
lvextend命令将逻辑卷扩展到其最大容量,但df显示的可用空间量相同:
$ df -h /sw
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgsw-software--lv 1014M 40M 975M 4% /sw
您已扩展了逻辑卷但未扩展文件系统。现在使用xfs_growfs命令且不带大小参数来调整文件系统大小。通过不使用-D size指定大小参数,xfs_growfs将文件系统扩展到其最大值:
$ sudo xfs_growfs /dev/vgsw/software-lv
meta-data=/dev/mapper/vgsw-software--lv isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 262144 to 377856
$ df -h /sw
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgsw-software--lv 1.5G 43M 1.4G 3% /sw
注意
您无法缩小 XFS 卷。
您已成功扩展文件系统,逻辑卷已准备就绪。由于文件系统开销,实际可用大小为 1.44 GB(在前面的示例中显示为1.4G)。
退役和磁盘处理
退役包括在处理前擦除或销毁磁盘。退役过程因公司而异,但通常遵循以下步骤:
-
通知
-
“尖叫”测试
-
断电
-
磁盘擦除
-
解除架设
-
托盘装载
-
处置
每个步骤的时间表各不相同。以下各节详细说明每个步骤的细节。
通知
利益相关者、系统管理员、网络管理员、存储管理员和管理层都会收到多个系统退役通知的列表。大公司通常每周发送一次列表,持续三到四周(实际时间因公司而异,是一种政策问题)。这些通知使利益相关者和其他人有机会通过电子邮件接管系统或阻止其退役,并在治理会议期间进行讨论。如果没有人代表任何列出的系统发言,则该过程将进入“尖叫”测试阶段。
尖叫测试
所谓的“尖叫”测试是指系统管理员或数据中心工作人员从网络中拔出指定系统,但未将列出的系统断电。计划是在此期间,如果有人因系统停机而尖叫,系统将被重新连接到网络,并且其运行将继续如以前一样。下次治理会议将从退役列表中移除该系统。
断电
退役过程的下一个里程碑是断电阶段,持续两周或更长时间。系统管理员将所有列出的系统断电。这段时间是有兴趣方第二次索要系统或通知治理委员会需要继续运行该系统的机会。
磁盘擦除
经过几周的通知和等待后,治理委员会最终确定名单,并将其提交给系统管理员进行磁盘抹除。系统管理员启动每个系统并使用磁盘抹除实用程序覆盖每个本地磁盘。此过程不包括利用或共享的存储,如存储区域网络(SAN)、网络附加存储(NAS)或非本地磁盘存储。此过程确保系统本地存储上没有遗留数据。
注意
多年来,我一直依赖于DariK 的引导和抹掉(DBAN)实用程序来清除要退役和处置的硬盘。这是一个免费的开源实用工具,适用于硬盘驱动器(HDDs)。这个产品不适用于固态驱动器(SSDs)。
卸架和托盘化
一旦系统的磁盘被抹除,名单就会提交给数据中心人员进行卸架。技术人员从数据中心机架中移除系统,并将其放置在运输托盘上。一旦托盘满了,技术人员会标记它,并将其放入处置队列。
处置
处置过程可能涉及竞标,其中公司批量购买托盘化系统以供销售或再部署。有时这些系统会被送往回收设施,技术人员会移除硬盘、CPU、内存和其他可回收部件,以供个别或批量再销售。系统处置也可能意味着整个系统被压碎或粉碎,并作为可回收材料出售。
概要
本章涵盖了磁盘管理的多个方面,包括一般与磁盘相关的信息,向系统添加新磁盘,逻辑卷管理,以及退役和处置。
在下一章中,我将涵盖系统管理员的两个重要任务:健康和日常管理。
第八章:维护系统健康
维护系统健康是一个广泛的主题,包括预防性维护、日常管理、补丁、安全任务、用户维护以及监控和减少各种类型的扩展。保持系统健康是一项主动任务,而不是被动的。
监控是有帮助的。定期清理特定区域可以帮助。自动化更新也有帮助,但您必须积极地查看日志、检查空间和扩展,并处理用户维护任务。如果您能自动化系统健康维护的每个方面,系统管理员的需求将大大减少。
本章涵盖了自动化和手动系统健康维护任务。
保持系统无杂物
日常管理是没人愿意做的事情。它繁琐、耗时,可能会激怒用户,甚至向管理层举报你的行为,这从来不是好事。只要您遵守公司政策,不应用任何自己的政策,您将有材料可以提醒生气的用户。清理系统的规则与您进行的任何维护相同:如果意外删除了关键文件或目录,请确保有可靠的备份。以下各节详细介绍了如何保持系统无杂物。
清理 /tmp 目录
/tmp 目录是一个共享目录。它与所有用户、应用程序和系统进程共享。任何人都可以写入此目录,这对管理员来说是不利的,因为拥有对系统目录的无限访问权限可能会产生致命后果。如果原始管理员没有将 /tmp 目录创建为一个具有有限空间访问权限的单独文件系统,用户或应用程序可能会填满所有空间。因此,出于这个原因,/tmp 目录绝不能作为与 / 相同分区的一部分。
对于系统管理员来说,/tmp 目录在日常管理方面有些棘手,因为用户、应用程序或系统没有任何限制。因为任何用户都可以写入它,他们可能会认为这是额外的可用空间,可以存储下载和其他文件。为了使该目录成为一个不太理想的存储位置,您应该创建一个 cron 作业,每晚在备份后运行,以删除任何非系统文件。
注意
在许多企业中,自动脚本每晚都会从 /tmp 目录中删除用户创建的文件,并且大多数情况下将 /tmp 目录排除在备份之外。
如果您不想为 /tmp 创建单独的文件系统并将其挂载到 /tmp 上,解决方案是启用 tmp.mount。此服务会创建一个临时文件系统(tmpfs),并将其挂载为 /tmp。其中一个特点是它是易失性存储(RAM),填充它不会导致系统稳定性问题。
要在您的系统上启用 tmp.mount,请完成以下步骤。
首先,检查 /tmp 目录的挂载点,看是否需要配置 tmp.mount:
$ df -h /tmp
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 6.2G 3.3G 3.0G 53% /
正如您所见,我的 /tmp 有一个缺陷,即它是 / 文件系统的子目录。启用 tmp.mount,然后启动它:
$ sudo systemctl enable tmp.mount
Created symlink /etc/systemd/system/local-fs.target.wants/tmp.mount
→ \ /usr/lib/systemd/system/tmp.mount.
$ sudo systemctl start tmp.mount
$ df -h /tmp
Filesystem Size Used Avail Use% Mounted on
tmpfs 405M 0 405M 0% /tmp
现在,/tmp 目录不再是 / 文件系统的子目录。启用 tmp.mount 使此配置持久化,这意味着这是一个永久性的更改,并且每次系统启动时都会自动创建。
下一部分介绍如何保持 /home 目录对所有人可用。
使 /home 对每个人都是一个宜居的空间
/home 目录是一个共享目录,因为它包含除 root 用户外所有用户的主目录。例如,假设您的系统上有用户 tux、penguin 和 gentoo。它们的主目录如下:
/home/tux
/home/penguin
/home/gentoo
在系统中,如果 /home 目录与 / 目录位于同一文件系统中,则可能导致用户填满 / 目录并引发系统问题,就像填满 /tmp 一样,在前一节中讨论过。由于 /home 中包含的文件的性质,您无法为其创建和挂载易失性文件系统。/home 目录必须是一个永久挂载的文件系统,最好不是 / 的一部分。如果它是 / 的一部分,则有两种方法可以更正它。第一种方法如下所述:
-
缩小现有的 LVM 文件系统
-
创建分区和文件系统
-
将该文件系统挂载为 /home
第二种方法涉及以下步骤:
-
安装新硬盘
-
创建新分区
-
将新分区挂载为 /home
在本章演示中,我将使用第二种方法为 /home 安装新硬盘。
完成这些步骤的详细过程如下:
-
创建或安装一个新硬盘。
-
在硬盘上创建新的分区。
-
在新分区上创建文件系统。
-
将新分区挂载到 /mnt。
-
将所有文件从 /home 复制或移动到 /mnt。
-
从 /home 中删除所有文件。
-
卸载位于 /mnt 的新分区。
-
将新分区挂载到 /home。
-
在 /etc/fstab 中为 /home 添加条目。
我向我的虚拟机添加了一个 1 GB 硬盘来演示这些步骤。以下各节详细说明如何完成此过程中的每一步。
在硬盘上创建新的分区
通过列出系统上的所有磁盘块设备来识别新硬盘:
$ lsblk | grep disk
sda 8:0 0 8G 0 disk
sdb 8:16 0 1.5G 0 disk
sdc 8:32 0 1G 0 disk
新磁盘设备(/dev/sdc)是新增的 1 GB 硬盘。为了在该硬盘上创建新的分区,请使用 fdisk 实用程序:
$ sudo fdisk /dev/sdc
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x3c239df6.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-2097151, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151):
Created a new partition 1 of type 'Linux' and of size 1023 MiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
列出 sdc 块设备以验证分区 /dev/sdc1 是否存在:
$ lsblk | grep sdc
sdc 8:32 0 1G 0 disk
└─sdc1 8:33 0 1023M 0 part
/dev/sdc1 分区已存在并准备好在其上创建文件系统。
创建文件系统
对于 /home 目录,将其格式化为 ext4 文件系统类型:
$ sudo mkfs.ext4 /dev/sdc1
mke2fs 1.45.6 (20-Mar-2020)
Creating filesystem with 261888 4k blocks and 65536 inodes
Filesystem UUID: bcd18fcc-3774-4b94-be0a-e2abf8aa4d31
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
确认你在 /dev/sdc1 上正确创建了 ext4 文件系统:
$ lsblk -o NAME,FSTYPE,SIZE | grep sdc
sdc 1G
└─sdc1 ext4 1023M
挂载新分区
要使用新分区,必须将其挂载。我使用 /mnt 作为临时挂载点,将文件从 /home 复制到最终将挂载为 /home 的新分区。如果现在将 /dev/sdc1 挂载到 /home 上,就无法复制文件,因为在 /home 上挂载会隐藏其文件。将设备挂载到非空目录会隐藏其内容并使其文件无法访问:
$ sudo mount /dev/sdc1 /mnt
$ mount | grep sdc
/dev/sdc1 on /mnt type ext4 (rw,relatime,seclabel)
从 /home 复制文件到 /mnt
将所有文件从 /home 目录复制以保留所有 (-a) 权限、链接和时间戳:
$ sudo cp -a /home/* /mnt
$ ls -la /home
total 0
drwxr-xr-x. 4 root root 32 Nov 3 2020 .
dr-xr-xr-x. 19 root root 258 Dec 10 08:37 ..
drwx------. 2 1001 1001 62 Nov 13 2020 diane
drwx------. 7 khess khess 273 Dec 14 21:03 khess
$ ls -la /mnt
total 28
drwxr-xr-x. 5 root root 4096 Dec 15 08:33 .
dr-xr-xr-x. 19 root root 258 Dec 10 08:37 ..
drwx------. 2 1001 1001 4096 Nov 13 2020 diane
drwx------. 7 khess khess 4096 Dec 14 21:03 khess
drwx------. 2 root root 16384 Dec 15 08:17 lost+found
删除 /home 下的所有文件
我删除原始 /home 目录中的所有文件的原因是将磁盘空间释放回 / 文件系统,这也是我们进行此操作的原因之一。以下命令删除 /home 下的所有目录,而不删除 /home 目录本身。无需删除 /home:
$ sudo rm -rf /home/*
从 /mnt 卸载 /dev/sdc1
从 /mnt 卸载 /dev/sdc1:
$ sudo umount /mnt
将新分区挂载到 /home
将新分区挂载到 /home 目录:
$ sudo mount /dev/sdc1 /home
通过作为用户登录并检查一切是否按预期工作来对此操作进行真实测试。
创建 /etc/fstab 条目
/home 目录在系统重启后不会自动挂载,因为 /home 在不在 /etc/fstab 中列出的另一个分区上。您必须为其创建一个 /etc/fstab 条目。
我的 /etc/fstab 条目为 /dev/sdc1 如下:
/dev/sdc1 /home ext4 defaults 0 0
此 /etc/fstab 条目使挂载持久化。
下一部分涉及将共享目录中“过时”和重复的文件归档和删除。
清理共享目录
保持共享目录无杂物是困难的。可能是不可能的,但您可以使用系统工具和一些计划来解决这个问题。本节探讨了一些可以简化清理和维护的实用程序。
使用 fdupes 进行文件去重
fdupes 是一个流行的重复文件删除实用程序。fdupes 可以在给定的一组目录中找到重复的文件。fdupes 手册页面描述了该命令的功能如下:
在给定路径搜索重复文件。这些文件通过比较文件大小和 MD5 签名来找到,然后进行逐字节比较。
您可以从您的发行版仓库安装 fdupes,但最好使用以下步骤从 GitHub 仓库获取修补版本:
$ git clone https://github.com/tobiasschulz/fdupes
$ cd fdupes
$ make fdupes
$ sudo make install
这个打补丁的版本有更多选项,特别是在生产环境中作为系统管理员最有可能使用的选项之一。当你在一个目录上使用 fdupes 时,你可以只查看重复项,删除重复项(不推荐),或删除重复项并为其中一个文件创建软链接(推荐)。只有当原始文件不存在时,这种解决方案才会出现问题。但是提供一个文件的软链接比删除重复项要少得多,后者可能导致工单、电话和训斥。示例 8-1 到 8-3 展示了如何使用 fdupes 查找重复文件,生成报告,然后仅为其中一个文件提供链接。
示例 8-1. 列出重复文件及其大小
$ fdupes -rS /opt/shared
29 bytes each:
/opt/shared/docs/building/test.rtf
/opt/shared/docs/building/test.txt
/opt/shared/a/b/list.txt
/opt/shared/a/b/c/stuff.doc
/opt/shared/a/todo.list
/opt/shared/one/foo.lst
/opt/shared/x/y/listed.here
20 bytes each:
/opt/shared/docs/hr/list.txt
/opt/shared/x/got.txt
/opt/shared/a/b/none.doc
-r 选项是递归的,这意味着检查指定目录及其所有子目录。-S 选项表示报告文件大小。
在 示例 8-2 中,-m 选项告诉 fdupes 打印任何找到的重复文件的报告。
示例 8-2. 使用 -m 选项生成重复文件报告
$ fdupes -mr /opt/shared
8 duplicate files (in 2 sets), occupying 214 bytes.
在 示例 8-3 中,fdupes 使用 -L 选项用硬链接替换重复文件。每组重复文件中仅保留第一个找到的文件。
示例 8-3. 为其中一个文件提供链接
$ fdupes -rL /opt/shared
[+] /opt/shared/docs/building/test.rtf
[h] /opt/shared/docs/building/test.txt
[h] /opt/shared/a/b/list.txt
[h] /opt/shared/a/b/c/stuff.doc
[h] /opt/shared/a/todo.list
[h] /opt/shared/one/foo.lst
[h] /opt/shared/x/y/listed.here
[+] /opt/shared/docs/hr/list.txt
[h] /opt/shared/x/got.txt
[h] /opt/shared/a/b/none.doc
使用选择性删除选项 -d,你会被提示选择要保留的文件。再次强调,不建议删除文件。请自行决定是否继续:
$ fdupes -rd /opt/shared
[1] /opt/shared/a/b/goo.txt
[2] /opt/shared/a/false.doc
[3] /opt/shared/one/two/three/three
[4] /opt/shared/docs/building/test.rtf
[5] /opt/shared/x/y/new.txt
[6] /opt/shared/docs/building/test.txt
[7] /opt/shared/a/b/list.txt
[8] /opt/shared/a/b/c/stuff.doc
[9] /opt/shared/a/todo.list
[10] /opt/shared/one/foo.lst
[11] /opt/shared/x/y/listed.here
Set 1 of 2, preserve files [1 - 11, all]:
此选项除了保留的文件外都会删除文件,并且不会创建链接。查看 fdupes 的在线帮助和手册页面获取其他选项。
处理 /home 文件过度增长问题与配额
一些系统管理员和用户认为使用配额对付文件过度增长是一个严厉的解决方案。我认为它是一个在各种情况下都很好用的解决方案,可以帮助处理那些经常占用超过其应有份额的磁盘空间的用户。你可以在任何目录上实施配额,但肯定要考虑为共享目录和 /home 目录设置配额。
第一个任务是安装 quota,如果你的系统还没有的话:
$ sudo yum install quota
$ sudo apt install quota
要使用 quota 系统,你需要准备并挂载一个 xfs 文件系统。例如,我的挂载在 /home 下。为 xfs 文件系统在 /etc/fstab 中创建一个条目。以下是 /etc/fstab 中关于 /home 的条目,我希望强制执行配额:
/dev/sdc1 /home xfs defaults,usrquota,grpquota 0 0
接下来,在 /home 下创建两个新的空文件:quota.group 和 quota.user。在任何配置了配额的目录中,这两个文件必须存在,配额系统使用它们:
$ sudo touch /home/quota.group /home/quota.user
然后,使用 quotaon 命令启用配额:
$ sudo quotaon /home
quotaon /home
quotaon: Enforcing group quota already on /dev/sdc1
quotaon: Enforcing user quota already on /dev/sdc1
quotaon: Enable XFS project quota accounting during mount
系统现在已准备好为用户账户应用配额。 以下命令为演示目的设置了一个非常低的quota值。 软限制为 50 MB,硬限制为 80 MB。 当您超过软限制时,您会收到警告,但quota系统会阻止您超过硬限制。 您还可以限制用户可能消耗的索引节点(文件元数据结构)的数量。 索引节点限制可能更严格,因为用户可能生成成千上万个只占用几兆字节的小文本文件,但它限制了用户可以创建的文件数量。 索引节点也有硬限制和软限制。
[root@server1 home1]# sudo xfs_quota -x -c \
'limit -u bsoft=50m bhard=80m isoft=60 \ ihard=80 djones' /home
以下是用户在超过配额时看到的示例。 head命令创建一个 51 MB 的文件,以说明配额如何截断超过设定配额限制的文件:
$ su - djones
Password:
Last login: Mon Jan 10 20:16:49 CST 2022 on pts/0
[djones@server1 ~]$ head -c 51MB /dev/urandom > fillit.txt
[djones@server1 ~]$ head -c 51MB /dev/urandom > fillit1.txt
head: error writing 'standard output': Disk quota exceeded
$ ls -l
total 81892
-rw-rw-r--. 1 djones djones 32854016 Jan 10 20:21 fillit1.txt
-rw-rw-r--. 1 djones djones 51000000 Jan 10 20:21 fillit.txt
您可以看到,当用户达到他们的硬限制时,系统截断了他们试图创建的文件(fillit1.txt)。 如果用户没有设置配额,他们将拥有两个 51 MB 的文件。
配额防止用户在文件系统或目录上消耗超过一定量的空间。 但它们只应对违反公司政策或在公司系统上极端存储个人文件的用户执行。 您可以通过将所有限制设置为0轻松地从用户账户中删除配额限制:
$ sudo xfs_quota -x -c 'limit -u bsoft=0 bhard=0 isoft=0 ihard=0 djones' /home
[sudo] password for khess:
[khess@server1 home]$ su - djones
Password:
Last login: Mon Jan 10 20:20:41 CST 2022 on pts/0
[djones@server1 ~]$ head -c 51MB /dev/urandom > fillit2.txt
[djones@server1 ~]$ ls -l
total 131700
-rw-rw-r--. 1 djones djones 0 Jan 10 20:21 blah.txt
-rw-rw-r--. 1 djones djones 32854016 Jan 10 20:21 fillit1.txt
-rw-rw-r--. 1 djones djones 51000000 Jan 10 22:37 fillit2.txt
-rw-rw-r--. 1 djones djones 51000000 Jan 10 20:21 fillit.txt
现在关于超过限制的警告(或截断)已经消失。 djones账户不再对其施加配额限制。
这是对配额的一个很好的介绍,作为管理员,它们能为您做些什么,以及它们如何通过空间使用情况来控制您的用户。 接下来要探讨的话题是补丁,这是任何想要保持系统顺畅运行的管理员必不可少的任务。
补丁:保持系统健康的途径
对于新的系统管理员来说,补丁听起来可能像是在系统上放置胶带,暂时将其固定在一起,同时您寻找问题的真正解决方案。 补丁是一项基本任务,也许对于它的称呼并不准确:更新由开发者提供的系统实用程序、守护进程和应用程序修复。 软件补丁修复了特定的问题。 一个很好的例子是对 SSH 守护进程应用补丁以解决新的漏洞,这可能使系统容易受到攻击和妥协。
补丁并不总是专注于安全。通常,补丁修复稳定性问题、堵塞内存泄漏或修复损坏的功能。请记住,对 Linux 系统进行补丁几乎不意味着您必须启动重新启动,但如果更新了一个服务,您将需要重新启动该服务,除非补丁过程已经为您处理了这一点。如果补丁过程重新启动了一个服务,屏幕上将出现消息通知您重新启动。为了安全起见,在主要补丁事件后,我经常重新启动以确保系统及其服务得到重新启动。主要补丁事件包括多个修复以及通常的内核更新。如果您在维护窗口内并更新了多个服务、内核或其他关键系统软件,我建议您重新启动系统。
一些系统管理员通过设置cron作业来自动化他们的补丁管理,定期检查并安装补丁。这种场景有效,但你应该有一个或两个测试系统,手动更新以查看需要更新的内容,系统对这些更新的反应以及重启后系统的响应。你不希望也不需要因为糟糕的补丁而遇到任何意外。
现在,让我们看看如何对两种类型的 Linux 系统进行补丁管理——基于 Red Hat 的系统和基于 Debian 的系统。
Red Hat Enterprise Linux-Based 系统的补丁
要在基于 Red Hat Enterprise Linux 的系统上启动补丁过程,请使用yum或dnf。在此演示中,我使用yum,但在 Red Hat Enterprise Linux 8 及更高版本中,dnf是首选命令:
$ sudo yum update
Last metadata expiration check: 0:23:24 ago on Sun 30 Jan 2022 08:27:15 AM CST.
Dependencies resolved.
========================================================================
Package Arch Version Repo Size
========================================================================
Installing:
kernel x86_64 4.18.0-348... baseos 7.0 M
kernel-core x86_64 4.18.0-348... baseos 38 M
kernel-modules x86_64 4.18.0-348... baseos 30 M
Upgrading:
NetworkManager x86_64 1:1.32.10-... baseos 2.6 M
...
openssh x86_64 8.0p1-10.el8 baseos 522 k
openssh-clients x86_64 8.0p1-10.el8 baseos 668 k
openssh-server x86_64 8.0p1-10.el8 baseos 485 k
openssl x86_64 1:1.1.1k-5... baseos 709 k
openssl-libs x86_64 1:1.1.1k-5... baseos 1.5 M
...
yum noarch 4.7.0-4.el8 baseos 205 k
yum-utils noarch 4.0.21-3.el8 baseos 73 k
Installing dependencies:
libbpf x86_64 0.4.0-1.el8 baseos 110 k
Removing:
kernel x86_64 4.18.0-240... @BaseOS 0
kernel-core x86_64 4.18.0-240... @BaseOS 62 M
kernel-modules x86_64 4.18.0-240... @BaseOS 21 M
Transaction Summary
========================================================================
Install 4 Packages
Upgrade 287 Packages
Remove 3 Packages
Total download size: 558 M
Is this ok [y/N]:
正如你从上面截断的列表中可以看到,我已经很久没有更新这个系统了(287 个软件包需要升级)。我包括了我想让你看到的部分,例如一个新的内核更新和新的 OpenSSH 服务器(SSHD),以演示我在更新后将重新启动此系统。我喜欢通过不提供-y选项手动安装,这样我可以在继续之前查看所有需要升级的内容。
注意
YUM/DNF 更新的默认行为是不安装它们。你将收到以下提示:
Is this ok [y/N]:
如果按下 Enter 键,更新将不会安装,因为N是默认响应。你必须在此处明确批准安装,通过输入y来确认。
如果你在测试系统上安装并验证了更新,通常可以放心在生产系统上继续更新。安装未在测试系统上验证的补丁可能会导致稳定性问题或应用程序/库冲突,特别是如果你在运行某些旧程序版本。
Debian-Based Linux 系统的补丁
对于基于 Debian 的系统,补丁过程类似于基于 Red Hat Enterprise Linux 的系统,但有一些细微的差异。第一个差异是你使用apt命令来安装系统更新:
$ sudo apt update
Hit:1 http://us.archive.ubuntu.com/ubuntu focal InRelease
Get:2 http://us.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
Get:4 http://us.archive.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Fetched 336 kB in 1s (407 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
20 packages can be upgraded. Run 'apt list --upgradable' to see them.
khess@server2:~$ sudo apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
cloud-init command-not-found libasound2 libasound2-data libnetplan0 libssl1.1
linux-firmware netplan.io openssh-client openssh-server openssh-sftp-server ...
python3-commandnotfound python3-software-properties rsync software-propertie...
ubuntu-advantage-tools ufw update-notifier-common wget
20 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 120 MB of archives.
After this operation, 20.3 MB of additional disk space will be used.
Do you want to continue? [Y/n]
另一个不同之处在于批准程序。请注意是否要继续?[Y/n]提示符。Y是大写的,这意味着如果您按 Enter 键,更新将安装在您的系统上。请记住,在更新基于 Red Hat Enterprise Linux 的系统时,如果按 Enter 键,更新将不会安装。但请注意,apt没有像yum或dnf那样的自动批准选项(-y)。
注意
unattended-upgrades是一个可以安装的包,它将允许您自动更新基于 Debian 的系统。
如前所述,您应始终首先在测试系统上安装更新和升级。如果您设置了自动更新,除非您为更新系统创建一个类似以下的巧妙时间表,否则这将更加困难:
测试系统
每周二手动更新
开发系统
每隔两周的星期四手动更新
生产系统
每月更新每月最后一个星期日
这个计划或类似计划允许您在将自动更新安装到生产系统之前检查它们。如果您有一个允许您在出现问题时暂停cron作业的自动化或企业管理工具,您可以更好地控制自动修补。如果您没有这样的工具并且需要管理多个系统,我建议您探索像 Ansible 这样的自动化工具,以便向您的系统交付新的配置文件、脚本等。
当向您的系统应用零日或其他紧急补丁时,自动化系统也是有帮助的。像备份一样,打补丁需要您的密切关注。通过定期应用最新的补丁,保持系统平稳安全对您作为系统管理员的职责至关重要。
保护您的系统
尽管定期打补丁应成为整体安全计划的一部分,但与打补丁主题无关的一些基本安全设置我将在本节中进行介绍。同样,像 Ansible 这样的自动化系统可以大大节省维护几十、几百或几千个系统的时间和精力。
并非所有系统在应用安全措施时可以被平等对待。例如,您的 DMZ(面向互联网)系统、数据库系统、Web 服务器、应用服务器和文件存储系统每个(作为一个组)都需要不同的安全设置。您几乎不可能对每种类型的系统都应用单一的安全策略。一些通用的安全措施适用于每种系统,无论其功能如何,但声明您将设置一个统一的通用安全计划是不现实的。您必须为每种系统类型应用安全配置,以便专注于特定的漏洞。
例如,你能否想到适用于 Web 服务器但不适用于文件服务器的特定安全设置?在 Web 服务器的情况下,您需要实施证书来保护您的 Web 通信。您应该集中精力保护文件服务器上的共享目录和用户帐户。您是否打算在文件服务器上允许 Samba 共享?您是否打算允许向 Web 服务器上传文件?您和您的用户如何与系统交互决定了其安全问题,而不是它是一个通用的 Linux 系统的事实。
表 8-1 展示了针对具有特定目的和工作负载的 Linux 系统的一些安全指南示例。
表 8-1. Linux 服务安全指南
| 目的/工作负载 | 示例 | 安全措施 |
|---|---|---|
| 所有服务器 | 杂项服务 | SSH, /etc/hosts.allow 和 /etc/hosts.deny 限制, 防火墙, SELinux |
| Web 服务器 | Apache, NGINX, IHS, 其他 | TLS, 证书, HTTPS |
| 数据库服务器 | MySQL, PostgreSQL, 其他 | SSH 隧道, 限制连接到本地主机 |
| 文件服务器 | Samba 共享, NFS 共享, SSH | 为 Samba 集成的 Active Directory, 双因素身份验证 |
| 应用服务器 | Tomcat, WebSphere, 其他 | HTTPS, TLS, 证书 |
| 邮件服务器 | SMTP, IMAP, POP-3 协议 | 使用安全协议和邮件服务 |
如您在表 8-1 中所见,每个系统都应实施某些安全功能,无论其用途如何,除非有某些供应商相关的原因禁止此操作。您应该尽可能地锁定每个系统,并在保持用户功能和可访问性的同时保持严格限制。
维护用户和群组帐户
用户帐户维护不仅仅是添加和删除帐户。它还包括制定帐户命名约定、创建设定禁用帐户多久后删除的政策、在用户离开组或公司后保留用户主目录的时间标准、群组帐户的撤销以及用户和群组 ID 的撤销或重复使用。所有这些活动都可以防止用户帐户泛滥。以下是帐户泛滥的一些示例:
-
系统中超过策略限制而保留的已禁用帐户
-
系统中超过策略限制而保留的个人目录
-
系统中保留的活跃和已终止的用户帐户
-
没有成员的群组帐户
-
在 /etc/sudoers 中仍存在的已禁用或已删除帐户
-
系统中保留的活跃临时帐户
-
具有 shell 或密码的活跃服务帐户
设置命名约定
防止用户账户蔓延的最简单方法之一是创建用户账户命名约定。命名约定通过设定一套标准,使你和你的团队可以创建用户账户。例如,如果你将命名约定设置为姓氏的第一个字母和姓氏的前七个字符,现在你有了一个可用的系统。例外情况是当两个或更多人拥有相同的名字和姓氏时。在这些情况下,你会选择使用名字的第一个字母、中间字母和姓氏的前六个字符。
表 8-2 展示了标准命名约定的示例。
表 8-2. 标准账户命名约定
| 名字 | 姓氏 | 用户名 |
|---|---|---|
| 何塞 | 阿尔瓦雷斯 | jalvarez |
| 保拉 | 安德森 | panderso |
| 维克 | 库恩德拉 | vkundra |
| 西尔维亚 | 戈德斯坦 | sgoldste |
表 8-3 展示了重复姓名的例外情况的示例。
表 8-3. 重复姓名的例外情况
| 名字 | 姓氏 | 用户名 |
|---|---|---|
| 何塞 | 阿尔瓦雷斯 | jalvarez |
| 何塞 | 阿尔瓦雷斯 | jqalvare |
| 保拉 | 安德森 | panderso |
| 保拉 | 安德森 | pmanders |
如果你的用户没有中间名字,那么你可以按照字母表的倒序来进行,如表 8-4 所示。
表 8-4. 没有中间名的用户的账户名解决方案
| 名字 | 姓氏 | 用户名 |
|---|---|---|
| 保拉 | 安德森 | panderso |
| 保拉 | 安德森 | pzanders |
| 保拉 | 安德森 | pyanders |
| 保拉 | 安德森 | pxanders |
当然,你可以制定自己的命名约定,但我已经看到其他企业采用过这种方法,所以在这里值得一提。我还看到其他公司使用数字系统来避免重复的用户名。例如,如果有两个名为 Vivek Kundra 的用户,那么系统中创建的第一个将被创建为vkundra,第二个 Vivek Kundra 则为vkundra2。
命名约定的整个目的是开发一个系统,然后坚持使用它。有了命名约定,管理员就不会随意创建可能重复其他账户的用户账户。
例如,假设你为 Sylvia Goldstein 创建了一个用户账户sgoldste,另一位系统管理员创建了一个账户syliag。现在你面临一个安全问题,因为在同一个系统上有一个用户有两个账户,还有用户账户蔓延的问题。
用户账户蔓延不是一个小问题。假设 Sylvia 登录并使用两个账户来创建文件、安装软件,可能为她所属的群组创建依赖关系。现在的问题比简单地将文件从一个账户移动到另一个账户、更改用户和群组所有权、从系统中删除使用较少的账户要复杂得多。
如果系统管理员有一个命名规则,第二个管理员可能不会创建第二个账户。接下来,我将讨论创建账户保留政策,这是另一种防止账户扩展的方法。
创建账户保留政策
账户保留政策是一种良好的安全实践和日常管理实践。没有人在超过 90 天没有访问的活跃账户上悬挂安全扫描。一些高度安全的环境将强制每 45 天更改一次密码,在账户不活跃 90 天后禁用账户,并删除保持不活跃超过六个月的账户。这种激进的账户保留政策并不适合每个环境,但确实保护和挑战敏感系统用户维护或放弃他们的账户。
我并不建议您采用如此严格的政策。但是,您应该制定一种保留政策,并将其作为整体安全和雇佣教育计划的一部分提供给您的用户。
您的账户保留政策应该是一个书面政策,同时也是一个系统级政策。系统级政策意味着您必须配置全系统范围的不活跃账户锁定和删除设置。
更改不活跃账户状态
为了朝向系统解决方案迈进,请审计密码过期后系统禁用账户的默认天数,也称为INACTIVE变量:
$ sudo useradd -D | grep INACTIVE
INACTIVE=-1
-1表示未设置默认的不活跃值。
根据公司的安全政策设置无活动值。如果没有涉及此值的安全政策,将其设置为15天。有些系统管理员将此值设置为30。此设置的目的是禁用不活跃账户并保护系统安全:
$ sudo useradd -D -f 15
这将系统范围内的默认不活跃值设置为15天。如果用户收到更新密码的消息,则在系统禁用账户之前有 15 天的时间:
$ sudo useradd -D | grep INACTIVE
INACTIVE=15
如果用户尝试登录系统并失败,您可以检查他们的账户状态:
$ sudo passwd -S *username*
$ sudo passwd -S ndavis
ndavis PS 2022-02-13 0 99999 7 15 (Password set, SHA512 crypt.)
此用户账户状态正常。也许他们尝试登录到一个不是他们打算的主机,或者输入了一个错误的密码。但是,另一位用户asmith向您投诉说他无法登录相同的系统:
$ sudo passwd -S asmith
asmith LK 2022-02-12 0 99999 7 15 (Password locked.)
用户asmith被系统锁定。您需要解锁他们的账户,然后他们才能再次登录:
$ sudo passwd -u asmith
passwd: Success
用户可以再次登录。接下来,我将演示如何使用chage命令进一步保护账户。
保护用户账户
chage命令有几个选项,可进一步保护用户账户,例如强制定期更改密码、设置最小密码更改持续时间等。本节展示如何修改这些设置以保护您的用户和系统。
我在管理的系统上为所有用户更改的三个参数是 不活跃天数、密码更改间隔的最小天数 和 密码更改间隔的最大天数。我根据公司政策进行更改,如果有的话。否则,我会按照我的“默认”进行更改:
Inactive days: 15
Minimum number of days between password changes: 1
Maximum number of days between password changes: 90
$ sudo chage -m 1 -M 90 --inactive 15 asmith
$ sudo chage --list asmith
Last password change : Feb 13, 2022
Password expires : May 14, 2022
Password inactive : May 29, 2022
Account expires : never
Minimum number of days between password change : 1
Maximum number of days between password change : 90
Number of days of warning before password expires : 7
这会使用户的密码每 90 天过期一次。如果他们不更改密码,则在更改密码日期后的 15 天内其账户将被禁用。如果他们在提示时更改密码,则在一天后才能再次更改密码。
您只能使用 chage 命令逐个更改用户。如果您有多个用户和几台服务器,这可能会变得很麻烦。一个覆盖所有用户的脚本版本要高效得多。我提供了我的脚本如下:
#!/bin/bash
egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1 | grep -v root > user-list.txt
for user in `more user-list.txt`
do
chage -m 1 -M 90 -I 15 $user
done
退休组账户
一旦组为空且不活跃,仍保留在系统中的组账户是账户扩展的常见来源,但很容易修复。groupmems 命令可以通过回答特定组中的成员是谁来为您节省大量时间和挫折感:
$ sudo groupmems -g operations -l
ajones bhaas
$ sudo groupmems -g hr -l
asmith
本示例中使用的 groupmems 命令选项为 -g 表示组名,-l 表示列表。
如果没有组成员,则命令不显示任何输出:
$ sudo groupmems -g engineering -l
$
在此系统上,应该退休工程师组(从系统中移除因为空)。但在移除组之前,您必须弄清楚工程师组是否留下了任何他们拥有的文件:
$ sudo find / -group engineering
find: '/proc/3368/task/3368/fd/7': No such file or directory
find: '/proc/3368/task/3368/fdinfo/7': No such file or directory
find: '/proc/3368/fd/6': No such file or directory
find: '/proc/3368/fdinfo/6': No such file or directory
/shared/engineering
/shared/engineering/one
/shared/engineering/two
/shared/engineering/three
/shared/engineering/four
/shared/engineering/five
/shared/engineering/six
/shared/engineering/seven
/shared/engineering/eight
/shared/engineering/nine
/shared/engineering/ten
您应将文件转移到另一个用户或更改所有权为 root 以确保其安全,然后移除空组账户:
$ sudo groupdel engineering
您已成功移除了工程师账户。如果需要,您可以将其来日重建。
现在我已经讨论了扩展问题,接下来将讨论监控系统健康。
监控系统健康
系统监控并不明确属于扩展问题,但是它是维护系统健康的一部分。有数十种商业监控工具可供购买,但 sysstat 是 Linux 上的一个免费工具。它易于安装,在基于 Red Hat 的系统上,它会自动配置并立即开始收集数据。在基于 Debian 的系统上,您必须手动启用 sysstat 来收集数据。
要启用 sysstat 的系统活动报告(sar)工具以开始收集数据,请编辑 /etc/default/sysstat 文件,并将 ENABLED="false" 改为 ENABLED="true"。
然后重新启动 sysstat 服务:
$ sudo service sysstat restart
给系统一些时间开始生成活动报告。稍后在本章中您将学习如何生成活动报告。
sysstat 软件包包含用于检查性能和格式化系统统计信息的新二进制文件。表 8-5 列出了这些二进制文件及其功能。我从各自的 man 页面复制了每个二进制文件的描述。
表 8-5. sysstat 软件包中的二进制文件
| 二进制文件 | 名称 | 描述 |
|---|---|---|
cifsiostat |
CIFS 统计 | cifsiostat命令显示关于 CIFS 文件系统读取和写入操作的统计信息。 |
iostat |
CPU 和设备 I/O 统计 | iostat命令用于通过观察设备的活动时间与其平均传输速率的关系来监视系统输入/输出设备负载。 |
mpstat |
处理器相关统计 | mpstat命令会将每个可用处理器的活动写入标准输出,其中处理器 0 是第一个。 |
pidstat |
任务统计 | pidstat命令监视 Linux 内核当前管理的各个任务。 |
sadf |
sar数据格式化 |
sadf命令用于显示由sar命令创建的数据文件的内容。但与sar不同,sadf可以将其数据写入许多不同的格式(CSV、XML 等)。 |
sar |
系统活动报告 | sar命令会将操作系统中选定的累积活动计数器的内容写入标准输出。 |
tapestat |
磁带统计 | tapestat命令用于监视连接到系统的磁带驱动器的活动。 |
如果你熟悉vmstat命令,它不是sysstat的一部分,你就知道其它“stat”命令的工作原理。例如,在每个 Linux 系统上,vmstat要求你提供以秒为间隔的时间延迟快照和一个特定数量(计数),典型值为5:
vmstat [*options*] [delay [*count*]]
vmstat命令的第一次运行给出自上次重启以来的平均值:
$ vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 44616 343888 244 334676 0 0 1 1 1 24 0 0 100 0 0
0 0 44616 343768 244 334676 0 0 0 0 48 91 0 0 100 0 0
0 0 44616 343768 244 334676 0 0 0 2 53 104 0 0 100 0 0
1 0 44616 343768 244 334676 0 0 0 4 78 141 0 0 100 0 0
0 0 44616 343768 244 334676 0 0 0 0 75 141 0 0 100 0 0
每隔五秒钟运行一次vmstat命令,共采集五个快照。其它“stat”命令也是类似的工作方式。你需要提供一个延迟和一个计数。以下是一个包含两个快照和五秒延迟的iostat命令示例:
$ iostat 5 2
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 02/13/2022 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.01 0.00 0.24 0.01 0.00 99.74
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.16 0.98 1.34 1592993 2187576
scd0 0.00 0.00 0.00 1 0
sdc 0.00 0.01 0.00 8975 2786
sdb 0.00 0.00 0.00 2921 2048
dm-0 0.17 0.94 1.33 1529818 2170543
dm-1 0.02 0.02 0.06 38232 94228
loop0 0.00 0.00 0.00 1192 0
loop1 0.00 0.00 0.00 253 0
loop2 0.00 0.00 0.00 1202 0
dm-2 0.00 0.00 0.00 1223 2048
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.50 0.00 0.00 99.50
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
scd0 0.00 0.00 0.00 0 0
sdc 0.00 0.00 0.00 0 0
sdb 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0
dm-1 0.00 0.00 0.00 0 0
loop0 0.00 0.00 0.00 0 0
loop1 0.00 0.00 0.00 0 0
loop2 0.00 0.00 0.00 0 0
dm-2 0.00 0.00 0.00 0 0
收集系统活动报告
sar命令在系统活动信息的收集、报告和保存方面既全面又灵活。你可以像“stat”命令那样使用它,提供一个间隔和一个计数,使用选项如-b来显示 I/O 统计信息,或者结合两者在特定间隔内显示所选性能计数器。
我将以一个带有开关的sar使用示例开始。继续使用-b示例,以下是部分 I/O 统计报告:
$ sar -b
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 02/13/2022 _x86_64_ (1 CPU)
12:00:15 AM tps rtps wtps bread/s bwrtn/s
12:10:15 AM 0.22 0.03 0.19 2.32 4.30
12:20:15 AM 0.10 0.00 0.10 0.00 0.79
12:30:15 AM 0.16 0.00 0.16 0.00 1.76
12:40:15 AM 0.08 0.00 0.08 0.00 0.5
...
12:20:15 PM 0.08 0.00 0.08 0.00 0.73
12:30:15 PM 0.10 0.00 0.10 0.00 0.87
12:40:15 PM 0.08 0.00 0.08 0.00 0.78
12:50:15 PM 0.11 0.00 0.11 0.00 0.90
Average: 0.25 0.11 0.14 6.29 2.35
如报告所示,数据显示从午夜开始,这就是我不得不截断它的原因。以下是一个使用-b,计数为五,间隔为五秒的 I/O 统计数据示例:
$ sar -b 5 5
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 02/13/2022 _x86_64_ (1 CPU)
12:57:13 PM tps rtps wtps bread/s bwrtn/s
12:57:18 PM 0.00 0.00 0.00 0.00 0.00
12:57:23 PM 0.00 0.00 0.00 0.00 0.00
12:57:28 PM 0.00 0.00 0.00 0.00 0.00
12:57:33 PM 0.00 0.00 0.00 0.00 0.00
12:57:38 PM 0.00 0.00 0.00 0.00 0.00
Average: 0.00 0.00 0.00 0.00 0.00
最后,你可以使用sar命令和一个计数以及一个间隔:
$ sar 5 5
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 02/13/2022 _x86_64_ (1 CPU)
01:02:11 PM CPU %user %nice %system %iowait %steal %idle
01:02:16 PM all 0.00 0.00 0.20 0.00 0.00 99.80
01:02:21 PM all 0.00 0.00 0.40 0.00 0.00 99.60
01:02:26 PM all 0.00 0.00 0.20 0.00 0.00 99.80
01:02:31 PM all 0.00 0.00 0.20 0.00 0.00 99.80
01:02:36 PM all 0.00 0.00 0.20 0.00 0.00 99.80
Average: all 0.00 0.00 0.24 0.00 0.00 99.76
注意
sar命令的默认输出是 CPU 统计信息。要显示其他统计信息,你必须使用一个开关,例如用于 I/O 数据的-b。
接下来的部分展示如何运行系统活动报告并将sar数据保存到文件中。
格式化系统活动报告
显示sar数据能让您看到过去 24 小时的快照和性能情况,但如果您想以特定格式(如 CSV 或 XML)将这些数据捕获到文件中(系统活动报告),则可以使用sadf命令。
为了帮助区分sadf和sar选项,请记住在命令中首先出现sadf选项,然后是sar选项跟随双破折号。请参考 man 手册获取这两个命令的所有可用选项。
我最喜欢的sadf命令使用-d开关来创建逗号分隔的文件,非常适合导入数据库:
$ sadf -d
# hostname;interval;timestamp;CPU;%user;%nice;%system;%iowait;%steal;%idle
server1;600;2022-02-13 06:10:15 UTC;-1;0.01;0.00;0.24;0.01;0.00;99.74
server1;600;2022-02-13 06:20:15 UTC;-1;0.00;0.00;0.21;0.01;0.00;99.78
server1;600;2022-02-13 06:30:15 UTC;-1;0.01;0.02;0.23;0.01;0.00;99.74
server1;600;2022-02-13 06:40:15 UTC;-1;0.00;0.00;0.22;0.01;0.00;99.77
系统活动日志位于/var/log/sa目录下,并以“sa”后跟当天日期的数字作为文件名。例如,用于当月第 10 天的系统活动日志数据文件是sa10。您可以指定从其他日期的活动日志数据文件:
$ sadf -d /var/log/sa/sa10 -- -d
# hostname;interval;timestamp;DEV;tps;rkB/s;wkB/s;areq-sz;aqu-sz;await;...
server1;600;2022-02-10 06:10:15 UTC;dev8-0;0.35;8.46;2.17;30.81;0.00;0.62;...
server1;600;2022-02-10 06:10:15 UTC;dev11-0;0.00;0.00;0.00;0.00;0.00;0.00;...
server1;600;2022-02-10 06:10:15 UTC;dev8-32;0.00;0.00;0.00;0.00;0.00;0.00;...
server1;600;2022-02-10 06:10:15 UTC;dev8-16;0.00;0.00;0.00;0.00;0.00;0.00;...
server1;600;2022-02-10 06:10:15 UTC;dev253-0;0.30;8.35;2.27;35.42;0.00;0.90;...
server1;600;2022-02-10 06:10:15 UTC;dev253-1;0.03;0.11;0.00;4.00;0.00;1.00;...
server1;600;2022-02-10 06:10:15 UTC;dev7-0;0.00;0.00;0.00;0.00;0.00;0.00;...
server1;600;2022-02-10 06:10:15 UTC;dev7-1;0.00;0.00;0.00;0.00;0.00;0.00;...
server1;600;2022-02-10 06:10:15 UTC;dev7-2;0.00;0.00;0.00;0.00;0.00;0.00;...
server1;600;2022-02-10 06:10:15 UTC;dev253-2;0.00;0.00;0.00;0.00;0.00;0.00;...
注释
在某些 Linux 发行版中,sysstat日志存储在/var/log/sa中,但在其他发行版中,这些日志则存储在/var/log/sysstat中。
--选项告诉sadf命令其后跟随的选项是sar命令选项,而非sadf选项。在命令sadf -d /var/log/sa/sa10 -- -d中,跟在--后的-d选项将显示sar设备信息。也许一个不那么令人困惑的例子是显示来自sar命令的网络信息:
$ sadf -d /var/log/sa03 -- -n DEV
# hostname;interval;timestamp;IFACE;rxpck/s;txpck/s;rxkB/s;txkB/s;rxcmp/s;...
server1;600;2022-02-10 06:10:15 UTC;lo;0.00;0.00;0.00;0.00;0.00;...
server1;600;2022-02-10 06:10:15 UTC;enp0s3;0.50;0.01;0.12;0.00;0.00;...
server1;600;2022-02-10 06:20:15 UTC;lo;0.00;0.00;0.00;0.00;0.00;...
server1;600;2022-02-10 06:20:15 UTC;enp0s3;0.42;0.00;0.10;0.00;0.00;...
server1;600;2022-02-10 06:30:15 UTC;lo;0.00;0.00;0.00;0.00;0.00;...
server1;600;2022-02-10 06:30:15 UTC;enp0s3;0.47;0.00;0.10;0.00;0.00;...
-n是网络活动的sar选项。DEV表示网络设备,如lo(环回)、eth0、enp0s3等。
摘要
我只是初步了解了系统健康的表面,而这一章可能需要写成一本整书。健康监控在维护客户 SLA 方面非常重要。跟踪系统健康是影响容量和性能、安全性以及标准系统维护的重要系统管理员任务。它如此重要,以至于一些大型企业专门成立了整个团队来处理这一任务。
在第九章中,我讨论了非健康系统监控和网络库存系统。
第九章:监控您的系统
监控不是可选的。它是必需的。每个系统管理员都必须通过警惕的眼光监视其系统的性能、健康和安全性。手动监视系统并执行其他管理任务是不可能的,因此您必须依赖自动化软件、特定的系统配置和报告系统来更新每个系统的状态。
本章探讨了本地监控工具,并指导您收集系统的性能和健康统计信息。
保持对 CPU、内存和磁盘性能和容量的警觉
Linux 系统中的三个主要监控焦点是 CPU、内存和磁盘性能。
注意
本地区域网络(LAN)上的网络容量通常不是什么大问题,尤其是在千兆网络速度下。许多数据中心/服务器房间使用 10 千兆连接,因此系统间通信几乎是即时的,即使是大型备份也没有问题。话虽如此,检查网络性能只需要您几分钟时间,为什么不包括呢?数据存在且可以自由获取,因此请展示它、研究它,并在看到负面趋势时采取行动。
本章重点介绍 CPU、内存和磁盘的性能和容量。
跟踪 CPU 使用率
CPU 通常位于系统组件列表的顶部,需要监视。它处于顶部是因为它是系统的动力源。如果您的系统 CPU 持续运行在 80%以上的利用率,可能是系统没有足够的 CPU 来支持操作系统和所有运行的应用程序。还有可能是应用程序编码问题或安全漏洞问题导致 CPU 利用率进入“红色”区域。
有许多可用工具可帮助您监视和评估 CPU 利用率。最简单和最常见的是top和ps命令,它们是每个 Linux 发行版的标准构建的一部分。
top 命令
作为系统管理员,您可能遇到过top或其相关命令之一,如atop或htop。top实用程序在大多数 Linux 发行版中是标准的,但您需要从发行版的存储库安装atop和htop软件包。top命令提供了实时查看系统“顶级”进程的视图。默认情况下,top列出了消耗 CPU 最多的进程。
top
所有用户可以使用top命令,并从 CPU(默认)更改排序选项到内存、时间和 PID,如图 9-1 所示。

图 9-1. 按% CPU 排序的 top 命令
使用 Shift + M 切换到内存使用模式,如图 9-2 所示。

图 9-2. 按内存消耗排序的 top 命令
要查看进程运行了多长时间,请使用 Shift + S 来按时间排序,如 图 9-3 所示。

图 9-3. 按时间排序的顶部进程
表 9-1 提供了一些 top 的排序选项的键盘快捷键。
表 9-1. 一些排序选项的键盘快捷键
| Key | Sorting |
|---|---|
| Shift + M | %MEM(内存使用率) |
| Shift + P | %CPU(CPU 使用率 - 默认) |
| Shift + S | TIME(运行时间) |
浏览 top 的输出,你可能发现很难知道哪个值是焦点。因此,通常需要使用其中一个键盘快捷键来应用已知的排序方案以重置你的视图。如果我忘记了正在运行的排序方案,我会循环查看 CPU、内存和时间来检查。
标准的 top 命令很有用,但对于许多系统管理员来说,显示的信息并不足以支持明智的决策。atop 和 htop 命令在大多数发行版上默认未安装,但它们提供了更广泛的系统状态视图。
atop
atop 实用程序是一个先进的系统和进程监视器。atop 在下方窗格显示标准的顶部进程,但在上方窗格提供 CPU、内存、磁盘和网络性能的洞察,如 图 9-4 所示。

图 9-4. atop 命令
atop 的 man 手册 如下描述 atop:
atop程序是一个交互式监视器,用于查看 Linux 系统的负载情况。它显示系统级别上最关键的硬件资源(从性能角度看),即 CPU、内存、磁盘、LVM、交换空间使用情况和网络。它还显示了哪些进程负责 CPU 和内存负载的指示负载。
你可以作为普通用户或 root 用户运行 atop。根据命令是由哪个用户(普通用户还是 root 用户)执行的,命令将显示一条消息,告知你当前使用的模式。
作为 root 用户运行时:
*** System and Process Activity since Boot *** Unrestricted view (privileged)
作为普通用户运行时:
*** System and Process Activity since Boot *** Restricted view (unprivileged)
这两种模式的视图相同。但在受限视图中,有一些你不能执行的操作,比如在非自己拥有的进程上使用 kill 命令。正如前面提到的,atop 实用程序对系统管理员非常有吸引力,因为它显示了关键系统参数的重点性能值。这些统计数据非常方便,因为你无需搜索特定的性能数据或使用可能昂贵的第三方工具来提取信息。atop 实用程序是系统管理员工具箱的重要组成部分。
htop
htop实用程序是另一个系统性能查看器,显示与标准top实用程序相同的信息,但具有彩色编码和方便的命令菜单。如您在图 9-5 中所见,htop实用程序的当前使用模式被突出显示(CPU%)。当前模式是 CPU 使用率。菜单可帮助执行特定命令,管理员无需记忆每个操作的按键。

图 9-5. htop实用程序在 CPU 使用模式下运行的示意图
ps
ps命令显示有关运行中进程的信息。您可以使用命令选项或开关以不同格式查看自己的进程、所有进程和进程表。ps命令在所有 Linux 发行版中都很常见。
要查看您的用户帐户拥有的所有进程,请使用带有-ux选项的ps命令:
$ ps -ux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
khess 1550 0.0 1.1 89444 9600 ? Ss Jul31 0:00 /usr/lib/systemd/...
khess 1554 0.0 0.4 244512 3868 ? S Jul31 0:00 (sd-pam)
khess 1560 0.0 0.5 153444 4728 ? S Jul31 0:00 sshd: khess@pts/0
khess 1561 0.0 0.6 235212 5052 pts/0 Ss Jul31 0:00 -bash
khess 4698 0.0 0.4 271452 4140 pts/0 R+ 08:31 0:00 ps -ux
您也可以使用-aux开关组合按所有者查看所有进程:
$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 1.6 174996 13372 ? Ss Jul31 0:04 /usr/lib/systemd/...
root 2 0.0 0.0 0 0 ? S Jul31 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< Jul31 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< Jul31 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< Jul31 0:00 [kworker/0:0H...
root 9 0.0 0.0 0 0 ? I< Jul31 0:00 [mm_percpu_wq]
完整的进程表过长无法在此展示,但您可以从列表中看到,显示的结果按进程 ID(PID)升序显示。前一节的top命令是一个动态进程表,您可以按 CPU、内存和其他性能测量排序。
本节中其余的实用程序不像top或ps命令那样著名,但足够重要,您应该学习并探索每个工具的功能和功能。
glances
glances,如图 9-6,是另一个top程序。它是一个跨平台的监控工具。开发者重新排列并着色显示,但信息与您在htop实用程序中看到的类似。

图 9-6. glances的动态显示,焦点在CPU%
按下 M 键(不需要 Shift 键的快捷键在glances中)将焦点从CPU%切换到MEM%,按 T 键切换到TIME。按 C 键返回显示的CPU%。
注意
如果您的系统受到 CPU 约束或怀疑受到 CPU 约束,请不要将glances用作主要 CPU 性能检查工具,因为它消耗大约 15%的 CPU,而top只需 3%–5%。
您也可以在客户端/服务器配置中运行glances,导出数据到多种格式,并更改其显示设置。请参阅glances的手册页以获取glances功能和选项的列表。
探索sysstat监控
sysstat(系统状态)包是一个本地工具。换句话说,它是一个预打包的标准监控工具,在任何 Linux 发行版上都是免费且自由可用的。如果您愿意,可以从源代码编译它,但它通常以软件包形式提供给所有主要发行版。
以下摘自sysstat手册页:
sysstat包含用于 Linux 的 sar、sadf、mpstat、iostat、tapestat、pidstat、cifsiostat 工具。
- sar 是系统活动报告工具。
sadf是系统活动数据格式化程序,以多种格式(CSV、XML 等)显示sar收集的数据。iostat是显示 CPU 利用率和磁盘 I/O 统计信息的输入/输出统计工具。tapestat显示磁带和磁带驱动器的统计信息。mpstat是显示全局和每个处理器统计信息的多处理器统计工具。pidstat按进程 ID 报告 Linux 进程的统计信息。cifsiostat是 CIFS(Samba/SMB)I/O 统计工具。
系统活动报告
sar 实用程序是 sysstat 命令套件中使用最多的工具。这个系统活动报告工具显示从午夜到当前时间的性能统计数据。默认情况下,sar 只显示当天的指标。
您可以将 sar 收集的信息保存在二进制格式的文件中。sar 报告的统计信息包括 I/O 传输速率、分页、与进程相关的性能、中断、网络活动、内存利用率、交换空间利用率、CPU 利用率、内核活动、TTY 统计等等。 sysstat 软件包完全支持单处理器和多处理器系统。
使用 sar 命令无选项显示 CPU 统计信息(默认情况下):
$ sar
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 09/20/2022 _x86_64_ (1 CPU)
12:00:07 AM CPU %user %nice %system %iowait %steal %idle
12:10:08 AM all 0.01 0.20 0.53 0.05 0.00 99.22
12:20:00 AM all 0.01 0.00 0.25 0.01 0.00 99.74
12:30:01 AM all 0.00 0.00 0.24 0.01 0.00 99.75
12:40:02 AM all 0.01 0.00 0.25 0.01 0.00 99.73
...
02:00:04 PM all 0.01 0.00 0.26 0.01 0.00 99.73
02:10:05 PM all 0.01 0.01 0.27 0.01 0.00 99.70
02:20:05 PM all 0.01 0.00 0.26 0.01 0.00 99.72
02:30:06 PM all 0.01 0.00 0.27 0.01 0.00 99.72
Average: all 0.01 0.01 0.29 0.01 0.00 99.69
您可以使用命令选项过滤 sar 的结果。例如,要显示 CPU 统计信息,请使用 -u 选项。 -u 选项显示与 sar 命令无选项相同的结果。添加 ALL 关键字以包括所有与 CPU 相关的统计信息:
$ sar -u ALL
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 09/24/2022 _x86_64_ (1 CPU)
12:00:03 AM CPU %usr %nice %sys %iowait %steal %irq %soft %guest %gnice %idle
12:10:01 AM all 0.02 0.00 0.06 0.01 0.00 0.22 0.05 0.00 0.00 99.64
12:20:01 AM all 0.01 0.00 0.03 0.01 0.00 0.21 0.05 0.00 0.00 99.69
12:30:02 AM all 0.01 0.00 0.03 0.01 0.00 0.20 0.05 0.00 0.00 99.70
-B 选项显示分页统计信息:
$ sar -B
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 09/24/2022 _x86_64_ (1 CPU)
-b 选项报告 I/O 和传输速率统计信息:
$ sar -b
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 09/24/2022 _x86_64_ (1 CPU)
12:00:03 AM tps rtps wtps bread/s bwrtn/s
12:10:01 AM 0.53 0.13 0.40 11.42 6.52
12:20:01 AM 0.17 0.00 0.17 0.00 1.97
12:30:02 AM 0.16 0.00 0.16 0.00 1.97
12:40:03 AM 0.17 0.00 0.17 0.00 1.99
如示例所示,sar 命令非常灵活,并有多个选项用于显示系统性能数据。请参阅 sar 手册获取详尽的选项列表。下一节将介绍使用 sadf 命令以多种格式显示 sar 数据。
以多种格式显示系统活动数据
sadf 命令将 sar 数据发送到不同的输出类型,以便将其数据导入数据库或在网页上显示更容易。例如,以下命令以易于导入数据库的格式显示本月 21 日的 sar 数据:
$ sadf -d /var/log/sa/sa21
# hostname;interval;timestamp;CPU;%user;%nice;%system;%iowait;%steal;%idle
server1;601;2022-09-21 04:10:04 UTC;-1;0.01;0.00;0.28;0.01;0.00;99.70
server1;601;2022-09-21 04:20:05 UTC;-1;0.01;0.00;0.26;0.01;0.00;99.72
server1;601;2022-09-21 04:30:06 UTC;-1;0.01;0.00;0.28;0.01;0.00;99.71
server1;601;2022-09-21 04:40:07 UTC;-1;0.01;0.00;0.27;0.01;0.00;99.71
...
除了与历史数据一起使用 sadf,还可以与当前数据一起使用:
$ sadf -dh -- -p
# hostname;interval;timestamp;CPU;%user;%nice;%system;%iowait;%steal;%idle[...]
server1;598;2022-09-24 04:10:01 UTC;-1;0.02;0.00;0.33;0.01;0.00;99.64
server1;601;2022-09-24 04:20:01 UTC;-1;0.01;0.00;0.30;0.01;0.00;99.69
server1;601;2022-09-24 04:30:02 UTC;-1;0.01;0.00;0.29;0.01;0.00;99.70
server1;600;2022-09-24 04:40:03 UTC;-1;0.01;0.00;0.29;0.01;0.00;99.69
...
使用 sadf 生成不同数据输出的选项太多,无法在此列出。请在网上搜索更多示例或尝试来自 sadf 手册的选项。接下来的章节将处理其他 sysstat 实用程序(如 iostat、tapestat、mpstat、pidstat 和 cifsiostat)的具体统计输出:它们的相关性取决于您的硬件配置。例如,几乎没有任何企业仍在使用磁带驱动器进行备份。
使用 iostat 监控系统 I/O 设备负载
与其他“stat”命令类似,你看到的第一个指标是从系统上次启动以来的统计摘要或总结指标。通常,你会多次运行 stat 命令以查看当前统计信息,或者使用-y选项忽略总结指标。在第一个示例中,包括摘要信息;在第二个示例中,摘要被省略了。
这是包含摘要信息的回应:
$ iostat -d 2
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 09/24/2022 _x86_64_ (1 CPU)
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.26 1.59 2.05 312698 403049
sdc 0.01 0.04 0.01 8267 2797
sdb 0.00 0.02 0.01 3028 2048
scd0 0.00 0.00 0.00 1 0
dm-0 0.26 1.31 2.12 257071 416372
dm-1 0.00 0.01 0.01 2220 1172
dm-2 0.00 0.01 0.01 1330 2048
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdc 0.00 0.00 0.00 0 0
sdb 0.00 0.00 0.00 0 0
scd0 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0
dm-1 0.00 0.00 0.00 0 0
dm-2 0.00 0.00 0.00 0 0
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdc 0.00 0.00 0.00 0 0
sdb 0.00 0.00 0.00 0 0
scd0 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0
dm-1 0.00 0.00 0.00 0 0
dm-2 0.00 0.00 0.00 0 0
这是不包含摘要信息的回应:
$ iostat -y -d 2
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 09/24/2022 _x86_64_ (1 CPU)
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdc 1.00 0.00 0.75 0 1
sdb 0.00 0.00 0.00 0 0
scd0 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0
dm-1 0.00 0.00 0.00 0 0
dm-2 0.00 0.00 0.00 0 0
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdc 0.00 0.00 0.00 0 0
sdb 0.00 0.00 0.00 0 0
scd0 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0
dm-1 0.00 0.00 0.00 0 0
dm-2 0.00 0.00 0.00 0 0
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdc 0.00 0.00 0.00 0 0
sdb 0.00 0.00 0.00 0 0
scd0 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0
dm-1 0.00 0.00 0.00 0 0
dm-2 0.00 0.00 0.00 0 0
在安静的虚拟机上,统计数据可能并不是很有趣,但至少你能看到该实用程序在报告中产生了哪些指标。与其他sysstat实用程序一样,iostat有几个选项可以从手册页中获取。
使用磁带统计实用程序回到老派
在写这篇文章时,我已经有超过 15 年没有使用磁带驱动器了。虚拟磁带驱动器(将硬盘伪装成磁带驱动器)已经取代了旧的流式磁带系统。我在这里介绍tapestat是为了遗留目的,因为总有一个旧的“不支持”的系统上还有一个安装了磁带驱动器的设备。关于它的信息比黄金还要珍贵,你可能需要检索这些信息。本节不会帮助你检索信息,但你可以从其操作中看到一些与磁带驱动器相关的统计数据。
这是我在我的 Linux 虚拟机上运行tapestat时收到的响应:
$ tapestat
Linux 4.18.0-348.7.1.el8_5.x86_64 (server1) 09/24/2022 _x86_64_ (1 CPU)
No tape drives with statistics found
当你输入tapestat命令时,你可能会收到的消息。磁带驱动器已经成为历史的一部分,并且不是任何人的“好日子”的一部分。如果你仍在使用它,你的输出将为你提供有趣和有用的统计信息。
收集处理器统计信息
使用mpstat(多处理器统计)实用程序,你可以显示系统的多处理器和单处理器统计信息。使用mpstat命令而无选项显示所有处理器的摘要:
$ mpstat
Linux 5.4.0-125-generic (server2) 09/25/2022 _x86_64_ (2 CPU)
10:06:16 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:06:16 AM all 0.92 0.01 0.91 0.20 0.00 0.25 0.00 0.00 0.00 97.72
系统中包含两个处理器,因此可以查看各个处理器的性能。通过指定选项-P和处理器编号来查看各个处理器。请记住,处理器编号从0开始。对于双处理器系统,有处理器0和处理器1。以下命令显示处理器1的统计信息:
$ mpstat -P 1
Linux 5.4.0-125-generic (server2) 09/25/2022 _x86_64_ (2 CPU)
10:12:43 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:12:43 AM 1 0.71 0.01 0.64 0.14 0.00 0.08 0.00 0.00 0.00 98.43
你还可以通过指定ALL选项查看所有处理器:
$ mpstat -P ALL
Linux 5.4.0-125-generic (server2) 09/25/2022 _x86_64_ (2 CPU)
09:56:28 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
09:56:28 AM all 2.05 0.02 2.01 0.44 0.00 0.44 0.00 0.00 0.00 95.05
09:56:28 AM 0 1.93 0.02 2.11 0.44 0.00 0.65 0.00 0.00 0.00 94.84
09:56:28 AM 1 2.16 0.02 1.91 0.43 0.00 0.22 0.00 0.00 0.00 95.25
与其他“stat”命令类似,你可以请求在几秒钟的间隔和指定的迭代次数内显示。例如,以下命令每五秒执行一次mpstat,迭代三次:
$ mpstat 5 3
Linux 5.4.0-125-generic (server2) 09/25/2022 _x86_64_ (2 CPU)
10:26:53 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:26:58 AM all 0.00 0.00 0.00 0.00 0.00 0.10 0.00 0.00 0.00 99.90
10:27:03 AM all 0.00 0.00 0.00 0.00 0.00 0.10 0.00 0.00 0.00 99.90
10:27:08 AM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: all 0.00 0.00 0.00 0.00 0.00 0.07 0.00 0.00 0.00 99.93
在更忙碌的系统上,数字会更具信息性。你可以确定特定处理器是否在或超过容量,并选择性地将进程绑定到其他处理器以减轻对CPU0的压力。接下来的实用程序pidstat显示特定进程绑定到哪个处理器。
使用 pidstat 监视 Linux 任务
pidstat命令用于监视当前由 Linux 内核管理的单个任务。默认命令,未传递任何选项给它,仅在报告中显示活动任务(具有非零统计值的任务):
$ pidstat
Linux 5.4.0-125-generic (server2) 09/25/2022 _x86_64_ (2 CPU)
11:19:08 AM UID PID %usr %system %guest %wait %CPU CPU Command
11:19:08 AM 0 1 0.02 0.04 0.00 0.01 0.06 0 systemd
11:19:08 AM 0 2 0.00 0.00 0.00 0.00 0.00 1 kthreadd
11:19:08 AM 0 10 0.00 0.01 0.00 0.00 0.01 0 ksoftirqd/0
11:19:08 AM 0 11 0.00 0.03 0.00 0.02 0.03 1 rcu_sched
11:19:08 AM 0 12 0.00 0.00 0.00 0.00 0.00 0 migration/0
11:19:08 AM 0 17 0.01 0.00 0.00 0.01 0.01 1 migration/1
11:19:08 AM 0 18 0.00 0.00 0.00 0.01 0.00 1 ksoftirqd/1
11:19:08 AM 0 30 0.00 0.00 0.00 0.00 0.00 1 khugepaged
...
pidstat实用程序的一个便利用途是检查单个用户的系统使用情况:
$ pidstat -d -U khess
Linux 5.4.0-125-generic (server2) 09/25/2022 _x86_64_ (2 CPU)
11:36:26 AM USER PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
11:36:26 AM khess 1131 0.03 0.00 0.00 1 systemd
11:36:26 AM khess 1239 0.79 0.00 0.00 2 bash
pidstat 实用程序在跟踪耗费太多系统资源的恶意用户或进程时具有重要价值。
使用cifsiostat监视与 Windows 兼容的文件系统统计信息
cifsiostat 命令显示关于在 Common Internet File System (CIFS)或 Samba 文件系统上读取和写入操作的统计信息。许多系统管理员会维护 CIFS 以与其 Windows 用户兼容。Windows 用户可以将驱动器映射到 CIFS 共享,类似于在 Windows 系统上映射到共享文件夹。使用 CIFS 可以更轻松地在 Windows 桌面系统和 Linux 服务器之间维护一些兼容性。CIFS 也可能使得使用 Windows Server 系统变得不必要,因为许多 Windows 服务可以使用该协议复制。
使用cifsiostat命令显示统计信息:
$ cifsiostat
Filesystem: rB/s wB/s rops/s wops/s fo/s fc/s fd/s
\\server2\common 0.00 0.00 0.00 0.00 1.00 1.00 0.00
如果cifsiostat在您的系统上不起作用,请确保已正确安装和运行 CIFS/Samba。将 Samba 用户添加到您的系统中。设置可写/可浏览的共享。使用以下命令启动/重新启动和启用 Samba:
$ sudo systemctl enable smbd
$ sudo systemctl enable nmbd
$ sudo systemctl start smbd
$ sudo systemctl start nmbd
同样,请确保已加载cifs内核模块:
$ modinfo cifs
总结
在本章中,您了解了如何监控系统性能以及可以使用哪些工具来跟踪这些统计信息。不幸的是,并没有一种单一的工具可以做到一切。许多系统管理员安装商业监控工具来弥补缺乏全局免费监控工具的问题。过去曾有一些尝试创建此类免费工具的企图,但它们要么被其开发者放弃,要么被出售给商业公司。
监控您的系统是一个必需的任务,它不仅仅是简单的上/下状态检查。您必须对系统的性能和容量保持持续的警惕,以尽量减少停机时间,并为您的应用程序和资源提供业务连续性。
第十章:脚本编写与自动化
系统管理员尽力自动化他们所能自动化的任务。但并非所有事情都可以自动化。自动化是好事,但也有其局限性。在本章中,我讨论了自动化的利与弊。有些任务难以自动化,因为涉及太多变量。自动化也带来一些安全风险,因为自动化需要提升特权的任务会产生安全漏洞,这可能导致系统被入侵。其他妨碍自动化的因素包括时间同步和时间漂移、系统故障、脚本错误条件和人类交互。
创建脚本并自动化任务既具有挑战性又有趣。观察一系列脚本和计划按计划运行,模仿人类的击键、决策和活动,是令人满足的。每个系统管理员都必须掌握如何创建基本的 Shell 脚本,并应自动化所有可能的非特权、重复性任务。本章介绍了脚本编写与自动化的概念,但不涉及脚本的低级机制(循环、文件 I/O 等),这些内容在网络上有详细的文档。
回答这个问题:为什么要自动化?
我曾有几位系统管理员问我,为什么要自动化任何事情。答案很简单:这样你就可以专注于更高级别的任务,而你的计算机系统可以处理日常繁琐的工作,这些工作你必须完成,但 CPU 和一些内存可以在没有错误的情况下处理。你想让你的一天充满手动创建备份、将备份复制到存档位置、检查每个系统的容量、安装更新、检查日志文件是否有错误以及检查运行时间,还是更愿意专注于系统安全、测试新软件和提高脚本技能?
你只有有限的时间来完成必须做的工作。而你手边可能有几乎不计其数的计算能力。利用它吧。那些需要你花费几个小时的任务可以交给系统,这些系统可以无误地完成这些重复性任务,而且不会感到疲倦或沮丧,并且几乎没有额外开销。这就是你应该自动化每一个可能的任务的原因。
自动化将你自动化出职业
剧透警告:你永远不可能通过自动化失去工作,但你应该尝试。说真的,你可以自动化你面对的每一个重复乏味的任务,但你永远不会因为自动化而失业。硬件、软件、网络,尤其是用户,有太多变量和可能出错的地方,无法因为你成功自动化了太多而终结你的就业。
下面是我相信能为你解惑的五个关于自动化的常见问题的答案:
应该自动化哪些任务?
任何可以可靠地脚本化的任务,即使需要用户输入。
有哪些任务是无法自动化的?
是的,有很多这样的任务。大多数需要复杂、多步决策的事情不能被自动化(尽管有些可以)。你可以使用各种技术来自动化它们,包括expect、shell 脚本、Perl、PHP 和其他脚本语言和编译语言。
有哪些任务是不应该自动化的?
是的。你不应该自动化那些需要你在文本文件中存储未加密密码的任务。有多种方法可以自动化任务,你可以使用加密密码、密钥文件、限制的sudo或非特权账户。
我应该首先自动化哪些任务?
备份。例如,创建/etc目录的备份,并使用安全复制(SCP)将其归档到另一个系统上。
我应该购买商业自动化解决方案吗?
你可以,但在花钱购买之前,应该先使用自己的脚本并耗尽你的选择。但是,如果主机数量使之合理,当然可以购买商业解决方案。
基本的自动化很容易做到,它节省时间和金钱,避免了人为错误。
自动化还涉及心理因素——自动化的系统管理员比手动执行每个任务的人经历更少的倦怠感。想想备份的重复性质,将其转移到归档位置,检查备份,删除旧的归档。如果你管理的系统超过少数几个,手动输入每个命令将占据你一天(或晚上)的大部分时间。这种工作方式对人的心理影响很大,导致倦怠和工作不满意。多项研究表明,自动化确实提高了工作满意度。Alex Edelstein 的博客文章“你的员工中 89%可以从这一变化中受益”进一步解释了这个概念。
创建脚本
如果你需要一个脚本来执行特定的任务,那么很有可能可以通过简单的在线搜索找到一个。你不必从头开始编写一个。根据你的需求调整脚本并使用它们而无需内疚。其他系统管理员会将他们的脚本放在网上供你使用。然而,你应该学习脚本编写的基础知识,比如从文件中读取,写入文件,grep,管道,重定向,循环和在脚本内调用其他脚本。你不必成为脚本编写专家,但学习这些基础知识有助于你找到你需要的东西,并允许你根据你的情况进行调整。
编写备份脚本是一个很好的起点。备份是必需的,在故障或人为错误(可能是你自己的)时你将成为英雄。我知道一些有超过十年经验的系统管理员曾经意外删除了整个/etc目录,因此良好的备份对于作为系统管理员的愉快生活至关重要。以下部分将教你脚本编写的概念。其中最重要的是概述你的脚本。
概述你的脚本
在编写脚本之前,请先概述脚本的功能。不,你不必创建流程图,但应列出希望在脚本运行期间发生的步骤。这里有一个示例脚本,我称之为backup_server1.sh:
-
创建/etc目录的
tar文件。 -
压缩
tar文件。 -
将文件传输到服务器archive1。
这很简单。该脚本是一个简单的自上而下的过程,没有决策树或分支。
从概述编写脚本
现在您有了脚本概述,也有了脚本的文档。您必须记录脚本,因为在六个月或一年后,您可能不会记得脚本的目的,甚至不记得您编写过它。
backup_server1.sh的内容如下:
#!/bin/bash
# Create a tar file of /etc.
sudo tar cvf server1_etc.tar /etc
# Compress the tar file
gzip -9 server1_etc.tar
# Transfer the file to archive1 into the /server1/backups directory
scp server1_etc.tar.gz archive1:/server1/backups
保存文件,赋予执行权限,然后就可以使用了。archive1系统上/server1/backups目录应由将备份放入其中的用户可执行和可写。为了更好的安全性,您应指定一个备份用户,并创建仅该用户具有权限的备份目录。
在所有系统上创建一个名为 Backup and Restore (bur)的用户,并为bur用户设置无密码 SSH 密钥文件。为所有系统上的bur用户设置cron作业:
drwx------ 2 bur bur 64 Oct 4 08:01 backups
这是server1上bur用户的crontab:
0 2 * * * /home/bur/backup_server1.sh
bur用户的crontab将在每天凌晨 2 点备份server1的/etc目录。备份将传输到archive1中的/server1/backup目录。您需要在每个系统上设置这种情况。archive1的备份应发送到另一个系统。
/etc目录不是您需要备份的唯一目录。这只是一个例子。在安全事件或故障之前恢复系统可能需要备份/home、/var/www/html、/opt等目录。crontab(定时任务)将在下一节详细解释。
定时任务
cron实用程序安排命令在特定时间运行。它有助于自动执行必须在特定时间、多次或人类难以方便执行的重复任务。
多年来,开发人员尝试替换cron实用程序,但成功甚少。cron难以替换,因为它工作良好,并且足够灵活,可以处理大多数计划活动。cron可靠,因为它使用计算机的系统时钟执行计划活动。如果您的自动化任务涉及多个系统并且它们的时间偏移超出同步,则会遇到问题。解决方法是引用中央时间服务器。我将在本节后面介绍网络时间协议。
使用 cron 调度任务
cron实用程序在所有 Linux 系统上都可用,并且它可以正常工作。无需调整或配置。它是一个经过时间考验的应用程序,专门用于在特定时间运行命令,并且它执行得非常好。学习cron的最佳方式是通过示例,因为其语法不一定直观。
cron具有简单的“语法”或格式:
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * command to execute
这里没有显示的是,您可以仅使用一个计划或cron“作业”多次运行脚本或命令。例如,您需要运行一个检查文件存在性的脚本,每天每 5 分钟运行一次。该条目的格式如下:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script.sh
如果您希望脚本在每周一、三和五下午 2 点运行,cron调度的格式如下:
0 14 * * 1,3,5 /path/to/script.sh
如果您希望您的脚本在每个月的 15 日上午 6 点运行:
0 6 15 * * /path/to/script.sh
您在cron调度中有很多可能性。
警告
不要为** * * * * /path/to/script.sh*在cron中设置一个计划,除非您希望您的脚本每天每分钟运行一次。对于大多数监视场景,每五分钟运行一次足以捕获您试图捕获或跟踪的任何进程、错误或文件。
使用网络时间协议防止时间漂移
编写操作多个系统的脚本时的一个问题是同步它们之间的系统时间。例如,想象一下,您有一个从服务器 A收集文件并将其复制到服务器 B的脚本,一旦这些文件被复制,服务器 B会检查它们,然后创建一个 tar 包并将它们复制到 NAS 进行归档。如果这需要每天多次发生并按时序列进行,您可以看到在服务器系统之间同步时间的重要性。
保持所有系统时间同步的方法是参考一个互联网时间服务器和网络内部的时间服务器(以防止遇到互联网连接故障)。
安装ntp或chrony以允许您的系统与外部(互联网)时间服务器同步。安装chrony很简单,并且作为客户端不需要配置。在这里,我演示了如何安装和配置chrony。在 Debian 发行版上,它的工作方式类似,只是您的chrony配置文件位于/etc/chrony/而不仅仅是/etc:
$ sudo yum -y install chrony
$ sudo apt install chrony
$ sudo systemctl enable chronyd
Created symlink /etc/systemd/system/multi-user.target.wants/chronyd.service
→ /usr/lib/systemd/system/chronyd.service.
$ sudo systemctl start chronyd
chrony包提供了chrony守护程序chronyd以及一个命令行界面实用程序,具有数十个选项,您可以在其手册页中找到。要执行快速检查,请使用以下命令:
$ chronyc activity
200 OK
4 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
您还可以将chrony配置为您本地网络的时间服务器。要这样做,请取消注释系统中/etc/chrony.conf文件中的以下两行:
# Allow NTP client access from local network.
#allow 192.168.0.0/16
# Serve time even if not synchronized to a time source.
#local stratum 10
更改Allow行以涵盖您的子网,并重新启动chronyd:
$ sudo systemctl restart chronyd
要设置其他 Linux 系统使用您的chrony服务器,请将以下行输入到您的/etc/chrony.conf文件中:
server 192.168.1.80 prefer iburst
prefer 指定告诉 chrony 应首先查询本地系统以获取正确的时间。重新启动 chronyd 以接受新设置,并使用以下命令检查您的 chronyd 源:
$ chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? server1 0 6 0 - +0ns[ +0ns] +/- 0ns
^- mon2.hostin.cc 2 6 7 1 +37ms[ +31ms] +/- 138ms
^+ ntp.netnod.se 1 6 7 1 +9151us[+2267us] +/- 81ms
^? nobody.yourvserver.net 2 6 1 4 -2309us[-9194us] +/- 65ms
^* nettuno.ntp.irh.it 2 6 7 1 -4454us[ -11ms] +/- 67ms
您还可以通过注释 /etc/chrony.conf 中的“pool”行来配置所有客户端系统仅使用本地服务器。您还可以编辑 chrony.conf 文件以设置更具体的设置。我展示的是一个最小但可工作的配置。
警告
虽然 cron 和 chrony 听起来相似,都处理时间安排,并共同工作,但它们实际上是不同的。cron 实用程序安排在特定日期和时间执行作业,而 chrony 与外部时间服务器同步系统时钟。chrony 保持系统时间稳定,以便 cron 作业在正确的时间运行,尤其是在跨多个系统定时作业时尤为重要。
摘要
时机是关键。 调度作业、同步本地系统的时间、在系统之间定时自动化脚本以及与外部“真实源”同步时间是至关重要的。自动化只是保持系统时间同步的原因之一。安全性是另一个原因。考虑这样的情况:您正试图隔离安全事件,而您的系统时间未同步。要确定事件发生的时间和持续时间将变得困难。
自动化是作为系统管理员工作的重要部分。没有足够的时间手动完成每个必需的任务。您必须将重复的琐碎任务交给系统。它们不会抱怨、疲倦或输入错误命令。自动化是一件好事,您应该接受它。尽量自动化以解脱出手工作业的困境。
第十一章:部署 Samba 以实现 Windows 兼容性
互操作性是指诸如 Windows、Linux、Unix 和 macOS 等不同系统共存并协同工作的能力。互操作性现已成为所有数据中心操作系统的标准和被接受的特性,尽管某些功能需要第三方软件。硬件、软件和操作系统不再能够独立存在于专有的真空环境中。换句话说,厂商必须确保其产品具有跨平台的能力。当代的数据中心是异构的——这意味着 Windows、Linux 和 Unix 系统都占据机架。
本地和第三方工具使互操作性成为可能。从 Active Directory(AD)和 LDAP 到 Samba/SMB 再到*nix 工具和应用程序,系统可以共同努力实现一个共同的目标:为客户提供服务。
注意
泛指符号“*nix”代表所有 Unix、Linux 和类似的操作系统及发行版。
Samba 是一套工具,为 Linux 和 Unix 提供 Windows 互操作性。Samba 使用 Server Message Block/Common Internet File System(SMB/CIFS)协议为非 Windows 系统提供安全、稳定的文件和打印服务。Samba 具有自己的身份验证结构,包括权限和密码。
使用 Samba,Linux 系统可以执行以下操作:
-
与 Windows 计算机共享目录、文件系统和打印机
-
挂载 Windows 共享
-
浏览由 Windows 和其他 Linux 计算机提供的共享网络
-
参与 Windows 域身份验证和授权
-
使用 Windows 名称解析服务
-
使用共享打印机
安装了 Samba 的 Linux 服务器,Windows 计算机可以执行以下操作:
-
浏览 Linux 共享
-
使用共享打印机
-
映射网络驱动器到 Linux 共享
本章探讨一些工具和应用程序,使 Linux 系统能够与 Windows 互操作。下一节讨论与 Windows 系统交互的挑战,以及使其正常工作的工具和配置。
规划您的 Samba 环境
在任何企业中,新文件共享请求都是司空见惯的。经常分布在数百或数千英里之外的同事,希望有一个共享空间来放置文件,如文档、电子表格、文本文件、脚本和图像。作为系统管理员,您必须询问您的团队一些问题,以便获得这个共享空间。
对于这种情况,设施部门请求共享文件空间。因此,您将其 Linux 系统设置为 Windows 文件服务器。以下是要询问的五个重要问题列表:
-
这个空间是否应该仅限于您的团队?
-
您希望您组内的每个人都能够在共享空间中复制和创建文件吗?
-
您是否希望设置上传文件的默认权限?
-
您是否需要任何只读文件夹用于文档?
-
这是永久共享空间还是临时共享空间?
对于这种情况,设施经理提供了以下答案:
-
是的,只限制给 facilities 员工。
-
每个人都需要能够复制和创建文件。
-
组中的每个人都需要对所有文件具有读写权限。
-
是的,我们需要一个Policies文件夹,任何人都不能编辑或删除文件。
-
这是一个永久的空间。
答案为 facilities 团队的新共享空间提供了一个起点。如果 facilities 组不存在,请立即创建一个,并将 facilities 团队成员添加为其主要组。组成员帐户是atran、areed和akumar。
注意
Samba 用户名和密码必须与在 Windows 系统上配置的完全匹配。
为了演示 Samba 的功能,执行以下任务:
$ sudo groupadd -g 9001 facilities
$ sudo usermod -g facilities atran
$ sudo usermod -g facilities areed
$ sudo usermod -g facilities akumar
创建一个目录,比如/opt/facilities,将通过 Samba 共享:
$ sudo mkdir /opt/facilities
更改/opt/facilities目录的组所有权和权限,以反映请求的权限:
$ sudo chgrp facilities /opt/facilities
$ sudo chmod 770 /opt/facilities
在/opt/facilities目录下创建一个子目录,并命名为Policies。将Policies目录设置为 facilities 组的只读权限:
$ sudo mkdir /opt/facilities/Policies
$ sudo chmod 740 /opt/facilities/Policies
现在共享空间设置已完成,准备好进行 Samba 配置。
安装 Samba 及其依赖项
在配置与 Samba 相关的任何内容之前,您必须安装它及其依赖软件:
$ sudo yum install samba
Last metadata expiration check: 2:55:52 ago on Sat 08 Oct 2022 11:42:12 AM EDT.
Dependencies resolved.
=================================================================================
Package Architecture Version Repository Size
=================================================================================
Installing:
samba x86_64 4.14.5-7.el8_5 baseos 848 k
Installing dependencies:
libwbclient x86_64 4.14.5-7.el8_5 baseos 121 k
Samba-client-libs x86_64 4.14.5-7.el8_5 baseos 5.4 M
samba-common noarch 4.14.5-7.el8_5 baseos 221 k
Samba-common-libs x86_64 4.14.5-7.el8_5 baseos 173 k
samba-common-tools x86_64 4.14.5-7.el8_5 baseos 500 k
samba-libs x86_64 4.14.5-7.el8_5 baseos
Transaction Summary
=================================================================================
Install 7 Packages
Total download size: 7.4 M
Installed size: 25 M
Is this ok [y/N]: y
该过程在其他发行版上运行方式类似。此操作安装了您设置 Linux 系统作为 Windows 文件服务器所需的所有内容。
启用并启动 Samba 服务(smb和nmb):
$ sudo systemctl enable smb
Created symlink /etc/systemd/system/multi-user.target.wants/smb.service
→ /usr/lib/systemd/system/smb.service.
$ sudo systemctl enable nmb
Created symlink /etc/systemd/system/multi-user.target.wants/nmb.service
→ /usr/lib/systemd/system/nmb.service.
$ sudo systemctl start smb
$ sudo systemctl start nmb
Samba 服务现已启动,并将在启动时启动。
将 Samba 用户添加到您的系统
因为 Samba 管理自己的用户列表,您必须将每个用户添加到 Samba 用户数据库中。为演示目的,我使用PaSSw0rd作为 Samba 密码:
$ sudo smbpasswd -a atran
New SMB password:
Retype new SMB password:
Added user atran.
有一个配置可用于同步 Samba 和 Linux 密码。我稍后会在本章中介绍这个配置。
将 Samba 用户作为组进行管理
组使管理大量用户变得更容易。组更容易管理,因为您可以一次为多个用户应用安全性,而无需跟踪每个用户的安全设置的开销。换句话说,管理 10 个组的安全性比管理 100 个单独用户的安全性要容易得多。
您可以创建新的 Linux 组或使用现有组用于 Samba 用户,并授予组访问共享的权限。您也可以为单个用户授予共享的访问权限,但这需要更多的工作量。
继续使用示例场景,您有一个包含三名成员的 facilities Linux 组,您可以为特定目录(/opt/facilities)的所有三个组成员管理目录和文件权限。这是标准的 Linux 管理实践。
如果您通过 Samba 共享同一目录(/opt/facilities),请在配置文件中添加valid users = @facilities,以允许整个组访问共享目录。@facilities声明指的是 facilities Linux 组,其组成员是该共享目录的有效用户。
Linux 文件和目录权限与 Samba 权限不同。 Linux 用户可能对目录具有写入权限,但对于同一用户,共享可能是只读的。 如果不将有效用户添加到共享中,则 Linux 文件权限允许组写入目录也无济于事; 组成员将无法通过共享访问该目录。
启用 Samba 共享的主要原因之一是创建 Windows 和 Mac 客户端与 Linux 服务器之间的兼容性。 本章的其余部分涉及配置和支持该互操作性。
为 Mac 和 Windows 客户端提供服务
作为 Linux 系统管理员,您必须意识到 Linux 是一种出色的服务器操作系统。 有些人认为大规模采用 Linux 桌面“就在拐角处”。 但是,现实情况是,Windows 和 Mac 工作站是企业的标准,而 Linux 仍然是个例外。 因为 Linux 是一种出色的服务器操作系统,系统管理员必须提供与 Windows 和 Mac 客户端兼容的服务。 macOS 由于有*nix 的根源,通常与 Linux 兼容,因此在使 Mac 系统和 Linux 协同工作时需要的工作量较少。
但是,要将 Windows 与 Linux 集成并不容易——至少不能直接。 Windows 系统需要第三方工具和实用程序,而 Linux 系统则需要额外的软件包和特殊配置。 但是,可以使这两个系统无缝工作在一起,而且解决方案也相当优雅和稳定。
为桌面客户端提供网络存储
管理员通过映射驱动器将网络存储提供给 Windows 系统,并通过挂载共享将其提供给 Mac 客户端。 在 Linux 术语中,映射驱动器是挂载的远程共享目录。 Windows 将这些远程共享标识为驱动器字母,例如F:到Z:。 从 Linux 系统,系统管理员通过 Samba 共享目录,这在某种程度上类似于*nix 网络文件系统(NFS)共享。 macOS 系统也可以通过浏览使用 Samba 协议或直接连接来挂载 Samba 共享。
Samba 共享非常方便,用户可以将文件拖放到共享目录中,而无需使用 FTP、SFTP、SCP 或其他文件传输软件。 Samba 共享看起来是从 Windows 服务器系统共享出来的,这进一步将 Linux 整合到 Windows 和 Mac 桌面环境中。
探索全局 Samba 设置
您可以在/etc/samba/smb.conf文件的[global]部分中设置数十个“指令”。 尽管如此,在我看来,无论您是否使用域控制器和 AD,以下指令都应设置为最佳的独立 Samba 服务器使用。 所示的许多指令是默认值:
[global]
load printers = yes
passdb backend = tdbsam
security = user
cups options = raw
workgroup = YOUR_DOMAIN_NAME
printcap name = cups
printing = cups
os level = 20
netbios name = SERVER1
browseable = yes
interfaces = lo eth0 192.168.1.0/24
hosts allow = 127\. 192.168.1.
更改设置以匹配您的网络和需求。 工作组通常设置为域名或工作组相同。 NetBIOS 名称是您将在网络浏览列表中看到的 Samba 服务器的名称。
通过 Samba 打印
您也可以共享打印机,但因为大多数系统通过其 IP 地址直接打印到打印机,因此此处不涵盖打印机共享。在 /etc/samba/smb.conf 文件中有一个共享打印机的示例配置:
[printers]
comment = All Printers
path = /var/tmp
printable = yes
create mask = 0600
browseable = no
[print$]
comment = Printer Drivers
path = /var/lib/samba/drivers
write list = @printadmin root
force group = @printadmin
create mask = 0664
directory mask = 0775
这些配置将帮助您入门。我建议您将 browseable = no 更改为 browseable = yes。每次进行配置更改时,请记得重新启动 samba 服务。接下来的两个部分将指导您如何共享用户访问目录。
部署 lmhosts 文件
就像在 Windows 系统中一样,Samba 支持 lmhosts 文件。 lmhosts 文件列出了网络上系统的 NetBIOS 名称和 IP 地址。我建议您将 Windows lmhosts 文件的内容复制粘贴到提供 Samba 服务的 Linux 系统上。不要将 Windows lmhosts 文件转移到 Linux 服务器,因为 Windows 和 Linux 系统之间存在文本格式差异。 /etc/samba 中的默认 lmhosts 文件只包含本地主机信息:
127.0.0.1 localhost
将 lmhosts 文件视为您考虑 /etc/hosts 文件的方式相同。您还可以在以下列表中显示的 lmhosts 文件中设置其他指令。指令跟随条目并使用 #:
#PRE
为了名称查找和解析加载到缓存中的条目:
192.168.1.50 testserv1 #PRE
#DOM:*domain*
域服务器条目。与 #PRE 指令一起使用:
192.168.1.100 DC1 #PRE #DOM:WEST #The West Domain Controller DC1
#INCLUDE \\*UNC Path*\*To File*
包含来自另一个系统的文件。这通常用于集成经常更新的 Windows 系统中的 lmhosts 文件:
#INCLUDE \\server1\public\lmhosts
#BEGIN_ALTERNATE/#END_ALTERNATE
将多个 #INCLUDE 指令分组在一起:
#BEGIN_ALTERNATE
#INCLUDE \\server1\public\lmhosts
#INCLUDE \\server2\public\lmhosts
#INCLUDE \\server3\public\lmhosts
#END_ALTERNATE
我在我的 Samba 服务器上始终使用 lmhosts 文件。我设置了一个自动化脚本,以保持本地 lmhosts 文件与真相的单一来源同步。然而,指向另一个系统 lmhosts 文件的 #INCLUDE 指令也是一个不错的选择。
接下来的几个部分演示了如何设置和使用 Samba 共享。
配置共享目录
/etc/samba/smb.conf 文件是 Samba 配置文件,用于设置共享目录。 homes 共享是开始自定义共享目录配置的好地方。
下面是来自 /etc/samba/smb.conf.example 文件的示例共享目录:
[homes]
comment = Home Directories
browseable = no
writeable = yes
; valid users = %S
; valid users = MYDOMAIN\%S
下面是我 /etc/samba/smb.conf 文件中的设施共享配置。方括号部分 [Facilities] 是共享名称。请记住共享名称不超过 15 个字符,并避免非字母数字字符和空格。
create mode 和 directory mode 根据设施经理从先前提到的五个问题的需求进行设置:
[Facilities]
create mode = 0660
writeable = yes
path = /opt/facilities
comment = Facilities Group Share
directory mode = 0770
only user = yes
valid users = @facilities
browseable = yes
valid users 条目限制了只能访问设施 Linux 组中列出的用户。browseable 意味着如果执行网络浏览,系统和此共享将出现在可用共享列表中。create mode 指令 (0660) 是共享文件的默认创建权限。当您通过共享在共享目录中创建新文件时,其权限将是 0660。目录模式是共享的权限。
浏览共享目录
本节介绍了如何从 Mac、Windows 和 Linux 计算机浏览和连接 Linux Samba 共享。参考图表 11-1 和 11-2,查看 Mac 系统如何查看 Linux 系统上的 Samba 共享。server1 是我在示例中使用的 CentOS 系统,server2 是本书中还使用的 Ubuntu 系统。

图表 11-1. macOS 系统上的 Samba 网络浏览
连接后,挂载的共享将显示为 macOS Finder 应用程序中的资源。

图表 11-2. macOS Finder 应用程序显示 Samba 系统和共享
在 Windows 系统上,视图类似,但要连接远程共享,您必须映射驱动器。映射驱动器意味着挂载远程共享并将其用作系统本地资源。请回顾前面提到的 NFS 参考。参见图表 11-3 和 11-4。

图表 11-3. 将驱动器 (G:) 映射到远程共享 \server1\Facilities
映射共享会将其作为客户端系统上的驱动器字母显示。

图表 11-4. Windows 文件资源管理器中的映射驱动器
通过映射驱动器,用户 ajones 可以自由访问 Facilities 共享,该用户可以在共享目录中创建、编辑和复制文件。接下来的部分介绍了 Linux 系统如何查看和连接到 Windows 共享。
挂载 Windows 系统的共享
您还可以使用 Samba 协议从 Linux 计算机浏览远程 Windows(或其他 Linux)系统上的共享:
$ smbclient -U "Ken Hess" -L WIN10
Enter WORKGROUP\Ken Hess's password:
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
Files Disk
IPC$ IPC Remote IPC
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to WIN10 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available
关于 SMB1 的消息可以忽略。这不会影响功能。根据您在浏览的系统上的 Samba 客户端和服务器版本,您可能会收到与 SMB 版本相关的不同消息。这些消息都可以忽略。
在 WIN10 计算机上挂载远程 Windows 共享(Files):
$ sudo mount -t cifs \\\\WIN10\\Files /mnt
Password for Ken Hess@\WIN10\Files: ********
[khess@server1 facilities]$ ls /mnt
abi.mp4 new.txt untitled.mp3
如果在 mount 命令中未使用文件系统类型 cifs,则会收到以下消息:
mount: /mnt: special device \\WIN10\Files does not exist.
Use four backslashes (\\\\) and two for the UNC mapping command's share name
(\\). For example, \\\\WIN10\\Files. You may also use single-quoted backs...
('\\'WIN10'\'Files). Remember that in Linux, you escape a character with ...
(\), so you must escape (or quote) the backslash character with a backsla...
to tell the shell that this is a literal backslash. A regular UNC mapping...
looks like this: \\WIN10\Files.
概要
Linux 在当代企业数据中心到小型服务器房间的无缝互通性提供了增强功能,降低成本,并提供更大的软件选择自由。无论您选择将哪个发行版集成到您的业务中,向 Windows 和 Mac 客户端提供服务对于 Linux 的采纳和成功至关重要。您必须无缝复制标准的 Windows Server 服务,并向用户和管理层展示,Linux 可以通过比昂贵的替代方案更高的稳定性和更低的维护成本来消除怀疑。
第十二章:Linux 故障排除
有人将 Linux 故障排除比作“徒劳无功的练习”,但是如果你简单地花时间调查系统发生了什么,Linux 故障排除既不那么戏剧性,也不那么困难。太多时候,系统管理员不会执行任何相关的故障排除,而是快速备份,然后重新镜像(擦除磁盘并重新安装)系统。尽管在重大安全漏洞的情况下,这是最佳选择,但我并不赞成这种做法。
本章教授您一般的故障排除概念和工具,而不是如何排除特定问题(例如如何修复工作不正常的网站)。排除个别问题可能需要一本非常厚的书或一系列书籍。本章讨论操作系统故障排除、软件、硬件和安全性。
本章旨在为您提供一些基本的故障排除技能,介绍必要的工具,并向您展示如果其他选项失败,如何找到解决方案。故障排除是一个个人过程;不是每个人都以相同的方式进行。这些过程和工具在我的职业生涯中帮助了我很多,但您的结果可能会有所不同,最终,您会找到最适合您的步骤和指南。
让我们从操作系统本身开始您的故障排除课程。
恢复操作系统
故障排除操作系统要么非常容易,要么几乎不可能。似乎没有中间地带。系统错误通常是致命的,但并非必然如此。当我在本章中使用“致命”一词时,我指的是不可恢复的错误,需要重新镜像系统。操作系统问题可能仅仅是运行文件系统检查(fsck)并修复一些文件,也可能像多日的故障排除会议最终导致整个系统重新镜像。例如,如果遇到内核恐慌,您可能首先想到重新镜像系统,但这只有时候是必要的。
接下来的部分演示了如何解决内核恐慌。
缓解内核恐慌
系统引导时发生多种原因的内核恐慌。大多数情况下,要么是损坏的initramfs文件,要么是未正确创建的initramfs文件。initramfs文件对每个内核都是特定的,因此,如果您最近升级了内核,则可能在安装过程中未创建initramfs,或者initramfs创建过程不顺利。内核恐慌也可能是由于最近的错误补丁引起的。其他问题仍可能导致内核恐慌,例如硬件故障,但列出的问题是最常见且容易解决的。一个相对简单的过程(下面讨论)可能使您的系统再次可引导,并避免重新安装所有内容的痛苦。
想象一下,您收到了类似于图 12-1 中示例的消息。

图 12-1。Linux 内核恐慌
屏幕在这里冻结。没有“按任意键继续”消息。你必须关闭系统然后重新开机开始新的启动过程。在此时,重新启动系统,要么从可引导 ISO 启动,要么重新启动并从 Grub 菜单进入救援过程。进入救援模式或使用可引导 ISO 时,你将成为 root 用户,所以要小心操作。
显示你的内核版本:
# uname -r
3.10.0-327.el7.x86_64
运行以下命令从你的内核重新创建正确的initramfs:
# dracut -f /boot/initramfs-3.10.0-327.el7.x86_64.img 3.10.0-327.el7.x86_64
你可能会收到类似以下的消息:
dracut: Will not override existing initramfs (/boot/initramfs...) without --force
使用不同命令创建initramfs文件:
# mkinitrd --force \
/boot/initramfs-3.10.0-327.el7.x86_64.img 3.10.0-327.el7.x86_64
重新启动系统。希望它能够无问题启动。如果在此修复过程后再次遇到内核恐慌,可能是硬盘故障、其他损坏的启动相关文件或者有 bug 的内核。重试救援过程并安装不同的内核。确保为该过程准备好 ISO 映像。
启动到根救援 shell,挂载你的 ISO 映像,并安装 ISO 映像中可用的内核。
例如,你的根文件系统挂载在/mnt/sysimage,并且你将 ISO 挂载在/opt/mnt下:
# cd /opt/mnt/install/repo/Packages
# rpm -Uvh --root=/mnt/sysimage kernel-3.10.0-1127.10.1.el7.x86_64
使用 ISO 映像中的内核包。现在,重新启动系统;如果一切正常,你应该拥有一个正常运行的系统。如果不行,考虑再次引导到救援环境——如果需要,创建关键文件的备份——然后重新安装系统映像。当然,如果硬件问题如坏盘或控制器问题可能导致内核恐慌。
操作系统问题的其他来源很多,但它们各不相同,这里不可能全部覆盖。相反,你应该检查系统的日志,下一节将介绍如何处理。
抓取系统日志:
抓取系统日志意味着搜索日志中的错误或其他相关信息。然而,系统管理员在/var/log中度过大部分时间;有时,日志文件是你唯一依赖的故障排除系统问题的工具。
我的起始点是发出像下面这样过滤的dmesg命令:
$ dmesg | grep -i error
[ 2.229324] RAS: Correctable Errors collector initialized.
[ 3.820963] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
[ 3.829724] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
这通常会缩小操作系统和硬件问题可能发生的范围。如果通过dmesg未找到相关错误,请尝试使用其他过滤器如fault、failed、undefined或unknown进一步调查:
$ dmesg | grep -i failed
[ 3.820963] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
[ 3.829724] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
$ dmesg | grep -i fault
[ 0.004466] MTRR default type: uncachable
[ 0.362760] pid_max: default: 32768 minimum: 301
[ 0.710356] iommu: Default domain type: Translated
[ 0.728057] NetLabel: unlabeled traffic allowed by default
[ 0.802045] PCI: CLS 0 bytes, default 64
[ 5.766858] systemd[1]: systemd 245.4-4ubuntu3.17 running in system mode. (+PA...
[333390.696268] systemd[1]: systemd 245.4-4ubuntu3.18 running in system mode. ...
$ dmesg | grep -i undefined
$ dmesg | grep -i unknown
[ 0.374321] SRBDS: Unknown: Dependent on hypervisor status
如果之前的搜索未发现有价值信息,请使用系统日志文件:
$ cd /var/log
$ sudo grep -ir error *
这可能会生成一个非常长的列表。如果是这样,建议将输出重定向到文件中,以便后续分析这些结果:
$ sudo grep -ir error * > ~/errors.txt
然后你可以在这个文本文件中搜索更具体的内容:
$ cd
$ grep host errors.txt
我在这里使用grep搜索了host,但你应该根据需要搜索这些结果中的任何术语。优化这个过程直到找到符合你问题的相关错误。这可能需要时间。这是我的处理过程,但通常能提供有价值的信息,并为进一步调查提供几个下一步方向。
接下来的章节将讨论软件故障排除以及我找出错误和问题的过程。
解开软件问题
软件故障排除可能会很棘手。软件问题的根本原因可能不是软件本身。但在进一步调查之前,问题可能会表现为软件问题。正如任何有经验的系统管理员会告诉您的那样,软件问题可能的根本原因可能在硬件、其他软件、文件损坏或删除、软件依赖性问题、网络问题、重复的端口、重复的 IP 地址以及系统上任何可能的配置或错误配置问题中。软件错误消息不一定会指向解决方案,但它们是排除故障的一个良好起点。然而,错误代码和日志是排除故障的一个良好起点。
在本节中,我指导您定位和筛选系统和应用程序日志,并执行任何内置或供应商提供的状态和配置检查。
检查系统日志
系统日志是查找错误、故障和成功的好起点。是的,成功不一定是良性的。想象一下这样的情景,有人已经入侵了您的网络,在使用合法账户登录系统后变成了 root 用户,然后窃取了机密数据或加密了您的数据。只有执行操作的一方——恶意访问系统的人——是不合法的。系统将这个恶意行为视为正常、合法和成功。这些动作可能完全不会引起任何警报。
您的系统日志显示了发生的情况,因此不要忽视检查成功登录情况。在本章后面的一节中,我会给您展示一个安全脚本示例,可以让您一目了然地查看登录情况进行检查。
系统日志位于/var/log。要读取这些文件,您必须具有根权限。
尽管输出内容对于本书的文本来说过长且过宽,这里是我在系统日志上使用的两个故障排除过滤器:
$ sudo grep -i error *.log
$ sudo grep -i fail *.log
我总是使用-i选项来忽略大小写,这样我就能确保捕捉到每一个错误和失败的实例,无论日志如何捕捉它们。下一节将介绍检查特定应用程序日志,通常比仅依赖系统日志更有帮助。
检查应用程序日志
幸运的是,应用程序日志提供了特定的错误或错误代码,帮助您排查软件问题。这些日志可能位于/var/log下,也可能位于应用程序的主目录下,或者其他某个目录中,但始终位于名为log或logs的子目录中。例如,Apache 的日志通常位于/var/log/httpd,但在基于 Red Hat Enterprise Linux 的系统中,还会有一个从/etc/httpd/logs到/var/log/httpd的符号链接。通常这些链接是为了与其他应用程序向后兼容而存在的。
利用内部应用程序检查
一些开发人员在他们的软件中包含了配置检查器和特定工具,帮助你识别、隔离和解决问题。面对特定应用程序配置问题和失败时,这些实用程序是你的最佳选择。一些配置文件有相当复杂的语法,遗漏单个括号或分号可能极其难以隔离。
例如,以下命令提供了检查你的 Apache HTTP 服务器配置语法的极好反馈。当httpd.conf中的所有配置正确时,你将收到Syntax OK消息:
$ apachectl configtest
Syntax OK
然而,如果配置指令不正确,你的configtest结果会隔离出问题:
$ apachectl configtest
AH00526: Syntax error on line 34 of /etc/httpd/conf/httpd.conf:
Invalid command 'ServerBoot', perhaps misspelled or defined by a module not
included in the server configuration
启动或重新启动应用程序时也会检查配置:
$ sudo apachectl restart
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.
$ systemctl status httpd.service
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor prese...
Active: failed (Result: exit-code) since Sun 2022-10-16 08:49:44 EDT; 17s ago
Docs: man:httpd.service(8)
Process: 58661 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited,...
Process: 59189 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited,...
Main PID: 59189 (code=exited, status=1/FAILURE)
Status: "Reading configuration..."
Oct 16 08:49:44 server1 systemd[1]: httpd.service: Succeeded.
Oct 16 08:49:44 server1 systemd[1]: Stopped The Apache HTTP Server.
Oct 16 08:49:44 server1 systemd[1]: Starting The Apache HTTP Server...
Oct 16 08:49:44 server1 httpd[59189]: AH00526: Syntax error on line 34 of /etc...
Oct 16 08:49:44 server1 httpd[59189]: Invalid command 'ServerBoot', perhaps mi...
Oct 16 08:49:44 server1 systemd[1]: httpd.service: Main process exited, code=e...
Oct 16 08:49:44 server1 systemd[1]: httpd.service: Failed with result 'exit-co...
Oct 16 08:49:44 server1 systemd[1]: Failed to start The Apache HTTP Server.
在上述错误消息中,行Oct 16 08:49:44 server1 httpd[59189]: AH00526: Syntax error on line 34 of /etc/httpd/conf/httpd.conf:(部分在前面的代码列表中被省略)告诉我配置文件中存在语法错误,需要进一步调查:
$ cd /var/log
$ sudo grep -ir "Syntax error" *
Binary file journal/027dd8a8c9624671b26d07e94eae8f1d/system.journal matches
我搜索的结果无助于排除语法错误,因此我使用了之前推荐的系统工具journalctl,从前面的apachectl restart命令 (查看详细信息,请参阅"systemctl status httpd.service"和"journalctl -xe"。),结果同样模糊:
$ sudo journalctl -xe
-- Support: https://access.redhat.com/support
--
-- The unit httpd.service has entered the 'failed' state with result 'exit-code'.
Oct 16 08:49:44 server1 systemd[1]: Failed to start The Apache HTTP Server.
-- Subject: Unit httpd.service has failed
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- Unit httpd.service has failed.
--
-- The result is failed.
你最好的做法是检查你更改的httpd.conf文件中引起错误的行。常见问题如拼写错误或使用错误的指令通常是语法错误的原因。
管理防火墙及其规则
防火墙非常适合减缓入侵者速度,但它们也可能干扰故障排除。在故障排除过程中避免禁用防火墙的诱惑。相反,添加新规则以适应你需要做的事情。你可能会忘记重新启用防火墙,这可能导致灾难性后果。
防火墙并非百分之百防护,但在减缓潜在入侵者方面具有价值。有时候,它的存在足以阻止恶意行为者,并鼓励他们寻找更容易的目标。花费数小时来排查新服务问题最终记住可能是你的防火墙导致了问题,这是非常令人沮丧的。
卸载和重新安装软件
无尽的故障排除通常是对耐心的考验,不建议这样做。虽然没有设定软件问题需要花费多长时间的标准,但在某个时候,你必须确定进一步的故障排除是浪费宝贵时间。那时候,你应该备份应用程序的配置文件和数据,然后将其删除并重新安装。
在重新安装应用程序之前,请确保已安装了最新的稳定包或下载了最新的稳定源代码。如果您使用的是最新版本,请尝试返回到较早的稳定版本。此外,请确保您的系统已更新,并具备了应用程序所需的最新兼容工具和实用程序。源代码包中附带的README或INSTALL文本文件通常列出了兼容的编译器版本和其他所需支持软件的版本。
重新启动您的系统
对于许多 Linux 系统管理员来说,定期重新启动系统的概念不仅陌生,而且几乎闻所未闻。然而,重新启动应该是常规系统维护的一部分。重新启动不仅刷新硬件和软件配置,还能通知您有关任何故障或问题的信息。例如,您可能会发现某些应用程序在重新启动后不会自动启动。也许您没有使用systemctl enable *service_name*命令来启用它们。启动一个服务会将其置于内存中,设置监听端口并允许连接。但是,除非启用,否则该服务将不会在下次重启时启动,无论是人为发起的还是由崩溃引起的。
dmesg命令会通知您有关最新重新启动中的任何问题。通过过滤结果,您可以发现软件和硬件错误。以下是两个示例:
$ dmesg | grep -i error
[ 8.741308] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
[ 8.741321] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
$ dmesg | grep -i fail
[ 0.063026] acpi PNP0A03:00: fail to add MMCONFIG information, can't access ...
[ 8.741308] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
[ 8.741321] [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
重新启动您的系统不应成为争议。每月进行热启动(重启)和每季度进行冷启动(断电/开机)是许多企业维护周期的标准部分,还包括打补丁、安全审计和端口扫描。下一部分将讨论硬件故障排除。
处理硬件故障
通常,排除硬件故障非常简单;硬件要么正常工作,要么不工作。当硬件开始故障时,您可能会遇到像网络接口卡(NIC)的间歇性功能或正在失效的硬盘上的文件损坏等不规律行为。但通常,硬件设备发生故障时,您必须更换它。数据中心服务器系统具有多个子系统的内置冗余,以便故障不至于灾难性。始终购买具有冗余电源供应、多个 NIC 和充足 RAM 的服务器系统。将磁盘设置为 RAID 10 等阵列,以确保故障不会破坏您的夜晚和周末。
即使您拥有多磁盘阵列,请注意,如果其中一块驱动器故障,会影响性能。您将收到一条关于磁盘故障的警告,如果您可以物理访问系统,通过状态指示灯很容易确定哪个磁盘已故障。尽管需要花费一些钱,但在发生故障时应该准备好多个新的磁盘进行更换。另一个选择是迁移到比机械硬盘更冷却且寿命更长的固态硬盘(SSD)。请记住,热量是电子设备的敌人,这就是为什么数据中心看起来风大且寒冷的原因之一。散热是任何良好数据中心的主要设计特征和重大问题之一。
接下来的部分涵盖了预防性故障排除、诊断和硬件更换,以及系统设计的讨论。
预防性硬件故障排除
除非您拥有来自刀片服务器系统底座或第三方软件套件的智能硬件诊断工具,否则无法预测硬件故障。本机 Linux 命令提供给您一般的列表或状态。尽管如此,如果您的硬件组件正常运行,很少会出现“标记”设备或收到关于即将发生故障的警告。
由于我之前提到的,硬件故障难以预测,因为硬件要么工作,要么不工作。一些硬件组件可以部分故障。网络接口卡(NIC)可能会开始失败并“发狂”,或发送格式不正确的数据包。发狂的网络卡正在故障中,应予以更换。
机械硬盘可能会以文件损坏或不正确、随机或根本无法引导的方式部分故障。有时,故障的硬盘在冷启动后可能会暂时修复自身。有时候,当机械硬盘故障时,您会听到它们在旋转、启动、关闭或咔哒声。使用最近的备份并更换硬盘。尽可能使用固态硬盘。也尽可能镜像您的驱动器。固态硬盘通常会以全存或全失的方式故障。我从未见过固态硬盘部分失效的情况。
内存“条”通常会以全失或全存的方式失败。我从未见过部分失效的情况。当内存条故障时,在启动过程中 RAM 不会完全计算。例如,如果系统包含 64 GB 的 RAM,可能只会识别 48 GB。虽然内存条可以单独故障,但它们以对的方式读取。因此,如果您的系统有八个 8 GB 内存条(共计 64 GB),并且单个内存条故障,则 RAM 计数会以对的方式失效。具体而言,如果您的系统有四个插槽,每个插槽放置两根内存条(每根 8 GB × 8 根 = 64 GB),一根内存条故障,则它的成对内存条也会显示为故障,启动时 RAM 只会计数 48 GB。
接下来的部分将为您介绍几个有用的硬件命令。
收集系统硬件信息
我没有任何裸机系统上安装 Linux。我只有虚拟机可供使用。我建议使用本节讨论的命令收集每个您管理的唯一物理系统的硬件数据,并将这些信息保存在您稍后可以轻松查阅的地方。收集每个裸机系统的硬件信息,然后为每个虚拟化平台的单个虚拟机收集相同的信息。虚拟硬件在每个平台和虚拟主机之间非常一致。换句话说,如果您有所有 VMware 主机且您的主机软件版本一致,那么您的虚拟机硬件应该都是相同的。虚拟机可以在主机之间自由移动,因为它们的虚拟硬件是通用的和一致的,而不管底层硬件是什么样子。
本节介绍的命令收集有关您硬件的信息,尽管其中一些信息可能会重叠,但从多个命令收集信息仍然是很好的。正如您将看到的,某些命令收集有关您硬件的具体详细信息,而其他命令仅收集产品名称和功能。您可以以普通用户身份执行这些命令,但某些命令警告您要使用 root 帐户,否则信息可能不完整或不准确。本节中的所有命令都是以 root 用户身份运行的。这些命令的输出通常太长,无法在本书中完全重现,但我将为每个命令提供摘录,以便您了解命令的报告内容。每个命令都提供多个选项,可提供自定义输出和报告。有关这些选项的更多信息,请参阅每个命令的 man 页面。最后,请注意,根据您的特定 Linux 发行版,某些讨论的工具可能已经存在,而其他工具可能需要安装。
hwinfo
hwinfo 实用程序探测系统的硬件并报告其发现。报告非常长,但非常详尽。您可以使用 --short 选项创建简短摘要报告。以下是完整的简短报告列表:
# hwinfo --short
cpu:
Intel(R) Core(TM) i5-5350U CPU @ 1.80GHz, 1800 MHz
keyboard:
/dev/input/event2 AT Translated Set 2 keyboard
mouse:
/dev/input/mice Mouse
graphics card:
VMware VMWARE0405
sound:
Intel 82801AA AC'97 Audio Controller
storage:
Intel 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI...
Intel 82371AB/EB/MB PIIX4 IDE
network:
enp0s3 Intel PRO/1000 MT Desktop Adapter
network interface:
lo Loopback network interface
enp0s3 Ethernet network interface
disk:
/dev/sdb VBOX HARDDISK
/dev/sdc VBOX HARDDISK
/dev/sda VBOX HARDDISK
partition:
/dev/sdc1 Partition
/dev/sda1 Partition
/dev/sda2 Partition
cdrom:
/dev/sr0 VBOX CD-ROM
usb controller:
Apple KeyLargo/Intrepid USB
bios:
BIOS
bridge:
Intel 82371SB PIIX3 ISA [Natoma/Triton II]
Intel 82371AB/EB/MB PIIX4 ACPI
Intel 440FX - 82441FX PMC [Natoma]
hub:
Linux Foundation 1.1 root hub
memory:
Main Memory
unknown:
FPU
DMA controller
PIC
Keyboard controller
InnoTek Systemberatung VirtualBox Guest Service
整个报告非常长,但简短版本完整而无需所有详细信息。为您管理的每个系统创建两种报告是一个好策略。
接下来,我们将介绍所谓的“ls 命令”用于硬件。每个命令以 ls 开头,并列出系统硬件组件的各种部分。
lshw
lshw 实用程序提供详细的硬件信息,包括 CPU、主板、内存、固件、缓存配置和总线速度。您可以使用 -html 选项选择创建 HTML 报告版本。以下是使用 lshw 命令无选项生成的部分输出:
# lshw
server1
description: Computer
product: VirtualBox
vendor: innotek GmbH
version: 1.2
serial: 0
width: 64 bits
capabilities: smbios-2.5 dmi-2.5 vsyscall32
configuration: family=Virtual Machine uuid=1f88c169-07a7-024b-8d54-6dc9070...
lshw 实用程序是系统详细硬件快照。本节其余的 ls 命令是特定于子系统的。
lspci
lspci 实用程序列出所有 PCI 设备,它们的制造商和版本信息:
# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:02.0 VGA compatible controller: VMware SVGA II Adapter
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Contro...
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service
00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC'97 Audio Con...
00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB
00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Co...
lshw 最有趣的选项之一是 -sanitize,它可以从报告中删除任何敏感信息。
lsblk
lsblk 实用程序列出所有块设备、它们的挂载点、大小和其他信息。要查看从 lsblk 获取的完整报告,必须以 root 身份执行它,因为它查询信息的方式是从 sysfs 和 udev db(如果可用)获取的:
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 7G 0 part
├─cl-root 253:0 0 6.2G 0 lvm /
└─cl-swap 253:1 0 820M 0 lvm [SWAP]
sdb 8:16 0 1.5G 0 disk
└─vgsw-software--lv 253:2 0 1.5G 0 lvm /sw
sdc 8:32 0 1G 0 disk
└─sdc1 8:33 0 1023M 0 part /home
sr0 11:0 1 1024M 0 rom
您可以使用其他选项来提取更多信息,例如设备所有者、权限和 UUID。此输出未正确格式化用于此文本,但您可以输入以下命令以查看扩展的块设备信息:
# lsblk -fm
lsblk 实用程序不会报告 RAM 磁盘设备。
lscpu
lscpu 实用程序报告有关系统 CPU 架构的信息。它有很多选项,有些必须叠加使用,因此请参阅手册页以查看您所需报告的具体要求:
# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 1
On-line CPU(s) list: 0
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 61
Model name: Intel(R) Core(TM) i5-5350U CPU @ 1.80GHz
Stepping: 4
CPU MHz: 1799.999
BogoMIPS: 3599.99
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
NUMA node0 CPU(s): 0
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca ...
CPU 很少出现故障,但如果需要检查兼容性或升级到新的 CPU 世代时,这些信息是非常有价值的。
使用这些实用程序来排除系统故障需要收集预故障信息作为硬件审计,然后将这些初始报告与疑似故障后的报告进行比较。简单的 diff 可以告诉您预故障和故障后报告之间的任何差异。请记住,这有效是因为许多这些实用程序在执行时探测您的硬件,而不仅仅是从静态系统文本文件中读取配置。
下一节介绍了安全故障排除和评估系统安全所使用的工具。
创建自动化安全检查
在解决问题之前,您必须知道问题的存在。通过日志、报告、失败的进程、删除或损坏的文件、被 compromise 的帐户等观察方式可以找出问题。检测和修复安全问题是软件和人员的全职工作。换句话说,如果您管理超过几个服务器系统,并且取决于其重要性,您需要购买具有监控、自动更新、通知以及一些系统扫描、审核和减轻工具的安全软件。此外,单一工具是不足够的。您需要入侵检测/防护系统、防火墙、SELinux、反恶意软件和许多安全系统配置来提高系统的整体安全性。
在本节中,我介绍了创建每日安全报告的步骤,您可以自动化报告系统安全情况。除非您有一些自动化流程来照顾您,否则每天 24 小时内都不可能监视每个系统。恶意行为者和应用程序经常停止、干扰或擦除日志,以掩盖其秘密操作,因此有时缺乏信息表明您存在问题。
我开始一天的方式是,我更喜欢将自动化的安全报告视为 HTML 页面,以确定是否需要进一步调查任何问题。以下是我过去使用过的每日安全脚本(daily_report.sh)的示例。/opt/note目录是一个 Web 启用的目录,在我的 Apache 配置中别名为reports。我已经将其间隔排版,以便阅读更加容易:
#!/bin/bash
#Daily Report Script
today=`date +%m-%d-%Y`
touch /opt/note/$today.xhtml
echo "<pre>" >> /opt/note/$today.xhtml
echo "Last Log " >> /opt/note/$today.xhtml
last | grep root >> /opt/note/$today.xhtml
echo "Non-privileged accounts in the Last Log " >> /opt/note/$today.xhtml
last | grep -v root >> /opt/note/$today.xhtml
echo " " >> /opt/note/$today.xhtml
echo "Root Accounts " >> /opt/note/$today.xhtml
grep :0 /etc/passwd >> /opt/note/$today.xhtml
echo " " >> /opt/note/$today.xhtml
echo "Files modified since yesterday " >> /opt/note/$today.xhtml
find /etc -mtime -1 >> /opt/note/$today.xhtml
echo "</pre>" >> /opt/note/$today.xhtml
创建报告文件作为今天的日期.xhtml可以确保您可以为比较保留这些文件列表。例如,如果您认为可能存在违规行为,您可以对两个文件执行diff以查看是否存在您应该注意的差异:
# diff 10-20-2022.xhtml 10-21-2022.xhtml
没有响应意味着文件相同。但是,如果您执行diff并收到类似以下内容的信息,则需要进一步进行调查:
# diff 10-20-2022.xhtml 10-21-2022.xhtml
4a5
> jamd:x:0:0:root:/root:/bin/sh
此diff显示有人在10-21-2022创建了一个新的根级帐户jamd。不幸的是,入侵者创建此帐户的方式,使得jamd触及、修改或创建的任何文件都将具有根用户所有权,并看起来像是根帐户创建或修改了它。现在jamd拥有根帐户后,他们可以更改根密码,从/etc/passwd中删除帐户,并删除/etc/sudoers文件,从而基本上将系统管理员排除在访问系统之外,除非通过控制台。
注意
入侵者很少锁定系统管理员,因为这样做将引起行动和补救措施。相反,入侵者试图掩盖他们的行动,并使用系统进行数据外泄或攻击当前网络内外的其他系统。
您可以按特定错误筛选日志,或将其他命令的输出重定向到文件,比如防火墙状态检查。将您用于检查系统安全性的命令放入此脚本中,然后设置一个cron作业作为www-data,每天运行此脚本,并在上班后立即检查以开始一些取证调查或放心继续您的一天。确保www-data用户对/opt/note目录具有读取、写入和执行权限。
摘要
故障排除是一项需要时间和经验磨练的学习技能,但请记住要依靠您的同事、知识库、日志和您喜爱的互联网搜索引擎来帮助您解决复杂的问题。从各种来源寻求帮助并不丢人。记住,有时最好的解决方案是放弃冗长的故障排除会话,从干净的安装开始。
第十三章讨论了保护您的系统,这是一项需要关注、技能和多层行动的持续任务。
第十三章:保护你的系统
系统安全是将配置、软件、政策、规则和最佳实践应用于系统(无论是新的还是多年前的),以使系统在不因安全漏洞和妥协而导致显著停机时间的情况下运行。作为系统管理员,安全是你最重要和耗时的任务。
本章专注于预防安全问题。发现和减轻风险只是简单提及。你将学习如何保护新部署的系统和长期运行的系统。没有一个单一的处理方法是全面的,因为看似每天都会出现新的威胁和漏洞。你将学习如何将基本安全设置应用于你的 Linux 系统。因为许多大型公司都有自己的标准,我推荐的安全设置是一个很好的起点,但你应该始终遵守公司的安全协议和政策。
保护根账户
根用户账户是每个 Linux 系统上的超级账户,你必须保护对它的访问。如果有人入侵了这个账户,他们可以将你锁在外面,摧毁系统,窃取数据,或者继续控制它并用它来进入和攻击你网络内的其他系统。永远不要把根密码写下来或与系统管理员组外的任何人分享。如果你使用数据库或其他安全密码管理器来生成和存储密码,请确保在这些应用程序周围采取极端的安全措施。
除了保护常规用户账户(具有复杂性、长度和过期时间的密码)之外,作为系统管理员,你还有责任保护根账户。系统用户账户密码可以共享、写下、通过钓鱼窃取,或口头给予试图通过社会工程学策略利用用户的人。因此,无论密码多么复杂,仍然容易受到许多不同类型的攻击,并且应该用无密码密钥文件替换,其创建和使用在本章后面有详细介绍。
下一节将帮助你了解必须找到和保持的平衡,即保护系统的安全性并不至于将其严密锁定以至于用户会尝试绕过安全性,通过创建流氓系统或本地虚拟机来进行攻击,这些系统可能几乎没有任何安全措施。
在安全性和可用性之间找到平衡
如我们所言,安全是你的最大责任。然而,你也必须支持可用的系统。最安全的系统是关机并锁起来的,但它也是不可用的。因此,你必须在安全和可用性之间取得平衡。
系统必须具有用户、软件、文件和网络连接才能发挥作用。所有这些都会降低系统的安全性,但提高可用性。
你的工作是执行以下任务:
-
维护系统,使其免受网络攻击
-
保护系统免受粗心用户的影响
-
保护用户免受彼此的影响
-
保护系统的配置和数据,只允许具有适当访问权限的人访问。
在接下来的章节中,您将学习如何执行这些功能。
减少系统的攻击面
您是否曾在电视或电影中看过决斗的再现?请注意,参与者会相向而立,一只手伸出持有决斗手枪,另一只手则在身后。这种“决斗”姿势可以减少他们的可击中表面,使他们更难被命中。通过减小目标大小,您还可以减少致命打击的可能性。您应该通过同样的方式减少系统的攻击表面,只暴露必要的部分以支持正常用户操作。
安装新系统时,您必须仔细选择要安装的服务。例如,当我安装基于 Red Hat 的服务器系统时,我通常使用最小安装选项,通常仅包括 SSH 服务。根据需要添加服务和软件包,以保持系统的足迹小而专注于单一任务。我从不在服务器系统上安装图形用户界面(GUI)或图形显示管理器,因为这些用户友好界面固有的安全漏洞。
检查并移除 GUI
要检查您的系统是否具有图形显示管理器,请执行以下命令:
$ systemctl get-default
multi-user.target
如果回复不是multi-user.target,请运行以下命令进行纠正:
$ sudo systemctl set-default multi-user.target
检查 GUI 或图形显示管理器的安装情况:
$ rpm -qa | grep xorg | grep server
如果您收到任何回复,它可能看起来类似于以下内容:
xorg-x11-server-utils-7.7-27.el8.x86_64
您还可能看到类似xorg-x11-server-common和xorg-x11-server-utils的软件包。如果看到这些软件包之一,请执行以下命令将其移除。请使用与您系统安装的特定软件包名称对应的名称:
$ sudo yum remove xorg-x11-server-Xorg \
xorg-x11-server-common xorg-x11-server-utils
创建单一用途系统
每个系统至少需要一个 SSH 服务器。这是一种安全的连接和管理系统的方法。未使用的服务会使您的系统变得容易受攻击,并成为系统和网络广泛妥协的入口点。您应该使用服务器或最小安装选项安装系统,并在安装和设置后根据需要添加服务。
如果您的发行版没有服务器或最小安装选项,那么您必须选择性地卸载任何不明确需要用于系统指定目的的服务或软件包。让我们来看看如何创建单一用途系统。
虚拟化和云计算使企业能够专注于每个系统一个服务。由于硬件成本,我们曾将物理系统用作服务器而不是虚拟化主机,并且不得不在单个系统上堆叠多个服务。虚拟化主机系统可以为数十个虚拟机或数百个容器系统提供服务,每个执行单一的业务任务,如 Web 服务器、数据库服务器或应用服务器。
构建一个仅托管单一服务的系统比精简存在已久的系统要简单得多。然而,作为系统管理员职责的一部分,您应对管理的任何系统执行安全“扫描”。安全扫描或审核包括使用以下命令检查本地计算机上的监听端口:
$ netstat -an | grep LISTEN | grep tcp
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
$ netstat -an | grep LISTEN | grep udp
这两个命令提供了监听守护进程(服务)列表。接口0.0.0.0代表所有接口。仅在本地系统上可访问的服务监听127.0.0.1(localhost或loopback)。恶意行为者经常设置成外流服务伪装成 Web 服务、DNS 服务或其他合法服务来愚弄系统管理员和端口扫描器。您应检查系统中所有监听进程的合法性:
$ netstat -an | grep LISTEN | grep tcp
tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
例如,在/etc/httpd/conf/httpd.conf文件(或您特定的 Apache 配置文件)中,有两种可能的配置,但您只能使用其中一种。您必须注释掉您不希望使用的那一个。以下是httpd.conf的摘录:
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
Listen 127.0.0.1:80
#Listen 80
您可以指定特定的网络接口和端口(Listen 127.0.0.1:80)或监听所有接口的端口(Listen 80)。前一种配置确保只有本地系统用户可以使用 Web 服务。虽然仅限本地的 Web 服务器不太实用,但它说明了如何限制对网络服务的访问。
执行autoremove命令可删除系统中未使用的软件:
$ sudo yum autoremove
$ sudo apt autoremove
此命令移除任何未完整卸载或未充分清理软件包残留的软件包依赖关系。
警告
请记住,启用任何通过网络监听的守护进程或服务都会使您的系统面临潜在风险。必须通过安全协议、防火墙、访问控制列表和必要的 IP 限制来保护所有服务。
下一节讨论用户账户的安全性。
创建和保护用户账户
一旦在您的系统上创建用户帐户,系统的安全性就会降低。但是,正如您所知,用户帐户是必需的。除了 root 帐户以外几乎没有没有用户帐户的系统。服务帐户是常见的用户帐户,即使没有交互式外壳。没有外壳意味着没有人可以交互式地登录为该用户并发出外壳命令。大多数系统都有交互式外壳用户帐户,以便常规用户可以登录并发出命令,编译软件,连接到其他系统并使用存储和数据等资源。
交互式用户帐户的最大问题是弱密码。弱密码威胁您系统的安全性。至少有两种方法可以减轻这个问题。一种方法是通过制定和执行强密码策略来设置系统要求强密码。另一种方法是禁用密码使用,而改用 SSH 密钥文件,以便用户可以在不需要密码的情况下连接到其他系统。您还可以使用各种免费或商业工具配置多因素认证(MFA)。本书不涉及 MFA 的实施。
制定并执行强密码策略
在基于 Red Hat Enterprise Linux 的系统中,/etc/security/pwquality.conf文件是允许系统管理员设置和执行企业密码策略的配置文件。以下是该文件的完整列表:
# Configuration for systemwide password quality limits
# Defaults:
#
# Number of characters in the new password that must not be present in the
# old password.
# difok = 1
#
# Minimum acceptable size for the new password (plus one if
# credits are not disabled which is the default). (See pam_cracklib manual.)
# Cannot be set to lower value than 6.
# minlen = 8
#
# The maximum credit for having digits in the new password. If less than 0
# it is the minimum number of digits in the new password.
# dcredit = 0
#
# The maximum credit for having uppercase characters in the new password.
# If less than 0 it is the minimum number of uppercase characters in the new
# password.
# ucredit = 0
#
# The maximum credit for having lowercase characters in the new password.
# If less than 0 it is the minimum number of lowercase characters in the new
# password.
# lcredit = 0
#
# The maximum credit for having other characters in the new password.
# If less than 0 it is the minimum number of other characters in the new
# password.
# ocredit = 0
#
# The minimum number of required classes of characters for the new
# password (digits, uppercase, lowercase, others).
# minclass = 0
#
# The maximum number of allowed consecutive same characters in the new password.
# The check is disabled if the value is 0.
# maxrepeat = 0
#
# The maximum number of allowed consecutive characters of the same class in the
# new password.
# The check is disabled if the value is 0.
# maxclassrepeat = 0
#
# Whether to check for the words from the passwd entry GECOS string of the user.
# The check is enabled if the value is not 0.
# gecoscheck = 0
#
# Whether to check for the words from the cracklib dictionary.
# The check is enabled if the value is not 0.
# dictcheck = 1
#
# Whether to check if it contains the user name in some form.
# The check is enabled if the value is not 0.
# usercheck = 1
#
# Length of substrings from the username to check for in the password
# The check is enabled if the value is greater than 0 and usercheck is enabled.
# usersubstr = 0
#
# Whether the check is enforced by the PAM module and possibly other
# applications.
# The new password is rejected if it fails the check and the value is not 0.
# enforcing = 1
#
# Path to the cracklib dictionaries. Default is to use the cracklib default.
# dictpath =
#
# Prompt user at most N times before returning with error. The default is 1.
# retry = 3
#
# Enforces pwquality checks on the root user password.
# Enabled if the option is present.
# enforce_for_root
#
# Skip testing the password quality for users that are not present in the
# /etc/passwd file.
# Enabled if the option is present.
# local_users_only
通过无密码密钥文件连接到其他系统
通过数据包嗅探或键盘记录程序捕获密码是一种常见的系统妥协方法,当毫无戒心的用户使用密码从一个系统连接到另一个系统时。密码捕获的最佳方法之一是完全停止使用密码。使用密钥文件,用户可以在不需要交互输入密码的情况下从一个系统连接到另一个系统。
在系统之间设置密钥文件是微不足道但稍显耗时的。最终,这提高了安全性,因为没有密码在网络上传输,也没有写在便签上,或者简单到任何人都能猜出来。
创建密钥文件
通过密钥文件的远程登录为您提供了比使用密码更安全的远程系统之间的连接。不详细讨论私钥/公钥身份验证的工作原理(您可以自行研究),使用密钥文件不会将加密或未加密的密码传递到另一个系统。对于攻击者来说,没有可用的数据(密码),因此无法对加密信息进行暴力破解攻击。创建私钥/公钥对非常简单。
下面的示例使用两个 Linux 系统,server1和server2。您可以在以下代码中看到,您尚未配置这两个系统之间的通过密钥文件的远程登录:
[khess@server1 ~]$ ssh server2
The authenticity of host 'server2 (192.168.1.20)' can't be established.
ECDSA key fingerprint is SHA256:dh2YOMWKu2pF/SivS++Y1u1FaE9LcadCKIl6shlSUuc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'server2' (ECDSA) to the list of known hosts.
khess@server2's password:
Last login: Thu Aug 11 08:12:06 2022 from 192.168.1.234
[khess@server2 ~]$
在这两个系统上运行以下命令来设置您之间的私钥/公钥对:
[khess@server1 ~]$ ssh-keygen -t ecdsa -b 521
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/khess/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/khess/.ssh/id_ecdsa.
Your public key has been saved in /home/khess/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:KGNaYYxQXO46dm2J7/8960FLAYQ5mb3e+wgRghX4BUk khess@server1
The key's randomart image is:
+---[ECDSA 521]---+
|.o... oE@o |
| ..+ .oB o. |
| . = ...o... |
| o . ..... . |
| * . S...o |
| = = . .+.. |
| = o + . o. |
| . o o ooo |
| .o.....=+. |
+----[SHA256]-----+
默认加密算法是 RSA,但 RSA 和 DSA 算法都已经过时,您不应该使用它们。较新的椭圆曲线数字签名算法(ECDSA)目前是最佳选择。虽然此算法接受 256 位和 384 位加密,但使用 521 位以获得最大保护。您可以选择提供一个密码来进一步保护您的密钥文件对。提供密码确保即使您的私钥被盗,也不能在没有密码的情况下使用它。
注意
可用的三种密钥大小为 256、384 和 521。不,你在命令中看到的521不是错误。人们可能会认为下一个可用的密钥大小将是 512,但对于 ECDSA 来说,它是 521。
使用以下命令将 ID 从一个服务器复制到另一个服务器:
[khess@server1 ~]$ ssh-copy-id server2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/khess/.ss...
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filte...
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prom...
khess@server2's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'server2'"
and check to ensure that only the key(s) you wanted were added.
正如消息所建议的那样,尝试登录到server2:
[khess@server1 ~]$ ssh server2
Last login: Fri Aug 12 14:10:46 2022 from 192.168.1.80
[khess@server2 ~]$
您已成功创建密钥对,现在可以从server1登录到server2而无需密码。您的下一个问题应该是:“这种无密码登录只能从server1到server2(单向),还是双向的(server2到server1)?”
要回答这个问题,请尝试从server2登录到server1:
[khess@server2 ~]$ ssh server1
The authenticity of host 'server1 (192.168.1.80)' can't be established.
ECDSA key fingerprint is SHA256:Aim3J/cp24ZIneGzoNyZpf3kWG17ZRrMQVicvOQRyPM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.80' (ECDSA) to the list of known hosts.
khess@192.168.1.80's password:
Last login: Thu Aug 11 08:08:04 2022 from 192.168.1.234
[khess@server1 ~]$
答案是否定的。密钥对是单向的。要设置双向登录(server2到server1),您必须为server2重复该过程:
[khess@server2 ~]$ ssh-keygen -t ecdsa -b 521
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/khess/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/khess/.ssh/id_ecdsa
Your public key has been saved in /home/khess/.ssh/id_ecdsa.pub
The key fingerprint is:
SHA256:nlHb2YUMzW29H7XrZvubiP0RK8DnkB+I3bff9TBHsTo khess@server2
The key's randomart image is:
+---[ECDSA 521]---+
| .o ..|
| oo.=|
| . oo=|
| .+o+o =o|
| S..Bo+.+=|
| . o * +o=|
| o E++o|
| o +BB|
| . o+=O|
+----[SHA256]-----+
[khess@server2 ~]$ ssh-copy-id server1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/khess/.ss...
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filte...
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prom...
khess@server1's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'server1'"
and check to make sure that only the key(s) you wanted were added.
[khess@server2 ~]$ ssh server1
Last login: Sun Aug 14 10:35:42 2022 from 192.168.1.20
[khess@server1 ~]$
现在您可以使用密钥对认证在server1和server2之间进行双向连接。如果您想了解更多关于 SSH、加密协议和安全相关主题的信息,请访问OpenSSH 网站。
添加额外的 SSHD 安全性
你应该通过接受密钥文件认证来保护你的 SSHD,如果尚未设置。您可以通过执行以下命令进行检查:
$ sudo grep -i pubkey /etc/ssh/sshd_config
#PubkeyAuthentication yes
取消注释此行并重新启动 SSHD 服务。如果您过滤“password”一词,您将在/etc/ssh/sshd_config中找到以下行:
$ sudo grep -i password /etc/ssh/sshd_config
PasswordAuthentication yes
此行允许用户使用用户名和密码连接和登录。此行是设置基于密钥的身份验证的要求。(请参阅上一小节,在那里我们看到您必须通过用户名和密码登录以将您的密钥复制到远程系统。)
警告
如果您将PasswordAuthentication yes更改为PasswordAuthentication no,您将排除尚未配置其基于密钥的认证的用户,因为他们将无法使用用户名和密码登录。除非您使用某种自动化,否则您将需要手动配置每个用户帐户。
前面的警告是作为系统管理员必须做出的决策点之一——在可用性和安全性之间找到平衡。一方面,您试图通过从远程连接中删除密码来增加安全性是令人钦佩的。但另一方面,您必须保留密码身份验证,以便用户可以创建他们自己的密钥对进行安全连接。我的最佳建议是禁用密码并为您的用户处理此任务,因为如果您将这一重要的安全步骤留给用户,您的系统可能会在数月或数年内未受保护。如果您决定不禁用密码身份验证,请增加密码复杂性,缩短过期间隔至不超过 90 天,并强制执行不重复使用的密码。
实施高级安全措施
“高级”的定义肯定是一个有争议的问题。对我来说,高级意味着安全措施通常符合国家标准与技术研究所 (NIST) 800-53 和相关文件中描述的安全技术实施指南 (STIG)。所谓的“STIGging”系统保护它免受网络攻击和本地系统攻击。
注意
请记住,即使使用 STIG 来保护系统也不是绝对安全的方法,但它是建立新系统的良好标准。最好使用它来保护您继承的系统。
STIG 通常用于参与国防部项目的政府承包商拥有的系统,这些系统必须遵守严格的数据处理规定。但它们适用于任何系统,无论是否托管敏感数据。您应尽可能地实施这些项目,特别是高严重性列表中的项目。图 13-1 显示了每个指南的编号和严重性以供参考。

图 13-1. 红帽企业 Linux 8 STIG 的发现和严重级别
下一节将讨论将这些控制项应用于您的系统。
应用 STIG 安全控制
应用一系列 STIG 控制是一项耗时的任务。然而,当您阅读这些控制项时,您会发现大多数必要的配置可以自动化完成以符合标准。而且,一些 STIG 提供了可下载的脚本,以便更轻松地实现合规性。尽管所示的 STIG 是针对红帽企业 Linux 的,但这些标准适用于企业和政府办公室中使用的所有 Linux 发行版。有关 Ubuntu STIG 的信息可在 Ubuntu DISA 页面 上找到。
如果您为系统创建“黄金”镜像(我强烈建议这样做),您可以开发一个已经设置了安全控制的 STIG 镜像。新的、修订后的 STIG 会根据需要发布,并且通常只包含一些新的安全修复,您可以通过脚本或某些自动化工具将这些修复应用于您的系统。每年更新一次“黄金”镜像可能足以保持系统更新,以便轻松分发新的控制措施。
要实施 STIG 控制措施,请从第一类别(高严重性)控制措施开始,并首先应用这些控制措施。如果您认为某些系统可能存在漏洞,立即实施所有第一类别安全控制措施。目前,针对 Red Hat Enterprise Linux 8,只有 21 个这样的控制措施,因此所需的工作量是最少的。对于第二类别(中等严重性)控制措施,您应该使用审计工具,因为有超过 300 个第二类别控制措施。
安装和使用安全工具
有数十种商业和免费的安全工具可用于更好地保护您的系统。以下三种工具与 STIG 结合使用可以极大增强您系统的安全性。正如前文所述,您应该在将系统部署到实时网络之前至少安装并运行这些工具一次。初步运行将为您提供一个基线评估。保留这些初步报告以便将来与您运行的报告进行比较。
强烈建议使用以下几款安全工具。所有新系统应在系统生产部署之前安装这些工具,并完成初步运行。这些安全工具在许多企业环境中表现良好并得到广泛接受。
Lynis
Lynis 是一个比安全内容自动化协议(SCAP)和 STIG 工具更轻量级的漏洞检测工具。但是,如果您必须符合国防部或其他政府安全标准,它并不能替代这些工具。Lynis 是一个安全审计工具,用于检查您服务器的系统和软件配置。
通过您的软件包管理器安装 Lynis 软件包,然后运行系统审核:
$ sudo lynis audit system
审计完成后,我通常使用 grep 搜索 Suggestion,如下所示,以获取推荐安全修复的列表。这个列表可能非常长。
$ sudo grep Suggestion /var/log/lynis.log > lynis_fixes.txt
您可以参考此列表,进行更正和修复,并重新运行系统审核。我建议继续这样做,直到没有更多建议的修复或者将列表推荐的修复不再适用于您的系统为止。以下是我的建议列表摘录:
2022-10-31 13:35:53 Suggestion: Install Apache mod_evasive to guard webserver ...
DoS/brute force attempts [test:HTTP-6640] [details:-] [solution:-]
2022-10-31 13:35:53 Suggestion: Install Apache modsecurity to guard webserver ...
web application attacks [test:HTTP-6643] [details:-] [solution:-]
2022-10-31 13:35:54 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:AllowTcpForwarding (set YES to NO)] [solution:-]
2022-10-31 13:35:54 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:ClientAliveCountMax (set 3 to 2)] [solution:-]
2022-10-31 13:35:54 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:Compression (set YES to NO)] [solution:-]
2022-10-31 13:35:55 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:LogLevel (set INFO to VERBOSE)] [solution:-]
2022-10-31 13:35:55 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:MaxAuthTries (set 6 to 3)] [solution:-]
2022-10-31 13:35:55 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:MaxSessions (set 10 to 2)] [solution:-]
2022-10-31 13:35:55 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:PermitRootLogin (set YES to (FORCED-COMMANDS-ONLY|NO|PROHIBIT-PASSWOR...
2022-10-31 13:35:55 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:Port (set 22 to )] [solution:-]
2022-10-31 13:35:55 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:TCPKeepAlive (set YES to NO)] [solution:-]
2022-10-31 13:35:55 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:X11Forwarding (set YES to NO)] [solution:-]
2022-10-31 13:35:55 Suggestion: Consider hardening SSH configuration [test:SSH...
[details:AllowAgentForwarding (set YES to NO)] [solution:-]
2022-10-31 13:35:58 Suggestion: Enable logging to an external logging host for...
purposes and additional protection [test:LOGG-2154] [details:-] [solution:-]
2022-10-31 13:35:59 Suggestion: Check what deleted files are still in use and ...
[test:LOGG-2190] [details:-] [solution:-]
2022-10-31 13:36:13 Suggestion: Add a legal banner to /etc/issue, to warn unau...
users [test:BANN-7126] [details:-] [solution:-]
2022-10-31 13:36:13 Suggestion: Add legal banner to /etc/issue.net, to warn un...
users [test:BANN-7130] [details:-] [solution:-]
我可以忽略的一个示例是/etc/issue和/etc/issue.net的法律声明。我的系统是私有虚拟机,只有我使用它们。您可能会看到一长串 SSH 加固建议。您应该实施这些建议。一些系统管理员从经过 Lynis“清理”的系统创建“黄金”映像,以便部署一个干净的映像。当然,应定期运行 Lynis 以维护此状态。定期报告的计划cron作业是一个很好的解决方案。
Portsentry
Portsentry 在内存中运行,并尝试检测网络端口扫描,然后通过hosts.deny、防火墙规则、ipchains和iptables条目或丢弃的路由禁止违规主机的 IP 地址。
在/etc/portsentry/portsentry.conf中定义的以下端口是“激活”的。您可以随意添加自定义端口或删除端口号。在 Ubuntu 实现中,这是默认的端口列表:
# Use these if you just want to be aware:
TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346,20
034,27665,31337,32771,32772,32773,32774,40421,49724,54320"
UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,31335,32770,32771,327
72,32773,32774,31337,54321"
默认操作是将路由返回到扫描主机:
KILL_ROUTE="/sbin/route add -host $TARGET$ reject"
我还通过取消注释以下行使用/etc/hosts.deny条目:
KILL_HOSTS_DENY="ALL: $TARGET$ : DENY"
确保主机的路由被阻止并且 IP 地址在/etc/hosts.deny中被阻止。/etc/hosts.deny和路由中的条目看起来像扫描的结果(扫描主机为192.168.1.234)。
来自/etc/hosts.deny:
ALL: 192.168.1.234 : DENY
来自路由表:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default Docsis-Gateway 0.0.0.0 UG 0 0 0 enp0s3
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s3
192.168.1.234 - 255.255.255.255 !H 0 - 0 -
下面是/var/log/syslog中标识违规系统的一些条目:
Oct 31 21:21:51 server2 portsentry[177518]: attackalert: Host: 192.168.1.234...
already blocked. Ignoring
Oct 31 21:21:51 server2 portsentry[177518]: attackalert: Connect from host: ...
to TCP port: 32772
Oct 31 21:21:51 server2 portsentry[177518]: attackalert: Host: 192.168.1.234...
already blocked. Ignoring
Oct 31 21:21:51 server2 portsentry[177518]: attackalert: Connect from host: ...
to TCP port: 32773
Oct 31 21:21:51 server2 portsentry[177518]: attackalert: Host: 192.168.1.234...
already blocked. Ignoring
Oct 31 21:21:51 server2 portsentry[177518]: attackalert: Connect from host: ...
to TCP port: 32774
Oct 31 21:21:51 server2 portsentry[177518]: attackalert: Host: 192.168.1.234...
already blocked. Ignoring
Portsentry 是一个非常有用的小工具,一直是我的安全层之一。您可以看到它有效地阻止了来自特定主机的连接。如果您有一个 DMZ 主机,应该在其上使用 Portsentry,因为它每天会被扫描多次。
高级入侵检测环境
高级入侵检测环境(AIDE)是用于检查文件完整性的入侵检测系统。从存储库安装 AIDE:
$ sudo dnf install aide
如果您不使用基于 Red Hat 的系统,安装过程将有所不同。在 Ubuntu(我认为在所有基于 Debian 的系统上都是如此),安装程序会引导您完成后缀配置,并在/etc/aide下创建多个配置文件。Ubuntu 的实现与基于 Red Hat Enterprise Linux 的实现不同。文本中已经注意到了这些差异。在使用 AIDE 之前,您必须首先使用以下命令初始化其数据库。此过程需要几分钟完成。
$ sudo aide --init
Start timestamp: 2022-10-31 09:19:12 -0400 (AIDE 0.16)
AIDE initialized database at /var/lib/aide/aide.db.new.gz
Number of entries: 156566
---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------
/var/lib/aide/aide.db.new.gz
MD5 : WzAN0+7wHIA5a+vZkzwQVQ==
SHA1 : 8FisYNVBvBy3bdg1NaeJY1vm7LI=
RMD160 : fwBCNvM7WMl7j8TN3EhB5X72ozs=
TIGER : 2fM2gL5j7aZ+BpjS9QOx4CjJKEZlZLSC
SHA256 : XTBnehGnObWiSXR4qEJDQqOO0eCAQzfJ
4viTZDfmQYI=
SHA512 : M+1T1KBw04F/hbWE2uSEs3mEsYI7QzoM
godalkUZAWLoG5LgsJTiFjPXdSnZ/dRE
n4A83aQWtART7O7uVNR//A==
End timestamp: 2022-10-31 09:21:17 -0400 (run time: 2m 5s)
您可以使用类似的命令(脚本)在 Ubuntu 上初始化 AIDE 数据库,执行aide –init:
$ sudo aideinit
Running aide --init...
Start timestamp: 2022-10-31 09:31:07 -0400 (AIDE 0.16.1)
AIDE initialized database at /var/lib/aide/aide.db.new
Verbose level: 6
Number of entries: 220642
---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------
/var/lib/aide/aide.db.new
RMD160 : pxukBfZYMClQJluYftmJxyHvQ6c=
TIGER : aRgAX6JnizUa9yiTE29/uZ0HqMYioQcN
SHA256 : lmV6LTtzpiLDUAw6qloEgfAT0sD7J74w
2vqhj7nVLP0=
SHA512 : VCfBAAxLvaA5CEtOJEPu2SeA/565gfUS
T0BgFFwfXWG8RkksMbnHtm8pDtVlUSnc
TqQhcebdU/qODLwPkGIzTg==
CRC32 : 7jx94w==
HAVAL : vrZDJ+70DZkjj7t6BHzt3ph4UN4yoDnd
8oxrBBy2hvA=
GOST : sDLorHAYPZb74dZmIpYYZjARR3znxOXI
Sv0WSZiZV0g=
End timestamp: 2022-10-31 09:39:38 -0400 (run time: 8m 31s)
在基于 Red Hat Enterprise Linux 的系统上,您必须在检查系统之前执行最后一个任务:
$ sudo cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
$ sudo aide --check
Start timestamp: 2022-10-31 10:08:44 -0400 (AIDE 0.16)
AIDE found NO differences between database and filesystem. Looks okay!!
Number of entries: 156566
---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------
/var/lib/aide/aide.db.gz
MD5 : WzAN0+7wHIA5a+vZkzwQVQ==
SHA1 : 8FisYNVBvBy3bdg1NaeJY1vm7LI=
RMD160 : fwBCNvM7WMl7j8TN3EhB5X72ozs=
TIGER : 2fM2gL5j7aZ+BpjS9QOx4CjJKEZlZLSC
SHA256 : XTBnehGnObWiSXR4qEJDQqOO0eCAQzfJ
4viTZDfmQYI=
SHA512 : M+1T1KBw04F/hbWE2uSEs3mEsYI7QzoM
godalkUZAWLoG5LgsJTiFjPXdSnZ/dRE
n4A83aQWtART7O7uVNR//A==
End timestamp: 2022-10-31 10:10:53 -0400 (run time: 2m 9s)
您可以在 Ubuntu 系统上执行检查,而无需复制文件。Ubuntu 安装程序会为您完成此任务。但是,如果您运行sudo aide --check,您会收到错误Couldn't open file /var/lib/aide/please-dont-call-aide-without-parameters/aide.db for reading。
Ubuntu 系统显示了一份对变更的正面报告。虽然冗长,但它说明了当 AIDE 检测到变更时,您会看到的报告类型。报告提供了对文件所做更改的详细信息:
$ sudo aide.wrapper --check
Start timestamp: 2022-10-31 10:09:42 -0400 (AIDE 0.16.1)
AIDE found differences between database and filesystem!!
Verbose level: 6
Summary:
Total number of entries: 220641
Added entries: 1
Removed entries: 1
Changed entries: 5
---------------------------------------------------
Added entries:
---------------------------------------------------
f++++++++++++++++: /var/lib/aide/aide.db
---------------------------------------------------
Removed entries:
---------------------------------------------------
l----------------: /run/systemd/units/invocation:packagekit.service
---------------------------------------------------
Changed entries:
---------------------------------------------------
f =.... ....C.. : /run/samba/smbXsrv_open_global.tdb
f =.... ....C.. : /run/samba/smbd_cleanupd.tdb
d <.... mc.. .. : /run/systemd/units
f =.... mc..C.. .: /var/log/journal/ae1c358b16f744999c9d4b7a80e.../system.journal
f >b... mc..C.. .: /var/log/sysstat/sa31
---------------------------------------------------
Detailed information about changes:
---------------------------------------------------
File: /run/samba/smbXsrv_open_global.tdb
RMD160 : CCdm3M2ObTIu3vIXdx1vyH8emLc= | AMx08YvCC7rmeUGhvjZ3OjLInKs=
TIGER : 814xHPLSSvskZzBYZ0xfLej4O5/LeQ2s | PE/hVYgRx4i17ckNePiFjVXgPQu0wOGG
SHA256 : Y6KJgoFPHLYXfqBOom9NlbkXIYAmXmjQ | ahWfobXIOoIToffW0+jZjYYTg8W/JrFd
/kRNN0Axa1o= | vrCgRinjC+g=
SHA512 : kRDLUujEHcHUIyUVtv/u9BFldu+oCXFj | ZudqhTqoc3xOSp5RMntoJ0yUU6dkrifw
9qbOjLft3SJK3btR0vfJtJHL1UW13LZC | R+2UDQM1zTopREoU/+N/jo9i80AcDqD6
bUf44NCR1OSQ6s2DIfcb7A== | j44U/ao6HhDEjE/aqoMT4Q==
CRC32 : j0j0sA== | E7N72A==
HAVAL : giCwkv0n5oPDwHs/9k0HfPoGcAvkntQF | TJbUsmxe9Kt0+xK6R72Nk0R/2PT/XZVe
39jkiW8nA3o= | Ml3VqYaXTGg=
GOST : P7uSZmTObQfp5nChg9W4svXupluCGaMS | GHF0TxYsXQfay3ayLi/KBck1hDcor92t
xKp5tZQoPsQ= | zHzSyOiNZYk=
File: /run/samba/smbd_cleanupd.tdb
RMD160 : D8RmZx6959xPvPKuRbEGMJdl9ww= | uOtFZoKw8zVjcGZdhJkXcyL3kEg=
TIGER : xCRjkykka/bv2rf06KRdPtigjByvsQJB | r5sm3aHqZJ26jPmADp8tk1qvdPw1IfFF
SHA256 : 7egAlq5dMozWAiYPYx3JH9r7kY1oyeOR | FVaSrvPfA5ivujOsuVcKgCdS20TQTGrw
0DYEU4MZohA= | MFTjvyUFZWk=
SHA512 : AqzJDePQwKxivNPtdJzX4suWBQnDSJhO | lYLskmVOAFSHs9dG2eVP9u4bEAWOcKM6
hjUdEpFGKFaj0ODwuVumBHi/npByq2pZ | M0Tf73IXztE5kaP/9YHaOJRGata0GCZk
+tMh5Kc5IevDpGPvrj5lxQ== | t5viYSFd2ZIL9Alr31kACg==
CRC32 : V4u1vg== | haAC6Q==
HAVAL : 0Ny4G+Y4tTaGHfFu7cXgW7yV2iPaO7xL | tR7ZgOfYNMjaKk0byAUOXAPx6/COqfVc
ae5dMQFmNPY= | 4jpIEdYENd4=
GOST : dbrx9gce/697G9QVs4XcaoHXuS2fd3Nn | jewBI4vx9CPF6Xof7f2vdZOrzmzAcD2c
ZNAX4+OndrQ= | yimBCewy/bE=
Directory: /run/systemd/units
Size : 1760 | 1740
Mtime : 2022-10-31 09:30:13 -0400 | 2022-10-31 09:35:18 -0400
Ctime : 2022-10-31 09:30:13 -0400 | 2022-10-31 09:35:18 -0400
File: /var/log/journal/ae1c358b16f744999c9d4b7a80e92d66/system.journal
Mtime : 2022-10-31 09:35:18 -0400 | 2022-10-31 10:17:02 -0400
Ctime : 2022-10-31 09:35:18 -0400 | 2022-10-31 10:17:02 -0400
RMD160 : oUjngLN5zL6EG9FssV5/Y7RDdG4= | EekegpOq7Vf0fR82TtrvxJAwXP4=
TIGER : ZH3LLiOvM8ew7O3yw+SC/wHiDvkTemCF | N9DDL3wW44urrq0MJhwnclk4/c1jLuJW
SHA256 : bfyPm9q1QlUlTm+JurRZnVMgAOYb0UFE | 5vU1pGWJ2WxMLZK7/f3qZ/Ix4o+NANoB
qIjQofT4Jfo= | kNN6Q+9pwCk=
SHA512 : oLscXcjp62ezwcSZ3E1EUkTrRCilblyM | Vd0CyIE+C+oGAOLsCfvfxdNlqKvasSC4
9/g+mdsGNBxA681uxBJcyVZIPJZ1s/cX | dVF0zmryyzd5lDsod8aH8WNLEfpHlSzL
SQV6E+nnc2KiL4teg1YdKg== | j9+yt6iOJAKTtO3bIdqmEg==
CRC32 : pe7DMw== | br312w==
HAVAL : izYRs/Df2Ae5PAbD9m7RsTOXvO2sTOV0 | wamyIlLjRTtgFpwgfIABPhAodrHuRHe1
qv7063B7mFI= | ee/pSNw9Z/I=
GOST : FH3fMIAa0W2eV+aLNnkY+wjxhjr+LhqA | yYmdcHpvePslHVmsm1w2TpgqIo6Mh1QT
CZbOX7wbKRA= | oFuber3PVDo=
File: /var/log/sysstat/sa31
Size : 131024 | 139840
Bcount : 264 | 288
Mtime : 2022-10-31 09:35:01 -0400 | 2022-10-31 10:15:01 -0400
Ctime : 2022-10-31 09:35:01 -0400 | 2022-10-31 10:15:01 -0400
RMD160 : bFqT+RlB042AhIl9JaOaAI/fGPE= | jO8DEa6NGNYnP6+U8BF/yUsweIs=
TIGER : /Pz1oVax6QHqhWivA3Cec/f0vHajjxx0 | XiMXwjskfSFf4NH8rRb4cWc6West9MQp
SHA256 : t256G+V3hS8DvMj53EXw8W7e/MkwSAUe | T7r2xNaGWtzBp0Qab6seO1KNluyOmWa+
9AYuduiSjVI= | 634jjyPpVCk=
SHA512 : KSUTRzDpgc/s2jwJkQIb0uS+5cJsFqXl | iguQ86cwvpqL3WAmFJWA0tpzy43REGKh
yGXoVuzd65YDpE8msRaBRCcqTIB740pf | DcySXGUBCSHXvmFHAK4P7Zk0tJB4etzj
dgo3E6K/s8UaqI1biiC2tQ== | Vpg8/WZL+0nSk3XaKZ6UwA==
CRC32 : 07QWcA== | 8X9Ixg==
HAVAL : WnGG1i1qhDBdNIL7TGF9euydFem/oZC9 | v6IskRb6hSnVRiB5tqUSCysPtqn3ZKQp
u7o3lSxAl0Q= | HPay7Epiak0=
GOST : vkWWBQUA+WBuEBvNAMLFerzUOkT5SWl9 | AZNTPCF3a1oSYHexxtKQoL0ksvP1Oyhx
QTnod3FQCJQ= | H+BXGeFVW70=
---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------
/var/lib/aide/aide.db
RMD160 : pxukBfZYMClQJluYftmJxyHvQ6c=
TIGER : aRgAX6JnizUa9yiTE29/uZ0HqMYioQcN
SHA256 : lmV6LTtzpiLDUAw6qloEgfAT0sD7J74w
2vqhj7nVLP0=
SHA512 : VCfBAAxLvaA5CEtOJEPu2SeA/565gfUS
T0BgFFwfXWG8RkksMbnHtm8pDtVlUSnc
TqQhcebdU/qODLwPkGIzTg==
CRC32 : 7jx94w==
HAVAL : vrZDJ+70DZkjj7t6BHzt3ph4UN4yoDnd
8oxrBBy2hvA=
GOST : sDLorHAYPZb74dZmIpYYZjARR3znxOXI
Sv0WSZiZV0g=
End timestamp: 2022-10-31 10:18:52 -0400 (run time: 9m 10s)
您还可以运行一个检查和更新数据库的更新,但输入和输出数据库必须不同。该命令的输出也相当冗长,因此被截断。但我在这里展示的是摘要而不是详细视图。此更新在 Ubuntu 系统上执行,但在基于 Red Hat Enterprise Linux 的系统上使用 sudo aide.wrapper --update 命令同样有效:
$ sudo aide.wrapper --update
Start timestamp: 2022-10-31 10:42:00 -0400 (AIDE 0.16.1)
AIDE found differences between database and filesystem!!
New AIDE database written to /var/lib/aide/aide.db.new
Verbose level: 6
Summary:
Total number of entries: 220641
Added entries: 1
Removed entries: 1
Changed entries: 9
---------------------------------------------------
Added entries:
---------------------------------------------------
f++++++++++++++++: /var/lib/aide/aide.db
---------------------------------------------------
Removed entries:
---------------------------------------------------
l----------------: /run/systemd/units/invocation:packagekit.service
---------------------------------------------------
Changed entries:
---------------------------------------------------
f =.... ....C.. : /run/samba/smbXsrv_open_global.tdb
f =.... ....C.. : /run/samba/smbd_cleanupd.tdb
d <.... mc.. .. : /run/systemd/units
d =.... mc.. .. .: /var/lib/chrony
f =.... mci.C.. .: /var/lib/chrony/chrony.drift
d =.... mc.. .. .: /var/lib/snapd
f >.... mci.C.. .: /var/lib/snapd/state.json
f =.... mc..C.. .: /var/log/journal/ae1c358b16f744999c9d4b7a80e.../system.journal
f >b... mc..C.. .: /var/log/sysstat/sa31
如您所见,您可能会收到误报,因为一些文件经常更改,但为了保证文件完整性检查的工作是值得的。下一节是回应安全事件的概述,包括内部和外部系统漏洞的情况。
回应安全事件
安全事件范围从用户允许另一个用户访问其帐户,到聪明用户试图破解 root 用户的密码,再到恶意外部参与者或高级持续性威胁的全面安全漏洞。我目睹了这些情况,以及许多其他类型的安全事件。任何系统管理员执行的最不愉快的任务之一是应对安全事件。你能想象到的最糟糕的一天是当你发现安全漏洞或有人告诉你,“我们被黑了”。这些话会毁掉一个本来平静无事的日子。
一份写得好的安全政策是防范内部威胁的最佳防线,比如有人试图破解 root 用户密码或者在用户之间共享凭证。这些事件应该记录并报告给管理层,并采取政策驱动的措施来防止此类安全漏洞的未来发生。对于外部漏洞,情况则不同,因为企业政策不约束组织外的恶意参与者。
本节涵盖处理由内部和外部参与者引发的安全事件的主题。
制定书面安全政策
编写安全政策是一项可以管理的任务。许多示例可以在网上免费找到。快速搜索会找到数百种可能性。选择一个或多个通用的政策示例,并适应到你的组织。所有的安全事件都很严重,都应该予以重视。即使是友好同事之间简单地共享用户名和密码也是一种违规行为,应立即严肃处理。违反安全政策往往是受到警告、解雇甚至刑事起诉的理由。
每位员工应该收到一份书面安全政策副本,并签署表示他们已阅读并理解该政策及其违反后果。年度安全复习课程应强化公司的安全政策标准、期望和违规后果。
确认违规
您必须确认是否发生了违规行为,以及违规行为对知识产权、财务记录、员工信息和其他宝贵信息和数据造成了何种程度的损害。根据您从证券交易委员会、国防部和其他当局的具体监管要求,发现和确认后有些违规行为必须向执法部门报告。
如果您不属于众多监管机构的一员,您可能会发现您需要自行确认并处理违规行为。您应当联系一家处理违规发现的第三方安全公司,以协助您的努力。
第一步是将受损系统从网络中移除。拔掉它们的网络连接并禁用 WiFi 适配器。保持系统开启状态。将您的取证工具离线加载到受影响的系统上,并在执行任何缓解操作之前对系统进行磁盘克隆。复制的磁盘可能对执法部门追踪嫌疑人很有价值。
识别恶意行为者
通常情况下,识别内部行为者比识别外部来源要容易得多。包括 FBI、国土安全部、NSA 和其他机构的执法部门可能会在威胁来自外部来源时帮助进行调查。攻击者通过删除日志文件、分批窃取数据并在不被察觉的情况下在您的网络内部系统之间进行转移,以保持未被发现数月甚至数年的状态。
如果您怀疑一个恶意组织或外国政府支持的集体已经侵入了您的网络或窃取了知识产权,您最好的选择是联系执法部门和联邦调查局(FBI)。如果您的公司是国防部或其他机构保护的承包商,FBI 或 NSA 可能会在您发现发生违规之前与您联系。在这些情况下,最好向当局提供他们要求的任何信息、数据和访问权限。识别、阻止和起诉网络犯罪分子是政府机构的首要任务。
采取纠正措施
一旦确认了违规行为并评估了损害情况,就是时候采取纠正措施了,包括扫描和清理文件、启用基于主机的防火墙、加密数据和重新镜像系统。你所采取的措施将取决于违规的程度以及恶意行为者采取的行动。良好的备份、灾难恢复计划、加密数据和多层安全措施将有助于您从违规中恢复。
您应当向当地执法部门报告任何违规行为并采取任何建议的措施。如果违规行为仍在进行中,请通知执法部门违规行为仍在进行中,以便他们能够采取行动或代表您通知其他机构。
不幸的是,当攻击的广度和深度不明确时,建议离线重置关键系统,并在将其重新引入企业网络之前应用所有安全措施。
概要
网络和系统安全是持续的工作,而不是“安装完成就可以忘记”的情况。安全需要持续的警惕、高级培训、定期软件和硬件补丁、自动化系统软件以及来自多重安全层的安全性,包括 MFA、防火墙、加密、安全工具、安全开发和用户培训。明智的做法是聘请外部安全公司协助设计和保护您的网络和资产。
第十四章:继续你的教育
无论你有多么技术性,你都必须在整个职业生涯中继续学习。而且如果你获得了认证,许多认证都要求每年完成一定数量的继续教育单位(CEU),你必须记录并提交给认证机构。但继续教育不仅仅是获取认证和每年收集 CEU 以维持这些认证。继续教育意味着拓展视野,学习新知识,并提升自己作为技术专家的能力。
本章重点介绍教育机会,包括内部企业培训、认证培训、独立研究以及社区学院和大学课程。
内部培训
通常,最经济且最便捷的培训是公司自主开发、组织或主办的培训。我不是指我们必须参加以满足监管要求的年度复习课程。我指的是增强你技能和知识的技术简历构建课程。内部培训是指你的公司为员工开发并提供的培训,或者你的公司购买并在现场提供的培训。培训的交付方式取决于诸多因素,如成本、讲师可用性、时间和其他后勤考虑。
内部培训也存在一个弊端,那就是培训发生在现场。是的,其中一个优点也是一个缺点。当你在本地设施接受培训时,你可能会面临用户、同事或者你的经理来打断你的培训,让你去“只需要一分钟”的修复某些问题。这些中断和打扰,虽然可能是必要的,但对你的学习是有害的。你会错过宝贵的信息、演示和课程,这些内容往往很难自己回去再补习。就我个人而言,我参加的每一次现场课程都被支持电话打断过。当我请求专门的培训时间时,我的经理总是提醒我“培训是一种特权”和“工作是第一位”的理念。要做好培训可能会被打断甚至中止的准备,原因是你工作的要求。
寻求认证
在 1990 年代末和 2000 年代初,全行业开始大力推广技术人员认证。然而,许多认证课程过于关注教授考试答案,导致学习内容肤浅,经验丰富的技术人员认为这些认证几乎没有价值。由于这种趋势,认证因而声名狼藉。对于新获得认证的 IT 人士感到不满的专业人士开始寻求“更高级别”的认证,如思科的 CCNA、CCNE 等,因为这些认证被认为更具合法性,而其他供应商的认证则不被如此看待。
快进到现在,IT 认证依然很重要;某些认证仍然被认为比其他认证更正统和有价值。一个很好的例子是认证信息系统安全专业人员(CISSP)。这种高级认证变得如此流行,以至于整个行业现在围绕它建立起来。有课程、学习指南、集训营、考试通过保证、突击培训,数以百计的书籍等等。当这种曾经极具声望的认证市场饱和时,一个新的竞争者将会崛起,取代它成为下一个大热门认证。
认证可能很有价值,但我对追逐可能会很快消失的潮流有所保留。你应该寻找经过时间和工作检验的认证,这些认证对你当前的工作或你想要的工作有价值。
为认证考试做准备
我听说过“经验是最好的老师”,但有经验的专业人士仍然可能在昂贵的认证考试中失败。不论你的专业水平、经验或工作职责如何,都请为考试做好准备。考试往往用措辞方式提问,可能会让最有经验的专业人士感到困惑或误导。不要轻视考试,也不要假设你已经了解一切。认证考试是一项严肃的事务。
数以百计的书籍和其他准备材料可以免费或以合理的价格获取。你应该参加练习考试,了解考试题目的场景表述方式。大多数考试都是基于场景的。这意味着你必须能够应用你的知识,而不仅仅是记住事实。记住事实会帮助你回答一些问题,但你必须阅读一个场景并根据你的选择做出决定。而场景和问题很少是直接的。我最好的建议是至少使用两种不同作者的不同学习来源,以获得多角度的观点和多作者撰写的练习题目。
参加考试
在考试当天,早点到达考试中心,这样你可以签到、冷静下来、使用洗手间,并进入考试状态。考试监考员会带领你进入考试房间,有时是私人的,但也可能是多人同时参加考试的房间。在进入考试房间之前,监考员会让你掏空口袋、脱掉外套并交出手机。你的个人物品会被放在储物柜里,你在考试期间将使用提供的草稿纸和笔。监考员会告知你考试规则和考试期间的行为准则。一旦完成考试,屏幕上会显示下一步的指示,通常是返回主桌接收你的考试结果。大多数考试在完成时就会得分,所以你会在离开考试场地之前知道是否通过。监考员可能会提供你的考试结果。监考员还会从储物柜中归还你的个人物品。
如果你考试不及格想要重考,尽快恢复学习,考试题和考试内容仍然新鲜在你脑海中。你的考试结果通常会突出你最擅长和最薄弱的主题,这样你可以在重考之前集中精力处理这些问题。确保重考直到通过。一旦你获得认证,没人会在意你考了多少次。在你的电子邮件签名、LinkedIn 个人资料、专业通信和在线资料中使用你的新认证名称。下一节将介绍独立学习,以提升你的技术技能。
自我教育
获得认证没有什么错。没人会把它视为负面的职业举动,尽管它可能不会影响你当前或未来的职业成功。如果认证不适合你,可以尝试一些独立学习。曾经,在 IT 领域,培训几乎不存在。公司不愿意为专业发展培训付费;而你可以自己承担费用和时间来进行教育。
我花费了数千美元和无数个小时来进行自我教育。我购买并在车库里设置了多个系统,安装了各种操作系统并进行了实验。我安装了操作系统、应用程序和自动化软件。曾经,我拥有一个 Hyper-V 基础架构,一个 vSphere 基础架构,数十台虚拟机,包括多个 Linux 发行版、多个微软桌面和服务器系统,甚至还有一些个别的系统,如 FreeBSD、FreeDOS 和其他一些我记不清的系统。我会独立解决硬件、软件、网络、打印和应用程序问题。在日常工作之外扩展我的知识,让我在全职企业工作和健康的自由职业生涯中保持了超过 20 年的持续就业。你当前正在阅读的部分,是我独立学习的成果之一。
独立学习可以使你在人群中脱颖而出。例如,我们一个计算机实验室中非常老旧的 Solaris 系统遇到了故障。由于裁员和自然减员,没有人知道如何修复这个系统,因为 Solaris 的版本太旧了。不幸的是,系统所有者也不知道如何修复它,但必须修复它,因为真正的依赖关系建立在它周围。公司发出了一封全公司邮件,希望能找到知道如何修复这个老古董计算机的人。我看到了这封邮件,但忽略了它,直到我的一位同事,他知道我有独立学习的经历和解决奇怪问题的历史,站出来为我自愿承担了这个任务。那天下午,我成功地让系统重新工作了起来。客户非常感激,我也因此收到了一些表扬和一张用于美好晚餐的礼品卡。
独立学习不需要在硬件和软件上做大投资。你可以免费或廉价地注册虚拟基础设施,探索云解决方案、N 层数据库设置、点对点网络、软件开发以及其他成千上万美元才能自己构建的技术和解决方案。通过独立的发现和探索,你可以开发出与通常无法接触到的技术相关的技能。我鼓励你在线搜索以找到独立学习的机会。
接下来的部分探讨了传统学院和大学培训的一个新方面。
正式化您的教育
在我超过 25 年的 IT 行业生涯中,我发现没有学位的同事与有学位的同事数量差不多。我有过从未上过一天大学的经理。我也曾与一些在 IT 以外领域获得硕士和博士学位的人合作过,他们中的许多人,就像我一样,是从其他行业转行而来。IT 领域的人才涵盖了心理学、英语和物理学等多种学科背景,原因有很多。直到最近,传统的大学和大学并不支持 IT 培训。当然,在此之前,一些学院和大学提供了管理信息系统(MIS)和计算机信息系统(CIS)学位。尽管如此,这些项目内容较少,在早期并不受行业尊重。如今,全面的学位课程涵盖了游戏开发、数据科学、网络、安全和云技术。
高级 IT 培训的最佳方法之一是,一些学院和大学提供远程、在线和自主学习,这对希望进一步教育和提升技能而又不想遵循传统住宿要求的职业人士来说是最理想的。但并非所有学位课程都一样。有些课程在行业中的接受度并不高,因此在花费数千美元获得许多雇主会认为不足够的学位之前,你应该进行调查。
例如,安全问题目前是一个热门话题,许多大学提供安全培训和学位课程,其中一些还有认证组成部分。做好调查,找出你的雇主支持哪些。如果你的雇主有学费补偿计划,请问协调员你所探索的学院是否在批准列表上。如果不在,继续寻找直到找到合适的。
接下来的部分涵盖了在职培训,意味着通过工作获得经验和教育。
利用你的工作作为教育的一部分
检查工作描述可能会让你相信,有些神奇的方程式能够将工作年限转化为教育年限,而这是正确的。这个神奇的比率是一年的教育等于两年的经验。这不是我的观点,而是一个公认的行业标准。由协调护理服务公司(CCSI)提供的文件明确说明了各种教育和经验的范围。教育很重要,但工作经验是大多数行业工作的真正制胜因素。
多个在线来源讨论了教育与经验之间的斗争。自己搜索“经验与教育”你就能看到。这场辩论已经进行多年。当你没有经验时,经验的要求就成了就业的高门槛。
解决教育与经验之间的问题是通过工作经验来补充你的教育。但是当你没有经验时该如何获得经验呢?你应该探索志愿机会、实习和学生学徒项目,并记录你的工作和研究。
志愿机会并不是时常自动出现——你必须自己去寻找。你可以在教堂、当地剧院、志愿组织、学校,甚至像律师事务所、餐馆和零售店这样的商业企业提供桌面和网络支持。解释清楚你想积累工作经验,愿意为桌面支持、网络支持、安全、文档管理、网站创建与维护以及其他与计算机相关的任务提供志愿时间。许多企业要么无法负担聘请 IT 支持,要么不需要全职人员,他们会乐意与你合作。
实习和学生学徒是获得真实工作经验的绝佳途径。这些工作通常由政府、学院或企业资助,经常是学位、工作研究或奖学金计划的一部分。一些实习和学徒项目是竞争性的,而不仅仅是基于需求。咨询你的学校顾问、当地就业办公室或在线来源,了解你所在地区的这类项目。
你还应该记录你的研究和工作。例如,如果你建造计算机,安装和管理 Linux 系统,制造专用硬件,或编写自己的应用程序,你可以记录这些工作并添加到你的简历中。你的工作对潜在雇主有职业相关性和价值,所以要把它写下来。
一旦就业,尽量了解企业的一切。了解它的业务周期、盈利区域、弱点、脆弱性、市场定位和当前展望。
总结
教育和培训对于你的职业发展都很重要。你必须通过跟上最新版本、更新、安全问题和行业改进来保持你的技术优势。你必须通过继续教育单位和参加最新的考试来保持你的认证更新。记得记录你在工作中使用的所有软件和硬件供应商、版本和特殊功能,因为这些项目对简历建设至关重要。
需要注意的是,你学到的每一样东西都会增加你的价值,无论是从课堂上还是从工作中学到的。从一切可能的来源学习尽可能多的东西,并展示你能够在命令行或数据中心实践你的学习能力。
这本书的下一章也是最后一章涵盖了职业生涯的转变。在其中,我讨论了如何创业、转入管理岗位,以及关于推动职业发展并避免陷阱的大量通用信息。
第十五章:制定职业发展计划
当然,我们的父母或祖父母可能从高中或大学毕业后就开始一份工作,一直做到三十年或更长时间,然后退休,但现在的职业生涯并不是这样发展的。而所谓的“现在”,我指的是过去三十年。在各种技术相关的职业中,很少有人能在同一公司同一个职位工作超过五年。
凭个人经验,我在 EDS 和 HP 工作了十六年,但在此期间在每家公司内担任了几个职位。我的大多数工作持续了十八个月到两年半。频繁转换角色是明智的,尽管所有的转换都是同级的,我在每一个角色中都有所成长和学习。在 EDS 和 HP 的任职期间,我同一个经理合作了三次或更多次。我们两个在公司内部频繁移动,总是交叉路径。在那些大规模连续裁员的日子里,像是一个活动靶子是明智的选择。
如今,职业变动并不被视为不利。一位招聘人员告诉我,一些经理和公司认为一个技术人员如果每一到两年不换工作,可能会不那么受欢迎。我对此并不信服。稳定到足以在几年内保持岗位并在工作的每个方面变得称职的人也有其优点。但是在某个时候,你会发现自己在寻找新的系统管理工作。本章探讨了寻找就业机会、提升你的工作以及追求那些理想的“梦想”职位的各种方式。
开始你自己的业务
你是否曾经想过辞去工作,开始自己的科技业务?对更多的金钱或自主权的渴望使你得出结论,你可以做得更好、更快或更便宜。或者,也许“做自己的老板”这个想法吸引了你。对系统管理员来说,为自己创业意味着咨询、教学或自由职业。在所有情况下,这意味着直接向公司销售你的技能。虽然不想泼冷水,但在你辞去工作,踏上这段新冒险之前,你需要了解一些事情。
面对自雇的现实
作为企业家,你必须面对的主要现实是,你从不是自己的老板。每一个客户都是你的老板。在公司工作时,通常你只有一个上级经理向其汇报。但是当你为自己工作时,情况就不同了。你现在的工作是吸引新客户并保持现有客户。当你感觉身体不适时,你不能请病假;你不能因度假而休息很长时间;你的福利完全由你自己负责。这就是说,经营一家企业是一项艰苦的工作。
如果这些自雇的现实没有阻止你的兴趣,并且你决定开始自己的业务,你的第一步之一应该是购买保险来保护自己。一些保险公司出售错误与疏忽(E&O)保险或其他赔偿政策,以保护你免受欺诈、错误和不满意的客户。许多社区学院提供企业创业班或小型企业管理课程,你可以参加以测试你的企业的有效性。
你还应该将你的企业注册为 S 公司或有限责任公司(LLC)。这很容易。如果你需要帮助,可以在网上、州政府部门以及朋友、顾问、律师、财务顾问和会计师处得到帮助。
管理员工
如果你认为成为员工很困难,那么想象一下管理员工。处理假期、病假、错误、客户关怀和同事互动都是员工管理的一部分。我建议你在员工开始工作之前口头和书面陈述你的期望。你可以通过员工手册、一对一会议或其他书面和口头沟通形式来做到这一点。你还应该定期进行会议,向员工提供关于其表现的反馈。建立每月或两周一次的会议,讨论期望、表现和员工问题。员工最大的投诉之一是沟通不畅。如果你自己曾经历过这种情况,不要让它发生在你的管理之下。
你还需要管理工资、税收和员工福利。可以委托会计服务、工资服务或会计师来处理这些任务。此外,你必须考虑生活成本的工资增加、奖金和补偿性(补偿)时间。
雇用承包商
你可以在没有员工的情况下经营你的业务。承包劳工比员工更昂贵,但你不必管理假期、加班时间、奖金、病假或大多数其他雇主/雇员关系方面的事务。你仍然必须处理承包商的薪酬和税收。你还必须为客户关怀和表现设定期望。
承包劳工的主要问题在于你无法控制他们的时间,而控制是确定某人是员工还是承包商的决定性因素。在规定工作参数时要小心,以免越过承包商/员工界线。获取律师或税务会计师的建议,了解管理承包商与员工的规则。由内部税务局(IRS)重新分类为员工的承包商对你的业务来说既昂贵又有害。在这个业务方面始终寻求专业建议。IRS 或合格的会计师将帮助你确定资源是员工还是承包商。
正如你所看到的,经营一家企业并不像印名片和充当承包商那么简单。即使是独资企业,经营企业也有许多方面需要考虑。在你辞去日常工作之前,你需要认真考虑税收、可抵扣开支、利润、劳动力费率、医疗福利和个人时间。
许多技术工作者开始创业,并享受挑战、成功和失败。你听说过一些技术人员如何创办了一家公司,出售了那家公司,现在已经退休或者投身于新的事业。你也听说过那些尝试经营自己公司却最终回到公司生活成为员工的人。不用担心,去创业并最终回到公司生活并没有负面的污名。经营一家企业很难,不是每个人都能做到,雇主们也理解这一点。
以下部分讨论的是,如果你决定成为一名员工更合你的口味,那么进入公司管理层可能是一个选择。
进入公司管理层
作为系统管理员,你曾考虑过从食物链的底部向公司阶梯迈进。在我的系统管理员岁月中,我考虑过多次。我会接受管理工作,把我的技术生活抛在脑后吗?这是一个好问题;你在职业生涯中至少要回答一次。
挑战自己
我相信许多系统管理员,包括我自己,在认为经理不理解我们在做什么,但意识到我们是组织中不可或缺的一部分。我们是组织结构图中的“执行者”。一位高级经理曾经告诉我(我在此引用他的话),“我什么都不做,但我能完成任务。”我肯定他看到了我的眉毛扬起,仿佛在说,“是的,我知道。我们都知道。”他没有对我的不太明显的反应做出回应。不过,他的确有一点道理。问题在于,他不是被雇佣来按按钮、拉杆或重新启动计算机的,但他能确保有人去执行这些操作。你看,管理是一个不同的视角。经理们执行来自上级的命令,并因他们的直接汇报而获得赞誉。经理们反过来应该奖励他们的成就者。
成为一名经理并不容易。许多公司的责任压在你的肩上,但真正的回报是通过直接汇报给你的工作人员分散在你的薪水等级之上。经理们必须要“玩政治”,这意味着他们必须在前线人员(如帮助台技术员、桌面技术员、系统管理员、网络管理员、数据库管理员等)之间保持平衡。这些直接汇报者可能过度工作、心怀不满、得不到赏识。同时,你的上级经理并不了解食物链底层的人员为保持业务运转而做出的贡献。
或许,就像船长不需要划船也不关心你如何划船一样,高级管理人员不需要亲自动手,但他们需要确保按需和所需的速度完成工作。我不喜欢这样,但我理解。
在你进入管理阶层或考虑进入管理阶层之前,你必须权衡成本与收益。其中一项成本是与以前的同事的关系。也许你在前线花了多长时间并不重要,因为一旦你戴上管理者的帽子,你以前的同事可能会以不同的方式看待你。
管理你的新角色
如果你的公司提供管理课程,请参加。这些课程会教你一些通用的管理规则,但你真正需要的是企业文化。无论公司规模大小,每家公司都有自己的企业文化,你必须学会驾驭它。培训课程将帮助你为新角色做好准备。
管理你的新角色的下一步是向高级管理人员请求导师。请求导师将对你有多重好处。首先,它会让你成为一个认识到拥有导师的价值的人。其次,你将拥有一个自动的职业倡导者(你的导师),而你需要一个倡导者来帮助你实现职业目标。第三,它让你从上而下学习人员管理、企业文化和你的组织。如果你是父母,你是如何学习的?也许是通过观察你的父母。我建议你向多个管理者学习,看看不同的管理方法,并自行决定最佳的技术组合。向不一定在你指挥链中的人学习。
本章的其余部分提供了一些对大多数技术岗位有用的一般建议,不仅限于系统管理。虽然这里的信息有些通用,但我相信你会觉得它有价值,因为它将帮助你享受更高效、更和平和前进的职业生涯。
随着职场市场的变化
有一次招聘人员告诉我,市场上开放的 Linux 系统管理员职位稀缺且被低估。那无疑是他在当时我们共同居住的城市的经历,但这并不适用于全国职场市场。Linux 系统管理员多年来一直享有良好的职场市场,并且拥有至少五年经验的系统管理员可以找到多个薪资优厚的职位选择。
根据劳工统计局的数据,美国的国家就业市场每年都在变化,但前景仍然良好。对于网络和计算机系统管理员(我能找到的最接近的匹配)的预测是未来十年增长 5%,年薪中位数接近 85,000 美元。尽管这些信息已经过时,报告日期是 2020 年 5 月。COVID-19 疫情改变了技术专业人员的就业市场。疫情期间出现的一个变化是远程工作。在 2020 年 3 月之前,大多数公司要求员工在物理办公室工作。现在已不再如此。远程工作已成为新常态。因为它是新常态,您必须自律,充分利用电话会议和即时通讯,以及在工作中表现出色。接下来的章节将介绍如何浏览在线求职网站、在工作日保持专注,并适当地使用会议和协作工具。
在线求职网站搜索
在线找工作虽然并不新鲜,但求职网站在过去几十年里发生了翻天覆地的变化。求职网站通过关键词搜索为求职者提供职位列表,并包括面试技巧、简历写作技巧、职业技能测试以及其他教育机会。对于自己找工作或帮助其他技术专业人士找工作时,我会使用四个网站:LinkedIn、FlexJobs、Monster 和 Indeed。在这里提到这些网站并不是在推荐,也不是对其他服务的负面评价。这些是我使用过的网站。
通过 LinkedIn 进行专业人脉拓展
在 LinkedIn 上找到与您的专业资料和简历匹配的工作和职业愿景可能比其他仅限于职位的网站更容易,因为 LinkedIn 利用这些信息生成工作搜索结果和推荐的职位列表。LinkedIn 是一个社交网络网站,您可以创建个人资料、与他人建立联系、加入群组、发布信息、搜索职位,并与您的联系人实时聊天。
LinkedIn 包括多个职业工具:
-
求职提醒
-
薪资调查
-
技能评估
-
面试准备
-
简历生成器
它拥有一个学习平台,您可以订阅以通过在线培训获取知识或提升当前技能。您还可以订阅 LinkedIn 的高级服务,为求职者提供更多工具和服务。如果您希望保持求职过程的隐私性,可以启用让招聘人员看到您“可用”的选项,而无需向全世界宣布您在找新工作。我个人在 LinkedIn 上取得了很大的成功,强烈推荐您完善个人资料并开始建立人脉。
寻找更好的与 FlexJobs 合作的方法
我多年来(自 2014 年以来)一直持有FlexJobs 会员资格,主要是为了寻找自由撰稿职位。但 FlexJobs 不仅仅是一个简单的求职平台。它还有一些我喜欢的引人注目的功能:
-
职位提醒
-
学习中心
-
职业建议
-
文章
-
研讨会和网络活动
-
成本低廉(每年 50 美元)
对求职者来说,FlexJobs 的低成本和高价值能以少量资金获取丰厚回报。这里提供各类工作的数千个职位。如果你寻找自由职业或兼职工作,它都能满足。这个网站上有许多高薪远程和灵活位置的工作机会。从初级和无技术要求的职位到 C 级高管职位,应有尽有。
通过 Monster 找到合适的职位
Monster 是我记得使用过的最古老的在线求职工具。很多人都使用它并通过它轻松找到工作。每天,我都会收到根据在 Monster 上的简历而发送的职位空缺邮件。从某些方面来说,它有点落后于时代,因为它没有其他网站那样丰富的设计和工具数量。但它确实拥有以下功能:
-
求职搜索
-
薪资工具
-
职业建议
-
文章和其他资源的链接
如果你在 Monster 上上传了简历,你会立即收到与你职业相关的职位列表。如果你愿意,通过招聘代理公司来完成一部分工作可能会有所帮助。我通过 Monster 收到的工作大多是合同工和合同到期类型,这些我不感兴趣。因为除了自由职业外,我只对全职、长期工作感兴趣。在 Monster 上注册,上传你的简历,并允许职位通知进入你的收件箱,但不要只依赖 Monster。
在 Indeed 上找工作
Indeed 自称为全球第一求职网站。它不仅仅是一个简单的职位搜索引擎。与这里列出的其他网站一样,Indeed 也有职业指南和相关信息可供查阅。虽然大多数功能面向雇主,但这并不是件坏事。当你在一个网站上发布简历和个人资料时,你希望潜在雇主能尽可能轻松地找到你。
今天搜索“Linux 管理员”就能找到 841 个职位匹配。我最喜欢 Indeed 的地方在于它的速度和透明度。一旦服务显示了一个职位匹配,你立刻就能看到有关该职位的所有信息。例如,在公司的网站上,你可以知道职位名称、公司名称、薪水、地点、职位描述和申请链接。无需注册、烦扰、第三方或其他障碍存在。当你在找工作时,不想要或者不需要障碍、冗长的流程或者绕圈子。
寻找工作需要耐心、反复试错,并且需要通过大量的工作“花招”,正如我所说的——意味着有些工作听起来不错,但一旦你点击了描述,你就会意识到你浪费了时间。这是过程的一部分。但一旦你找到了新的职位,你必须掌握远程工作。听起来很容易,但并非总是如此。下一部分将详细探讨远程工作。
远程工作
乍一看,从家里工作似乎是一种完美的情况,而且确实可以。但正如一位前同事所描述的,它可能是一种“不太理想的”体验。他的意思是没有通勤到传统工作场所的情况会使同事、经理和高管期望你每天在任何时间都可以使用。他和我花了很多 14 到 16 小时的时间工作,打电话,以及在夜间的所有时间内支持客户,这对我们自己的家庭生活和健康造成了损害。
高层管理人员希望我们每天工作八小时,处理“非工作时间”的维护,并且在第二天通常的时间准时上班。但“补偿”时间的承诺从未兑现过,也没有任何奖金或其他福利。这是我的经历,尽管我知道其他人确实得到了补偿时间、奖金以及其他额外的报酬。
在整个工作日保持专注
你必须警惕你在桌前工作的时间。记住要休息,把午餐从工作桌前带走,并将你的工作日限制在正常和合理的时间内。不要觉得因为可以在家工作就要工作 12 小时。你需要和家人、朋友以及自己有自己的时间。
有些人在家里会缺乏集中注意力。他们会洗衣服、遛狗、购物、吃长时间的午餐,并且滥用特权,导致每个人都变成了被微观管理的对象。这些活动有些在办公室里也很正常,但不要过度。待在你的桌子旁边。做你的工作。当你离开桌子时,带上手机,以便同事在停电、问题或其他业务相关情况下可以联系到你。在一天中,进行一次较短的步行或骑行,而不是多次短暂休息是没有坏处的,但要注意你花的时间,让你的同事知道,并保持手机随身携带。
一天中多次短暂休息或一次较长的休息可以让你恢复活力。如果你回想一下在办公室里的活动,你可能会和同事有些互动,离开办公室吃午餐,甚至在校园内享受健身房的待遇。在家工作时,你同样有权利享受这些。记住,滥用系统伤害的是每一个人。需要时集中注意力,必要时休息。
下面的部分详细介绍了如何与同事、经理以及组织外的人员进行远程协作,以确保最佳体验。
学习如何沟通
几乎每一个工作描述都把“优秀的书面和口头沟通能力”列为工作的要求之一。并不是每个人都必须是专业的写手或出色的演讲者,但你应该努力与同事、客户和管理层进行清晰和专业的沟通。清晰的沟通提升了你的职位并增强了你的职业选择。使用讽刺、愤怒、过多的幽默或轻率的谈话风格会让你看起来不专业,也难以得到晋升。保持专业态度并不总是容易的,但你必须努力做到。
以下各节将重点介绍如何利用各种工具进行沟通。在电子沟通中,意义可能会丢失或被曲解,因此你必须学会通过电子邮件、即时通讯/短信和视频会议呼叫进行专业的分享。
通过视频会议和即时通讯工作。
如果你以前从未远程工作过,你应该为电话会议准备自己和电脑。这意味着如果你的电脑没有连接或安装摄像头,你需要准备一个摄像头。大多数新款笔记本电脑都有内置摄像头,但如果你使用台式电脑,你将需要购买一个 USB 摄像头。你可以使用手机,但是其质量和大小并不理想。
注意
当寻找新职位时,你需要购买、设置和测试摄像头,因为现在的面试都是通过电话会议进行的。
你可以从在线渠道购买价值仅为 20 美元的 USB 摄像头。接下来的章节将讨论视频会议作为面试和工作通信方法以及远程通信礼仪的一些指南。
视频会议呼叫
自从新冠疫情爆发以来,Zoom(和其他会议软件)的电话会议已经很普遍。我不指望这种情况很快会改变,因为现在许多技术型员工已经习惯了远程工作。与视频会议呼叫相关的几个注意事项和禁忌,你应该在面试或开始新工作之前了解清楚:
-
电话准时。
-
穿着得体。
-
不说话时请静音。
-
在讲话时看向摄像头。
-
避免分心。
-
要讲话清晰。
古话说,“如果你不早点到,你就迟到了”,这对于电话会议确实适用。在电话即将开始时加入电话不仅是礼貌的表现,也显示了你对职位的热情,让电话组织者知道你也尊重他们的时间。为电话会议穿着得体并整理仪容。假装你在办公室,会议是“面对面”的。你不必穿得像去参加豪华聚会一样,但必须看起来整洁和专业。记得在不说话时将麦克风静音。让麦克风捕捉到随机噪音会分散他人注意力。你会惊讶地发现,即使是远处的声音也能通过电话传达出来。
在视频通话中,看向摄像头而不是屏幕上的人们。我知道这很难做到,但是对方在讲话时更希望看到你看着他们,而不是侧目看向一侧。在商务电话中,你应该避免分心。也许你看过新闻主播在家里播报时,孩子们闯入他的房间的视频。这段视频很有趣,大多数人都会原谅,但它确实会让你显得不够专业。你必须专注于通话,避免被电子邮件、即时消息或购物所分散注意力。专注是专业的表现,也是被期望的。
说话要清晰,但不要对着麦克风大声喊。当你面对麦克风并全神贯注于对话时,其他人会更好地听到你的声音。如果在通话过程中需要做其他事情或因某种原因被打断,请确保静音麦克风并关闭视频。你仍然可以听电话,而不会分散他人的注意力。
即时消息
当你需要发送消息、提问或安排会议时,电子邮件似乎太慢了,而你可以简单地发送即时消息。即时消息可能很方便,但它也可能会让你的同事感到恼火。要礼貌地询问对方是否有时间和你聊天。即时消息相当于在虚拟空间中走到某人的小隔间前与其交谈。记住,在工作时间内,你的同事都很忙。尊重他们的时间。一旦你与对方接触,说明你的目的或提出你的问题。在对话中友好且简洁。记住,即时消息并不是私密的,所以要小心你在基于文本的对话中写什么。
通过电子邮件沟通
电子邮件是同事、朋友、商业伙伴和家人之间的主要沟通方式,已经如此超过 40 年。我们大多数人无法在日常生活中离开它,但仍有一些人不了解其规则。是的,电子邮件有规则,我们都应该学习它们。这十条规则将确保你的电子邮件沟通对所有受众都是专业和安全的:
-
在所有业务沟通中保持专业。
-
保持礼貌。
-
记住,电子邮件通信可以作为法庭证据。
-
电子邮件可以转发和密件抄送给其他人。
-
电子邮件不太适合用讽刺和口头语言。
-
注意打开附件。
-
电子邮件是一种流行的诈骗工具。
-
电子邮件可以被伪造。
-
不要使用“回复所有”功能。
-
检查你的拼写。
在商业沟通中保持专业的“语气”是一种必要的做法。早点把对话的重点说清楚,不要啰嗦,并以专业的签名结束电子邮件。你的电子邮件签名也应该专业。包括你的姓名、电话、公司名称、部门和职务。引用和风趣的签名通常是不必要的,且往往被视为不专业。在签名中包括你的性别代词,例如 He/Him,She/Her 或 They/Them,并请在沟通中尊重他人的性别代词。
收件人可能会打印、转发或盲抄你的消息,在它离开你的电脑后,你无法控制接下来会发生什么。电子邮件是法庭可接受的证据,可能用来证明和展示行为模式。讽刺、笑话和口语在电子邮件中的效果通常不如口头交流,因为收件人无法看到面部表情或听到语调变化,无法理解其替代含义。当使用电子邮件与来自不同文化背景的人沟通时,应避免使用口语。误解或冒犯的可能性太大。
作为系统管理员或 IT 专业人员,你知道(或应该知道)电子邮件是网络钓鱼和欺诈的常见媒介。不,你没有赢得过你从未参加过的竞赛/彩票/抽奖。没有人会把钱存入你的账户以帮助他们洗钱。当这些尝试通过垃圾邮件过滤器时,请将其删除,不要转发给任何人。勒索软件、木马病毒和病毒太常见且成本高昂,不能冒任何风险。电子邮件可以被伪造。电子邮件看起来可能来自合法发送者,但最终可能是欺骗性的,通常是危险的。
请检查电子邮件沟通中的拼写。尤其是商业邮件,带有拼写错误或不正确的单词看起来非常不专业。书面沟通比口头沟通更正式。在发送之前,你应该大声朗读你的消息,以确保它们传达正确的含义,而且没有人会误解你的意思。
离开你当前的职位
当你离开当前职位进入另一职位时,你应该遵守特定的规则或行为标准。如果不这样做,会给你在业务界带来坏名声,并可能限制未来的职业机会。你希望每个职位都是通往下一个的跳板。你也希望有一个可信的工作历史。对潜在雇主来说,你的前任经理给出的推荐要比前同事的推荐更加令人印象深刻。如果你感到舒适,来自前客户的赞誉也非常受人尊敬。在接下来的部分,我将涵盖你的辞职信、辞职后的行为以及如何在宣布后处理同事、经理和客户。
撰写辞职信
写辞职信通常是你职业生涯中最困难的事情之一。当写辞职信时,我的情绪跌宕起伏,我经历了喜悦、愤怒、抑郁和恐惧。离开一份你喜欢的工作通常很难,离开一个你获得朋友和舒适感的工作也很难。当你从一个你不喜欢的职位辞职时,你必须格外小心,克制是至关重要的。
宣布你打算离开的意图
在你的辞职信中,第一项工作是说明你要离开职位的意图。将你的辞职信交给你的直接主管或经理是典型的做法。在信中称呼他们时,就像在对话中一样用亲爱的阿尔瓦雷兹女士或亲爱的奥克塔维亚。不要使用“敬启者”或其他泛泛的问候语,因为这是不礼貌的。
提供你打算的最后工作日的日期。在美国,通常要提前两周通知你的离职意图,尽管这并不是必需的。
描述你的目标
不要抱怨、否认、贬低或陈述离开的负面理由。相反,传达你的目标和离开的原因,但不要写“为了找到一份更好的工作”或类似的话。可以陈述你的目标为:“我找到了一份工作,为我的职业生涯提供了成长和机会。”或者“我的新职位让我有机会晋升到管理层。”也可以表明类似这样的说法:“我决定重新安排我的目标,我正在追求一个允许我<说明机会>的新机会。”
这封信不是抱怨的适当场所。要专业而简明。你不需要写超过一两句话来定义你寻找新工作的目标。
在过渡期间提供帮助
在你的信中表明你愿意并热衷于帮助将你的职责和责任过渡给一个新人。如果你有人选可以接替你的角色或与你进行交叉培训,可以说:“我认为安娜是一个很好的选择,她和我一起工作过,并且她对扩展她的角色表现出了兴趣。”不要详细说明。选择安娜还是其他人是你的管理层的决定。
留下你的选择空间
说明你愿意与你的经理讨论你的辞职。这种表态让你的管理层知道有可能进行谈判的机会。
有时,一家公司非常重视你的工作,以至于他们会提出留下的反 offer。保留工作的决定有一些注意事项,但留下是合理的。所谓的“买回”并不少见,任何报价都应该被认真听取和考虑。
我听过留下还是离开后接受反驳的两面观点。我对此没有特别的建议,除非您当前感到不快乐,否则您可能在决定留下后仍然不快乐。如果您并不不快乐,但真的在寻找当前职位无法提供的机会,现在您有机会进行讨论和谈判。
递交信件
交出辞职信并不容易,即使您厌恶目前的工作。这是一件令人感到压力和恐惧的事情。我总是打印这封信,放进信封里,写上经理的名字,然后在他们不在办公室时放在他们的桌子上。这只是我非对抗性的风格。我不知道这样做对还是错,但这就是我的方式。
您的经理有时间私下阅读您的信,与他们的经理讨论,并作出回应。通常,面对面的辞职会导致双方的即时抱怨或更糟的后果。如果您远程工作,这种方法显然行不通。
离职
在某些情况下,您当前的雇主可能会缩短您的通知时间。有些雇主在提交辞职信后即刻解雇您,没有任何讨论、谈判或离职面谈。您必须为任何结果和反应做好准备。离职可能与被裁员或解雇一样具有情感上的挑战,这对您和雇主都不容易。这些部分涉及在通知期间工作以及如何以尊严和尊重的方式继续前进。
过渡您的职责
大多数人在工作期间对我们的系统、脚本、文档和成就都有一定的归属感。感觉放手自己的东西是很正常的。请记住,您正在迎接新的挑战,把旧的挑战留给他人。以善意和尊重地将您的职责交接给同事们。他们正在承担新的责任,可能因为您的离去而感到不知所措,并且他们在几天后将无法依赖您的经验。
完成未完成的任务
如果可能的话,在最后一天之前完成或过渡任何未完成的任务。如果可以完成项目,请不要半途而废。尽管您的动力可能不高,但请记住,您有责任让同事们的过渡变得轻松和舒适。
撰写文档
如果在任职期间还没有这么做,现在是时候记录你的工作内容了。记录你的日常任务。找出奇怪的事物、脚本以及任何可能帮助新人接手你工作的信息。文档编写并不容易,但你必须帮助你的同事在你离开后弥补你的缺席。做正确的事情,为他们提供充足的指导。即使你讨厌你当前的雇主,如果你不让他们处于不利的位置,你会感觉更好。此时尽力而为将意味着你不必找借口、感到羞愧,或者在餐馆里碰到前雇主时躲开。
处理你的离职面谈
如果你有未解决的抱怨,请在离职面谈中提出。离职面谈是你能够帮助前同事并与雇主澄清关系的时机。记得保持职业态度。陈述事实,而不是情绪包袱,然后感到满意,因为你告诉了雇主你的想法以及为何离开的原因。
有时候离职面谈对现任和未来的员工都有重大影响。一些雇主希望留住优秀的人才,并试图改善长期存在的或不理想的情况。
总结
当谈到你的职业生涯时,我想告诉你的最后一件事是,不要听信唱衰者的话。你会听到说无论你从事什么工作,工作市场都很差,你的职业前景没有出路。Linux 系统管理是一个不错的职业选择。作为系统管理员有成长空间,并且有大量的工作岗位。随着更多公司转向云端,你将需要把注意力从管理本地系统转移到管理基于云的系统上。
努力获取你的 Linux 认证,并补充其他技术认证,如网络和安全认证。无论计算技术发展到何种地步,安全始终是一个关注点和机会。祝你在求职和职业生涯中好运。


浙公网安备 33010602011771号