Ubuntu-服务器精要-全-

Ubuntu 服务器精要(全)

原文:annas-archive.org/md5/88eb89d49a79193b3f0a43206f5b4e48

译者:飞龙

协议:CC BY-NC-SA 4.0

序言

《Ubuntu 服务器基础》是一本实用的操作指南,提供了清晰的逐步过程来安装和管理 Ubuntu 服务器,帮助你充分发挥 Ubuntu 的真正力量,而无需成为该领域的专家。

本书节奏较快,适合那些希望了解最新版本 Ubuntu 服务器基础知识的管理员。本书的目的是引导读者,使其能够在办公环境中部署和配置 Ubuntu 服务器。首先,我们将从解释如何安装 Ubuntu 服务器开始。接着,我们将介绍随 Ubuntu 一起提供的命令行界面最有用的方面。与此同时,我们将探讨如何管理和配置 Ubuntu 服务器。关于这一主题,我们会有一章进行扩展。之后,我们将讨论如何在 Ubuntu 服务器上部署服务并进行安全配置。在结尾部分,我们将了解 Ubuntu 提供的虚拟化和云计算功能。最后,我们将探索一些与 Ubuntu 服务器相关的实用小贴士。

本书内容

第一章,《Ubuntu 服务器安装》作为 Ubuntu 服务器安装指南。

第二章,《配置与管理 Ubuntu 服务器》提供了管理 Ubuntu 服务器所需的知识和工具。

第三章,《在 Ubuntu 上部署服务器》让用户能够轻松设置和部署一系列常用服务,如电子邮件、网页、DNS 等。

第四章,《Ubuntu 安全设置》作为 Ubuntu 服务器的安全指南。

第五章,《Ubuntu 服务器中的虚拟化与云计算》提供了有关虚拟化和云计算所需的知识。

第六章,《Ubuntu 服务器的技巧与窍门》包含了每个 Ubuntu 管理员需要掌握的一些最实用的技巧和窍门。

本书所需工具

使用本书,你只需要基本的 Linux 操作系统知识和一杯咖啡。

本书适用对象

本书适用于熟悉 Linux 操作系统基础的系统管理员,且寻求一本快速入门 Ubuntu 的指南。熟悉旧版本 Ubuntu 的读者也会发现本书很有用。本书假设读者具有基本的 Linux 管理知识。通过本书,读者将能够很好地掌握最新版本 Ubuntu 的使用,并探索 Ubuntu 服务器管理的新特性。

术语规范

本书中,你会看到多种文本样式,用以区分不同种类的信息。以下是这些样式的几个示例及其含义的解释。

文本中的代码词汇、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入和 Twitter 用户名将按以下格式显示:“我们可以通过使用 include 指令包含其他上下文。”

代码块按以下方式设置:

zone "localhost" {
  type master;
  file "/etc/bind/db.local";
  allow-transfer { 192.168.1.2; };
  also-notify { 192.168.1.2; };
};
zone "127.in-addr.arpa" {
  type master;
  file "/etc/bind/db.127";
  allow-transfer { 192.168.1.2; };
  also-notify { 192.168.1.2; };
};

任何命令行输入或输出会按以下方式展示:

sudo ln -s /etc/phppgadmin/apache.conf /etc/apache2/sites-available/phppgadmin
sudo a2ensite phppgadmin
sudo apache2ctl graceful

新术语重要词汇 会以粗体显示。你在屏幕上看到的词汇,比如菜单或对话框中的内容,会以这样的方式出现在文本中:“然后,进入机器的设置,选择系统选项卡。”

注意

警告或重要提示会以这样的框框显示。

提示

提示和技巧会以这样的方式展示。

读者反馈

我们始终欢迎读者的反馈。告诉我们你对这本书的看法——喜欢什么或不喜欢什么。读者反馈对我们非常重要,因为它帮助我们开发出你真正能从中获得最大价值的书籍。

要向我们发送一般反馈,只需通过电子邮件 <feedback@packtpub.com>,并在邮件主题中提到书籍标题。

如果你在某个主题上有专业知识,并且有兴趣撰写或参与书籍的贡献,请查看我们的作者指南,网址是 www.packtpub.com/authors

客户支持

现在你已经是一本 Packt 书籍的骄傲拥有者,我们提供了许多帮助你充分利用购买的内容。

下载示例代码

你可以从你的账户中下载所有你购买的 Packt 出版社书籍的示例代码文件,访问 www.packtpub.com。如果你是在其他地方购买的这本书,可以访问 www.packtpub.com/support 并注册以便将文件通过电子邮件直接发送给你。

下载本书的彩色图片

我们还为你提供了一个 PDF 文件,里面包含了本书中使用的截图/图表的彩色图片。这些彩色图片将帮助你更好地理解输出结果的变化。你可以从 www.packtpub.com/sites/default/files/downloads/4800OS_ColoredImages.pdf 下载该文件。

勘误

虽然我们已尽一切努力确保内容的准确性,但错误仍然可能发生。如果您在我们的书籍中发现错误——可能是文本或代码中的错误——我们将非常感激您能向我们报告。这样,您可以帮助其他读者避免困惑,并帮助我们改进后续版本的书籍。如果您发现任何勘误,请通过访问www.packtpub.com/submit-errata进行报告,选择您的书籍,点击勘误提交表单链接,并输入勘误的详细信息。一旦您的勘误被验证,您的提交将被接受,勘误将上传到我们的网站,或者添加到该书籍勘误部分的现有勘误列表中。

要查看以前提交的勘误,请访问www.packtpub.com/books/content/support,并在搜索框中输入书名。所需信息将显示在勘误部分。

盗版

互联网对受版权保护材料的盗版问题在所有媒体中持续存在。在 Packt,我们非常重视版权和许可证的保护。如果您在互联网上发现我们作品的任何非法复制,请立即提供其位置地址或网站名称,以便我们采取补救措施。

请通过<copyright@packtpub.com>联系我们,并提供涉嫌盗版材料的链接。

感谢您帮助保护我们的作者以及我们为您提供宝贵内容的能力。

问题

如果您对本书的任何方面有问题,可以通过<questions@packtpub.com>联系我们,我们将尽力解决问题。

第一章. Ubuntu Server 安装

本章将介绍如何通过不同的方法安装 Ubuntu Server。我们将了解如何通过简单或高级安装在手动和自动模式下安装 Ubuntu Server。

为了实现这个目标,我们将按照以下计划进行:

  • 安装前的准备

  • 手动安装

  • 自动安装

安装前的准备

在本节中,我们将快速了解最新的 Ubuntu Server 版本发布信息,然后列出所有的系统要求。

最新的 Ubuntu 版本

生产 Ubuntu 的公司 Canonical 每 6 个月发布一个新版本。每个版本都有一个YY.ZZ模式的代码,其中YY表示年份,ZZ表示月份。

我开始写这本书是在 2015 年 4 月 23 日 Ubuntu 15.04(Vivid Vervet)发布之后。目前有两个主要版本——去年发布的 LTS 版本(LTS代表长期支持),即版本 14.04,以及最新的版本 15.04。如果你选择这两个版本中的任意一个来执行接下来的章节任务,应该没有太大问题,因为没有区别。因此,我们决定以最新版本为示例,尤其是因为下一个 LTS 版本将基于该版本。(请注意,只有 LTS 版本由 Canonical 提供 5 年的支持,而非 LTS 版本的支持期仅为 9 个月。这就是我们通常选择 LTS 版本来部署 Ubuntu Server 的原因。)当这两个版本之间有显著差异时,我们会提到它。

现在,让我们来看看与最新版本相关的一些信息:

  • 它使用了 Linux 内核 3.19,带来了很多关于性能的改进,同时也为服务器和云计算提供了更好的网络功能。

  • 15.04 是第一版引入 LXD 的 Ubuntu 版本。

  • 它使用了最新版本的 OpenStack、LXCLinux 容器)、LXD、Juju、libvirt、QEMU、Open vSwitch、Ceph、cloud-init、Docker 以及与 HA 相关的软件包更新。

  • 它将服务管理器和标准启动upstart替换为systemd

注意

upstart启动方式在 Ubuntu 中仍然存在。你可以通过打开GRUB启动菜单,选择Ubuntu 的高级选项,然后点击Ubuntu,使用 Linux(upstart)来使用它。

如果你希望永久切换到upstart启动方式,可以安装upstart-sysv包,它将移除ubuntu-standardsystemd-sysv

系统要求

系统要求取决于未来可能需要部署和安装的服务。为了演示/测试的目的,我们需要一个最小配置:300 MHz 的 CPU,192 MB 的 RAM 和 1.5 GB 的硬盘。这个轻量级配置使我们可以在旧计算机甚至虚拟机上部署 Ubuntu Server。这种有限的资源占用主要是因为没有 X Windows 系统(图形界面),而在服务器环境中通常不需要图形界面。

在生产环境中,您应小心考虑资源(CPU、RAM 和硬盘)的实际需求以及这些需求的预估增长。为此,您需要根据即将部署的服务,做好尺寸的良好衡量。

本书中的示例将使用 64 位版本的 Ubuntu Server 15.04,并将在一台拥有 1 GB RAM 和 2 TB 硬盘的虚拟机上安装。

提示

请注意,如果您使用的是二手计算机/服务器,在安装或升级 Ubuntu 之前,您应先备份数据。安装过程中使用的分区工具是可靠的,通常可以无问题地使用多年,但有时它们可能会执行灾难性的操作。

额外资源

本书仅包含必要的内容。它恰好涵盖了您完成特定任务所需了解的内容。如果您需要更多关于 Ubuntu 的信息并深入了解,可以访问官方文档,help.ubuntu.com

您应根据您的系统架构下载 CD 镜像。完整的镜像列表可以在releases.ubuntu.com/15.04/找到。

手动安装

在本节中,我们将看看如何手动安装 Ubuntu Server,无论是从 CD 还是 USB 驱动器。在此,我们仅讨论从 CD 安装的过程;从 USB 驱动器安装的过程相同。在后者的情况下,您需要通过 BIOS 界面配置计算机从 USB 启动。

还有一种手动安装 Ubuntu Server 的方式,即通过网络安装,但由于我们将在下一节自动化安装中深入讲解此过程,因此在这里不做讨论。

从 CD 进行简单安装

从 CD 安装 Ubuntu 的过程与大多数 Linux 发行版相同。因此,如果您已经熟悉这一过程,可以节省时间,直接跳到下一节。如果您是这个领域的新手,请仔细阅读这一节,因为接下来的章节(高级安装和自动化安装)将基于此。请注意,Ubuntu Server 版没有桌面版那样的图形环境。因此,您只需使用键盘,而不能使用鼠标。以下是从 CD 安装 Ubuntu 的逐步过程:

  1. 首先,从releases.ubuntu.com/15.04/的下载页面下载与你的 CPU 架构匹配的安装 CD 镜像,并将其刻录到空白 CD 上。

  2. 其次,验证你的服务器 BIOS 是否配置为从 CD-ROM 驱动器启动;如果不是这种情况,请确保进行更改。

  3. 将 CD 插入 CD-ROM 驱动器并启动。

  4. 在启动过程刚开始时,你将被要求选择安装语言。选择你需要的语言。如果你不小心选择了其他语言,也不用担心,你很快就会学会如何更改设置。

  5. 现在,你将看到以下界面:从 CD 启动的简单安装

    你可以看到很多选项,满足你的需求:

    • 如果在选择默认的 安装 Ubuntu 服务器 选项时直接按 Enter 键,你将启动安装过程。

    • 第二个选项,使用 MAAS 安装多个服务器,将在本章后面讲解虚拟化和云计算时讨论。

    • 有些人更喜欢从第三个选项,检查磁盘缺陷,开始,以验证将 ISO 文件刻录到 CD 上的过程是否正确。

    • 第四个选项,测试内存,非常有帮助,特别是在你的服务器开始崩溃并且你怀疑是内存相关问题时。

    • 你可以使用第五个选项,从第一个硬盘启动,以防你忘记在 CD-ROM 驱动器中启动 CD。

    • 最后,最后一个选项,修复损坏的系统,将 CD 变成一个救援磁盘,对于备份和恢复非常有用。

    • 在大多数情况下,当你选择默认的 安装 Ubuntu 服务器 选项时,所有你需要做的就是按 Enter 键启动安装过程,但也有一些情况需要一些特殊选项,要么是因为你的机器有一些特定的硬件需求,要么是因为你需要为未来使用定制服务器的内核参数。为此,Ubuntu 通过启动画面底部的菜单提供了许多可能性,可以通过功能键访问。

    • 如果你按 F1,你将看到一个交互式帮助屏幕,里面有其他选项的文档。

    • 如果你在启动时不小心选择了错误的语言,按 F2 键进行更改。启动屏幕将根据你的语言自动选择一个键盘映射。

    • 如果你想选择不同的键盘映射(例如,我在准备本书的截图时使用的是英文,但我使用的是法语键盘),按 F3 键从键盘映射选项列表中选择。启动屏幕还提供了许多优秀的辅助功能选项。

    • F4键会显示一个安装模式的列表,您可以选择使用 OEM 安装、最小化系统或最小化虚拟化客户端来安装 Ubuntu 服务器。OEM 安装适用于制造商。最小化虚拟化客户端为您提供了一个轻松安装虚拟化版 Ubuntu 的方法。

    • F5键显示了一个辅助功能菜单,允许您选择高对比度屏幕、屏幕放大器、屏幕阅读器、盲文终端、键盘修饰符,甚至屏幕键盘。

    • 一旦按下F6键,您将获得对启动过程的真正控制。在这里,您可以看到一个常见参数的菜单,这些参数有助于在硬件较为复杂的情况下从 CD 启动。如果按下Esc键,您将从该菜单返回启动提示符。在此处,您可以输入可能需要的额外内核启动参数,具体如下所示的截图:

    从 CD 进行简单安装

  6. 在启动安装过程后,系统会要求您选择安装过程的语言,这将成为您要安装的服务器的默认语言。使用键盘上的上下箭头键选择您想要的语言,然后按Enter键。系统还会要求您选择服务器的位置(基于此,系统将调整服务器时间设置)。之后,您可以选择让安装程序自动检测键盘布局,或手动输入键盘布局。

  7. 执行完这些步骤后,安装程序将通过检测硬件并加载一些软件包来启动安装过程。然后,它将继续配置网络设置,使用DHCP动态主机配置协议),并询问您想要为服务器设置的主机名。如果您不想使用 DHCP 进行网络配置,请选择返回,或者简单按Esc键回到网络配置的第一个界面,在这里您可以找到手动配置网络选项,如下图所示:从 CD 进行简单安装

    通过做出这个选择,系统会通过不同的界面提示您输入 IP 地址、子网掩码、默认网关和 DNS。

    注意

    请注意,如果您不小心输入了错误的信息,并且在按下Enter键后才发现,也不必担心。您可以轻松返回上一界面并重新输入正确的数据。只需要选择返回,或者简单按Esc键。

    还请注意,这些数据并非“固定不变”,您可以稍后更改它们。我们将在下一章中介绍如何操作。

  8. 此时,我们几乎完成了网络设置部分。接下来将要求输入主机名,然后我们进入用户设置部分。首先,你将被问及完整的用户名。接着,你将看到一个界面,要求输入用于身份验证的 Ubuntu 用户名,该用户名通常会根据你之前输入的完整用户名给出建议。你可以接受这个建议或进行修改。最后,你将被要求输入并重新输入该用户的密码。此步骤需要小心,因为输入的密码将被隐藏,如下截图所示。因此,记得输入的密码非常重要:从 CD 进行简单安装

    接下来,你将被问是否想要加密你的家目录。除非你知道自己在做什么,否则不要选择加密。在这一步的最后,你将被要求检查时区。如果时区不正确,请进行更改。

  9. 现在,安装的最关键部分到来了——分区!如果你使用的是一块新的硬盘,你将看到一个屏幕,如下截图所示:从 CD 进行简单安装

    如果你使用的是一块二手硬盘,你将看到一个稍微不同的界面。它通常包含相同的四个选项,并且与现有分区的重用选项相关联。前三个选项是推荐给新手的。在我们的例子中,我们将选择引导——使用整个磁盘并设置 LVM选项。手动选项将在高级安装部分介绍。

    按下Enter键后,你将进入下一屏幕,系统会要求你选择要分区的磁盘。然后你将进入一个界面,系统会询问你是否允许在磁盘上写入更改,默认选择的是。我们当然需要对磁盘进行更改。在继续之前,我们应该确保已经备份了磁盘上的数据。接下来选择选项并按Enter键。完成此步骤前,你将被要求输入每个卷组的大小,这些卷组将用于这次分区。你可以输入一个数字,后面跟上单位,如 MB、GB 或 TB,或者简单地使用百分比。最后,你将得到分区步骤的摘要,需在应用之前确认,如下截图所示。选择选项并按Enter键:

    从 CD 进行简单安装

  10. 此时,真正的安装过程开始了。在安装过程中,安装程序只需要 CD,但如果有网络连接,它可以用来下载软件列表并安装最新的更新。为此,它将要求你输入代理设置(如果有的话),或者保持此字段为空。

    完成此步骤后,安装程序将开始下载软件包列表(我们将在下一章中介绍此内容)。此步骤可能需要一些时间,具体取决于你的互联网速度:

    来自 CD 的简单安装

    几分钟后,安装过程开始:

    来自 CD 的简单安装

    在此步骤中,系统会询问你有关更新策略的问题。就个人而言,我建议你禁用自动更新安装。最好让管理员根据 Ubuntu Server 上运行的服务器手动管理更新安装。

  11. Ubuntu 安装程序提供的一个有用功能是能够选择安装服务器软件包,如 SSH 和 DNS 服务器。你可以按空格键选择其中一个,按回车键继续安装过程。在我们的案例中,我们决定在此步骤不安装服务器。我们将在后续章节中介绍如何操作:来自 CD 的简单安装

  12. 最后,系统会要求你确认是否安装 GRUB 引导加载程序到主引导记录MBR)。然后,你会在安装过程结束时看到以下通知:来自 CD 的简单安装

从旧版升级

如果你有现有的 Ubuntu Server,并希望将其升级到最新版本,可以使用do-release-upgrade命令。该命令是update-manager-core包的一部分,且没有任何图形化依赖,默认已安装。

你可以通过运行以下命令查看与此命令相关的选项列表:

do-release-upgrade --help

以下选项将非常有用:

  • do-release-upgrade --check-dist-upgrade-only--check-dist-upgrade-only选项用于检查是否有新版本。如果发现新版本,终端会显示相应的结果。执行此命令后,它仅执行验证操作,不会进行升级。

  • do-release-upgrade --sandbox--sandbox选项用于在受保护的环境中测试升级。这对于希望在将升级应用到生产环境之前进行测试非常有用。

  • do-release-upgradedo-release-upgrade工具会检查并升级到下一个 LTS 或稳定版本(如果有的话)。

提示

do-release-upgrade工具使用的升级策略定义在/etc/update-manager/release-upgrades文件中。文件末尾的提示变量表示在请求升级时是仅考虑 LTS 版本,还是会搜索所有版本(包括 LTS 和常规版本)。该提示变量可以取以下值:lts(仅 LTS 版本),normal(所有版本),never(从不搜索新版本)。

当您部署的是已经是 LTS 版本的 Ubuntu 时,您应仅使用Prompt=lts模式。否则,do-release-upgrade将无法检测到新版本。

高级安装

大多数 Ubuntu 服务器的安装过程满足了大多数用户的需求,并且大部分用户(无论是新手还是高级用户)都是以相同的方式使用它,但需要更多关注并且根据需求由许多高级系统管理员自定义的部分是分区步骤。在本节中,我们将看看如何针对特定硬盘架构执行高级分区。

使用 RAID

RAID技术(冗余独立磁盘阵列的缩写)指的是将数据分布在多个硬盘上(从几个硬盘创建一个存储单元)的一种技术。由此创建的单元具有更高的容错能力(高可用性)或更高的性能(容量/写入速度)。将数据分布在多个硬盘上可以提高相关服务的安全性和可靠性。

注意

如需了解更多关于此技术的信息,您可以访问www.tldp.org/HOWTO/Software-RAID-HOWTO.html进行学习。

在本节中,我们将展示如何使用两个 RAID1 分区在两个不同的硬盘上安装 Ubuntu 服务器,一个用于分区,另一个用于交换分区:

  1. 分区磁盘步骤中,选择手动。然后,逐个选择您希望成为 RAID 分区的一部分的所有磁盘(在我们的例子中,只有两个磁盘)。对于每个磁盘,创建一个新的空分区表。

  2. 选择第一个硬盘上的空闲空间。然后,选择创建新分区。设置您希望为交换区分配的大小;它应为 RAM 大小的两倍,最大不超过 2 GB。接着,选择主分区并选择起始位置。在用作:一行中,应选择RAID 的物理卷选项。最后,选择完成分区设置

  3. 使用剩余的空闲空间,为根分区执行相同的步骤。唯一的例外是,在设置大小后,选择继续,然后选择主分区。此外,选择可启动标志:一行并将其值更改为

  4. 返回分区磁盘步骤,并在页面开头选择配置软件 RAID。然后,选择以将更改写入磁盘。

  5. 创建 MD 设备设置中,对于本示例,选择RAID1,但如果您应用的是其他架构,请选择适合您需求的选项。

  6. 现在,输入您为阵列选择的硬盘数量(在我们的例子中,我们有两个活动设备)。然后,选择继续

  7. 接下来,输入备用设备的数量(对于 RAID1,选择默认设置为 0),然后选择继续

  8. 在此步骤中,选择您希望使用的分区。对于交换分区,选择sda1sdb1。选择继续以进入下一步。

  9. 重复步骤 3 到 7 以准备根分区,最后选择sda2sdb2。最后,选择完成

我们现在应该有一个 RAID 设备和硬盘的列表。接下来的步骤是对 RAID 设备进行格式化并设置挂载点。将 RAID 设备当作本地硬盘处理,进行格式化并挂载:

  1. 返回到初始分区页面后,我们将看到新创建的RAID 设备#0#1分区。

  2. RAID1 设备#0分区下,选择#1并按Enter键。

  3. 用作:字段中,选择交换区,然后通过使用完成设置分区项来应用此分区。

  4. RAID1 设备#1分区下,选择#1并按Enter键。

  5. 用作:字段中,选择Ext4 日志文件系统

  6. 挂载点字段中,选择/(根文件系统)。您可以根据需要更改其他选项。然后,通过使用完成设置分区项来应用该分区。

  7. 最后,选择完成分区并写入磁盘更改

安装过程将继续正常进行。

使用 LVM

LVM逻辑卷管理器)允许在 Linux 上创建和管理逻辑卷。使用逻辑卷某种程度上替代了磁盘分区。这是一个更灵活的系统,它允许您,例如,减少一个文件系统的大小,扩展另一个文件系统,无论它们在磁盘上的位置如何。

注意

有关此技术的更多信息,您可以参观tldp.org/HOWTO/LVM-HOWTO/

在本节中,我们将查看 Ubuntu 服务器安装过程中的分区步骤,其中/srv分区挂载在 LVM 卷上。本节将分为两部分——第一部分是在 Ubuntu 安装过程中,只有一个PV物理卷),它将成为VG卷组)的一部分,第二部分将在 Ubuntu 安装后。执行此过程时,我们将演示如何向 VG 添加第二个 PV:

  1. 分区磁盘屏幕中,选择手动

  2. 选择硬盘。然后,选择以确认在此设备上创建一个新的空分区表命令。

  3. 接下来,创建标准的交换分区和/分区,并选择您希望使用的文件系统。

  4. 对于我们的/srv LVM 分区,创建一个新的逻辑分区,并将用作字段更改为LVM 的物理卷。然后,选择完成设置分区

  5. 现在,选择配置逻辑卷管理器并选择

  6. 在下一屏幕中,选择LVM 配置操作,然后选择创建卷组。命名 VG(例如,vg01)。然后,选择为 LVM 准备的分区,并选择继续

  7. 返回LVM 配置操作页面并选择创建逻辑卷。选择新创建的 VG 并为新 LV 命名。然后,选择一个大小,最后选择完成。您将再次进入主分区磁盘页面。

  8. 现在,让我们为新的 LVM 添加一个文件系统。为此,选择 LVM 下您创建的分区,设置所需的文件系统,并选择/srv作为挂载点。接下来,选择完成设置分区

  9. 最后,应用完成分区并将更改写入磁盘命令。然后,确认更改并继续安装。

现在,我们将继续第二部分,该部分从 Ubuntu Server 安装后开始,涵盖了添加第二块硬盘、创建 PV、将其添加到现有 VG、使用 srv 命令扩展 LV,以及最后扩展文件系统。在此部分中,我们将使用一块名为/dev/sdb的第二硬盘,并将其完全作为 PV 使用。您可以根据需要配置并使用任何数量的 PV:

  1. 首先,使用以下命令创建 PV:

    sudo pvcreate /dev/sdb
    
    
  2. 接下来,扩展 VG(在我们的示例中为vg01),如下所示:

    sudo vgextend vg01 /dev/sdb
    
    
  3. 使用vgdisplay命令来查找可以分配的大小(有关空闲物理区的大小,请查看Free PE / size行)。我们假设在示例中,空闲大小为 511 PE(相当于 4 MB PE 大小的 2 GB),并且我们将使用所有可用的空闲空间。

  4. 现在,我们可以使用 PE 通过以下命令扩展 LV(还有其他方法,但它们超出了本书的范围):

    sudo lvextend /dev/vg01/srv -l +511
    
    
  5. 我们在这里使用了-l选项来通过 PE 扩展 LV。如果您想使用 MB、GB 和 TB 来扩展,您可以使用-l选项。

  6. 在扩展ext3ext4文件系统之前,建议先卸载它(作为最佳实践)。如果您想减少一个 LV,必须先卸载它。以下命令将卸载分区并进行检查:

    sudo umount /srv
    sudo e2fsck -f /dev/vg01/srv
    
    
  7. 最后,您可以使用以下命令来调整文件系统的大小:

    sudo resize2fs /dev/vg01/srv
    
    
  8. 现在,您可以挂载分区并使用以下命令检查其新大小:

    mount /dev/vg01/srv /srv && df -h /srv
    
    

自动化安装

有时,我们需要安装大量的服务器。在这种情况下,手动安装将花费大量时间来执行重复任务。为了解决这个问题,我们有自动化安装,或者我们称之为网络引导。

为此,我们需要一台配备 DHCP 服务器和 TFTP 服务器的机器,这些服务器将为我们提供安装系统所需的服务和配置文件。

PXE 过程

客户端计算机(我们未来的服务器)将以PXEPreboot Execution Environment)模式启动其网络接口。然后,网络中的 DHCP 服务器将发送pxelinux.0文件;这一点将在后面解释。因此,客户端计算机通过 TFTP 访问pxelinux.cfg配置文件,该文件包含启动安装过程所需的必要信息。

PXE 安装过程

让我们从服务器安装开始:

  1. 首先,使用sudo apt-get install isc-dhcp-server -y命令安装 DHCP 服务器,然后通过使用/etc/default/isc-dhcp-server文件配置它,选择你想要监听的网络(如eth0)。

    /etc/dhcp/dhcpd.conf文件中,你需要配置一些参数,比如子网和地址范围。然后,使用以下命令重新启动它:

    sudo service isc-dhcp-server restart
    
    
  2. 完成此步骤后,安装以下必要的软件包,如果你希望设置 PXE 环境:

    sudo apt-get install apache2 tftpd-hpa inetutils-inetd
    
    

    现在,到了配置 TFTP 服务的时刻。为此,向/etc/default/tftpd-hpa文件中添加以下两行:

    RUN_DAEMON="yes"
    OPTIONS="-l -s /var/lib/tftpboot"
    
    

    同时,在/etc/inetd.conf文件末尾添加以下一行:

    tftp    dgram   udp    wait    root    /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot
    
    

    然后,通过使用sudo /etc/init.d/tftpd-hpa restart命令重启服务。

  3. 现在,我们需要将安装文件复制到 PXE 服务器。在我们的示例中,我使用了我家目录中的 ISO 镜像。首先,通过以下命令将其挂载:

    sudo mount loop /home/abdelmonam/ubuntu-15.04-server-amd64.iso /mnt
    
    

    然后,通过以下命令将所需的文件复制到服务器:

    cd /mnt
    sudo cp -fr install/netboot/* /var/lib/tftpboot/
    sudo mkdir /var/www/Ubuntu
    sudo cp -fr /mnt/* /var/www/ubuntu/
    
    

    完成此操作后,修改/var/lib/tftpboot/pxelinux.cfg/default的 PXE 配置文件,在文件末尾添加以下几行:

    label linux
    kernel ubuntu-installer/amd64/linux
    append ks=http://192.168.1.1/ks.cfg vga=normal initrd=ubuntu-installer/amd64/initrd.gz
    ramdisk_size=16432 root=/dev/rd/0 rw  --
    
    

    添加 IP 地址时要小心。

  4. 设置 PXE 服务器的最后一步是将以下几行添加到/etc/dhcp/dhcpd.conf文件末尾:

    allow booting;
    allow bootp;
    option option-128 code 128 = string;
    option option-129 code 129 = text;
    next-server 192.168.1.1;
    filename "pxelinux.0";
    
    

    然后,通过以下命令重启 DHCP 服务器:

    sudo service isc-dhcp-server restart
    
    

让我们继续进行客户端配置。在我们的案例中,我使用了一个virtualbox实例来测试这种安装方式:

  1. 通过virtualbox管理器创建具有所需特性的虚拟机。

  2. 然后,进入机器的设置,选择系统选项卡。在启动顺序部分,取消选择所有选项并选择网络,如下图所示:PXE 安装过程

  3. 选择网络选项卡,并将网络适配器配置为桥接模式。

  4. 最后,启动你的虚拟机。你将看到以下界面:PXE 安装过程

如果你是在本地通过 CD 进行安装,享受服务器安装的过程吧。

提示

PXE 安装可以用来并行安装许多机器,也可以在没有 CD-ROM 驱动器的机器上安装 Ubuntu Server。

如果将 PXE 方法与kickstart和/或preseed文件结合使用,安装过程将完全自动化。关于kickstart的一个不错的起点是help.ubuntu.com/community/KickstartCompatibility

附加资源

由于本书仅涵盖了 Ubuntu Server 的基本内容,无法深入探讨所有话题。因此,以下是一些有用的链接,帮助你在这个主题上深入探索:

总结

在本章中,我们了解了如何通过简单或高级安装的方式,在不同模式下安装 Ubuntu Server——手动安装和自动安装。

现在,我们可以开始管理我们的服务器,这是我们将在下一章中讨论的主题。

第二章。配置和管理 Ubuntu Server

在安装 Ubuntu Server 后,您需要进行管理。如果您是新手,本章对您来说是必不可少的。因此,请严格按照指南操作。如果您是有经验的 Linux 用户,并且熟悉其他发行版的工作方式,您可以考虑尝试类似于驾驶新车的体验。汽车当然有方向盘、油门和刹车,但您仍然需要花一点时间调整镜子,找到仪表和控制装置的位置,并调整座位直到感觉舒适。将本章视为在新车驾驶座位后花费的那一两分钟。

为了达成这个目标,我们将按照以下计划进行:

  • 使用命令行进行管理

  • Ubuntu Server 的软件包管理

  • Ubuntu Server 的网络配置

  • 执行基本系统管理任务

使用命令行进行管理

有关命令行工具及其有效使用方式,已经有整本书专门写作。在本节中,我们将查看我们需要的基本工具。如果您是经验丰富的管理员,可以跳过到下一节。只需记住以下注意事项即可。

注意

请注意,与其他 Linux 发行版不同,Ubuntu 默认禁用超级用户作为 root 用户使用,出于安全考虑。因此,当您希望以 root 权限运行命令时,应在命令前加上 sudo 关键字。系统会要求您输入密码(安装 Ubuntu Server 时使用的密码)。例如,如果您希望编辑 /etc/hosts 文件,请运行以下代码:

abdelmonam@abdelmonam-tactic:~$ sudo vi /etc/hosts
[sudo] password for abdelmonam:

如果您想激活 root 帐户(不推荐),或允许其他用户运行 sudo,您可以按照详细的教程操作。help.ubuntu.com/community/RootSudo.

现在,让我们从我认为对 Linux 管理员最重要的命令开始—man,或在线参考手册的界面。它为您提供任何您想使用的命令的必要信息(当然,前提是该命令已经有文档,这在大多数情况下是真实的)。我们通过在希望了解的命令前输入 man 关键字来使用它。我们使用箭头键进行导航,/ 字符进行搜索,Enter 键查看下一行,空格键 查看下一页,q 字符退出界面。例如,以下截图展示了当您运行 man ls 命令时会看到的内容:

使用命令行进行管理

man 页面按章节分组,每个章节对应一个主题。例如,第一个章节的 man 页面是可执行程序或 shell 命令,第二个章节是 系统调用(由内核提供的函数),依此类推。你可以通过运行 man man 命令查看所有章节。

另一个有用的命令是 apropos,它显示参数中找到的单词所在的章节和 man 页面。例如,当搜索包含 pwd 命令的 man 页面/章节时,我们使用以下命令:

abdelmonam@abdelmonam-tactic:~$ apropos pwd
lckpwdf (3)          - get shadow password file entry
pwd (1)              - print name of current/working directory
pwdx (1)             - report current working directory of a process
ulckpwdf (3)         - get shadow password file entry
unix_chkpwd (8)      - Helper binary that verifies the password of the current user

让我们考虑一个命令出现在多个章节中的情况,如下所示:

abdelmonam@abdelmonam-tactic:~$ apropos smbpasswd
smbpasswd (5)        - The Samba encrypted password file
smbpasswd (8)        - change a user's SMB password

你可以通过使用 man <章节号> <命令> 来查看与该章节相关的信息(例如,man 5 smbpasswd)。或者,如果你想查看该命令所有 man 页面章节的内容,可以使用 man -a <命令>(例如,man -a smbpasswd)。如果省略章节号,man 会返回它找到的第一个章节的 man 页面。

ls 命令列出参数中指定路径下的文件和目录(实际的 . 目录是默认选择)。有些选项非常有用。例如,使用 -a 选项,我们可以列出缓存项目。使用 -l 选项,我们可以获取额外的信息,如文件大小和权限:

abdelmonam@abdelmonam-tactic:~$ ls -la /etc/systemd/
total 48
drwxr-xr-x  5 root root 4096 Jun  2 17:30 .
drwxr-xr-x 93 root root 4096 Jun  2 17:40 ..
-rw-r--r--  1 root root  720 Apr 18 22:11 bootchart.conf
-rw-r--r--  1 root root  970 Apr 18 22:11 journald.conf
-rw-r--r--  1 root root  966 Apr 18 22:11 logind.conf
drwxr-xr-x  2 root root 4096 Apr 18 22:11 network
-rw-r--r--  1 root root  589 Apr 18 22:11 resolved.conf
drwxr-xr-x 13 root root 4096 Jun  2 17:38 system
-rw-r--r--  1 root root 1471 Apr 18 22:11 system.conf
-rw-r--r--  1 root root  607 Apr 18 22:11 timesyncd.conf
drwxr-xr-x  2 root root 4096 Apr 18 22:11 user
-rw-r--r--  1 root root 1127 Apr 18 22:11 user.conf

pwd 命令给出当前路径(工作目录)。

history 命令列出了你运行的最后几个命令。

chmod 命令允许你更改文件权限。使用时请小心,尤其是在使用 * 魔法符号代替文件名并配合 -R 选项递归执行时。与此相关的命令还有 chownchgrp,它们分别允许你更改文件的所有者和组。

top 命令列出正在你 Ubuntu 服务器上运行的进程;这些进程按 CPU 使用率排序。该列表实时更新,且受屏幕大小限制。如果你想查看系统上运行的所有进程列表,可以运行著名的 ps -ef | less 命令。在这里,我们通过使用 | 字符将该命令的结果传递给 less 命令,按页面逐步查看结果输出,less 的功能类似于著名的 more 命令。此外,less 允许你向前和向后浏览。

提示

请注意,管道(使用 | 字符)是一种优化命令输出的机制,通过将第一个命令(| 字符前的命令)的输出作为输入传递给第二个命令(| 字符后的命令)。我们可以在单个命令行中使用多个管道进行级联。

在没有图形界面的服务器环境中,有一些有用的快捷键,比如 Ctrl+C,用于退出未响应的命令(或执行时间过长的命令),Ctrl+D,用于向命令发送 文件结束EOF)信号,最后是 Ctrl+Z,用于停止正在前台运行的命令(在控制台上)。尽管它会停止命令的执行,但并不会终止它。相反,它只是被暂停了。我们可以通过 bg 命令将其恢复到后台,或者通过 fg 命令再次将其恢复到前台。要做到这一点,你需要知道与程序相关联的作业号。你可以通过 jobs 命令获取作业号列表。

对于文件管理,你需要使用 mkdir 来创建目录,cd 进入目录,touch 创建文件,cat 查看文件内容。对于目录/文件管理,你可以使用 cp 进行复制,rm 进行删除,mv 进行移动/重命名。

要编辑文件,你可以使用两个著名的编辑器中的任意一个,vivim

提示

请注意,这些是最常用的 CLI 命令。在本书的后续章节中,我们将会介绍其他命令。每当我们需要使用某个命令时,都会为其提供解释。如果你希望充分利用某个特定的命令,可以使用之前提到的 man 命令。

注意

如果你想深入了解 Linux 命令行CLI),我建议你参考linuxcommand.org/tlcl.php上的书籍。

在服务器环境中工作时,了解基本的 vi/vim 编辑器是强制性的。学习如何使用 vi 超出了本书的范围。所以,你需要自己做一些努力来学习它。如果需要更多帮助,你可以在www.cs.colostate.edu/helpdocs/vi.html找到一些很好的 vi 编辑器基础培训。

Ubuntu 服务器的软件包管理

Ubuntu 和其他基于 Debian 的系统一样,使用 Debian 软件包格式,如 .deb 软件包。在安装软件时,我更喜欢使用 .deb 软件包,而不是 tarball 压缩包。因为一方面,与 tarball 不同,使用 .deb 软件包可以让我们追踪系统中安装的每个软件包。另一方面,只有 .deb 软件包可以通过包管理器请求服务器上的软件包数据库,并获取有关已安装和可用软件包的信息,包管理器会自动处理缺失的依赖项。

软件包库

Ubuntu 软件包存储在软件库中,软件库是一个预编译的二进制格式的软件包集合,这些软件包可以存储在不同的介质上,例如 CD-ROM,或通过互联网获取。Canonical(Ubuntu 的创建公司)提供了四个官方软件库:

  • main:这是一个包含完全自由许可下分发的软件,并且由 Ubuntu 团队支持的仓库。

  • restricted:这是一个包含可能不完全符合自由许可的软件,但由 Ubuntu 团队支持的仓库,通常包含特定硬件组件的驱动程序。

  • universe:这个仓库包含大多数 Linux 世界中的开源软件,这些软件可能不完全符合与其他软件相同的自由许可。该仓库中的软件不由 Ubuntu 团队提供支持。

  • multiverse:在这里,你会找到一些不符合自由软件标准的软件。该仓库中的软件不由 Ubuntu 团队提供支持。

还有许多其他的仓库。它们中的许多是由软件编辑器拥有并包含与其产品相关的软件包。大多数是由社区提供的,并且存在于 个人软件包档案 (PPA) 下,这是一个适用于 Ubuntu 的仓库软件(更多信息请访问 launchpad.net/ubuntu/+ppas)。

在 Ubuntu 服务器上管理仓库是在 /etc/apt/sources.list 文件中完成的。以下是一个新安装的 Ubuntu 服务器的该文件示例:

abdelmonam@abdelmonam-tactic:~$ cat /etc/apt/sources.list
#

# deb cdrom:[Ubuntu-Server 15.04 _Vivid Vervet_ - Release amd64 (20150422)]/ vivid main restricted

#deb cdrom:[Ubuntu-Server 15.04 _Vivid Vervet_ - Release amd64 (20150422)]/ vivid main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://tn.archive.ubuntu.com/ubuntu/ vivid main restricted
deb-src http://tn.archive.ubuntu.com/ubuntu/ vivid main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://tn.archive.ubuntu.com/ubuntu/ vivid-updates main restricted
deb-src http://tn.archive.ubuntu.com/ubuntu/ vivid-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://tn.archive.ubuntu.com/ubuntu/ vivid universe
deb-src http://tn.archive.ubuntu.com/ubuntu/ vivid universe
deb http://tn.archive.ubuntu.com/ubuntu/ vivid-updates universe
deb-src http://tn.archive.ubuntu.com/ubuntu/ vivid-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://tn.archive.ubuntu.com/ubuntu/ vivid multiverse
deb-src http://tn.archive.ubuntu.com/ubuntu/ vivid multiverse
deb http://tn.archive.ubuntu.com/ubuntu/ vivid-updates multiverse
deb-src http://tn.archive.ubuntu.com/ubuntu/ vivid-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://tn.archive.ubuntu.com/ubuntu/ vivid-backports main restricted universe multiverse
deb-src http://tn.archive.ubuntu.com/ubuntu/ vivid-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu vivid-security main restricted
deb-src http://security.ubuntu.com/ubuntu vivid-security main restricted
deb http://security.ubuntu.com/ubuntu vivid-security universe
deb-src http://security.ubuntu.com/ubuntu vivid-security universe
deb http://security.ubuntu.com/ubuntu vivid-security multiverse
deb-src http://security.ubuntu.com/ubuntu vivid-security multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu vivid partner
# deb-src http://archive.canonical.com/ubuntu vivid partner

在修改了源列表文件后,使用 sudo apt-get update 命令更新软件包数据库。接下来我们将看看如何使用 apt 工具。

软件包管理工具

在 Ubuntu 中,有一些软件包管理工具,尤其是在大多数服务器安装的非图形环境中。在接下来的部分,你将了解除了著名的 tasksel 工具外,最常用的三个工具——dpkgaptitudeapt

注意

请注意,使用多个软件包管理数据库可能会导致困惑。我建议你选择一个软件包管理系统并坚持使用它。接下来我们将使用 apt 来进行操作。

dpkg 工具

该工具用于管理(安装、移除和构建)来自 CD-ROM 或其他磁盘存储的本地 .deb 软件包。它不会自动从仓库下载和安装软件包,也不会管理依赖关系。

dpkg 工具非常强大。当处理本地安装的软件包时,它可以派上用场。例如,它可以帮助你列出系统上安装的所有软件包,包括那些使用其他工具(如 apt)安装的软件包。要查看这些内容,你可以运行命令 dpkg -l(由于该命令的输出是一个巨大的列表,你可以运行 dpkg -l 命令并使用 less 分页查看)。以下是我们服务器上执行 dpkg -l | less 的结果:

The dpkg tool

dpkg 命令还可以列出与特定软件包一起安装的不同文件。在这种情况下,我们应该使用 -l 选项,并将软件包的名称作为参数。如以下截图所示,我们列出了与 isc-dhcp-common 软件包一起安装的文件:

dpkg 工具

另一方面,我们可以使用 -S 选项检查包中安装的特定文件。如下面的截图所示,/usr/bin/omshell 文件是与 isc-dhcp-common 包一起安装的:

dpkg 工具

注意

请注意,在安装包时会自动生成许多文件,尽管它们存在于文件系统中,dpkg -S 可能无法识别它们属于哪个包。

使用 dpkg,我们可以通过 -i 选项安装本地的 .deb 包:

sudo dpkg -i <file_name.deb>

我们还可以通过 -r 选项删除包,但不推荐这么做,因为 dpkg 不处理依赖关系。如果你使用 dpkg 删除一个程序依赖的包,可能会导致这些程序崩溃。

aptitude 工具

aptitude 工具基于 apt高级包管理工具),这一部分将在本章后面讨论,但这个工具更加用户友好。你可以使用 aptitude,通过 search 关键字在包描述数据库中搜索特定的词,或者使用 show 关键字来显示特定包的很多有用信息。然而,aptitude 最有帮助的用法是,你可以在不加任何关键字的情况下启动它,这时你将看到一个基于菜单的文本界面来操作 apt。这个界面适用于服务器环境(通常是非图形化工具)。它帮助用户自动执行许多任务。

当你执行 sudo aptitude 命令时,你会看到以下界面:

aptitude 工具

你可以通过使用 Ctrl+T 快捷键查看 Package 菜单,并使用箭头键进行导航,如下图所示:

aptitude 工具

你也可以像使用 apt 命令行界面那样使用 aptitude 命令行界面(非菜单驱动界面)。例如,你可以使用 sudo aptitude install bind9 来安装 bind9 DNS 服务器。

apt 工具

apt 用于从在线仓库下载并安装包。apt 命令(如 apt-getapt-cache 等)通常用于与在线软件配合使用。然而,它们也可以用于安装本地包。

apt-cache 命令允许你操作 apt 包缓存。apt-cache 命令不会修改系统的状态,但它提供了搜索和从包元数据中生成有用输出的功能。例如,使用 search 关键字,你可以在包描述数据库中搜索特定词汇。使用 show 关键字,你可以显示特定包的详细信息。

apt-get 工具功能强大。它执行许多功能,如安装新包、升级旧包、更新包数据库,甚至升级整个 Ubuntu 服务器。

要安装一个新软件包,你只需要运行带有 install 关键字的命令。例如,要安装 apache2 web 服务器,你应该运行以下命令:

sudo apt-get install apache2

当然,你可以使用以下命令将其删除:

sudo apt-get remove apache2

注意

请注意,使用 --purge 选项,你还可以删除配置文件。因此,请谨慎使用它。

我们可以同时安装和删除一整批软件包。只需写出软件包的名称,名称之间用空格隔开。

apt-get 的常见用法是,在修改源列表文件后更新软件数据库。要做到这一点,请执行以下命令:

sudo apt-get update

随着时间的推移,很多软件包将会有更新的版本。因此,进行 upgrade 操作是必要的,以保持你的 Ubuntu 服务器最新,特别是当涉及到安全更新时。apt-get 工具允许我们通过以下命令来完成此操作(在如前所述更新数据库后):

sudo apt-get upgrade.

注意

请注意,一般情况下,完成新安装后的第一件事就是通过运行以下命令升级系统中的所有软件:

sudo apt-get update && sudo apt-get upgrade

若想了解有关 apt-get 的更多信息,你可以参考手册页,或使用 help 关键字,如下所示:

abdelmonam@abdelmonam-tactic:~$ apt-get help
apt 1.0.9.7ubuntu4 for amd64 compiled on Apr  7 2015 14:42:59
Usage: apt-get [options] command
 apt-get [options] install|remove pkg1 [pkg2 ...]
 apt-get [options] source pkg1 [pkg2 ...]

apt-get is a simple command line interface for downloading and
installing packages. The most frequently used commands are update
and install.

Commands:
 update - Retrieve new lists of packages
 upgrade - Perform an upgrade
 install - Install new packages (pkg is libc6 not libc6.deb)
 remove - Remove packages
 autoremove - Remove automatically all unused packages
 purge - Remove packages and config files
 source - Download source archives
 build-dep - Configure build-dependencies for source packages
 dist-upgrade - Distribution upgrade, see apt-get(8)
 dselect-upgrade - Follow dselect selections
 clean - Erase downloaded archive files
 autoclean - Erase old downloaded archive files
 check - Verify that there are no broken dependencies
 changelog - Download and display the changelog for the given package
 download - Download the binary package into the current directory

Options:
 -h  This help text.
 -q  Loggable output - no progress indicator
 -qq No output except for errors
 -d  Download only - do NOT install or unpack archives
 -s  No-act. Perform ordering simulation
 -y  Assume Yes to all queries and do not prompt
 -f  Attempt to correct a system with broken dependencies in place
 -m  Attempt to continue if archives are unlocatable
 -u  Show a list of upgraded packages as well
 -b  Build the source package after fetching it
 -V  Show verbose version numbers
 -c=? Read this configuration file
 -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp
See the apt-get(8), sources.list(5) and apt.conf(5) manual
pages for more information and options.
This APT has Super Cow Powers.

使用 tasksel 添加软件集合

tasksel 工具为你提供了同时安装和配置新软件的可能性——无论是使用默认值,还是让你输入适当的值。因此,你将得到你想要安装的软件,它可以正常工作并且随时可用,无需额外的自定义(当然,你可以稍后根据需要重新配置它)。

你可能还记得在安装软件时,我们看到一个界面,询问是否安装一些服务器(如 DNS、邮件、Web 等)。这一任务可以通过 tasksel 完成。我们可以随时通过以下命令启动相同的菜单界面:

sudo tasksel

该命令的输出如下:

使用 tasksel 添加软件集合

使用箭头键在集合之间导航,按 空格键 选择你想要安装的软件(你将看到软件左侧有一个星号),按 Tab 键导航到 OK 按钮,按 Enter 键启动安装。

如果你想知道为完成特定任务将安装哪些软件包,可以运行以下命令,以 lamp web 服务器为例:

abdelmonam@abdelmonam-tactic:~$ tasksel --task-packages lamp-server
libmysqlclient18
apache2
php5-cli
libapache2-mod-php5
apache2.2-common
apache2-utils
php5-common
php5-mysql
mysql-server
apache2.2-bin
mysql-client-5.5
mysql-server-5.5
perl-modules
perl
mysql-server-core-5.5
mysql-client-core-5.5
ssl-cert
apache2-mpm-prefork
mysql-common

Ubuntu 服务器的网络配置

要涵盖 Linux 系统管理员的所有网络配置方面,我们需要大量的书籍。因此,在这一小节中,我们将只涵盖每个 Ubuntu 服务器管理员在设置和更改网络设置时需要的基本主题。

配置文件

在这一节中,我们将查看 Ubuntu 服务器网络设置的核心文件。

注意

请注意,修改这些文件后,你应该通过输入以下命令重启网络进程:

sudo /etc/init.d/networking restart

与 Red Hat 系统不同,Ubuntu 以及所有基于 Debian 的发行版使用一个独特的文件来配置所有网络接口;这个文件叫做 /etc/network/interfaces。一般来说,在 Ubuntu 服务器上,你会看到回环接口和以太网接口。对于回环接口(127.0.0.1),其配置是标准的,不需要你做任何修改。对于以太网接口,在大多数情况下(当你处理服务器时),你会发现多个接口。它们通常被命名为 ethX,其中 X 是一个从 0 开始并根据接口数量递增的数字。

以太网接口可以配置为 DHCP 或静态模式。如果是 DHCP 模式,我们将在 /etc/network/interfaces 中看到以下内容:

auto eth0
iface eth0 inet dhcp

这里,包含 auto 关键字的那一行表示该接口在计算机启动时应自动启动。

如果是静态模式,你将看到如下的输出:

iface eth0 inet static
address 192.168.1.58
netmask 255.255.255.0
gateway 192.168.1.1

这些字段非常简单,且几乎不需要解释。

另一个重要的网络配置文件是 /etc/resolv.conf,它包含了你的服务器使用的 DNS 列表。如果你使用的是 DHCP,这个文件的内容会自动设置。你可以通过以下格式编辑它,添加你自己的/喜欢的 DNS 服务器:

nameserver 192.168.1.11
nameserver 192.168.1.12

该列表中 DNS 服务器的顺序将会在处理 DNS 请求时被遵循。

注意

请注意,一般来说,我们使用以下命令编辑 DNS 服务器:

sudo vi /etc/resolv.conf

然而,从 Ubuntu 12.04 及之后的版本开始,你应该使用以下内容:

sudo vi /etc/resolvconf/resolv.conf.d/base

/etc/hosts 文件也是核心网络设置文件之一。默认情况下,它包含了回环地址和本地主机地址,但你可以在其中添加其他地址/主机名对。在检查 DNS 之前,它将被首先使用。当你希望为主机名分配一个 IP 地址,即使你的 DNS 宕机时,它也非常有用。这个文件也被许多服务使用。我们将在下一章中查看这一点。

网络工具

在本节中,我们将了解一些 Ubuntu 服务器管理员应该了解的网络程序。

你应该了解的前两个命令是 ifupifdown,分别用于启用和禁用接口。你应该在参数中使用接口的名称。

注意

当你关闭一个接口时要小心。这样做可能会干扰系统中的任何服务。此外,如果你通过 SSH 连接到系统,并且关闭了系统的主要接口,你将会断开与 SSH 的连接。

另一个重要的工具是 ifconfig,它可以提供关于接口的详细信息,如下所示:

abdelmonam@abdelmonam-tactic:~$ ifconfig
eth0  Link encap:Ethernet  HWaddr 08:00:27:74:26:9b
 inet addr:192.168.1.58  Bcast:192.168.1.255  Mask:255.255.255.0
 inet6 addr: fe80::a00:27ff:fe74:269b/64 Scope:Link
 UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 RX packets:3182 errors:0 dropped:0 overruns:0 frame:0
 TX packets:758 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000
 RX bytes:296560 (296.5 KB)  TX bytes:117994 (117.9 KB)

lo    Link encap:Local Loopback
 inet addr:127.0.0.1  Mask:255.0.0.0
 inet6 addr: ::1/128 Scope:Host
 UP LOOPBACK RUNNING  MTU:65536  Metric:1
 RX packets:176 errors:0 dropped:0 overruns:0 frame:0
 TX packets:176 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:0
 RX bytes:14144 (14.1 KB)  TX bytes:14144 (14.1 KB)

ifconfig 命令也允许你配置接口、启用它们以及禁用它们。你可以通过 man ifconfig 查看它的潜力。

另一个重要的网络程序是 route 命令。与 ifconfig 相似,这个命令既可以用来查看网络设置,也可以用来设置网络路由(在本例中是网络路由)。它用于管理服务器上的路由(例如列出、添加、删除等)。我们来看一下以下命令:

abdelmonam@abdelmonam-tactic:~$ route
Kernel IP routing table
Destination  Gateway      Genmask      Flags Metric Ref    Use Iface
default      192.168.1.1  0.0.0.0       UG    0      0        0 eth0
192.168.1.0  *            255.255.255.0  U    0      0        0 eth0

在路由配置的相同上下文中,有一个著名的 traceroute6 命令,它能显示从服务器到目标的路径。

ethtool 命令是一个用于操作以太网卡设置的程序,如端口速度、自动协商、双工模式和 Wake-on-LAN。你可以使用以下命令安装它:

sudo apt-get install ethtool

要查看 ethtool 选项,你可以运行 man ethtoolethtool -h | less

执行基本的系统管理任务

在本节中,我们将探讨一组有用的 Ubuntu Server 管理任务,如监控和进程管理。

监控资源

对于系统管理员来说,监控任务是最重要的,因为它们能帮助我们保持系统的稳定,防止事故发生。Ubuntu Server 提供了一套强大的监控工具,涵盖了 CPU 使用情况、硬盘、虚拟内存等内容。

有些工具是 Ubuntu 自带的,而有些则需要安装。sysstat 包含其中的一些工具。你可以使用以下命令安装它:

sudo apt-get install sysstat

Ubuntu Server 管理员需要永久监控的最重要资源之一是内存使用情况,因为内存不足会对系统性能产生负面影响。

你可以使用 freetop 命令查看有关 RAM 和交换空间使用的基本信息。若要获得有关服务器内存使用的更详细信息,可以参考 vmstat 命令。slabtop 命令在你想查看内核(内存 slab 缓存)消耗多少内存时非常有用。

如前所述,top 命令用于查看当前正在运行的进程。默认情况下,这些进程会根据 CPU 使用情况进行排序。你还可以使用 top 以屏幕方式监控内存使用情况。当 top 正在运行时,只需按下 Shift+m,运行中的进程就会按内存使用情况进行排序(这样你可以检查哪些进程消耗了最多内存)。

另一个 Ubuntu Server 管理员需要监控的重要系统资源是 CPU 使用情况。我们之前提到过的 vmstat 命令可以生成与 CPU 使用情况相关的基本统计信息,如系统活动、用户活动、I/O 等待时间、空闲时间等。如果你想要更详细的 CPU 利用率报告,可以使用 iostat 命令,它包含在开头提到的 sysstat 包中。

例如,下面是如何每 5 秒显示一次 CPU 统计信息:

abdelmonam@abdelmonam-tactic:~$ iostat -c 5
Linux 3.19.0-15-generic (abdelmonam-tactic)  2015-06-13  _x86_64_ (1 CPU)

avg-cpu:  %user   %nice  %system  %iowait  %steal   %idle
 24,27   0,08   5,17     0,94     0,00     69,55

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
 24,45   0,00  3,41    0,25     0,00     71,89

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
 24,66    0,00    3,11    0,15    0,00   72,08

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
 28,17   0,00  3,39    0,10     0,00     68,34

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
 23,97   0,00  2,65    0,41     0,00     72,98

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
 25,08   0,00  3,13    0,21     0,00     71,59

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
 25,56   0,00  3,46    0,00     0,00     70,99

iostat的替代方法是dstat命令,它可以查看 CPU 使用情况和其他性能相关的信息。dstat命令具有一些其他工具所不具备的优势,比如信息显示的简洁性和清晰性,以及颜色的使用。要安装这个工具,请使用以下命令安装dstat包:

$ sudo apt-get install dstat

这是dstat显示 CPU 信息的一个示例:

监控资源

如前所述,top命令允许你专门找出哪些进程占用了最多的处理时间。默认情况下,排序顺序是基于 CPU 使用率的,但如果你因某些原因改变了排序方式(比如我们之前把排序方式改成了基于内存使用情况),你可以通过在运行top时使用Shift+p命令恢复到默认的排序顺序。

dudf这样的命令可以让你获取有关你 Ubuntu 服务器可用存储空间的基本信息。要了解存储设备的详细性能,可以使用vmstatiostat等命令。

让我们通过使用vmstat命令查看与磁盘相关的统计信息。以下是使用vmstat查看磁盘读写统计信息的示例,使用了-d 选项:

abdelmonam@abdelmonam-tactic:~$ vmstat -d

disk--------reads-------- ---------writes-------- -----IO------
     total merged sectors ms  total  merged  sectors  ms  cur  sec
ram0  0     0      0       0   0      0       0        0   0     0
ram1  0     0      0       0   0      0       0        0   0     0
ram2  0     0      0       0   0      0       0        0   0     0
ram3  0     0      0       0   0      0       0        0   0     0
ram4  0     0      0       0   0      0       0        0   0     0
ram5  0     0      0       0   0      0       0        0   0     0
ram6  0     0      0       0   0      0       0        0   0     0
ram7  0     0      0       0   0      0       0        0   0     0
ram8  0     0      0       0   0      0       0        0   0     0
ram9  0     0      0       0   0      0       0        0   0     0
ram10 0     0      0       0   0      0       0        0   0     0
ram11 0     0      0       0   0      0       0        0   0     0
ram12 0     0      0       0   0      0       0        0   0     0
ram13 0     0      0       0   0      0       0        0   0     0
ram14 0     0      0       0   0      0       0        0   0     0
ram15 0     0      0       0   0      0       0        0   0     0
loop0 0     0      0       0   0      0       0        0   0     0
loop1 0     0      0       0   0      0       0        0   0     0
loop2 0     0      0       0   0      0       0        0   0     0
loop3 0     0      0       0   0      0       0        0   0     0
loop4 0     0      0       0   0      0       0        0   0     0
loop5 0     0      0       0   0      0       0        0   0     0
loop6 0     0      0       0   0      0       0        0   0     0
loop7 0     0      0       0   0      0       0        0   0     0
sr0   0     0      0       0   0      0       0        0   0     0
sr1   0     0      0       0   0      0       0        0   0     0
sda   6742  89   493438  73140 732   969    43336   17552  0    37

另一个有用的文件系统管理命令是lsof。它可以帮助你查找哪些文件和目录实际上在存储设备上是打开的。你需要使用这个命令的最常见情况之一是当你试图卸载一个提示仍然在使用中的文件系统时。在这种情况下,你可以评估哪个打开的文件阻止了卸载,决定是否停止持有该文件的进程,然后再次执行卸载操作。

进程管理

如前所述,pstop命令允许我们显示大量与运行中的进程相关的信息。在本节中,我们将探讨其他可以帮助我们管理进程的命令。

当你运行top时,除了排序之外,你还可以执行很多操作。例如,你可以输入字母k,后跟一个信号编号(例如 9 或 15)和 PID,这会将信号发送到具有该 PID 的进程。你也可以使用字母n来更改一个进程的优先级。

改变正在运行的进程优先级的另一种方法是使用renice命令。如果你想在启动进程时更改默认优先级或设置更高或更低的优先级,可以使用 nice 命令。

改变正在运行的进程行为的另一种方法是向该进程发送信号。像killpkillkillall这样的命令可以用来向正在运行的进程发送信号。我们可以用数字(例如 9 和 15)或字符串(如 SIGKILL 和 SIGTERM)来表示信号。

调度需要运行的进程

cron 服务相关的命令可以用于在特定时间(包括当前时间)运行一个命令,因此它不会与当前的 shell 连接。at 命令用于在你设置的时间运行命令。例如,如果你想在 1 分钟后运行命令,只需运行 at now +1 min 命令。然后,当你看到 at 提示符时,写下你要执行的命令,如下所示:

at> your_command

之后,按 Enter 键。你将再次看到 at 提示符。你可以输入另一个命令或多个命令,每个命令占一行。然后,按 Enter 键。最后,运行 Ctrl+d 快捷键来关闭 at 提示符。

以同样的方式,你可以输入 at now +7 days 来在 7 天后运行一个命令。或者,如果你想在特定日期执行命令,可以运行 at,后跟 dd/mm/yy 格式的日期。

如果你想查看你输入命令后将执行的 at 作业队列(如前所述),你需要运行 atq 命令。如果你是新用户,你只能看到自己排队的 at 作业。只有 root 用户才能看到所有人的排队 at 作业。使用 atrm 命令,后跟作业编号(通过 at 创建步骤或 atq 命令获得),可以删除队列中的某个 at 作业。

at 命令用于排队一个只运行一次的命令。如果你想设置让命令反复运行,你可以使用 cron 服务,它允许你在 crontab 文件中编写脚本来安排 cron 作业。通常,有一个系统级的 crontab 文件(位于 /etc/crontab),但每个用户都可以创建个人的 crontab 文件,允许他们在自己选择的时间启动命令。要创建个人的 crontab 文件,你需要输入以下命令:

crontab -e

crontab -e 命令会打开 crontab 文件(如果文件存在的话),如果没有,它会使用你选择的文本编辑器创建一个新的文件:

abdelmonam@abdelmonam-tactic:~$ crontab -e
no crontab for abdelmonam - using an empty one

Select an editor.  To change later, run 'select-editor'.
 1\. /bin/ed
 2\. /bin/nano        <---- easiest
 3\. /usr/bin/emacs23
 4\. /usr/bin/vim.tiny

Choose 1-4 [2]:

crontab 文件中,每个作业都由一行表示,该行决定了作业的运行时间,后面跟着需要运行的命令。对于 times 字段,它们的顺序如下:分钟 (m)、小时 (h)、日期 (dom)、月份 (mon) 和 星期几 (dow)。你可以在这些字段中使用 *(表示 任何)。

注意

以下是从左到右的字段:分钟(0 到 59)、小时(0 到 23)、日期(0 到 31)、月份(0 到 12 或 Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)和星期几(0 到 7 或 Sun, Mon, Tue, Wed, Thu, Fri, Sat)。字段中的星号(*)表示该字段可以匹配任何值。

你可以为每个字段使用单个值或多个值。例如,对于dow字段,你可以使用MonFri的值来在每周的开始和结束(每个星期一星期五)运行作业。举个例子,对于mon字段,值 1,4,7,10 意味着作业将在每个季度的第一个月启动(即 1 月、4 月、7 月和 10 月)。

crontab作业的输出(包括错误信息)会通过电子邮件发送给属于该crontab文件的用户(除非被重定向)。

要列出你的crontab文件内容,应该运行crontab –l,要删除你的crontab文件,应该运行crontab -r

总结

在本章中,我们了解了配置和管理 Ubuntu Server 系统的不同方面。我们学习了使用 CLI 进行网络设置、软件包管理和管理任务。

在下一章,我们将开始本书的新部分,涉及服务的创建和管理。

第三章:在 Ubuntu 上部署服务器

数百种不同的服务可以部署在 Ubuntu 服务器上,每一种服务都可以在一本书中详细介绍。本章将重点介绍一些系统管理员常见的服务器设置和配置要点。新手将获得逐步指导,而高级用户将了解 Ubuntu 的服务器方法。我们将从部署著名的 OpenSSH 服务器开始,然后设置 DNS 服务器。接着,我们将介绍如何启动 Web 服务器和邮件服务器。最后,我们将介绍如何部署数据库、DHCP 和文件服务器。

本章内容涵盖了以下主题:

  • 部署 OpenSSH 服务器

  • 设置 DNS 服务器

  • 启动 Web 服务器

  • 部署邮件服务器

  • 设置数据库服务器

  • 设置 DHCP 服务器

  • 安装文件服务器

部署 OpenSSH 服务器

让我们从最有用的服务器开始,依我看来,每个管理员都应该在他们的服务器上安装它,无论该服务器的目的是什么,以及需要放置哪些服务。它就是 OpenSSH 服务器,允许你通过安全的方式从一个可以访问该服务器的计算机远程连接到服务器。OpenSSH 服务器是一组工具,除了提供安全的远程连接外,还支持通过 scp 协议进行安全的文件传输。

OpenSSH 服务器允许客户端使用多种认证方式连接,如简单密码、公共密钥和 Kerberos 票证。

安装 OpenSSH 服务器

我们可以只安装 OpenSSH 服务器,但通常我们需要同时安装 OpenSSH 工具——即服务器和客户端。我们需要一个服务器来从可访问的计算机连接到我们正在使用的 Ubuntu 服务器。我们还需要一个客户端来将其连接到另一个服务器或计算机。

安装 OpenSSH(包括服务器和客户端)非常简单。要安装 OpenSSH 客户端,你需要运行以下命令:

sudo apt-get install openssh-client

对于 OpenSSH 服务器,我们之前看到可以在 Ubuntu Server 安装过程中使用 tasksel 工具进行安装,但如果你在之前的步骤中忘记执行此操作,你需要运行以下命令:

sudo apt-get install openssh-server

注意

要同时安装客户端和服务器,你只需运行以下命令:

sudo apt-get install ssh

配置 OpenSSH 服务器

OpenSSH 服务器由 sshd 守护进程管理。其配置文件位于 /etc/ssh/sshd_config,可以通过编辑该文件来修改配置。

提示

对该文件的不当操作可能会影响 SSH 服务器的正常运行,甚至使其崩溃。因此,最好先对该文件进行备份,并作为安全措施,通过以下命令将备份文件设置为只读:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original
sudo chmod a-w /etc/ssh/sshd_config.original

让我们看几个可以通过此文件进行更改的示例。第一个例子是查找端口号。默认情况下,sshd监听端口22。您可以更改此行为,并通过在该文件中将端口指令的值设置为2233,使其监听端口2233。您还会找到HostKey指令,它允许我们设置认证密钥的路径。另一个例子是,当您想在登录前显示/etc/issue.net文件中的横幅消息时,通过注释掉以下行来实现:

#Banner /etc/issue.net

如果您想了解更多可以更改的配置指令及其可能的值和用途,只需运行 man sshd_config 命令。

在修改了/etc/ssh/sshd_config文件后,您应保存文件,并使用sudo service ssh restart命令重启守护进程。

小贴士

在远程位置编辑此文件时要小心,尤其是当远程连接是连接到服务器的唯一方式时,因为修改此文件可能会改变与网络交互时的行为。此外,如果该文件中有错误并且您重新启动sshd守护进程,服务器可能无法重新启动,您将失去与服务器的连接。因此,请小心操作,并准备好应急计划(例如,让现场人员通过恢复原始备份文件重新建立连接)。

请注意,通过运行/usr/bin/sshd -t,您可以在重启服务器之前测试config文件,从而避免我们在前一节中讨论的潜在问题。

设置 DNS 服务器

DNS 是一种域名系统服务器,它通过提供相应的 IP 地址来回答有关域名的查询。它是 www 工作的必要条件;没有它,用户将不得不学习每个网站的 IP 地址并手动输入到浏览器中(或者将它们手动添加到主机文件中),这是不可能的。

在 Ubuntu 下有许多提供 DNS 服务的程序,但最常见的是 BIND。

BIND 安装

如果在 Ubuntu Server 安装过程中错过了安装 BIND,您现在可以安装,方法有不止一种。

您可以使用tasksel工具,它会自动为您安装bind9bind9-doc两个软件包。或者,您也可以使用apt-get工具,如下所示:

sudo apt-get install bind9 bind9-doc

一旦安装了 BIND 软件包,它将使用默认参数完全配置并能够作为递归查询的缓存 DNS 工作。您当然可以根据需要自定义它。我们将在接下来的章节中讨论如何做到这一点。

您可以使用以下命令检查 BIND 的状态:

sudo service bind9 status

如果它没有运行,您可以使用以下命令启动它:

sudo service bind9 start

此命令的输出如下图所示:

BIND 安装

Ubuntu 的 BIND 约定

BIND 文件在 Ubuntu 中的组织方式可能与其他发行版有所不同。以下是基本的文件和目录:

  • /etc/bind:这是 BIND 配置文件的主目录,它还包含 区域 文件。

  • /etc/bind/named.conf:这是 BIND 的主配置文件。它包含了来自其他文件的脚本,其中最著名的文件有:/etc/bind/named.conf.default-zones,它包含如本地主机的默认区域;/etc/bind/named.conf.local,它包含由系统管理员添加的区域(当您想要添加区域时使用此文件);以及 /etc/bind/named.conf.options,它包含诸如转发器地址等附加选项。

  • /etc/bind/db.*:包含与每个区域相关的信息的区域文件,约定以 db. 开头,每个文件表示一个特定的区域。

  • /etc/init.d/bind9:这是包含启动 BIND 服务所需的启动参数的文件。

  • /var/log/syslog:默认情况下,BIND 使用此文件存储其日志。该文件包含许多其他服务的日志。因此,如果您只希望获取 BIND 的日志,可以使用 grep 命令查找关键字 named,如下所示:

    grep named /var/log/syslog
    
    

配置 BIND

配置 BIND 很简单。它通常是创建新的区域(或编辑现有的区域)。这可以通过执行以下三个步骤来完成:

  1. 可以创建与需要添加的区域相关的区域文件,或者编辑现有的文件。

  2. /etc/bind/named.conf.local 中添加对区域文件的引用

  3. 使用以下命令重新加载 BIND 服务:

    sudo service bind9 reload
    
    

区域文件配置

与特定域名相关的详细信息存储在 DNS 服务器中的一个实体中,称为 区域。每个区域都由 /etc/bind/ 目录下的一个文件表示。在本节中,我们将了解如何配置 DNS 区域文件。

注意

如果您想了解更多关于该主题的信息,可以在 www.slashroot.in/what-dns-zone-file-complete-tutorial-zone-file-and-its-contents 找到完整的关于区域文件及其内容的教程。

区域文件具有相同的结构。因此,配置新区域的一个简单方法是复制现有的区域文件(例如 /etc/bind/db.local),然后根据需要修改它。

默认情况下,区域文件中的定时器是以秒为单位设置的。您可以通过在值后添加字母 d 来使用其他时间单位,例如天、添加字母 w 表示周、使用字母 h 表示小时,等等。

以下是区域文件配置中最重要的字段:

  • SOA授权开始,该服务器被认为是信息的最佳来源

  • NS:这是区域文件的名称服务器

  • A:这是 IPv4 地址

  • AAAA:这是 IPv6 地址

  • MX:这是邮件服务器

你还需要为每个创建的区域配置一个反向 DNS 文件。其结构与正向文件相同,因此你可以简单地复制一个默认的反向区域,例如 /etc/bind/db.127

要在 /etc/bind/named.conf.local 文件中引用一个区域文件,只需复制现有引用的示例并进行修改。以下是一个示例,演示了这个过程:

zone "localhost" {
  type master;
  file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
  type master;
  file "/etc/bind/db.127";
};

注意

当你重新加载 BIND 时,它会考虑到修改后的区域文件,并且该文件具有更高的序列号。所以,在每次修改文件时,确保增加区域文件中的序列号。如果不这样做,你的修改将会被忽略。大多数系统管理员使用 yyyyMMddHHmm 格式来表示这个字段。

DNS 冗余

DNS 是 Web 和电子邮件应用程序的关键服务。因此,保持主 DNS 服务器(称为 salve)的冗余非常重要,它应该与 master DNS 服务器拥有相同的信息。

配置这个过程时,你需要通过使用 NS 记录将 salve 服务器添加到主服务器的区域文件中。然后,在引用区域文件时,应该在主 DNS 的区域定义中添加 allow-transfer 选项,以允许 slave DNS 从主 DNS 复制数据。你还可以添加 also-notify 选项,以便主 DNS 在该区域有任何修改时通知 slave DNS。另一方面,在 slave 服务器中,区域定义应该包含 slave 类型,并指向主服务器。例如,假设主 DNS 的 IP 地址是 192.168.1.1,而 slave DNS 的 IP 地址是 192.168.1.2,那么你应该得到如下输出:

master 服务器上,你会看到如下输出:

zone "localhost" {
  type master;
  file "/etc/bind/db.local";
  allow-transfer { 192.168.1.2; };
  also-notify { 192.168.1.2; };
};
zone "127.in-addr.arpa" {
  type master;
  file "/etc/bind/db.127";
  allow-transfer { 192.168.1.2; };
  also-notify { 192.168.1.2; };
};

slave 服务器上,你会看到如下输出:

zone "localhost" {
  type slave;
  file "/etc/bind/db.local";
  masters { 192.168.1.1; };
};
zone "127.in-addr.arpa" {
  type slave;
  file "/etc/bind/db.127";
  masters { 192.168.1.1; };
};

DNS 测试

要测试你的 DNS 是否正常工作,你应该向服务器发送请求并检查信息的正确性。为此,你可以使用一台计算机,将其 DNS 服务器指向该 DNS,或者直接将该 DNS 服务器的 IP 地址作为参数添加。

著名的 NsLookup 工具是最简单的 DNS 和反向 DNS 测试工具。还有 dig 工具,它可以提供更丰富的答案,以及与 NsLookup 类似的 host 工具。

启动 web 服务器

有很多开源的 web 服务器可以在 Ubuntu Server 上部署,例如 Apache Tomcat、NGINX 和 Jetty。每个 web 服务器都应该安装并配置好,以处理特定的编程语言。我们还需要安装相关的库,并配置与 web 服务器所需的数据库。与其做这些繁琐的步骤,尤其是当你需要一个 web 服务器来部署 PHP、Perl 或 Python 开发的应用时,最好的选择是安装一个 LAMP 服务器。

LAMPLinux Apache MySQL PHP(有时是 PerlPython)的缩写。它是基于 Apache web 服务器程序与 Perl、PHP 或 Python 处理动态内容,以及 MySQL 数据库在后台共同运行在 Linux 服务器上的标准 Web 服务器部署方案。它已成为在 Linux 下设置 Web 服务器部署的一种常见方式。这也是为什么 Ubuntu 将所有必要的包组合在一起——为了简化在 Ubuntu 服务器中使用 LAMP。

LAMP 安装

在默认的 Ubuntu 服务器安装中,有几种不同的方法来设置 Web 服务器。最简单的方法可能是在初始安装过程中选择 LAMP 服务器,或者之后使用tasksel工具。这将添加apache2apache2-mpm-preforkmysql-server-5.6mysql-client-5.6php5-mysql包以及它们的所有库和其他依赖项。或者,你也可以通过命令行使用 apt-get install 工具单独安装这些包。

在安装过程中,包管理器会要求你输入 MySQL 数据库的 root 密码,如下图所示:

LAMP 安装

输入密码是可选的。你可以将其保持为空,但出于安全原因,建议你为 MySQL 数据库设置 root 密码。如果不这样做,任何在服务器上有账户的人都可以访问你的数据库,读取、修改甚至删除数据。

安装 LAMP 服务器后,还有一个额外的程序非常有用,可以进行安装。这个程序叫做phpMyAdmin。它是一个专门为 MySQL 服务器管理编写的 LAMP 应用程序,提供了一个简便的图形界面,用于数据库管理任务,编写语言为 PHP,可以通过 web 浏览器访问。

要安装它,请运行以下命令:

sudo apt-get install phpmyadmin

在安装过程中,系统会要求你选择想要为 phpMyAdmin 配置的 web 服务器。在我们的案例中,选择的是apache2,如下图所示:

LAMP 安装

你可以通过在浏览器中使用 Ubuntu 服务器的 IP 地址来测试 LAMP 服务器。你应该会看到 Apache2 的默认页面。此外,你还可以通过<ubuntu-server-IP>/phpmyadmin来测试phpmyadmin。你将看到登录界面(使用 MySQL 参数登录到phpmyadmin)。

Ubuntu 的 LAMP 约定

和大多数其他发行版一样,Ubuntu 在 Apache 管理方面有一些约定。配置文件的组织方式、管理工具和日志的组织方式都有特定的规则。如果你不习惯 Debian 和 Ubuntu 对 Apache 的组织方式,可能会觉得与其他发行版有很大不同。以下是 Apache 的主要文件约定:

  • /etc/apache2: 该目录包含所有 Apache 配置文件。以前,Apache 是通过一个大的 httpd.conf 文件进行配置的,文件中包含了选项、设置和不同的虚拟主机。实际上,该文件为空,因为 Ubuntu 已经不再使用单一的 httpd.conf 模式,而是将配置分散到多个文件和子目录中。

  • /etc/apache2/apache2.conf: 这是 Ubuntu 的 Apache2 二进制文件使用的主配置文件。默认的 apache2.conf 文件注释丰富,因此它本身就可以作为每个配置选项及其作用的指南。

  • /etc/apache2/envvars: 该文件包含 Apache 启动时用于定义环境变量的定义,这些变量会被不同的脚本使用,例如 PID 文件的位置等设置。

  • /etc/apache2/ports.conf: 该文件用于定义 Apache 启动时监听的端口。默认设置使 Apache 监听标准端口 80,并且当启用 SSL 模块时,监听端口 443

  • /etc/apache2/conf.d/: 该目录在主 apache2.conf 文件中被列为包含目录,这意味着当 Apache 启动时,它也会包括此目录中的配置文件,并将其添加到整体配置中。该目录用于管理员(或软件包)可能希望与核心 apache2.conf 文件分开添加的附加 Apache 选项。

  • /etc/apache2/mods-available/: Ubuntu 提供了一种比传统方式更简单且模块化的模块添加方法。系统中所有可用的模块都通过 .load 和 .conf 文件在此目录中表示。

  • /etc/apache2/mods-enabled/: 该目录基本上包含指向 mods-available 目录中 .load 和 .conf 文件的符号链接。当 Apache 启动时,它会扫描此目录并加载其中引用的所有模块。因此,例如,如果您想启用 SSL 模块,可以运行 sudo ln -s /etc/apache2/mod-available/ssl.load /etc/apache2/mods-enabled/ssl.load。Ubuntu 甚至提供了简化这一过程的工具。要启用模块,只需运行 a2enmod,后跟您想启用的模块。例如,要启用之前提到的 SSL 模块,只需运行 sudo a2enmod ssl。同样,a2dismod 程序可以帮助您禁用模块。它的语法与 a2enmod 相同。因此,要禁用 SSL,执行 sudo a2dismod ssl

  • /etc/apache2/sites-available/: Ubuntu 以类似于组织模块的方式组织 Apache 虚拟主机。在 Ubuntu 中,每个可由 Apache 服务的虚拟主机或站点都会有一个单独的配置文件,位于 sites-available 目录下。

  • /etc/apache2/sites-enabled/:与 mods-enabled 类似,该目录包含指向 sites-available 中配置文件的符号链接。因此,当您想为 Apache 添加一个新的虚拟主机时,只需在 sites-available 中为该主机创建一个包含完整 <VirtualHost> 块的新配置文件,并将其 符号链接symlink)到此处:

    sudo ln -s /etc/apache2/sites-available/mysite /etc/apache2/sites-enabled/mysite
    
    

    或者,您可以使用与 a2enmod 相同工作原理的 a2ensite 脚本。只需运行 a2enmod 并传入您希望启用的站点作为参数。要启用 mysite,输入 sudo a2ensite mysite,要禁用它,您可以使用 a2dissite,如下所示:

    sudo a2dissite mysite
    
  • /var/www/:这是 Apache 的默认文档根目录。任何可以被 Apache 读取并放置在此目录中的 HTML 文件,一旦您指向浏览器到该服务器,便可以访问。该目录中已经有一个默认的 index.html 文件。

  • /usr/lib/cgi-bin/:这是 CGI 脚本的默认位置。通过 /cgi-bin 引用的脚本将指向此处。

  • /var/log/apache2/:这是 Apache 日志存储的标准目录。access.log 文件包含关于已访问文件的信息,error.log 文件列出了 Apache 错误。如果您在启动 Apache 时遇到问题,可以查看 error.log 文件以获取线索。

注意

要激活新的配置,您需要运行以下命令:

sudo service apache2 restart

Apache 管理和测试

在接下来的部分,我们将介绍一个非常有用的 Apache 工具,名为 apache2ctl,以及它的一些应用。

apache2ctl

/usr/sbin/apache2ctl 程序是您在 Ubuntu 上管理 Apache 的主要命令行程序。该命令的语法相当简单。从命令行运行 apache2ctl 并将一个命令作为参数传递给它。简单的启动、停止和重启命令,顾名思义,将分别启动、停止和重启 Apache 进程。您也可以通过 apache2 init 脚本实现相同的功能。因此,执行相同操作的三个命令如下:

sudo apache2ctl restart
sudo /etc/init.d/apache2 restart
sudo service apache2 restart

优雅地停止 Apache

restartstop 命令存在潜在风险。当您使用这些命令重启或停止 Apache 时,所有当前运行的 Apache 进程都会被终止,即使它们正在为用户提供文件。如果您在用户正在加载页面时发出 restart 命令,页面只会加载当前有的信息,然后停止加载,从而迫使用户重新加载页面。为了避免这种情况,apache2ctl 提供了 gracefulgraceful-stop 命令。

这些命令分别重新启动和停止 Apache,但在执行此操作时,它们会等待每个进程完成未完成的请求。在活动站点上,优雅重启对于正在使用服务的任何人来说甚至都不会被注意到。一般来说,除非你知道站点不会主动提供流量(或者你不在乎所有活动连接是否关闭),否则应该使用 gracefulgraceful-stop。唯一的例外是当你添加新的 SSL 证书到站点或进行其他需要完全重启 Apache 才能生效的更改时。

诊断 apache2ctl 命令

apache2ctl 的其他主要命令提供了更多的诊断功能。首先,configtest 将测试当前的 Apache 配置文件是否存在错误。这在您决定自动部署 Apache 脚本时非常有用。当您设置脚本来部署配置文件并重新启动 Apache 时,您可能面临的挑战是,如果配置文件中出现错误,Apache 可能不会启动备份。如果您将相同的文件部署到整个 Web 农场,那么一个语法错误和一个盲目部署和重启 Apache 的脚本可能会导致整个 Web 农场崩溃。通过 configtest,您可以在部署脚本中设置逻辑,一旦服务器通过了 configtest 命令,就重新启动 Apache。

当 Apache 服务器获得流量时,您通常希望从中获取诊断信息,例如有多少个 Apache 进程处于活动状态,这些进程正在做什么以及您还有多少空闲槽可用。statusfullstatus apache2ctl 命令为您提供了大量优秀的诊断数据。status 命令输出 Apache 服务器的通用整体状态,包括服务器已运行时间,有多少个请求处于活动状态以及有多少个进程处于空闲状态。除此之外,它还输出了一个 ASCII 艺术图,显示所有可用进程的地图,不同的字母代表不同的进程状态。fullstatus 命令输出类似的信息,只是更详细。

部署电子邮件服务器

与网络一同,电子邮件可能是大多数人在想到互联网时首先想到的服务。像网页服务器一样,电子邮件服务器传统上设置起来相当棘手,并且有许多关于此主题的指南和书籍。然而,在 Ubuntu 下设置和使用电子邮件服务器相当容易。

安装电子邮件服务器要求您管理发送和接收电子邮件。这两个概念很重要,因为它们实现了两种不同的协议——SMTP 用于发送,POPIMAP 用于接收消息。

当用户发送电子邮件时,实际上并不是直接与接收方进行联系。电子邮件至少会经过两个服务器,顺序是发送服务器(SMTP),称为MTA邮件传输代理),然后将邮件发送到接收服务器(POP 或 IMAP),称为MDA邮件投递代理),可能还会通过其他 SMTP 服务器中转电子邮件。然后,电子邮件将在这个最后的服务器上等待,直到接收方启动他们的电子邮件客户端(例如 Thunderbird),并通过 POP 或 IMAP 协议从接收服务器中提取消息。

注意

我们可以将所有这些服务器安装在同一台机器上,也可以安装在不同的机器上,这取决于你想使用的电子邮件服务器的规模。

还要注意,为了让电子邮件服务器能够正常工作并与互联网进行收发邮件,你需要拥有一个有效的 DNS 服务器并且拥有一个有效的域名。

如果你想避免自己组装电子邮件服务器的各个组件,同时又希望在 Ubuntu 上使用一个非常强大的邮件服务器,你可以选择一个像著名的 Zimbra 服务器这样的解决方案。解释如何安装和管理 Zimbra 需要的不仅仅是章节中的一部分内容。这就是为什么我写了一本名为 Learning Zimbra Server Essentials 的书,Packt 出版社出版,2013 年 10 月发布(欲了解更多信息,请访问 www.packtpub.com/networking-and-servers/learning-zimbra-server-essentials)。如果你愿意,你可以参考它。

现在,让我们来看看如何处理电子邮件服务器的每个组件。

MTA 服务器

有很多可以在 Ubuntu 服务器上部署的邮件传输代理MTA),但最著名的 MTA 是Postfix,因为它是一个安全、易于管理的好邮件服务器。此外,它是 Ubuntu 在选择邮件服务器时默认使用的电子邮件服务器,选择方法是在 tasksel 中进行选择。

安装 Postfix

Postfix 可以使用与本章中提到的许多其他服务相同的方法进行安装。你可以在初始安装时选择邮件服务器,或在运行 tasksel 程序时选择。此外,你还可以使用以下命令:

sudo apt-get install postfix

当你安装 Postfix 时,安装程序将启动初始的 Postfix 配置脚本。这是一个交互式程序,它为你提供了一些常见的电子邮件服务器配置。根据你的选择,它会提出更多选项,最终使你至少能够拥有一个功能齐全的电子邮件服务器。

首先,它给你一个不同配置模式的概览,你可以根据需要选择,如下图所示:

安装 Postfix

然后,它会给你选择的选项。在我们的例子中,我们将选择Internet site,如下图所示,这样我们就可以通过 SMTP 直接发送和接收电子邮件:

安装 Postfix

最后,它会询问您将用于该邮件服务器的域名。这是您用来发送电子邮件的域名。在我们的例子中,我们选择 ubuntu-essentials.net,这将允许我们发送类似 contact@ ubuntu-essentials.net 的邮件,如下图所示:

安装 Postfix

请记住,尽管邮件服务器能够正常工作,如果您想添加灰名单、垃圾邮件/病毒检查、IMAP 或 POP 服务器,或其他高级选项,您还需要进行一些额外的配置。

注意

在安装过程中,您只需提供少量信息。因此,为了完成其他必要参数的自定义设置,例如信任子网、默认邮箱大小和根地址,您可以在安装过程完成后运行以下命令并按照给定的步骤进行操作:

sudo dpkg-reconfigure postfix

管理 Postfix

Ubuntu 的 Postfix 约定没有太多意外。Postfix 在 Ubuntu 下使用的大多数目录和文件与其他平台上的结构相同。例如,/etc/postfix/ 目录包含大多数 Postfix 配置文件,特别是 /etc/postfix/main.cf,在这里您可以启用 SSL 安全认证、安装 TLS 证书进行签名和加密,并使用许多其他选项。/var/spool/mail/ 目录包含用户的邮箱,而 /var/log/mail.* 是日志文件。

您将用来管理 Postfix 的主要工具名为 postfix。它的工作方式与 apache2ctl 类似,接受多个不同的命令作为参数,也可以作为 init 脚本的替代品来启动和停止服务。例如,要停止 Postfix 并重新启动它,请输入以下命令:

sudo postfix stop
sudo postfix start

对于其他参数及其说明,您可以通过以下命令从 man 命令获取:

man postfix

除了 Postfix 命令行工具外,Postfix 还提供了一些其他工具来帮助您管理服务。以下是一些这些工具:

  • postqueue 命令可以由普通用户用来获取当前邮件队列的信息。

  • postsuper 命令允许超级用户对队列执行特权操作。

  • postconf 命令将每个 Postfix 设置及其值输出到屏幕上。如果您修改了主配置文件并希望在重新加载之前查看当前的运行配置,这将非常有用。例如,如果您想查看当前 config 文件中 myhostname 的值,只需输入以下命令:

    sudo postconf | grep ^myhostname
    
    

MDA 服务器

像 MTA 一样,很多 MDA 软件也存在于官方的 Ubuntu 仓库中,它们在复杂性和功能性方面有所不同,此外,还与其他电子邮件服务器组件(如 Postfix)之间的互操作性也有差异。为了举例说明,我将介绍 Dovecot POP 和 IMAP 服务器,因为它们与 Postfix 集成良好,支持 Maildirs,并且有很多附加软件包可供选择,这些软件包提供了如 LDAP、MySQL 和 Postgres 支持等高级功能。步骤相当简单,从在 Postfix 上启用 Maildirs 开始,然后安装 Dovecot。

Maildir 是一种特定的目录结构,用来保存电子邮件,而不是传统的使用 mbox 格式的方式。它应通过设置 /etc/postfix/main.cf 文件中的 home_mailbox 变量来在 Postfix 上启用,具体如下:

home_mailbox = Maildir/

或者,要启用它,你只需运行以下命令:

sudo postconf -e 'home_mailbox = Maildir/'

当然,在这一步之后,你应该通过以下命令重新加载 postfix

sudo postfix reload

然后,通过以下命令安装 Dovecot:

sudo apt-get install dovecot-imapd dovecot-pop3d

这将安装并启用 POP、POP 带 SSL、IMAP 和 IMAP 带 SSL。

安装后,你可以通过主配置文件 /etc/dovecot/dovecot.conf 来定制 Dovecot。每次修改 config 文件时,不要忘记使用 sudo /etc/init.d/dovecot reload 命令重新加载守护进程,以实施更改。

下一步是告诉 Dovecot 使用 Maildirs,并且让它知道在哪里可以找到它们。在此过程中,检查是否已经有一个未被注释的以 mail_location 开头的行(在默认安装中,它是被注释掉的)。如果不存在,那么添加以下行;如果存在,则修改 mail_location 行,使其看起来像下面的行:

mail_location = maildir:~/Maildir

然后,通过 sudo /etc/init.d/dovecot reload 命令重新加载 Dovecot。现在,你应该能够配置电子邮件客户端指向服务器并访问其本地电子邮件。

电子邮件服务器的过滤器和安全性

今天,未请求的大宗电子邮件UBE)已经成为电子邮件服务器面临的最大问题之一。也被称为 垃圾邮件,这些信息还可能携带病毒和其他形式的恶意软件。为了解决这个问题,有许多强大的工具可以安装在 Ubuntu 服务器上并与电子邮件服务器集成。以下是一些最好的工具列表:

  • Amavisd-new 是一个通用的扫描程序。它的作用是调用若干内容过滤工具,如病毒扫描、垃圾邮件检测等。你可以通过以下命令安装它:

    sudo apt-get install amavisd-new.
    
    

    要配置它,你首先需要通过编辑/etc/amavis/conf.d/15-content_filter_mode文件并取消注释其中的一些行来激活 Amavisd-new 中的防病毒和反垃圾邮件检测功能,文件中有详细说明。要自定义 Amavisd-new,你可以编辑/etc/amavis/conf.d/目录下的config文件中的选项。别忘了通过以下命令重新启动守护进程:

    sudo service amavis restart
    

    若要与 Postfix 集成,你需要输入以下命令:

    sudo postconf -e 'content_filter = smtp-amavis:[127.0.0.1]:10024'
    

    然后,通过在文件末尾添加以下内容来编辑/etc/postfix/master.cf文件:

    smtp-amavis   unix  smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20
    127.0.0.1:10025 inet   n  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters
    

    为了防止生成的报告垃圾邮件的消息被误分类为垃圾邮件,请在 pickup 传输服务下方立即添加以下两行:

    -o content_filter=
    -o receive_override_options=no_header_body_checks
    

    最后,通过以下命令重新启动 Postfix:

    sudo service postfix restart
    

    在此步骤中,已启用垃圾邮件和病毒检测的内容过滤。

  • Spamassassin是目前世界上使用最广泛的开源反垃圾邮件程序。它利用多种机制根据邮件内容过滤电子邮件。你可以通过sudo apt-get install spamassassin命令来安装它。要启动spamassassin守护进程,你需要在/etc/default/spamassassin文件中将 enabled 参数的值从0更改为1。然后,使用以下命令启动守护进程:

    sudo service spamassassin start
    
  • ClamAV是最著名的开源防病毒应用程序。你可以使用sudo apt-get install clamav-daemon命令来安装它。ClamAV 的默认配置符合我们的需求,因此我们可以开始使用它。然而,你也可以通过编辑/etc/clamav中的config文件进行自定义配置。

    提示

    你需要将 ClamAV 和 Amavis 用户添加到彼此的用户组中,以便 Amavisd-new 能够获得适当的访问权限,扫描文件并避免因所有权问题而阻碍扫描,具体操作如下:

    sudo adduser clamav amavis
    sudo adduser amavis clamav
    
    
  • Postgrey是一个为 Postfix 服务器实现灰名单的程序。灰名单是一种帮助减少服务器收到的垃圾邮件量的技术。你可以通过使用sudo apt-get install postgrey命令来安装它。对于其配置,你只需修改 Postfix 的main.cf文件中的smtpd_recipient_restrictions选项,添加localhost:10023服务。

  • OpenDKIM实现了Sendmail 邮件过滤器Milter)用于DomainKeys Identified MailDKIM)标准,而python-postfix-policyd-spf则启用发送者策略框架SPF)与 Postfix 进行检查。你可以通过以下命令安装 OpenDKIM:

    sudo apt-get install opendkim postfix-policyd-spf-python
    
    

    要了解更多关于这个主题的知识,请访问mandrill.zendesk.com/hc/en-us/articles/205582267-What-are-SPF-and-DKIM-and-how-do-I-set-them-up-

  • Spamassassin 进程可以通过使用与其集成的一些可选软件包来增强,从而提高垃圾邮件检测效果。我们可以通过使用 sudo apt-get install pyzor razor 命令安装这些软件包。Spamassassin 会自动检测可选组件,并在组件存在时使用它们。所以,不需要配置 pyzorrazor

  • 要过滤电子邮件附件,我们需要主过滤应用程序的压缩工具,可以使用以下命令安装:

    sudo apt-get install arj cabextract cpio lha nomarch pax rar unrar unzip zip
    

其他功能

安装完邮件服务器后,你可以通过配置 Thunderbird 或 Evolution 等电子邮件客户端来使用它。如果你已经安装了 Webmail 客户端,也可以通过 Web 访问它。你可以安装许多 Webmail 客户端。你需要的只是一个正常工作的 MTA 和 MDA,以及一个 Web 服务器。我们在之前的章节中已经讨论过这些话题。然后,你应该安装 Webmail 解决方案,并配置它与电子邮件服务器配合使用。你可以选择 SquirrelMail、Horde、OpenWebMail 和 Roundcube 中的任何一种解决方案。作为示例,我们将安装并配置 Roundcube。为此,你需要运行 sudo apt-get install roundcube-mysql roundcube 命令。然后,编辑 /etc/roundcube/apache.conf 文件并取消注释以下两行:

Alias /roundcube/program/js/tiny_mce/ /usr/share/tinymce/www/
Alias /roundcube /var/lib/roundcube

最后,通过使用以下命令重启 Apache:

sudo service apache2 restart

现在,你可以通过 <domaine-name>/roundcube 访问你的 Webmail。在我们的例子中,它是 www.buntu-essentials.net/roundcube

你还可以安装一个批量邮件管理器(邮件列表管理器),如著名的 mailman,并将其配置为与电子邮件服务器配合工作,方式与安装和配置 Webmail 客户端类似。

设置数据库服务器

数据库也是每个系统管理员每天都要处理的常用服务之一。在 Ubuntu Server 上,安装和管理数据库非常简单。我们之前已经看到如何在 LAMP 服务器中安装 MySQL 数据库。在本节中,我们将看到如何单独完成这项操作。我们还将看到如何安装和管理另一种常用的开源数据库服务器——Postgres。

MySQL 服务器

在 Ubuntu 上安装 MySQL 数据库非常简单,只需运行以下命令:

sudo apt-get install mysql-server

系统会要求你输入 root 密码。你可以留空,但我建议你设置一个密码,并且设置一个强密码会更好。

对于定制任务,你可以在 /etc/mysql/ 目录下找到 MySQL 的主配置文件。

Ubuntu 包含了 mysqladmin 工具,帮助你进行 MySQL 管理。你可以把它看作是 apache2ctl 程序,因为它接受命令行中的特定命令,然后与你的 mysqld 进程进行交互。例如,要获取 MySQL 进程的当前状态,运行以下命令:

sudo mysqladmin -p status

注意

我在此命令中使用了 -p 参数,这会告诉 mysqladmin 在命令行上提示我输入密码。如果你为 root 用户设置了密码,那么在执行命令时需要使用 -p。然而,如果你打算运行一批命令并且不想每次都输入密码,你可以将密码添加到 -p 选项中。例如,如果 MySQL 密码是 myP@ssword,请输入以下命令:

sudo mysqladmin -p myP@ssword status

mysqladmin 手册页面(在控制台中输入 man mysqladmin)列出了完整的命令集。

注意

管理 MySQL 数据库最简单的方法是使用 phpMyAdmin 工具。请查看本章 Web 服务器 部分中关于如何安装和配置它的内容。

Postgre 服务器

尽管 MySQL 因易于使用而闻名,但在 Ubuntu 上安装和使用 PostgreSQL 同样简单。要安装 PostgreSQL,你可以在安装 Ubuntu 时选择 PostgreSQL 服务器,或者事后使用 tasksel,也可以通过包管理器安装 postgresql 包,如下所示:

sudo apt-get install postgresql

安装 postgresql 包后,数据库服务将在后台启动,然后你可以设置超级用户账户并创建数据库。初始的管理工作将由 postgres 用户执行。因此,首先使用 sudo 切换到该用户,执行以下命令:

sudo -u postgres -s

现在,在这个 shell 中,你可以使用 createuser 程序创建一个新用户账户。另一方面,dropuser 命令用于删除用户。创建数据库使用 createdb 程序,访问数据库使用 psql 命令。

与 MySQL 一样,也有一个基于 PHP 的管理工具叫做 phpPgAdmin。要安装 phpPgAdmin,你只需要安装 phppgadmin 包,如下所示:

sudo apt-get install phppgadmin

该包将下载所有依赖项,包括一个 Web 服务器,以防未安装一个。安装包后,创建指向其 Apache 配置文件的符号链接,位于 /etc/apache2/sites-available,然后使用 a2ensite 启用该站点,如下所示:

sudo ln -s /etc/phppgadmin/apache.conf /etc/apache2/sites-available/phppgadmin
sudo a2ensite phppgadmin
sudo apache2ctl graceful

设置 DHCP 服务器

DHCP 代表 动态主机配置协议。通过此协议,网络上的新主机可以请求 IP 信息。DHCP 服务器随后会为主机提供它所需的所有通信信息,例如 IP 地址、子网掩码、网关和需要使用的 DNS 服务器。

安装 DHCP

在 Ubuntu 上安装 DHCP 服务器是一项简单的任务,只需输入以下命令,你就可以安装 DHCP 服务器:

sudo apt-get install dhcp3-server

Ubuntu DHCP 约定

它只需要额外的配置才能发挥作用;我们将在本节中看到这一点:

  • /etc/dhcp3/dhcpd.conf:这是 DHCP 服务器的配置文件。默认情况下,它是一个带有大量注释的文件,应该为你提供许多示例以供参考。

  • /var/lib/dhcp3/dhcpd.leases: 此文件包含服务器分发的当前 DHCP 租约列表。如果您想知道哪个 MAC 地址获取了特定的 IP 或者特定租约何时到期,请查看此文件。

  • /var/log/syslog: DHCP 使用标准的 syslog 文件记录其所有日志。在这里,您将能够找到来自网络的 DHCP 请求以及 DHCP 服务器的回复。

配置 DHCP

Ubuntu 提供了一个详细注释的 DHCP 配置文件,解释了所有主要选项并提供了多个不同的配置示例。对于基本的 DHCP 服务,通常您希望设置一个或两个场景——动态 DHCP静态 DHCP。在动态 DHCP 配置中,新主机将从可能的 IP 范围中分配一个 IP。不能保证每个主机每次都分配相同的 IP。使用静态 DHCP,您可以将特定的 IP 地址绑定到主机的 MAC 地址,并确保每次它出现在网络上时都会获取相同的 IP。动态 DHCP 适用于简单易于维护的 DHCP 服务器,而静态 DHCP 则提供了静态 IP 的许多好处,而几乎没有太多麻烦。另外,对于静态 IP,如果您确实想要更改主机的 IP 地址,您可以在 dhcpd.conf 文件中执行此操作并重新加载 DHCP,而不必跟踪并更改主机。

现在,为了重新加载 DHCP 并启用我的设置,请运行以下命令:

sudo service dhcp3-server restart

如果你没有出现语法错误,DHCP 服务器将会停止然后重新启动。如果文件中存在错误,它应该在屏幕上输出错误以及其位置。一个常见的错误是在特定行的末尾缺少分号。

安装文件服务器

这是本章的最后一节。在本节中,我们将了解如何在 Ubuntu 服务器上安装和配置两种最常用的文件服务器——FTPSamba

FTP 服务器

vsftpd 是 Ubuntu 中提供的 FTP 守护程序。它易于安装、设置和维护。要安装 vsftpd,请运行以下命令:

sudo apt-get install vsftpd

/etc/vsftpd.conf 文件包含 FTP 服务器的主要配置选项。它有很好的注释。因此,您可以轻松地进行编辑。在修改配置之后,您应该使用以下命令重启服务器:

sudo restart vsftpd

连接到 FTP 服务器非常简单。您可以通过在客户机的 CLI 中使用 FTP 命令或者像 FileZilla 这样的客户端 GUI 程序来进行连接。

注意

使用 FTP 时,数据通过网络以未加密的方式传输。要安全地传输数据,您可以使用 FTPS 协议(FTP over SSL),或者更好地转向SFTPSSH 文件传输协议)。

Samba 服务器

Samba 是一个实现 SMB 和 CIFS 协议的程序,这些是 Windows 文件共享协议。因此,它非常适合作为 Windows 下共享文件的平台,因为所有客户端都可以无需额外软件即可访问服务器。随着时间的推移,Samba 已经发展成支持 Windows 文件共享的高级功能,甚至能够像其他 Windows 文件服务器或 主域控制器PDC)一样工作。

要安装 Samba,你可以在安装 Ubuntu 时选择 Samba 服务器 选项,或者在安装后通过 tasksel 程序帮助安装,或者通过包管理器单独安装 sambasamba-docsmbfswinbind 包,具体方法如下:

sudo apt-get install samba samba-doc smbfs winbind

Samba 服务将自动启动。当然,默认情况下并不会共享任何有趣的内容。因此,你需要在共享任何目录之前调整 Samba 的配置文件。主要的配置文件位于 /etc/samba/ 目录下,特别是名为 /etc/samba/smb.conf 的核心配置文件。该文件有大量注释,并包含了多个不同的共享设置示例,其中包括一个有用的配置示例。

安装并配置好 Samba 服务器后,去网络上的另一台主机尝试连接 Samba 服务器。在 Ubuntu 桌面上,导航至 位置 | 连接到服务器。然后,从 服务类型 下拉菜单中选择 Windows 共享。最后,输入 Samba 服务器的 IP 地址或主机名,然后输入你在 smb.conf 文件中方括号之间的共享名称。点击 连接。Ubuntu 将挂载并在桌面显示该共享。

总结

在本章中,我们深入讨论了在 Ubuntu 服务器上部署服务的相关内容。我们讨论了如何安装和配置一些系统管理员通常会处理的最常用的服务器。

在下一章中,我们将探讨 Ubuntu 服务器的安全性方面。

第四章:Ubuntu 的安全性

在计算机服务器领域,安全性是一个非常热门的主题。这就是为什么 Ubuntu Server 非常重视它。在本章中,我们将看看如何激活、配置和增强许多安全方面。本章将分为以下三部分:

  • 为 Ubuntu Server 获得基本的安全级别

  • 深入了解如何配置高级安全设置

  • 执行整个 Ubuntu Server 的备份/恢复程序

基本安全设置

首先,让我们看看如何为 Ubuntu Server 设置基本的安全级别。安全领域有一句话叫做安全是一个过程,而不是一个产品。这意味着,尽管你的供应商可能告诉你,你不能通过某个应用程序或软件解决所有的安全问题。相反,只有当你开始遵循好的安全原则并制定良好的安全流程时,才能实现真正的安全。这正是我们在本节中将主要讨论的内容。

用户管理

在本小节中,你将了解关于用户管理的最佳实践,涉及不仅仅是用户创建、修改和删除,还包括组分配、权限和其他许多细节。

用户账户管理

以下是设置和管理用户账户时需要的最有用的命令:

  • useradd:此命令将作为参数传递的用户添加到本地身份验证系统。

  • usermod:此命令修改作为参数传递的用户属性。

  • userdel:此命令正确删除系统中作为参数传递的用户。

  • passwd:此命令修改作为参数传递的用户密码。

我们可以为这些命令添加一些选项,这些选项会列出并详细说明——例如,在useradd-的情况下,可以通过man useradduseradd --help来查看。

提示

存在一个adduser命令,也允许你创建新用户。useraddadduser的区别取决于 Linux 发行版。例如,对于 Fedora/Centos/Gentoo,adduser只是指向useradd的符号链接。但在我们的例子中,在 Debian 或 Ubuntu 系统上,useradd是命令本身,你可以使用它来创建用户并为这些用户定义选项。另一方面,adduser是一个 Perl 脚本,它使用useradd来创建账户,并会询问你密码、全名、电话号码和其他信息。可以说,在这种情况下,它为你简化了操作。

以下是创建新用户时需要考虑的最重要选项,尤其是出于安全原因:

  • -m:在创建需要创建的用户的主目录时使用此选项。如果不使用此选项,你将需要手动创建新目录、更改其所有权和权限,使其符合用户需求,将默认的文件和目录放入主目录中,然后通过使用usermod命令和-d选项,将默认的目录和文件分配给主目录。

  • -e date:用于设置用户的过期日期。过了这个日期,系统将自动禁用该用户的账户。如果需要为服务器创建临时用户时,可以使用此选项。即使你忘记删除它们,系统至少会锁定他们的账户。

  • -G groups:此选项用于设置用户的组成员资格。将服务器用户按组分类,并为每个组设置特定的参数和权限是良好的安全实践。

提示

每个用户都有一个唯一的 ID,即 UID 变量。在 Ubuntu 中,普通用户的 UID 从1,000开始,低于500的值保留给具有特定值的系统账户;UID 变量0保留给 root 用户。通常情况下,UID 是唯一的,但在有一种情况你可能想要给多个用户分配相同的 UID——即当你想创建一个备份的 root 用户时。为了做到这一点,你需要在创建用户时使用-o选项或使用-u 0选项与useradd命令结合使用。

密码管理

密码是操作系统OS)的安全钥匙之一。在 Ubuntu 服务器中,密码通过使用passwd命令进行管理。普通用户可以使用它来更改密码,而管理员则可以用它来更改其他普通用户的密码。不仅如此,passwd命令还具有其他一些重要功能,如以下这些,对于系统安全的维护非常有用:

  • 通过使用-l选项,管理员可以暂时锁定用户账户。稍后可以通过使用-u选项解锁账户。

  • 可以通过使用-S选项来报告特定用户账户的密码状态。

  • 用户可以通过使用-e选项,在下次登录时强制更改密码。

  • 设置密码在再次更改之前必须使用的最小天数,通过-n min_days_number选项进行设置。此选项有助于防止用户在密码过期后立即将密码更改回原来的密码。

  • 你可以设置密码的最大使用天数。完成这个周期后,用户必须更改密码。通过使用-x max_days_number选项来完成此操作。

  • 你可以通过-c notif选项通知用户密码即将过期;该选项的参数是以天为单位的通知期。

  • 您还可以设置用户账户的自动过期时间,如果一段时间内没有活动,则账户将过期。此时间以天为单位,并作为-i exper选项的参数传递。

与密码管理和用户登录相关的一些额外安全功能可以在/etc/login.defs文件中找到并进行修改。以下是这些参数中最重要的几个:

  • FAIL_DELAY:此参数设置系统在登录失败后等待的时间(以秒为单位),然后再提示用户重新输入密码。默认情况下,它是3秒。通过在此设置适当的值,我们可以阻止暴力破解攻击

  • LASTLOG_ENAB:这是一个布尔值。当设置为1时,表示此功能已启用。启用此功能后,系统将在/var/log/lastlog文件中记录所有成功的登录记录。lastlog文件必须存在才能使此功能生效。如果不存在,您可以通过使用touch /var/log/lastlog命令来创建它。

  • PASS_MIN_LEN:此参数包含新密码必须使用的最小字符数。

权限设置

权限是操作系统登录过程后的第二道安全屏障。与其他 Linux 服务器一样,Ubuntu 拥有强大且完善的权限结构。在本节中,我们将介绍两个主要概念——文件所有权和操作权限(读/写/执行)。

文件所有权

每个 Ubuntu 服务器上的文件都有所有者(用户)和组所有者(通常是用户的主组)。在某些情况下,管理员可能需要由于某些原因(如一般的安全原因)更改文件的所有权。为此,我们需要调用chownchgrp命令。

对于chown,命令的模式如下:

chown [OWNER][:[GROUP]] file

以下是几个该命令的示例:

  • chown one_user some_file:此命令将some_file的所有者更改为one_user

  • chown one_user:one_group some_file:此命令不仅执行了前面命令的操作,还将文件的组更改为one_group

我们也可以使用chown来仅更改组所有权。一个例子是chown .one_group some_file。不要忘记在组名之前的(.)字符,这里组名是one_group。注意我们最近开始使用冒号字符(:); .:都能完成这项工作。

对于组所有权,还有一个替代命令,即chgrp命令。它的使用示例是chgrp one_group some_file。请注意,在组名之前我们不需要 .字符,这里组名是one_group

注意

默认情况下,chownchgrp命令的作用范围仅限于它们所使用的文件或目录。如果您希望递归使用这些命令,只需添加-R选项。例如,chown -R one_user some_dir会将one_user用户设置为some_dir及其所有子目录中文件的所有者。

配置权限

操作权限有三种类型,分别是r符号或值为4)、w符号或值为2)和执行x符号或值为1)。这些权限可以分别应用于所有者用户u)、其主用户组g)成员和其他用户o)。我们还可以对所有用户a)应用权限。设置这些权限的方法有两种:

  • 特定用途:此功能用于配置特定文件的特定权限。通过使用chmod命令来完成此操作。

  • 通用用途:用于配置新创建文件的默认权限分配。通过使用umask命令来完成此操作。

提示

还有一些额外的特殊权限,称为特殊权限,即SUIDSGID粘滞位。这些内容超出了本书的范围,您可以在高级 Linux 管理指南中进一步探讨。

对于chmod工具,您可以使用以下两种模式:

  • 相对模式:这种模式与绝对模式相似,后者将在下一节中详细介绍,可以一次性设置大量权限变更。但当您需要一次仅添加或删除一个权限时,它更加实用且方便。当使用chmod的相对模式时,您需要指定要授予权限的实体(u、g、o、a),然后是授予符号(+表示添加,-表示删除,=表示设置权限)以及您希望应用的权限(r、w、x)。例如,chmod g+w some_file命令将向实体组添加some_file文件的写权限。我们来看另一个例子,通过使用chmod u+rwx,g+rx-w,o+r-wx another_file模式,我们一次性设置多个权限,其中将所有权限授予用户,向组添加readexecute权限并移除write权限,同时仅向其他用户添加read权限并移除writeexecute权限。

  • 绝对模式:这种模式提供了一种简短而方便的方式来设置权限,特别是当您需要一次修改多个权限时。在此模式下,我们使用数字值来定义权限。权限值由四个数字组成。第一个数字表示特殊权限(本书不涉及,之前的注释中有解释)。除非您需要使用此权限,否则可以省略该数字(小心,因为它可能有危险)。其余的数字按从左到右的顺序分别表示与用户、组和其他用户相关的权限。每个实体的值是通过将与每个权限相关的值相加来计算的(r=4,w=2,x=1)。例如,chmod u+rwx,g+rx-w,o+r-wx another_file命令的等效命令应为chmod 754 another_file

对于umask工具,它是用户文件创建模式掩码。它决定了创建新文件时所设置的默认权限。umask参数以数字值表示,该值从可以自动设置的最大权限中减去;文件的最大权限是666,目录的最大权限是777umask中使用的数字顺序与chmod命令相同;最左边的数字是针对用户的,第二个数字是针对组的,第三个数字是针对其他人的。默认情况下,umask设置为022,这为所有新创建的文件提供644权限,为所有新创建的目录提供755权限。

umask设置可以为所有用户或单独的用户进行更改。如果您希望为所有用户设置umask值,必须确保在/etc/login.defs配置文件中输入umask设置(以前是在/etc/profile文件中输入的,但现在已更改为/etc/login.defs)。另一方面,如果您希望仅对特定用户应用特定的umask设置,则必须编辑该用户主目录下的配置文件,并在其中设置所需的umask值。

对用户帐户应用配额

用户配额是服务器的另一层安全防护。它们允许管理员对用户和组的文件和目录创建应用配额限制。

要使用此功能,您需要执行以下步骤:

  1. 首先,安装quota软件。可以使用sudo apt-get install quota命令完成此操作。

  2. 其次,准备文件系统以支持配额。为此,您需要在/etc/fstab文件中的选项列中,为每个希望使用配额的文件系统添加usrquota选项(如果要对用户应用配额)或grpquota选项(如果是对组应用配额)。然后,通过使用以下命令,重新挂载所有已应用配额的分区:

    sudo mount -o remount <partition_name>
    
    
  3. 接下来,初始化配额软件。初始化配额系统的最佳方法是运行sudo quotacheck -augmv命令,这将创建aquota.useraquota.group文件,以列出所有实际用户的配额信息。

  4. 最终,实际的工作是为用户和组设置配额。这是通过edquota命令完成的。例如,sudo edquota -u <username>命令会在文本编辑器中为该用户打开一个临时的配额文件。该文件包含六个数字,指定了服务器上所有文件系统的配额。第一个数字表示当前用户所使用的块数量。第二个数字是该块数量的软限制,而第三个数字是硬限制。第五个和第六个数字是 inode 的对应值,几乎等同于该用户在文件系统上能创建的文件数量。第一个和第四个数字用于记录此用户当前使用的块和 inode 数量。

  5. 设置完配额后,你需要使用sudo edquota -t命令来设置你想使用的宽限期(可以是小时或天数)。宽限期是按文件系统设置的。因此,没有选项可以为不同的用户指定不同的宽限期设置。

提示

初始化步骤是为新用户设置配额时的必需步骤;它确保新用户被配额系统识别。

设置配额后,监控它是很有用的。你可以使用repquota命令来做到这一点。使用-aug选项时,命令会显示所有用户和组在所有卷上的当前配额设置。

最后,在设置完配额后,别忘了通过运行/etc/init.d/quota start命令来启动配额服务。

设置一个用户的配额后,你可能想将其应用到其他用户。你可以使用edquota -p命令,而不是为系统上所有用户遵循相同的程序。例如,sudo edquota -p user1 user2会将当前应用于user1的配额复制到user2

提示

edquota命令仅对块(blocks)有效,而不是字节、千字节或其他单位。因此,为了正确设置配额,你需要知道当前使用的块大小。要查找此块大小,可以使用sudo dumpe2fs <device> | grep "Block size"命令。

使用 sudo 配置管理任务

Ubuntu 通过一些默认的实践来提高默认安装的安全性。其做法之一是禁用 root 账户,并使用sudo来获得超级用户权限。与传统的 su 程序相比,sudo程序提供了一套更为强大的功能来提升用户权限。

sudo命令的配置文件位于/etc/sudoers。默认情况下,Ubuntu 提供了一个基本文件,允许 root 用户以任何其他用户的身份执行任何操作,并允许 admin 组成员成为 root 用户(在安装时创建的用户会自动被添加到此组)。

sudo软件包提供了一个叫做visudo的工具,任何时候你想修改文件时都应该使用它。因此,要查看和编辑/etc/sudoers文件,可以输入以下命令:

sudo visudo

你想使用visudo的原因是它会自动检查你的sudoers文件是否存在错误。由于sudoers文件中的错误可能会导致你无法访问 root 权限,因此这个语法检查非常重要。如果你确实犯了错误,visudo会在你保存设置并退出页面后告诉你。这样,你可以选择回去修复错误、不保存并退出,或者忽略警告并保存(这不推荐)。

注意

为了最佳地编辑文件和管理sudo程序,最简单的方法是阅读并遵循手册页面中的示例。你可以通过man sudoers命令访问它。

配置 AppArmor 工具

默认情况下,Ubuntu Server 安装的 AppArmor 系统为特定的系统服务添加了访问控制,旨在增强服务器的安全性。AppArmor 基于最小权限的安全原则。它为每个程序分配一系列规则,定义了该程序可以处理的一组文件和目录,并解释如何处理这些文件(只读读写)。当一个由 AppArmor 管理的应用程序违反这些访问控制时,AppArmor 会介入,阻止它这样做,并记录该事件。默认情况下,有大量的服务包含了 AppArmor 配置文件,并且每个 Ubuntu 版本都会添加更多的服务。除了默认的配置文件,宇宙仓库中还有一个apparmor-profiles软件包,你可以安装它来为其他服务添加更多的配置文件。一旦你学会了 AppArmor 规则的语法,你甚至可以添加自己的配置文件。

了解 AppArmor 如何工作的最佳方式是通过使用一个示例程序。MySQL 数据库服务器是一个在 Ubuntu 下由 AppArmor 自动管理的程序。因此,一旦安装了 MySQL 软件包,你可以使用aa-status程序查看 AppArmor 已经在管理它,如下所示:

sudo aa-status
apparmor module is loaded.
7 profiles are loaded.
7 profiles are in enforce mode.
 /sbin/dhclient
 /usr/lib/NetworkManager/nm-dhcp-client.action
 /usr/lib/NetworkManager/nm-dhcp-helper
 /usr/lib/connman/scripts/dhclient-script
 /usr/sbin/mysqld
 /usr/sbin/named
 /usr/sbin/tcpdump
0 profiles are in complain mode.
3 processes have profiles defined.
3 processes are in enforce mode.
 /sbin/dhclient (945)
 /usr/sbin/mysqld (6288)
 /usr/sbin/named (13679)
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.

在这里,你可以看到/usr/sbin/mysqld profile已加载,并且处于强制模式,当前正在运行的/usr/sbin/mysqld process(PID 6288)正由 AppArmor 管理。

AppArmor 将其配置文件存储在/etc/apparmor.d/目录下,每个文件名来源于它们管理的二进制文件。例如,/usr/sbin/mysqld的配置文件位于/etc/apparmor.d/usr.sbin.mysqld。如果你查看文件内容,你将了解 AppArmor 配置文件如何工作以及它们提供什么样的保护:

cat /etc/apparmor.d/usr.sbin.mysqld
# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include <tunables/global>

/usr/sbin/mysqld {
 #include <abstractions/base>
 #include <abstractions/nameservice>
 #include <abstractions/user-tmp>
 #include <abstractions/mysql>
 #include <abstractions/winbind>

 capability dac_override,
 capability sys_resource,
 capability setgid,
 capability setuid,

 network tcp,

 /etc/hosts.allow r,
 /etc/hosts.deny r,

 /etc/mysql/** r,
 /usr/lib/mysql/plugin/ r,
 /usr/lib/mysql/plugin/*.so* mr,
 /usr/sbin/mysqld mr,
 /usr/share/mysql/** r,
 /var/log/mysql.log rw,
 /var/log/mysql.err rw,
 /var/lib/mysql/ r,
 /var/lib/mysql/** rwk,
 /var/log/mysql/ r,
 /var/log/mysql/* rw,
 /var/run/mysqld/mysqld.pid rw,
 /var/run/mysqld/mysqld.sock w,
 /run/mysqld/mysqld.pid rw,
 /run/mysqld/mysqld.sock w,

 /sys/devices/system/cpu/ r,

 # Site-specific additions and overrides. See local/README for details.
 #include <local/usr.sbin.mysqld>
}

文件的语法非常简单。首先是文件或目录路径,其后是允许的权限。还支持通配符。例如,/etc/mysql/** 会递归地应用到/etc/mysql目录下的所有文件。一个单独的*会将文件应用到当前目录下的文件。

修改 AppArmor 配置文件后,应重新加载 AppArmor 守护程序以使更改生效。您可以通过以下命令执行此操作:

sudo /etc/init.d/apparmor reload

在 AppArmor 中,有两种模式,即enforcecomplain。在enforce模式下,AppArmor 会积极阻止程序违反其配置文件的尝试。在complain模式下,AppArmor 只是记录这些尝试,但允许它们发生。您可以使用aa-enforceaa-complain程序轻松地将配置文件设置为 enforce 或 complain 模式。

例如,如果您想要将 MySQL 的 AppArmor 配置文件从 enforce 模式更改为 complain 模式,则此配置文件可以在配置文件中执行读取和写入而无需限制,但只会记录这些操作。我们只需要运行以下命令:

sudo aa-complain /usr/sbin/mysqld
Setting /usr/sbin/mysqld to complain mode.

在进行此更改后,我们可以检查 AppArmor 的状态,方法如下:

sudo aa-status
apparmor module is loaded.
7 profiles are loaded.
6 profiles are in enforce mode.
 /sbin/dhclient
 /usr/lib/NetworkManager/nm-dhcp-client.action
 /usr/lib/NetworkManager/nm-dhcp-helper
 /usr/lib/connman/scripts/dhclient-script
 /usr/sbin/named
 /usr/sbin/tcpdump
1 profiles are in complain mode.
 /usr/sbin/mysqld
3 processes have profiles defined.
2 processes are in enforce mode.
 /sbin/dhclient (945)
 /usr/sbin/named (13679)
1 processes are in complain mode.
 /usr/sbin/mysqld (6288)
0 processes are unconfined but have a profile defined.

注意

要使用aa-complainaa-enforce程序,您首先需要使用以下命令安装apparmor-utils软件包:

sudo apt-get install apparmor-utils

如果您想临时禁用 AppArmor(例如,出于调试目的,以检查某些进程是否按预期工作,以及您是否尝试确定apparmor配置文件是否是问题的原因或其他原因),只需运行以下命令:

sudo /etc/init.d/apparmor stop
[ ok ] Stopping apparmor (via systemctl): apparmor.service.

请注意,运行上述命令只会清除配置文件的缓存。如果您需要卸载配置文件,则需要运行以下命令:

sudo /etc/init.d/apparmor teardown
 * Unloading AppArmor profiles [ OK ]

高级安全配置

在这一部分,我们将探讨一些在生产环境中大多数 Ubuntu 服务器上都需要的高级安全设置,特别是当它们包含关键服务时。这些高级配置非常重要,因为它们直接影响除 Ubuntu 服务器本身以外的服务行为。

SSH 安全增强

按定义,SSH 是一种安全通信协议,但我们可以应用一些额外的增强措施来进一步提升安全性。

让我们从默认的 Ubuntu SSH 配置开始。/etc/ssh/sshd_config文件非常安全,因为它允许使用身份验证密钥、使用权限分离并且只允许 SSH 协议 2。唯一值得怀疑的设置是PermitRootLogin yes,该选项定义了允许 root 用户通过 SSH 登录的选项。在我们的例子中(默认安装的 Ubuntu Server),这个设置是无用的,因为 root 账户已被禁用,但如果你想启用 root 账户,你可能需要将此选项设置为 no,并运行sudo service ssh reload来保存设置。通过这些步骤,你强制用户使用常规账户登录,如果需要 root 权限,他们可以执行sudo up命令来获取 root 权限。这也可以防止用户猜测 root 密码并获得访问权限。

SSH 的另一个重要安全增强是使用基于密钥的身份验证而不是密码。这项功能可以保护你的服务器免受暴力破解攻击。基于密钥的身份验证工作原理非常简单。它基于用户生成的一对密钥(一个公钥和一个私钥)。然后,公钥被放置在远程服务器的一个特殊文件中,私钥则必须保存在用户本地,并且不能与他人共享。当用户登录时,这些密钥将用于身份验证,而不是密码。通过这种方法,用户还可以更加舒适地工作,因为他们可以在不每次输入密码的情况下登录到自己的机器。然而,如果你希望增加额外的安全层,你还可以在你的密钥上设置密码短语。

设置基于密钥的身份验证相对简单。在本例中,我们有一个名为abdel的用户,他想在名为abdelmonam1的服务器上设置密钥身份验证,且这台计算机的名称为abdelmonam2。第一步是在abdelmonam2上使用ssh-keygen程序创建 RSA 公钥和私钥。在每次提示时,你可以按Enter键接受默认设置,如下截图所示:

SSH 安全增强

脚本将在你的主目录下的.ssh目录中创建密钥,在本例中是/home/abdel/.ssh。私钥和公钥分别命名为id_rsaid_rsa.pub。如果你选择了空的密码短语,保持私钥(id_rsa)的安全非常重要!如果有人获得了这个文件的访问权限,他们可以复制它并能够登录到你设置了这个密钥的机器上。

一旦你创建了密钥,下一步是将id_rsa.pub密钥复制到服务器上,然后将其附加到~/.ssh/authorized_keys文件中。有多种方法可以做到这一点。自动化方法涉及使用以下命令:

ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<ipaddress>

一种手动的方法是通过 SSH 登录到远程机器,使用文本编辑器打开 ~/.ssh/authorized_keys,并粘贴 id_rsa.pub 的内容。

一旦你在机器上设置好密钥,除非你为密钥设置了密码短语,否则应该能够登录而无需密码提示。如果是后者,你将需要输入密码短语。在你的密钥正常工作后,你可能想要完全禁用 SSH 密码认证。只要确保你的 SSH 密钥正常工作,否则你可能会锁定自己!要禁用密码认证,编辑 /etc/ssh/sshd_config 文件,找到包含 #PasswordAuthentication yes 的行。取消该行的注释并将其设置为 no,如下所示:

PasswordAuthentication no

最后,运行 sudo service sshd reload 来加载新的更改。

提示

默认情况下使用 2048 位 密钥。你可以使用 -b 标志将其增加到 4096 位(增加位数可以使密钥更难通过暴力破解方法破解),如下所示:

ssh-keygen -t rsa -b 4096

另一种防止 SSH 暴力破解攻击的方法,特别是当由于某些原因无法禁用密码认证时,是使用 denyhosts 包。这个包会监控失败的 SSH 登录。当一个主机尝试以不存在的用户身份登录,或多次尝试失败时,该主机会被添加到 /etc/hosts.deny 中,并阻止未来的 SSH 访问。

配置防火墙

保护网络中机器的一种常见方法是使用防火墙。本质上,防火墙使你能够限制对网络服务的访问。例如,使用防火墙,你可以将对 SSH 的访问限制为仅允许来自内部网络的主机访问,同时允许每个人访问 HTTP 服务。

历史上,Linux 中的防火墙规则需要通过一组冗长且复杂的 iptables 命令来设置(也称为 iptables 规则)。这种复杂性是一个弱点,因为主要的安全原则之一是以简单的方式处理事务。幸运的是,对于 Ubuntu 管理员来说,现在有一个名为 ufw 的更简单工具,旨在通过提供 iptables 命令的前端来简化防火墙管理。

ufw 程序默认安装在 Ubuntu Server 上,但它是禁用的;你需要在添加规则之前启用它。

ufw 的基本命令集非常简单。如果你运行 ufw -h,你将得到一个帮助页面,描述了主要的 ufw 命令;但如果你想查看完整的语法信息,可以输入 man ufw 阅读完整的手册页。首先,让我们识别主要命令,然后看一些示例:

  • 你可以通过使用 sudo ufw enablesudo ufw disable 来分别启用和禁用 ufw

  • 使用 sudo ufw status 检查 ufw 的状态;相同的命令将列出所有规则,以防 ufw 被启用。

  • 你还可以设置防火墙的默认策略。你需要考虑的一个非常重要的命令是default命令。该命令定义了防火墙的默认策略,例如,所有数据包是否默认被允许或拒绝。普遍的共识是,防火墙如果默认拒绝所有数据包,然后根据需要启用服务,通常会更安全。这样,在你启动一个新服务时(或者更糟的是,一个用户启动了一个服务),如果你忘记为其设置防火墙规则,它将会被默认阻止。因此,为了默认拒绝所有数据包,请输入sudo ufw default deny。要默认允许所有数据包,请输入sudo ufw default allow。请注意,除非你更改设置,否则ufw默认会拒绝所有数据包。

  • 你可以配置日志功能来追踪任何被阻止的内容以及任何违反默认策略的内容。要启用日志记录,请输入sudo ufw logging on,要禁用日志记录,请输入sudo ufw logging off

  • 一个基本的ufw规则接受端口或服务作为参数。要打开端口 53(用于 DNS 服务器),你需要运行sudo ufw allow 53

  • ufw命令还接受在/etc/services文件中定义的服务名称,而不是特定的端口。如果你查看/etc/services文件,你会发现端口 53 的 TCP 和 UDP 都设置为域名服务。因此,另一种表达该规则的方式是sudo ufw allow domain

  • 你还可以指定传输协议。举个例子,sudo ufw allow 53/udp

  • 你也可以设置允许访问服务器的特定子网。以下是一个命令示例,用于将 Web 访问(端口 80)限制为仅192.168.1.0网络:

    sudo ufw allow proto tcp from 192.168.1.0/24 to any port 80
    
    
  • 即使你默认拒绝所有数据包,也可能会遇到需要添加拒绝规则的情况。例如,假设你正在运行一个外部的 SMTP(电子邮件)服务器,并且发现你网络内部的某台主机(IP 地址为192.168.1.111)似乎感染了病毒,并且正在向你的电子邮件服务器发送大量无效的消息。为了阻止该 IP 地址,你可以执行以下命令:

    sudo ufw deny proto tcp from 192.168.1.111 to any port 25
    
    
  • 如果你希望阻止来自该主机的所有数据包,而不仅仅是 SMTP,你就不需要定义 proto 和 to 参数:

    sudo ufw deny from 192.168.1.111
    
    
  • 稍后,一旦病毒被清除并且主机恢复正常,你可以通过以下命令删除该规则:

    sudo ufw delete deny proto tcp from 192.168.1.111 to any port 25
    
    
  • 或者,如果你已经丢弃了来自该主机的所有数据包,以下命令将会删除该规则:

    sudo ufw delete deny from 192.168.1.111
    
    

提示

当你通过 SSH 连接时,使用ufw要小心,因为启用ufw并使用默认的拒绝所有数据包的操作会关闭你的 SSH 连接并隔离你的服务器。在你开始配置ufw并在启用它或添加任何其他规则之前,最好的做法是添加以下规则:

sudo ufw allow ssh

现在,让我们来看几个示例:

  • 对于 DNS 服务器,我们需要允许 DNS 数据包并拒绝其他数据包,当然在允许 SSH 后,最后启用 ufw 并检查其状态。以下是命令的顺序,顺序很重要,务必注意:

    sudo ufw allow ssh
    sudo ufw allow domain
    sudo ufw default deny
    sudo ufw enable
    sudo ufw status
    
    
  • 以下是另一个示例,展示了我们拥有多个服务的情况。这是一个 web 服务器,一般来说,我们应该允许 http (80)https (443) 访问:

    sudo ufw allow ssh
    sudo ufw allow www
    sudo ufw allow https
    sudo ufw default deny
    sudo ufw enable
    sudo ufw status
    
    

备份与恢复

本章中我们看到的工具和流程允许我们提升服务器安全级别并增强防御攻击的能力,但如果我们正遭受攻击怎么办?在某些情况下,我们可以调查并清理系统,但在大多数情况下,既没有足够的时间,也没有足够的手段来完成此操作,最好的解决方案是恢复一个健康的备份镜像。备份和恢复过程不仅可以解决与攻击相关的问题,还可以解决因人为错误或物理事故(如服务器机房火灾)导致的数据丢失问题。

在接下来的部分中,你将学到如何使用多种工具和多种方法进行 Ubuntu Server 的备份/恢复。

备份原则

在选择备份策略时,有一些原则应当遵循。大多数这些原则是常识,但值得反复强调:

  • 将你的数据备份到独立的系统

  • 测试你的备份

  • RAID 不能替代备份

  • 创建完整的增量备份计划

  • 决定备份的频率

  • 存档你的备份

磁盘镜像

镜像是驱动器的完整逐位复制。因此,一旦你对驱动器进行镜像,你将得到一个与原始驱动器完全相同的镜像。

注意

在镜像驱动器时,重要的是该驱动器不能在使用中。如果在镜像过程中驱动器发生变化,你将无法确保镜像的一致性。所以,请确保驱动器上的文件系统已卸载。

Ubuntu Server 使用经典的 UNIX 镜像工具 dd。其工作过程简单——它逐位读取输入文件并逐位复制到输出文件。如果你有两个大小相同的驱动器,比如 /dev/sda/dev/sdb,使用以下命令将 sda 镜像到 sdb

sudo dd if=/dev/sda of=/dev/sdb

dd 工具也可以处理文件作为输入和输出参数,而不是驱动器。因此,将目标镜像到文件而非驱动器会更好,这样我们就可以将其轻松复制到便携设备如 USB 驱动器中,或发送到远程文件服务器。

例如,如果你想将 sda 分区备份到 /media/myUSB/ 下的 USB 驱动器中的镜像文件中,你只需执行以下命令:

sudo dd if=/dev/sda of=/media/myUSB/sda-image.img

要恢复此镜像,只需交换这两个参数。以下是恢复之前两个示例的命令:

sudo dd if=/dev/sdb of=/dev/sda
sudo dd if=/media/myUSB/sda-image.img of=/dev/sda

你也可以对单个分区进行镜像。这是有用的,因为你可以轻松地挂载镜像回环并读取它们。首先,让我们对 /dev/sda 上的分区进行镜像,步骤如下:

sudo dd if=/dev/sda1 of=/media/myUSB/sda1-image.img

现在,您可以创建一个名为/mnt/temp的目录,并使用循环挂载选项来挂载此镜像,如下所示:

sudo mkdir /mnt/temp
sudo mount loop /media/myUSB/sda1-image.img /mnt/temp

当您只需要从镜像中恢复几个文件时,这非常方便。您可以像浏览其他文件系统一样浏览/mnt/temp,并从中复制单个文件或整个目录。

我们可以通过 SSH 直接将给定驱动器的镜像备份到远程服务器。例如,要将/dev/sda从本地机器通过网络传输到192.168.1.200并将镜像转储到/media/MyBackupData/sda-image.img,可以输入以下代码:

sudo dd if=/dev/sda | ssh username@192.168.1.200 \
"cat > /media/MyBackupData/sda-image.img"

要恢复此镜像,请使用以下代码:

ssh username@192.168.1.200 "cat /media/MyBackupData/sda-image.img" \ sudo dd of=/dev/sda

数据库备份

大多数情况下,备份一个系统就像创建其文件的副本一样简单。然而,在数据库系统中,事情并不那么简单。数据库通常不会立即将更改提交到磁盘。因此,如果您仅仅复制数据库文件,数据库本身可能处于不一致的状态。当您恢复它时,无法保证它是一个未损坏的副本。

解决这个问题的方法是使用数据库自带的工具,提供一个一致的数据库转储,将其保存到一个可以备份的文件中。在接下来的部分,您将学习如何在 Ubuntu 中使用 MySQL 数据库的工具。类似的步骤也适用于其他数据库,具体取决于它们自己的转储工具。

MySQL 用来创建数据库备份的工具叫做mysqldump。这个工具将整个数据库或多个数据库转储到屏幕上。大多数人然后将输出重定向到一个文件,或者将其通过管道传输给像 gzip 这样的工具进行压缩。例如,如果您的用户有一个名为mySite的数据库,下面是备份方法:

mysqldump mySite > mySite_backup.sql

如果您希望在转储数据库的同时进行压缩,可以在中间加上gzip管道,如下所示:

mysqldump MySite | gzip > MySite_backup.sql.gz

现在,如果您想要备份多个数据库,有两种主要的方法。第一种方法是使用--databases参数,后面跟上需要备份的数据库列表,数据库之间用空格分隔。另一种方法是使用--all-databases参数,这将备份所有内容,如下所示:

mysqldump --all-databases > all_databases_backup.sql

如果您为 MySQL 用户设置了密码,您需要通过-u-p选项来提供密码,以使此命令生效。例如,对于具有mySecret密码的 root 用户,请运行以下命令:

mysqldump --all-databases -u root -pmySecret \ > all_databases_backup.sql

上述命令将备份所有数据库,因为 root 用户使用的是不安全的密码。我给出这个例子只是想说明,虽然这个选项有效,但它是不安全的。原因是,所有参数的完整列表,包括密码,都可以通过运行ps命令的系统用户看到。更好的方法是使用-p而不指定密码:

mysqldump --all-databases -u root -p \ >
all_databases_backup.sql

当你指定-p但不提供密码时,mysqldump会像mysql命令一样提示你输入密码。这提供了良好的安全性,但当然也意味着你必须手动输入密码。大多数备份 MySQL 数据库的人都会设置一个cron任务在晚上自动执行。MySQL 推荐的解决方法是将密码添加到执行备份的用户的~/.my.cnf文件中的客户端部分。如果你还没有~/.my.cnf文件,可以创建一个新的,并在其中添加以下内容:

[client]
password=mypassword

mypassword替换为你的用户用来登录的密码。一旦你设置好这个文件,就不再需要指定-p选项了,因为mysqldump会从这个文件中获取密码。这里的缺点是密码以明文文件的形式存储在系统中。所以,你需要设置文件权限,以确保只有你的用户可以查看它:

chmod 400 ~/.my.cnf

要在 MySQL 上恢复备份,使用mysql命令行工具并指向你的备份。例如,要将mySite数据库备份到mySite_backup.sql,执行以下命令:

mysql mySite < mySite_backup.sql

如果你备份的是多个数据库,只需执行以下命令:

mysql < multiple_database_backup.sql

要恢复所有数据库,你需要以 root 用户身份登录。如果你设置了 root 密码,必须使用-p选项(除非你设置了.my.cnf文件,在这种情况下可以省略-p),如下所示:

mysql -u root -p < all_databases.sql

备份工具

我们可以使用很多备份工具来备份并轻松恢复 Ubuntu Server。有些使用 CLI,有些使用 GUI;有些是免费的,其他则需要付费许可。它们还根据备份模式有所不同,备份模式可以是完全备份(工具备份备份目标中的所有文件)、增量备份(工具备份自上次备份以来所有已更改的文件)或差异备份(工具备份自上次完全备份以来所有已更改的文件)。

下面是一些知名工具的比较:

工具名称 界面 备注
Areca Backup GUI 这是一个出色的备份软件,可以本地使用或通过 FTP 工作,使用 Java 编写,具有非常直观的 GTK 图形界面,并提供完全恢复和文件搜索的功能。
Bacula GUI 这是一个专业的开源备份软件。它可以备份单台计算机或多网络计算机的内容。Bacula 有很多功能,但需要你具备一定的备份知识。
BackInTime GUI 这是一个非常简单的备份工具,适用于 Linux。备份通过对一组目录进行“快照”来完成。目前,有两个可用的 GUI,分别是 Gnome 和 KDE。该解决方案是少数几个能够通过 SSH 将文件保存到远程服务器并以加密形式存储的工具之一。一旦存储,您可以毫不担心数据的安全性,将文件保存到专用服务器上。
BackupPC GUI 这是一个非常强大的工具,可以用于备份多个客户端(Linux 或 Windows)。BackupPC 用于保存一组机器。它具有一个网页界面,可以配置和启动备份或恢复文件。它还可以备份数据库。BackupPC 可以定期自动保存网络计算机上的目录。它还可以做更多的事情。
Déjà Dup GUI 这是一个简单的备份工具,是 duplicity 的图形界面工具。它允许您在本地目录、服务器(SSH/FTP/HTTP)或云端创建备份。它还允许您加密保存的文件并安排自动备份。
LuckyBackup GUI 这是一个简单的工具,具有 rsync 的强大功能,且界面友好。它提供简单模式或高级模式、恢复、模拟、远程操作、超级用户模式、配置文件和计划等功能。
SBackup GUI 这是一个简单易用且功能强大的工具。它允许您执行增量备份,但不支持差异备份。
Backup-Manager CLI 使用此工具,备份文件会保存在本地档案中,并可以导出到服务器(FTP、SSH、rsync 等),或刻录到 CD/DVD 上。
Duplicity CLI 该工具通过创建 TAR 压缩包并使用 GnuPG 加密来执行备份。然后,将这些压缩包发送到本地或远程备份目录。支持的远程协议包括 FTP、SSH/SCP、Rsync、WebDAV/WebDAVs 和 Amazon S3。
Rsync CLI Rsync(用于远程同步)是一个文件同步软件。它通常用于实现远程备份系统。Rsync 是单向同步,这意味着它通过传输已修改文件的字节,将源数据(本地或远程)同步、复制或更新到目标位置(本地或远程)。
Unison CLI Unison 是一个同步软件。与 Rsync 不同,它显示双向同步。

还有一些专门用于分区克隆的备份工具。以下是两种 Ubuntu 系统中非常有名的工具:

工具名称 界面 备注
Clonezilla GUI 这是 Norton Ghost 或 Acronis True Image 的免费等效工具。它允许您创建硬盘或分区的镜像备份,并进行恢复。
Partclone CLI 它用于备份分区。它某种程度上是 Norton Ghost 的等效工具。可以将其安装在 live usb 上以保存您的系统。

现在,让我们以一个强大的备份工具BackupPC为例。要安装它,你需要运行以下命令:

sudo apt-get install backuppc

系统会要求你提供一些关于邮件服务器(postfix)和你希望使用的 Web 服务器的信息(在我们的案例中,是 Apache),如下图所示。最后,你将收到一条消息,指出管理 BackupPC 所需的 URL 和登录系统所需的凭证:

备份工具

为了激活新配置,你需要运行以下命令:

sudo service apache2 restart

然后,你可以通过使用消息中给出的 URL,或者服务器 IP 地址后跟/backuppc/,通过网页浏览器开始使用 BackupPC。系统会要求你输入登录凭证,如下图所示。输入凭证后,你将看到一个易于使用且文档非常丰富的界面:

备份工具

注意

你可以在help.ubuntu.com/community/BackupPC找到更多关于如何在 GUI 和 CLI 模式下使用 BackupPC 的信息。

总结

本章我们专注于一个与 Ubuntu Server 相关的重要主题,即安全管理。我们覆盖了 Ubuntu Server 内的基本和高级安全功能,并探讨了如何利用这些功能提高系统的安全性。接着,我们概览了 Ubuntu Server 的备份/恢复操作。

在下一章中,我们将集中讨论当今最热门的 IT 话题之一——基于 Ubuntu Server 的虚拟化和云计算。

第五章:Ubuntu Server 中的虚拟化与云计算

虚拟化和云计算是目前系统管理社区中的一些热门话题。它们为系统管理员提供了在同一硬件上运行更多服务器的可能性,并以可靠的方式使用资源。已经基于虚拟化的云概念提供了更多的好处,尤其是在安全性和新兴的商业模式,如 SaaS、PaaS 和 IaaS 方面。

Ubuntu 提供了一套优秀的虚拟化和云计算平台。在本章中,我们将了解 Ubuntu Server 如何处理一些最知名的平台:

  • 在第一部分,我们将重点介绍虚拟化。我们将了解如何管理三大虚拟化程序,即 KVM、XenServer 和 Docker。

  • 在第二部分,我们将介绍 Ubuntu Server 提供的云计算功能。

虚拟化

在 Ubuntu Server 下有多种不同的虚拟化技术可用。在这一部分中,我们将了解虚拟化概念及其不同的技术和方法。然后,我们将学习一些最受欢迎的虚拟化程序,如基于内核的虚拟机KVM)、XenServer 和 Docker,每个技术中选取一个程序进行研究。

虚拟化介绍

虚拟化用于在一台或多台计算机/服务器上作为简单软件运行一个或多个操作系统/应用程序,而不是每台计算机只能安装一个操作系统。这些虚拟机被称为虚拟机环境,甚至是虚拟环境操作系统OS)的虚拟化是一种技术,使你能够在单台计算机上同时运行多个操作系统,仿佛它们在独立的计算机上工作一样。

虚拟化的好处

虚拟化有几个优点。以下是它的一些好处:

  • 你可以在不重新启动计算机的情况下使用不同的操作系统来运行那些在 Ubuntu 上原生不兼容的程序。

  • 你还可以使用与 Ubuntu 不兼容但可以与其他操作系统兼容的设备。

  • 你可以在操作系统下进行测试,而不会危及稳定的环境。

  • 你还可以在受控、隔离和安全的环境中进行软件测试。

  • 你可以使用运行在具有兼容虚拟机监控器的计算机上的虚拟机将操作系统从一台计算机传输到另一台计算机。

个人和中小型企业SMEs)/ 中小型工业SMIs)通常更关心同时运行两个不同操作系统,以便运行与一个虚拟机监控器兼容但与另一个不兼容的软件。大型公司越来越多地使用虚拟化技术来节省服务器机房空间、简化安装、便于在发生故障后重新启动,当然,还能开发安全可靠的业务网络。

虚拟化的不同技术

虚拟化概念的主要方面是一个叫做虚拟机管理程序(Hypervisor)的实体。虚拟机管理程序是用于创建和运行虚拟机的软件、固件或硬件。运行虚拟机管理程序的机器称为主机机器,每个在虚拟机管理程序上运行的虚拟机称为客户机。在本节中,我们将看到两种类型的虚拟机管理程序。除了虚拟机管理程序外,还有一个虚拟化概念的主要组成部分,它有多个名称。有些人称其为隔离器,而其他人则称之为容器虚拟化引擎,甚至是操作系统级虚拟化。在我们的案例中,我们将其称为隔离器。我们将在本节中探讨它以及两种虚拟机管理程序类型。

类型 1 虚拟机管理程序

这种类型的虚拟机管理程序也叫做本地虚拟机管理程序裸机虚拟机管理程序。它直接运行在主机的硬件上,直接处理硬件并管理客户操作系统。这种类型的虚拟机管理程序的一个例子是XenServer

我们可以通过使用以下架构来进行建模:

类型 1 虚拟机管理程序

类型 2 虚拟机管理程序

这种类型的虚拟机管理程序也叫做托管虚拟机管理程序。它像其他任何软件一样在主机操作系统上运行。它为客户系统提供硬件级别的仿真。这种类型的虚拟机管理程序的一个例子是Oracle VirtualBox

注意

一些虚拟化程序,如 KVM,无法轻松地归类为这两种类型之一。KVM是一个内核模块,它将主机操作系统转化为类型 1 虚拟机管理程序,但与此同时,主机操作系统始终作为通用操作系统运行,并运行其他与虚拟机资源竞争的应用程序。因此,KVM 也可以归类为类型 2 虚拟机管理程序。

我们可以通过使用以下架构来建模类型 2 虚拟机管理程序:

类型 2 虚拟机管理程序

一个隔离器

隔离器是用于将应用程序的执行隔离在所谓的上下文或执行区域中的一段软件。隔离器允许你在多实例模式下多次运行相同的应用程序(多个执行实例),即使该应用程序并未为此设计。这种解决方案非常高效,因为系统开销较小(系统用于做更多事情而不仅仅是管理自身的时间)。需要注意的是,虚拟化环境并非完全隔离。性能始终是一个关键因素。然而,我们无法真正谈论操作系统虚拟化。我们可以通过使用以下架构来进行建模:

隔离器

针对虚拟化的不同方法

在开始虚拟化项目之前,必须了解该领域的两种主要方法——完全虚拟化半虚拟化。XenServer 和 KVM 都提供这两种方法。因此,你需要非常清楚它们之间的区别,这也是我们将在接下来的章节中解释的内容。

半虚拟化

半虚拟化方法需要对客户操作系统进行修改,使其生成特定的指令,这些指令可以被虚拟机监控程序轻松处理,虚拟机监控程序只需解释并将其传递给物理硬件。

在这种情况下,客户操作系统知道自己是虚拟化的。因此,它将生成最适合在虚拟环境中使用的指令,而无需先进行翻译。

完全虚拟化

另一种方法是完全虚拟化,它允许你将未修改的操作系统作为客户操作系统。它的一个缺点是需要特殊的硬件支持,这通常是现代 CPU(包括 AMD 和 Intel 处理器)提供的一个特性。由于服务器 CPU 中内置了这种支持,完全虚拟化的机器可以高效地运行,尽管来自虚拟化操作系统的指令首先需要被虚拟机监控程序翻译。

KVM(基于内核的虚拟机)

在本节中,我们将了解 Ubuntu 实际支持的默认虚拟化技术。名为 KVM基于内核的虚拟机),这种虚拟化技术是一种免费软件,已内置于 Linux 内核中。该软件利用了英特尔和 AMD 处理器内置的虚拟化支持,允许你在单个主机上运行多个不同的操作系统和发行版作为 虚拟机VMs)。

前提条件

在开始安装过程之前,你应该验证计算机是否支持虚拟化。要检查这一点,你需要运行 kvm-ok 命令,它是 cpu-checker 包的一部分。因此,你首先需要安装该包,然后使用以下代码调用该命令:

sudo apt-get install cpu-checker
sudo kvm-ok

然后,检查结果并验证你得到了以下结果:

INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used

这意味着你应该寻找另一台计算机。然而,你也许会看到类似这样的信息:

INFO: /dev/kvm does not exist
HINT: sudo modprobe kvm_intel
INFO: Your CPU supports KVM extensions
KVM acceleration can be used

或者,你可能会看到类似这样的内容:

INFO: /dev/kvm exists
KVM acceleration can be used

这意味着你可以继续进行到下一部分。

注意

有时候你的 CPU 支持虚拟化,但你可能会看到一条消息说它无法支持。在这种情况下,大多数时候,虚拟化在 BIOS 中被禁用。因此,你需要从 BIOS 中启用它。你所需要做的就是重启计算机并使用适当的功能键进入 BIOS(启动后屏幕上会显示几秒钟;通常你需要按 F12)。在出现的 BIOS 屏幕中,寻找类似 CPU 或性能的选项并选择它。然后,寻找一个虚拟化选项,如 Intel 虚拟化技术,并启用它。保存更改并重启计算机。

配置 KVM 网络

有两种主要方式可以用来为虚拟机设置网络。默认的网络设置提供一个位于 192.168.122.0/24 的私有网络,DHCP 服务器会分配剩余的 IP 地址。或者,你也可以为虚拟机设置静态 IP。KVM 主机的 IP 是 192.168.122.1。虚拟机通过此网关使用 NAT网络地址转换)与外界通信。这种方式很好,尤其适合桌面上的虚拟机,但既然我们在讨论服务器,我猜测你希望 KVM 主机外的机器能够与虚拟机通信。虽然你当然可以设置一些 iptables DNAT 规则并转发流量回去,但这种解决方案扩展性较差。真正的解决方案是设置桥接网络,这样虚拟机就会显示在与主机相同的网络上。

在 Ubuntu 上设置 br0 桥接接口相对简单。本质上,你需要识别你希望桥接流量的接口(可能是 eth0,如果你设置了绑定,可能是 bond0),将其所有配置转移到 br0,并添加一些额外的桥接选项,然后将原接口设置为手动模式。当你看到示例时,这会更容易理解。假设我为 eth0 设置了 DHCP,而我在 /etc/network/interfaces 中的旧配置如下:

auto eth0
iface eth0 inet dhcp

然后,我的新配置将如下所示:

auto eth0
iface eth0 inet manual
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

注意

要了解更多关于 Ubuntu Server 上网络桥接的信息,你可以访问 help.ubuntu.com/community/NetworkConnectionBridge

请注意,我将 eth0inet 模式从 dhcp 更改为 manual。如果 eth0 配置了静态 IP,我可以直接将配置转移到 br0。让我们看一下以下配置:

auto eth0
iface eth0 inet static
address 192.168.0.5
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1

这将会进入以下配置:

auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.0.5
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

一旦我配置了 /etc/network/interfaces 文件以设置桥接,我就可以使用以下命令重启网络:

sudo /etc/init.d/networking restart

注意

要了解更多关于在 Ubuntu Server 上进行 KVM 高级网络配置的信息,你可以查看社区页面 help.ubuntu.com/community/KVM/Networking 和官方的 Ubuntu 文档 wiki.ubuntu.com/KvmWithBridge

KVM 安装

要执行 KVM 虚拟化,除了 KVM 之外,还需要安装一些额外的软件。以下软件组件需要添加:

  • libvirt:提供虚拟化硬件的接口

  • qemu:模拟 PC 硬件到虚拟机

  • bridge-utils:提供一种方式通过主机桥接虚拟机的网络

要安装 KVM 虚拟化所需的基本软件,可以运行以下命令:

sudo apt-get install libvirt-bin kvm bridge-utils qemu-common qemu-kvm qemu-utils

请注意,要管理这一组程序,你将主要使用命令语言解释器CLI)命令。如果你想使用 GUI 来管理虚拟机,可以使用著名的virt-manager图形软件。请注意,你需要安装图形环境,或者通过使用-X选项的 SSH 连接到服务器。还有另一种解决方案——在安装有图形环境的另一台台式机/笔记本电脑上安装virt-manager,然后使用以下命令通过它远程管理虚拟机:

virt-manager -c qemu+ssh://root@your-server-ip-or-name/system

要安装virt-manager,执行以下命令:

sudo apt-get install virt-manager

安装了virt-manager后,你现在可以选择通过图形界面或命令行管理虚拟机。接下来,你需要确保你想用来管理虚拟化的用户帐户已配置好。

注意

完成安装过程后,你应该使用以下命令将希望管理libvirtd组虚拟化的用户添加到该组中:

sudo adduser <user_name> libvirtd

最后,重启你的服务器,作为用户登录,并检查虚拟化服务是否正在运行。此时,你可以开始管理虚拟环境。

管理虚拟机

如果你想使用virt-manager图形工具管理虚拟环境,只需运行virt-manager命令,你将获得一个直观、易用的 GUI。你可以通过编辑编辑菜单下的首选项子菜单来进行自定义。你还需要通过编辑菜单检查连接详情,以自定义高级设置,如网络和存储,如下图所示:

管理虚拟机

然后,你可以开始创建和管理虚拟机;这非常简单且直观。

另一方面,如果你选择使用 CLI 工作,你应该掌握可以与主要虚拟化命令一起使用的选项。首先,你可以使用virt-install命令来安装虚拟机。使用virt-clone,你可以克隆一个现有的虚拟镜像。要管理虚拟机,你可以使用virsh命令列出虚拟机的信息,并启动、停止或重启它们。

请注意,在使用virt-install创建虚拟机之前,你需要先创建存储镜像。可以通过使用qemu-img命令来实现。例如,以下命令将在/media/Data目录下创建一个名为ubuntuserver、类型为qcow2的 20GB 存储镜像:

sudo qemu-img create -f qcow2 /media/Data/ubuntuserver.qcow2 20G

完成此步骤后,你可以创建虚拟机。下面是一个创建 Ubuntu 虚拟机的virt-install命令行示例。此命令包含了你在virt-manager窗口中需要点击或填写的许多选项。请注意,此命令还包含了我们在本节之前通过qemu-img命令创建的镜像:

virt-install --connect qemu:///system --name ubuntu_server15.04 \
--ram 1024 --disk path=/media/Data/ubuntuserver.qcow2,format=qcow2 \
--network=bridge:virbr0,model=virtio --vnc --os-type=linux \
--cdrom /media/Data/ISOs/ ubuntu-15.04-server-amd64.iso \
--noautoconsole --keymap=en-us

要查看可以与virt-install命令一起使用的每个选项的含义(以及更多内容),你需要查阅virt-install man页面(输入 man virt-install)。

一旦virt-install命令开始执行,你可以打开桌面上的一个应用程序来查看安装进度。virt-managervirt-viewer命令是你可以用来查看虚拟机控制台的命令之一。虚拟机安装完成后,你可以使用virsh命令来管理虚拟机。

virsh命令提供了一种管理虚拟机的好方法,特别是在虚拟机创建之后。你可以使用virsh查看哪些虚拟机正在运行。然后,你可以启动、停止、暂停以及以其他方式管理它们。还有许多替代virsh命令的方式可以用来管理虚拟机。有关详细信息,请参考virsh man页面(输入man virsh)。

XenServer

我们将讨论的第二个虚拟化平台是著名的XenServer。自 7.10 版本起,XenServer 开始支持 Ubuntu Server,但从 8.04 版本起,Canonical 决定将 KVM 作为 Ubuntu Server 中的默认虚拟化解决方案。

在本节中,我们将讨论如何将 Ubuntu Server 设置为 Xen 虚拟化的主机。我们还将学习如何在 Xen 环境中安装客户端。在开始本节的动手操作之前,让我们先了解一下 Xen 的术语。在 Xen 中,主机操作系统和客户操作系统之间没有区别。这是因为“主机”和“客户”这两个词暗示着一种层级关系,但这种关系并不存在(请参阅本章第一节中描述的类型 1 虚拟化管理程序模型)。因此,Xen 使用“域”来表示。存在domain 0操作系统(可以与其他虚拟化技术中的主机操作系统进行比较)以及其他操作系统(可以与客户操作系统进行比较)。

这些其他操作系统被称为domain U机器。domain 0操作系统(或简称dom0)是第一个加载到物理机器上的操作系统,在 Xen 环境中承担着特定的职责,包括驱动程序管理。domain U(或简称domU)机器是虚拟化的机器,它们没有与虚拟化相关的特殊职责。

先决条件

Linux 支持的硬件也可用于 Xen(只要与内核兼容)。默认情况下,Xen 支持所有经过修改以在其内运行的操作系统,这被称为半虚拟化。Xen 也通过硬件虚拟化支持未经修改的操作系统,这被称为完全虚拟化。然而,在这里我们必须使用支持硬件虚拟化的 CPU(Intel VT 和 AMD-V)。验证这一点有多种方法。例如,我们可以检查/proc/cpuinfo文件中为 CPU 设置的标志。通过使用egrep命令,我们可以搜索该文件,查找 Intel-VT 支持(vmx)或 AMD-V 支持(svm),使用以下命令:

egrep "(svm|vmx)" /proc/cpuinfo

此命令的输出如下图所示:

先决条件

另一种检查此点的方法是使用xm dmesg命令,查看与 Xen 虚拟化相关的所有功能概览,如下所示:

sudo xm dmesg | grep VMX
(XEN) HVM: VMX enabled
(XEN) VMX: MSR intercept bitmap enabled

如果没有结果,说明你的 CPU 不支持虚拟化,这意味着你不能虚拟化未修改的操作系统。

安装 XenServer

在 Ubuntu 上安装 XenServer 非常简单。你只需要运行以下命令:

sudo apt-get install xen-hypervisor

然后,重启系统并从GRand Unified BootloaderGRUB)中选择包含 XenServer 的启动项。

重启后,检查是否使用了正确的内核。运行sudo uname -a命令,验证结果中是否包含xen。同时,使用sudo xm list命令验证dom0是否已经启动。

验证网络是否配置正确。ifconfig命令必须至少返回三个接口,即lo(回环系统)、eth0(不再是网络接口,而是domU的图像的桥接)和peth0(网络接口)。如果不是这种情况,请编辑/etc/xen/xend-config.sxp文件,确保以下行未被注释:

(network-script network-bridge)
(vif-script vif-bridge)

修改完此脚本后,别忘了使用以下命令重启 Xen 守护进程:

service xend restart

Xen守护进程负责虚拟网络基础设施管理。

XenServer 环境中的网络概念

Xen 有一个与其他虚拟环境不同的特定网络环境。每个域(从dom0开始)都有自己的虚拟驱动程序,作为网络卡使用;它们简单地命名为eth0eth1等。在dom0操作系统中,你会发现这些虚拟驱动程序的逻辑表示(逻辑接口),其名称遵循vifx.y的模式,其中x表示虚拟化操作系统的 ID(U代表domU),而y表示虚拟化网络板的编号(从 0 开始)。

例如,dom0中的第一个网络卡(eth0)由vif0.0表示,dom3中的第二个网络卡(eth1)由vif3.1表示,依此类推。

继续探索这个概念,在dom0系统中,所有的vif接口都连接到虚拟桥接(称为xenbr0),它表现得像一个真实的交换机。接下来,这个桥接与peth0通信,peth0是物理网络卡的表示,最终与服务器中的网络板直接通信。以下图像是所有这些如何组织的图形表示:

XenServer 环境中的网络概念

注意

创建虚拟网络后,你必须在/etc/modules文件中添加max_loop=64行。这是强制性的,因为你需要确保可以为虚拟机创建足够的虚拟磁盘。重启系统以确认这个新设置有效,然后才能开始创建虚拟机。

管理虚拟机

与 KVM 类似,XenServer 也可以通过图形界面(GUI)或命令行界面(CLI)进行管理。对于 GUI,有许多工具可供选择。以下是其中的一些工具:

  • Virt-manager:我们在 KVM 部分已经看过了这个工具。如果您希望创建和管理 XenServer 虚拟机,它非常好用。

  • OpenXenManager:这是一个专门用于管理 Xen 的图形界面(GUI)。您可以使用以下命令安装它:

    sudo apt-get install openxenmanager
    
    
  • XCP 项目 KronosXCP代表Xen Cloud Platform。要安装此项目,您必须将ppa:ubuntu-xen-org/xcp1 PPA 添加到源列表中(请参见第二章,配置和管理 Ubuntu 服务器,了解如何操作),然后更新软件包列表,最后运行sudo apt-get install xcp-storage-managers

  • xen-tools:您可以使用以下命令安装此工具:

    sudo apt-get install xen-tools
    
    

在本节的后续部分,我们将重点讨论 CLI 工具。实现这一目标的原生方法是使用像dd这样的工具创建存储映像,如在第四章,安全与 Ubuntu部分中讨论的那样。接下来,您需要为客户系统创建一个配置文件,其中包含客户系统使用的所有设置(如 RAM、硬盘等),然后使用以下命令基于该config文件创建虚拟机:

sudo xm create -c <path_to_the_conf_file>

xm create命令也可以在没有config文件的情况下使用,如下所示:

sudo xm create /dev/null ramdisk=initrd.img \
kernel=/boot/vmlinuz-2.6.12.6-xenU \
name=ramdisk vif='' vcpus=1 \
memory=64 root=/dev/ram0

如果您希望使用xmxm手册包含了许多有用的信息。在开始使用xm之前,可以先阅读一下。

Docker 简介

Docker 是一个著名的程序,它自动化并简化了在软件容器内部署应用程序和服务的过程。它是最好的工具之一,属于隔离器类别(请参见本章的第一部分)。Docker 基于操作系统级虚拟化的附加抽象和自动化层(也称为隔离器)。从 Ubuntu Server 14.04 版本开始,它得到了支持。根据一家行业分析公司 451 Research 的说法:

“Docker 是一个可以将应用程序及其依赖项打包到一个虚拟容器中的工具,这个容器可以在任何 Linux 服务器上运行。这有助于提高应用程序的灵活性和可移植性,无论是在本地、公共云、私有云、裸金属等环境中。”

Docker 工作原理

如前所述,隔离器提供了一个环境(容器)来隔离运行的进程。这正是 Docker 通过实现一个高级 API 来轻量化地完成的,API 使用 Linux 内核提供的资源隔离功能(如内核命名空间、cgroups 等),使得不同的容器可以在同一个 Linux 实例中运行。

与虚拟机不同,Docker 容器不需要单独的操作系统。相反,它使用资源隔离(CPU、内存、块 I/O、网络等)来隔离应用程序对操作系统的视图。Docker 可以通过两种方式访问 Linux 内核的虚拟化功能。第一种方式是直接使用 libcontainer 库,自 Docker 0.9 版本起就已经提供。第二种方式是间接使用一系列工具,如 libvirtsystemd-nspawnLXCLinux 容器)。

容器使用带来的资源隔离和服务限制提供了几乎完全私有的操作系统视图。因此,每个容器都有自己的进程 ID 空间、文件系统结构和网络接口。通过为每个容器添加一些额外的约束,限制它们仅使用特定数量的资源(如 CPU、内存和 I/O),我们可以限制共享相同内核的多个容器的缺点。

使用 Docker 进行容器管理将简化分布式系统的设置以及新节点的部署,这为 平台即服务PaaS)模式开辟了新的时代。

安装 Docker

对于 Ubuntu Server 14.04 及更高版本,Docker 已包含在主 Ubuntu 仓库中。因此,安装 Docker 只需运行以下命令:

sudo apt-get install docker.io

对于旧版本,你需要在执行安装命令之前更新你的源列表。这个操作可以通过以下步骤完成:

  1. 创建一个名为 /etc/apt/sources.list.d/docker.list 的文件,并在其中放入以下行:

    deb http://get.docker.io/ubuntu docker main
    
    
  2. 然后,使用以下命令下载 GPG 密钥并安装 lxc-docker 包:

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 \ --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
    sudo apt-get update
    sudo apt-get install lxc-docker
    
    

提示

如果你不想每次 Docker 命令都使用 sudo,可以通过以下命令将用户添加到 Docker 组:

sudo addgroup user docker

安装完成后,你需要像启动其他普通服务一样,通过以下命令启动 Docker:

service docker start

使用 Docker

作为一个例子,我们将看看如何使用 Docker 与 LAMP 容器。但首先,让我们探讨一些后续理解不同操作时所需要的术语:

  • DockerFile:这是一个源文件,包含配置文件的指令。

  • Image:这是一个 DockerFile 的编译,用来构建一个可以部署的便携镜像。

  • Container:这是镜像的执行过程,简单来说,就是用来运行镜像的进程。

现在,让我们进入实际操作部分。

首先,对于镜像,你可以准备自己的镜像,或者直接下载社区构建的现成镜像。你可以通过访问 hub.docker.com/explore/ 网站,或通过 CLI 使用以下命令来搜索它们:

docker search lamp

您将得到一个长列表的镜像。您需要选择自己的镜像。在此示例中,我们选择了reinblau/lamp镜像。要安装此镜像,您只需运行以下命令:

docker pull reinblau/lamp

此命令将下载并安装此镜像。完成此步骤后,需要在容器中运行它。可以通过使用docker run命令来实现,该命令可以接受一些参数,例如 LAMP 案例中使用的端口 NAT:

docker run -d -p 80:80 -p 3306:3306 reinblau/lamp

这里,意味着主机的端口80将映射到docker容器的端口80。端口3306也是如此。我们可以从 Docker 的仓库页面获取此信息。

在此步骤中,我们可以开始使用在此docker容器中运行的 LAMP 服务器。

docker容器中工作时,您将看到类似这样的提示:

root@xxxxxx#

完成工作后,需要保存对镜像所做的更改。为此,需要运行以下代码:

root@xxxxxx# exit
docker commit xxxxxx image_name

要列出已安装在机器上的镜像,您需要运行以下代码:

docker images

要列出容器(运行中的镜像),需要执行以下命令:

docker ps -a

要获取容器的作业 ID,请执行以下命令:

docker run -d container_name

当需要通过以下命令停止容器时,此作业 ID 非常有用:

docker stop JOB_ID

当您想要移除作业 ID 时,使用以下命令:

docker rm JOB-ID
docker rm container_id

Docker 的一个最佳优势是可以轻松地导入/导出镜像。

要将容器导出为tar.gz文件,请执行以下命令:

docker export 2520aedc6bc5 > zimbra-after-install.tgz

要导入tar.gz文件,请执行以下命令:

cat zimbra-after-install.tgz  | docker import - zimbra-after-install

Ubuntu Server 的云计算

云计算是 IT 世界中的最新趋势和热门话题,而 Ubuntu Server 是该领域的领先操作系统之一,尤其是其基于 OpenStack 的基础设施,由 NASA、NSA、HP、AT&T、阿尔卡特-朗讯等大公司部署。

在接下来的章节中,我们将探讨可以轻松部署在 Ubuntu Server 上的两个最佳开源云服务——一个用于文件共享,另一个用于 PaaS——以及关于在 Ubuntu 上部署 OpenStack 的最佳部分。

ownCloud 软件

ownCloud软件允许您创建并使用存储服务器并在线共享文件。在接下来的章节中,我们将介绍 ownCloud 软件中使用的技术。

ownCloud 使用的技术

ownCloud 软件使用 WebDAV 协议,通过 Linux、Windows 或 Mac 上的网络驱动器无缝访问服务器。还有适用于多个平台(Linux、Mac、Windows、Android 等)的同步软件,您可以保持文件的本地副本并离线工作。ownCloud 软件不仅提供文件共享服务,还可以用来管理日历、联系人、书签,甚至音乐。

该项目使用 PHP 开发。因此,它可以安装在许多 Web 服务器上。它不需要诸如 Java 或特定 Web 服务器扩展的功能。

在接下来的部分中,我们将仅介绍 ownCloud 服务器的安装过程。本书不涉及客户端的安装和配置。

ownCloud 服务器的安装

自从 ownCloud 版本 5.0 发布以来,它的安装变得非常简单。ownCloud 的软件包已为 Ubuntu 支持的版本提供,下载地址为download.owncloud.org/download/repositories/stable/

例如,要为 Ubuntu 15.04 安装 ownCloud,请运行以下命令:

sudo sh -c "echo 'deb http://download.opensuse.org \
/repositories/isv:/ownCloud:/community/ \
xUbuntu_15.04/ /' >> /etc/apt/sources.list.d/owncloud.list
sudo apt-get update
sudo apt-get install owncloud

你可以将仓库密钥添加到apt中。请记住,密钥的所有者可能会分发更新、软件包和仓库,你的系统将会信任这些内容。要添加密钥,请运行以下代码:

wget –nv \ https://download.owncloud.org/download/repositories/stable/ \ xUbuntu_15.04/Release.key -O Release.key

sudo apt-key add - < Release.key

现在你的服务器可以通过http://<server_ip>/owncloud/访问。在第一次连接时,你必须创建一个账户。如果服务器提示缺少依赖项,请使用sudo service apache2 reload命令重新启动 Web 服务器。

要启用对 Apache 服务器的安全连接(HTTPS),请运行以下命令:

sudo a2enmod ssl
sudo a2ensite default-ssl
sudo service apache2 reload

现在,通过https://<server_ip>/owncloud/登录服务器。从管理菜单中,在https://<server_ip>/owncloud/index.php/settings/admin页面,勾选强制使用 HTTPS选项。

CozyCloud

CozyCloud 是一个免费的个人云服务器。它专注于与个人数据相关的应用程序和协作应用程序。CozyCloud 是一个个人PaaS平台即服务)解决方案,允许你一键部署个人 Web 应用程序。你可以选择现有的 Cozy 应用程序(如 Notes、Todos、Calendar、Contacts、Photos 等),也可以适配现有的 Node.js 应用程序,或者从头开始创建你自己的 Web 应用程序(相关文档和教程在网上可找到)。

在 Ubuntu Server 上安装 CozyCloud

首先,在你的机器上使用以下命令安装 Python 和 pip 工具:

apt-get install python python-pip python-dev \ software-properties-common

安装好pip工具后,你需要使用以下命令安装fabricfabtools

sudo pip install fabric fabtools

然后,下载fabric文件(这是一个将在你的远程服务器上运行命令的脚本),如下所示:

wget https://raw.githubusercontent. \
com/cozy/cozy-setup/master/fabfile.py

一旦系统准备好,使用本地机器上的fabric脚本启动 Cozy 安装(在你下载的fabfile所在的目录运行该脚本)。可以使用以下命令:

fab -H <user>@<ip_address> install

一旦运行了上述命令,你需要耐心等待片刻。正如你所知,某些命令或应用程序的部署可能需要一些时间,具体取决于你的网络和硬件能力。当安装程序提示时,你需要输入你的设置。

安装完成后,你可以访问https://<IP_address>:443来创建主 Cozy 账户。使用 HTTPS 是强制性的。如果你仅使用 HTTP,你将只看到nginx欢迎页面。

使用 CozyCloud

安装完成后,你可以按照之前的说明通过 HTTPS 访问你的平台。由于这是你第一次登录,你需要注册你的账户(提供电子邮件和密码)。

注意

你选择的密码也将成为启用 Cozy 应用程序加密数据库中特定信息的密钥。

然后,你将进入 Cozy 的主页,显示已安装的应用程序。操作类似于智能手机——你进入市场(标签 + 应用),并安装现有的应用程序或你构建的应用程序(如果它们已经在 GitHub 仓库中)。

CozyCloud 应用开发的一个重要方面是,Cozy 是一个 PaaS,这意味着应用程序的开发不依赖于 SDK(如 Android 或 iPhone 应用程序)。你可以像往常一样创建一个 Web 应用程序,并将其部署到 Cozy 或其他任何地方!

注意

如果你希望编写有关 Cozy 的文档,一个好的起点是 github.com/cozy/cozy-setup/wiki。该页面包含与开发相关的资源。

OpenStack

OpenStack 是一款自由软件,允许构建私有和公共云。OpenStack 不仅是软件,还是一个社区和项目,旨在帮助组织实现自己的云。OpenStack 由一系列由社区维护的软件和开源项目组成,其中包括 OpenStack Compute(名为 Nova)、OpenStack Object Storage(名为 Swift)、OpenStack Image Service(名为 Glance)等许多组件,且随着每次新版本发布,组件数量不断增加。

用户主要以IaaS基础设施即服务)的方式进行部署。该技术由一组互联的项目组成,这些项目控制着数据中心中处理、存储和网络资源的池,这些资源通过多个工具(如基于 Web 的仪表盘、命令行工具,甚至 RESTful API)由用户进行管理。

Canonical 提供了一个完全集成且优化的最新版本的 Ubuntu Server 和 OpenStack 的组合,允许用户通过 Ubuntu OpenStack 获得最佳的用户体验。根据 2014 年 11 月进行的 OpenStack 用户调查:

64% 的生产 OpenStack 云运行在 Ubuntu 上。

Canonical 提供了一套有用的工具。当与 OpenStack 配合使用时,它们能赋予 OpenStack 更多维度。在本节中,我们将首先介绍这些工具。然后,我们将继续查看如何在 Ubuntu Server 上安装 OpenStack。

OpenStack 工具

如前所述,Ubuntu 是全球最受欢迎的 OpenStack 操作系统。Ubuntu 提供了一套创新的工具和程序,帮助用户以最简单和最快的方式构建企业级云。

Juju

Juju,也意味着魔法,是由 Canonical 主要为云计算开发的服务编排管理工具。Juju 专注于服务。它以一种简单快捷的方式提供软件部署的新概念,并且可以在大量云基础设施上进行集成和扩展。Juju 的主要组成部分之一称为 Charms,可以用任何可以从命令行执行的编程语言编写。

MAAS

Metal as a ServiceMAAS)的概念是由 Canonical 创建的,旨在提供一个系统,可以简化设置物理硬件的任务,您可以在其中像 Ubuntu 的 OpenStack 云基础设施一样部署复杂可伸缩的服务。

MAAS 负责准备新节点,安装 Ubuntu 镜像,配置并使其功能正常。此外,它还检查硬件特定的任务,例如烧录测试、固件和 RAID 升级。

MAAS 和 Juju 的组合将通过将旧硬件回收再利用,为您的基础设施的其他部分注入新的生命。

Landscape

Ubuntu Server 下的云计算官方管理工具是 Landscape。它是 Ubuntu OpenStack 组合中最强大的工具之一。它是一个功能丰富的基于 Web 的 GUI,允许用户在几分钟内轻松构建其云,实时监控并以最有效的方式进行管理。

LXD

LXD,也被称为 Linux 容器超级监控程序,是由 Canonical 提供的下一代超级监控程序。它将容器的密度与虚拟机的可管理性结合在一起。LXD 简化了在联网和安全环境中部署和运行虚拟机的过程,具有高扩展性和互操作性的可能性。

Snappy

Snappy 是由 Canonical 提供的基于云的操作系统,基于 Ubuntu Server。它专为物联网IoT)设备设计。Snappy Ubuntu Core 与标准 Ubuntu 系统的区别在于,应用程序通过更简单、更快速的机制提供,并且最重要的是,它为应用程序提供了更强大的安全保证,使其成为 Docker 和其他云部署框架的理想选择。

OpenStack 设置

精通 OpenStack,从其设置、配置和管理,到故障排除和维护,这些都是需要通过数百页的书籍来解释的主题。在本节中,我们没有足够的空间详细介绍所有这些内容。因此,我将尝试让您略知一二。我们将探索在 Ubuntu Server 上两种方式设置 OpenStack 云的主要步骤——手动安装和基于 DevStack 的安装。

使用 DevStack 安装 OpenStack

DevStack 是一个脚本,可以快速创建 OpenStack 开发环境,或展示 OpenStack 服务并提供从 CLI 使用它们的示例。它从一个简单的演示工具发展为 OpenStack 安装的一个有用、快速的有效性检查工具。

DevStack 的使命是提供并维护用于从源代码(git 仓库的主分支或特定分支)安装中央 OpenStack 服务的工具,适用于开发和操作测试。它还演示并记录了配置和运行服务以及使用命令行客户端的示例。

以下是使用 DevStack 安装 OpenStack 所需的步骤:

  1. 安装所选操作系统。在我们的案例中,它是 Ubuntu Server 15.04。

  2. 使用以下命令下载 DevStack:

    git clone https://git.openstack.org/openstack-dev/devstack
    
    
  3. devstack 仓库包含一个安装 OpenStack 的脚本和配置文件的模板。

  4. 配置你的环境。你可以参考docs.openstack.org/developer/devstack/configuration.html获取更多细节。

  5. 使用以下命令开始安装:

    cd devstack; ./stack.sh
    
    

执行前面的命令需要几分钟时间。我们建议你在安装过程中阅读前面的脚本。

注意

你可以在docs.openstack.org/developer/devstack/找到许多指南。

手动安装

手动安装实际上是最适合你的,如果你想部署一个真正的云而不仅仅是测试 OpenStack 的功能。我们可以在一台机器上安装云,但 Canonical 建议你至少使用七台机器,每台机器有两块硬盘,并且其中两台必须有两个网络接口NICs)。

注意

如果你只想在单个 Ubuntu Server 上设置 OpenStack,并且基于 14.04 LTS 或 15.04 版本,可以参考fosskb.wordpress.com/2015/04/18/installing-openstack-kilo-on-ubuntu-15-04-single-machine-setup/的教程。

然而,如果你希望根据 Canonical 的建议建立一个真正的云,以下是一个简要总结,列出了如果你希望在 Ubuntu 服务器上运行自己的 Cloud OpenStack 所需的步骤:

  1. 首先,你需要在一台有两个网络接口的机器上安装 Ubuntu Server。然后,你需要设置一个包含所有机器的私有网络,并将网络划分为以下三个逻辑范围:

    • 动态范围将一个 IP 地址映射到每个连接到网络的网络接口卡(NIC)。

    • 静态范围将一个 IP 地址映射到每台连接到网络的机器。

    • 浮动 IP 范围将一个 IP 地址映射到你在云中将拥有的每个实例。

  2. 其次,您需要通过以下命令将所需的仓库添加到您的源列表并更新软件包列表:

    sudo add-apt-repository ppa:juju/stable
    sudo add-apt-repository ppa:maas-maintainers/stable
    sudo add-apt-repository ppa:cloud-installer/stable
    sudo apt-get update
    
    
  3. 接下来,如果您想设置 MAAS,您需要运行以下命令:

    sudo apt-get install maas
    
    
  4. 现在,按照以下逐步指令操作:

    • 访问http://<maas_ip_address>/MAAS/并按照页面提供的指示创建管理员的配置文件。然后,使用这些凭据登录。

    • 导入 Ubuntu 的磁盘映像。

    • 通过访问http://<maas_ip_address>/MAAS/account/prefs/将 SSH 密钥添加到您的用户配置文件中。

    • 复制 MAAS 密钥(稍后需要)。

    • 在为每个网络接口卡(NIC)自动创建的网络中,填写其他详细信息,例如网关和 DNS。

    接下来,您需要配置 MAAS 集群,具体操作如下:

    • 点击集群标签并选择集群主节点

    • 您将看到机器上的网络接口列表。点击连接到显示所有节点的私有网络接口旁边的编辑图标。

    • 设置该接口以管理 DHCP 和 DNS。

    • 将路由器 IP 设置为该私有网络的默认网关。

    • 填写动态和静态范围的详细信息;记住您应该为浮动 IP 留出空隙。

    • 保存更改。

    现在,您需要列出并配置机器,具体操作如下:

    • 确保所有机器设置为预启动执行环境PXE)启动。如果可能,请在 BIOS 中禁用其他所有启动选项,包括本地磁盘。

    • 通过启动机器来列出它们。这通常可以通过某种虚拟控制台完成。它们将全部出现在 MAAS 的节点列表中,之后可以再次关闭电源。

    • 编辑节点列表中的每台机器,填写电源类型和电源参数(即用户名和密码),以便 MAAS 可以根据需要开启或关闭它们。

    • 选择所有机器,并通过批量操作下拉菜单配置它们。

    • 等待直到所有机器都完成配置(即处于Ready状态)。

  5. 此时,您需要设置Landscape并通过以下命令启动 OpenStack 的自动化

    sudo apt-get install openstack
    sudo openstack-install
    
    
  6. 选择Landscape OpenStack 自动化选项。

  7. 使用在设置 MAAS 时保存的 MAAS 密钥填写 MAAS 凭据。

  8. 打开链接以访问 Landscape UI。

  9. 解决清单上的剩余问题。最后,点击配置按钮。

  10. 访问指定的 URL,进入 Landscape UI 的登录页面。

  11. 登录页面底部包含一个清单,显示所有资源的状态。验证所有资源是否显示绿色,以确认您的基础设施健康状态。

  12. 点击配置并为您的区域和云输入一个可选名称。

  13. 选择以下组件(这是初步列表;更多选项将在后续版本中添加,前提是它们通过了 OpenStack 互操作性实验室的测试):

    • 虚拟化组件(KVM)

    • 网络组件(Open vSwitch)

    • 存储组件:

      对象存储(Ceph, Swift)

      块存储(Ceph, iSCSI)

  14. 选择需要部署云计算的硬件,并点击保存选择

  15. 点击安装以构建你的云计算环境。

  16. 最后,开始使用你的云计算!

总结

在本章中,我们重点介绍了 Ubuntu Server 最有趣的功能之一——虚拟化和云计算。此时,你可以在 Ubuntu 服务器上定义并轻松使用与此主题相关的一整套程序。

在下一章中,我们将发现一些有用的小技巧,帮助 Ubuntu 系统管理员简化工作。

第六章. Ubuntu 服务器的技巧和窍门

这是本书的最后一章。在本章中,我们将查看一些每个 Ubuntu 服务器管理员在管理基于 Ubuntu 的服务器时,简化工作所需的最佳技巧和窍门。

本章分为以下三个部分:

  • 通用技巧 – 一套与 CLI、配置和脚本相关的通用技巧

  • 故障排除技巧 – 有助于故障排除任务的实用技巧

  • 实用工具和工具集 – 一套对系统管理员极有价值的复杂程序

通用技巧

本节将探讨一些有用的 Ubuntu 服务器技巧和窍门。这些是与命令行界面CLI)、软件包管理和配置定制相关的通用技巧。

Ubuntu 服务器命令行界面技巧和窍门

以下是一些有用的 CLI 命令:

  1. 通过使用以下命令,获取安装软件包的原因,即检查给定软件包的反向依赖关系:

    apt-cache rdepends --installed [package_name]
    apt-cache rdepends --installed mysql-server
    
    
  2. 执行以下命令列出所有用户及其最后登录时间:

    lastlog
    
    
  3. 要更改服务器时区,你需要运行以下代码:

    sudo dpkg-reconfigure tzdata
    
    

    此外,要检查timezone是否已更改,你需要运行以下命令:

    less /etc/timezone
    
    

    另外,不要忘记重启cron,以便它能够识别timezone的更改,如下所示:

    sudo service cron restart
    
    
  4. 如果你需要手动同步服务器时间,请使用以下命令:

    sudo ntpdate ntp.ubuntu.com
    
    
  5. 如果你想安装时间同步服务,请执行以下命令:

    sudo apt-get install ntp
    
    
  6. 要更新硬件时钟,请运行以下命令:

    hwclock --set --date '`date`'
    
    
  7. 要列出服务器上所有已挂载和未挂载的分区,请使用以下命令:

    sudo fdisk -l | less
    
    
  8. 如果你只想列出已挂载的分区及每个分区的空闲空间,请使用以下命令:

    df -h
    
    
  9. 使用以下代码查看特定文件或文件夹的大小(在查看文件夹大小时非常重要):

    du -h myfile
    du -sh myfolder
    
    
  10. 随着文件的增大,你可以使用以下代码查看追加的数据(这对于监控和故障排除非常有用):

    tail -f filename
    less +F filename
    
    
  11. 通过使用以下命令获取系统环境变量:

    printenv
    
    
  12. 要更改服务器主机名,请执行以下代码:

    sudo sh -c "echo new_host_name > /etc/hostname"
    sudo /etc/init.d/hostname restart
    
    
  13. 要查看有关 Linux 发行版的信息,你需要执行以下命令:

    lsb_release -a
    
    
  14. 要查看操作系统的安装日期,请运行以下命令:

    ls -ld /var/log/installer
    
    

如何防止服务器守护进程在安装过程中启动

在某些情况下,我们不希望在通过apt-getdpkg安装更新时,服务器或守护进程作为后安装脚本的一部分启动。为达到这个目标,你需要在/usr/sbin/目录下创建一个名为policy-rc.d的文件,并将以下内容放入其中:

#!/bin/sh
exit 101

然后,使用以下命令赋予其755权限:

chmod 755 /usr/sbin/policy-rc.d

完成后,别忘了使用以下命令删除这个文件:

rm -f /usr/sbin/policy-rc.d

如何移动或复制目录

cp(复制)命令仅适用于文件。要复制目录,您需要使用-r递归标志,如下所示:

cp -r input_directry destination_directory

mv(移动)命令的工作方式相同。您需要使用-r递归标志来移动目录,如下所示:

mv -r input_directry destination_directory

系统资源限制

Ubuntu Server 的默认行为是不会对用户进程施加资源限制。这意味着用户可以自由使用机器上的所有可用内存,或启动一个无限循环的进程,从而使系统在几秒钟内变得无法使用。解决这个问题的最佳方法是通过以下命令编辑/etc/security/limits.conf文件来限制某些用户资源:

sudoedit /etc/security/limits.conf

文件的内容解释得很清楚。此外,对于该文件的配置,有一个很好的man页面:

man limits.conf

对于磁盘配额,您需要安装配额包,正如本书前面的章节所讨论的那样。

一遍又一遍地运行命令

有时我们需要一遍又一遍地运行相同的命令,要么监控一个操作的进度或复制一个文件,要么排查服务器的状态。虽然您可以一遍又一遍地运行相同的命令,但更好的方法是使用watch命令。watch程序将命令作为参数,然后每两秒运行该命令一次,将其输出显示在屏幕上。因此,例如,如果我们想监控ubuntu.iso的大小,可以输入watch "ls -l ubuntu.iso"watch命令接受一些参数,例如-n参数,可以调整它在重新运行程序之前等待多少秒。

故障排除提示

本节中,您将找到与任务故障排除相关的高级技巧。这些对于大多数 Ubuntu Server 管理员来说是必备的。

在 Ubuntu Server 上自定义日志轮转

故障排除问题的最佳起点是阅读相关的服务日志。日志不会无限期保存,它们会存储在系统上,并遵循特定的策略。经过一段时间后,最旧的日志会被删除。因此,我们只保留一些最新的日志文件。这就叫做日志轮转;在 Ubuntu Server 上,它在两个层面上完成。通用策略配置在/etc/logrotate.conf文件中,而某些服务的特定策略配置在/etc/logrotate.d/目录下的特定文件中。

这个特定文件,名为/etc/logrotate.d/*,没有注释,而/etc/logrotate.conf通用文件注释丰富且非常清晰,语法与特定文件相同。man页面也有很好的文档,可以通过执行以下命令查看:

man logrotate

这些文件中默认存在的一些参数如下:

  • 日志轮转的周期性,可以设置日志轮转的周期为每日、每周、每月等。

  • 每个日志文件的生命周期,即日志文件在系统中保存的时间(直到被删除),以周为单位,并与 rotate 参数相关联。

  • 压缩日志文件的选项 旨在通过使用 compress 参数节省空间。

以下是一些可以手动添加的其他参数:

  • delaycompress 参数将上一日志文件的压缩推迟到下一个轮换周期,从而允许用户轻松查看上周的日志,而无需解压缩。

  • dateex 指令将默认的回溯文件名称从默认行为(以数字命名文件:logname.0logname.1logname.2 等)更改为包含 YYYYMMDD 日期模式,而不是 0、1、2 等。

主要系统日志文件

系统日志文件是每项故障排除任务的支柱。仔细查看这些文件通常可以让系统管理员提前发现系统中出现的问题,并在问题扩大之前解决大多数问题。

通常,日志文件存储在 /var/log 目录下;对于已经运行一段时间的服务器,该目录中会有大量的旧日志文件,并且大多数文件都使用 gzip 压缩。

以下是一些值得注意的日志文件:

  • 一般系统日志:/var/log/syslog

  • 系统认证日志:/var/log/auth.log

  • 系统邮件日志:/var/log/mail.log

  • 一般日志信息:/var/log/messages

  • 内核环形缓冲区信息,通常在系统启动时:/var/log/dmesg

检查打开的文件

在故障排除过程中,有时我们需要检查特定的文件(检查哪个进程正在运行并且正在打开它),或者检查特定的文件系统(哪些文件已打开并且是用于哪些操作)。这些信息由 lsof 命令提供。在 lsof 输出中,你会看到所有进程的列表,包括它们在文件系统上打开的文件、进程 ID、用户以及分配给它们的资源大小。

从 /proc 获取信息

排查 Ubuntu 服务器问题的一个良好起点是获取有关进程、硬件设备、内核子系统和其他 Linux 属性的信息。这可以通过 /proc 文件来实现。

/proc 目录中的文件获取信息可以通过使用 cat 命令简单完成。在 /proc 下,你会看到每个正在运行的进程都有一个独立的目录(每个进程的名称为其 PID),该目录包含有关该进程的信息。你还会找到包含计算机 CPU、软件版本、磁盘分区、内存使用情况等各种测量数据的 /proc 文件。

下面是一些示例,展示了你可以从 Ubuntu 系统的 /proc 目录中获取的信息:

  • 要显示启动提示中使用的选项,请运行 cat /proc/cmdline

  • 要显示与服务器处理器相关的信息,请运行cat /proc/cpuinfo

  • 要显示现有的字符设备和块设备,请运行cat /proc/devices

  • 要显示磁盘、分区及统计信息,请运行cat /proc/diskstats

  • 要列出当前内核中的文件系统类型,请运行cat /proc/filesystems

  • 要显示物理内存地址,请运行cat /proc/iomem

  • 要显示虚拟内存地址,请运行cat /proc/ioports

  • 要显示 1 分钟、5 分钟和 15 分钟的负载平均值,以及正在运行的进程/总进程和最高的进程识别号PID),请运行cat /proc/loadavg

  • 要显示可用的 RAM 和交换内存,请运行cat /proc/meminfo

  • 要显示加载的模块、内存大小、已加载的实例、依赖关系加载状态和内核内存,请运行cat /proc/modules

  • 要显示挂载的本地/远程文件系统信息,请运行cat /proc/mounts

  • 要显示挂载的本地磁盘分区,请运行cat /proc/partitions

  • 要显示 RAID 状态(使用 RAID 软件时),请运行cat /proc/mdstat

  • 要显示系统启动以来的内核统计信息,请运行cat /proc/stat

  • 要显示交换空间的信息,请运行cat /proc/swaps

  • 要显示内核版本及相关编译器,请运行cat /proc/version

在 Ubuntu 服务器上恢复 root 密码

有时,服务器管理员会忘记 root 密码。在 Ubuntu 服务器上,可以通过在称为单用户模式的特定模式下启动系统来恢复 root 密码,这也叫做运行级别 1恢复模式

所以,第一步是通过使用 GRUB 菜单进入该模式。通常,在 Ubuntu 服务器上,你会自动找到此选项(它在 GRUB 条目名称后面的小括号内带有Recovery Mode标签)。如果不是这种情况,使用 GRUB 手动编辑启动时提议的菜单条目,在你想要的引导条目的末尾添加单词“single”。

内核应该像往常一样启动,但你会看到一个 root 提示符(sh#),而不是普通的提示符(sh$)。

到此为止,我们已经获得了对文件系统的 root 访问权限。我们可以最终更改密码。现在你拥有 root 权限,修改密码时不会要求你输入旧密码。因此,在运行以下命令时,你将直接被要求输入新密码及其确认:

# passwd

最后,你可以重新启动机器并再次获得 root 权限。

提示

默认情况下,恢复模式下的文件系统是只读的。需要重新挂载为读/写模式,才能更改 root 密码或进行任何需要写入磁盘的操作。要以读/写访问模式挂载,请输入以下命令:

mount -o remount,rw /

注意空格:如果忽略空格或添加多余空格,将会导致错误。

如果你的/home/boot/tmp或任何其他挂载点在单独的分区上,你可以使用以下命令挂载它们:

mount --all

然而,必须在第一次重新挂载步骤后立即执行此操作,以确保 /etc/mtab 可写。

实用工具和工具

在本节中,我们将看看一些工具和实用程序,帮助 Ubuntu 服务器管理员以最佳方式管理系统,以便系统的可用性达到最大化。

NetHogs,网络监控工具

NetHogs 是一个网络监控工具,帮助你识别消耗带宽的程序。它类似于 top 命令,但用于网络。当你在排查网络问题时,例如 是什么占用了互联网连接?,这个工具非常有用。

启动 nethogs 需要使用 sudo 命令以 root 权限运行,因为它依赖 libpcap 来嗅探网络,像大多数网络监控工具一样。

安装 nethogs 很简单,只需运行以下命令:

sudo apt-get install nethogs

安装后,可以通过以下命令开始使用:

sudo nethogs network_interface_card (by default without using the NIC it will use eth0), for example: sudo nethogs eth1

程序运行后,你可以使用 M 键在以下两种模式之间切换:

  • 实时使用情况

  • 总使用量(不同模式基于大小单位,如 KB、MB 等)

vnStat,网络监控工具

nethogs,我们在上一节中看到的工具,允许你通过在给定日期/时间收集统计信息来实时监控网络带宽使用情况,但如果你希望监控一小时/一天/一周/月的带宽使用情况,它就帮不上忙了。这个棘手的功能由另一个名为 vnStat 的网络监控工具提供。vnstat 守护进程是一组监控网络带宽使用的程序。

要在 Ubuntu 服务器上安装 vnStat,可以使用 apt-get,如下所示:

sudo apt-get install vnstat

vnStat 的配置通过编辑 /etc/vnstat.conf 文件完成;只需不要忘记重启 itwith,如下所示:

sudo /etc/init.d/vnstat restart

要启动 vnStat 守护进程,请执行 vnstatd 命令

在使用此工具之前,你需要等待一段时间以收集数据,然后运行 vnstat 命令。

这个工具带有许多有用的选项。你可以通过使用 man 页面来发现它们。以下是最有用的几个:

  • vnstat -h:用于查看每小时使用情况的摘要

  • vnstat -d:用于查看每日使用情况的摘要

  • vnstat -w:用于查看每周使用情况的摘要

  • vnstat -m:用于查看每月使用情况的摘要

  • vnstat -t:显示所有时间内流量前 10 的天数。

  • vnstat -tr 10:显示 X 秒内的使用情况(默认值为 5)

  • vnstat -l:显示实时带宽使用情况

vnStat 是一个非常有用的小工具,如果你想获得按小时/日/周/月计算的带宽使用概况,并且几乎不需要占用任何资源来实现这一点。

使用 multitail 监视多个文件

在许多情况下,系统管理员需要同时查看多个文件。multitail是一个非常方便的 Linux 工具,提供了这一功能。multitail工具让您能够在同一个 shell 中同时查看多个文件。此外,multitail还允许您运行多个命令并查看它们的输出,这简化了系统管理员的工作,特别是在一些高级故障排除任务中。

要安装此工具,您只需运行以下命令:

sudo apt-get install multitail

有很多方法可以使用这个命令。您可以参考man页面,那里有不同的示例,解释如何更好地自定义输出。

程序 cockpit——Ubuntu 服务器的远程管理器

cockpit命令是一个交互式的服务器管理界面。它易于使用且非常轻量级,允许 Ubuntu Server 管理员在一个用户友好的界面中执行许多任务,如存储管理、日志检查、服务管理(启动和停止)等。

要在 Ubuntu Server 上安装cockpit,您需要运行以下命令:

sudo add-apt-repository ppa:jpsutton/cockpit
sudo apt-get update
sudo apt-get install cockpit

要启动cockpit服务,请使用以下命令:

sudo systemctl start cockpit

如果您希望在重启服务器时自动启动cockpit服务,请使用以下命令:

sudo systemctl enable cockpit.socket

最后,要访问cockpit图形界面,请使用以下 URL:

https://<server_ip>:9090

Webmin:著名的系统管理工具

Webmin是最著名的 Unix 管理工具之一。它是一个基于 Web 的界面,提供了大量功能,轻松管理服务器资源,包括:设置用户帐户;管理服务,如 Apache、FTP、DNS 等;共享文件管理;以及其他许多功能。总之,它是一个用户友好的界面。

安装webmin之前,首先需要一个完全正常运行的 LAMP 服务器。在本书的第三章《在 Ubuntu 上部署服务器》中,我们讨论了如何完成这一点。

之后,您需要从 APT 仓库安装webmin。首先,您需要将webmin官方仓库添加到服务器的源列表文件中。这可以通过使用sudo vi /etc/apt/sources.list命令编辑/etc/apt/sources.list文件来完成。然后,向sources.list文件中添加以下行:

deb http://download.webmin.com/download/repository sarge contrib
deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib

完成此操作后,您需要下载GNU 隐私保护GPG)密钥并通过以下命令将其添加到 APT 密钥中:

wget http://www.webmin.com/jcameron-key.asc
sudo apt-key add jcameron-key.asc

接下来,通过以下命令更新源列表:

sudo apt-get update

最后,通过以下命令安装webmin

sudo apt-get install webmin

要访问webmin,您需要访问https://<server_ip>:10000

使用 uvtool 程序并扩展 Cloud 镜像的使用

uvtool 程序由 Canonical 提供,供那些希望在云基础设施外部使用已经准备好的 Cloud 镜像来创建虚拟机的 Ubuntu 管理员使用,无需完整安装云服务器。这大大简化了使用 Cloud 镜像生成虚拟机的任务。

安装 uvtool 很简单,只需使用以下命令:

sudo apt-get -y install uvtool

注意

有关使用 uvtool 查找和同步 Cloud 镜像、创建和管理虚拟机以及该强大工具提供的其他功能的详细信息,可以参考官方的丰富文档,网址为 help.ubuntu.com/lts/serverguide/cloud-images-and-uvtool.html

总结

在本书的最后一章,我们回顾了 Ubuntu Server 管理员需要掌握的一些最佳技巧和方法,帮助他们以简便、高效、强大的方式管理 Ubuntu 服务器。到此为止,你已经掌握了必要的知识和技能,可以在信息通信技术(ICT)领域最优秀的操作系统之一上翱翔。

posted @ 2025-07-05 15:46  绝不原创的飞龙  阅读(67)  评论(0)    收藏  举报