第四章:启动过程

引导过程本身分为三个主要部分:加载程序、单用户启动、多用户启动。

上电

计算机需要足够的大脑来查找和加载其操作系统。这个工作由BISO或UEFI来完成。

BIOS和UEFI的目标都是让你的系统进入FreeBSD加载器。

UEFI

UEFI在引导驱动器中搜索标记为UEFI引导分区的分区。该分区仅包含一个具有特定目录和文件布局的FAT文件系统。

UEFI执行文件/EFI/BOOT/BOOTX64.EFI。该文件可能是一个花俏的多操作系统引导加载程序,也可能直接将你转储到操作系统中。

在FreeBSD中,UEFI引导会启动引导加载程序/boot/loader.efi。

BIOS

BIOS搜索标记为活动的磁盘分区,然后执行该分区的第一部分。

对于FreeBSD,这部分数据称为加载器——loader。每个FreeBSD系统都有一个加载器的参考副本,名为/boot/loader。

BISO有各种各样的限制。引导加载程序必须位于磁盘的一个非常特定的部分。BIOS无法从大于2.2TB的磁盘启动。目标引导加载程序必须小于512KB。安装的加载程序是二进制文件,而不是文件系统,因此即使是微小的更改也需要重新编译。

加载器

loader或叫boot blocks,加载FreeBSD内核,并在启动该内核之前想你提供一个菜单。loader(8)程序在左侧提供七个选项的菜单。新的FreeBSD系统提供了以下选项:

  1. Boot Multi User [Enter]——常规启动
  2. Boot Single User——单用户模式是一种最小启动模式,对受损系统非常有用。
  3. Escape to loader prompt——加载器包括一个命令行解释器,你可以在其中发出命令来调整你的系统,使其完全按照你的方式启动。
  4. Reboot——重启
  5. Kernel: default/kernel (1 of 2)
  6. Configure Boot Options…
  7. Select Boot Environment…

十秒后加载器会自动启动FreeBSD。

单用户模式

该模式加载内核并查找设备,但不会自动设置文件系统、启动网络、启用安全性或运行任何标准Unix服务。

单用户模式是系统最早可以给你一个命令提示符的模式。

如果配置错误的守护进程挂起启动,你可以进入单用户模式以阻止其启动;如果你丢了root密码,你可以启动到单用户模式来更改它。如果你需要洗牌关键的文件系统,同样可以在单用户模式进行操作。

当进入单用户模式后,内核提供了选择shell的机会,通常建议使用默认的/bin/sh。

单用户模式中的磁盘

在单用户模式下,根分区以只读方式挂载,不挂载其他磁盘。你要使用的许多程序都在根目录以外的分区上,因此你希望它们都以读写方式挂载并且可用。

执行此操作的方式因你使用的是UFS还是ZFS而异。

单用户模式下的UFS

要使文件系统表/etc/fstab中列出的所有文件系统可用,请运行以下命令:

fsck(8)程序清理文件系统,并确认它们在内部是一致的,并且磁盘认为它拥有的所有文件实际上都存在并被记录下来。

根文件系统是以自读方式挂载的。无论是什么促使我们进入单用户模式,都可能需要更改根文件系统。以读写方式重新挂载根文件系统。

最后-a标志mount(8)激活/etc/fstab中列出的每个文件系统。如果其中一个文件系统有问题,你可以通过在命令行上指定它们来单独挂载所需的文件系统。如果你是配置了NFS文件系统的高级用户,此时你将看到这些文件系统的错误消息,因为网络尚未启动。如果主机在/etc/fstab中有网络文件系统,则只挂载UFS系统,如下所示。

如果按名称挂载分区有问题,请尝试使用设备名称。根分区的设备名称可能是/dev/ada0s1a。你还需要为此分区指定一个挂载点。例如,要以root身份挂载第一个IDE磁盘分区,请输入以下命令:

如果服务器上有网络文件系统,但网络尚未启动,则可以通过指定文件系统类型来挂载所有本地分区。在这里,我们挂载所有UFS类型的本地文件系统,这是FreeBSD的默认文件系统类型:

现在,您可以访问UFS文件系统。

单用户模式下的ZFS

要使所有ZFS数据集可用,请使用zfs mount命令。你可以按名称挂载单个数据集,也可以使用-a选项挂载标记为可挂载的所有数据集:

ZFS将在挂载数据集之前执行其通常的完整性检查。

大多数数据集将与多用户模式下完全一样可访问,但作为根挂载的数据集仍将是只读的。关闭它。在这里,我在默认的FreeBSD安装上将根数据集设置为读写。

现在可以更改文件系统。

单用户模式下可用的程序

可供您使用的命令取决于挂载的分区。一些基本命令在/bin和/sbin中的根分区上可用,即使根以只读方式挂载,它们也是可用的。其他分区位于/usr中,在您挂载该分区之前无法访问。

如果你打乱了共享库系统(见第17章),这些程序都无法运行。FreeBSD在/rescue目录中提供了许多核心实用程序的静态链接版本。

单用户模式下的网络

如果你想在单用户模式下进行网络连接,请使用shell脚本/etc/netstart。此脚本调用相应的脚本来启动网络,为接口提供IP地址,并启用数据包过滤和路由。如果你想要这些服务中的一些,但不是全部,你需要阅读shell脚本并手动执行相应的命令。

用于单用户模式

在单用户模式下,你对系统的访问仅受FreeBSD和Unix知识的限制。

例如,如果你忘记了root密码,可以从单用户模式重置它:

此时使用passwd修改密码时,是不会要求提供旧密码的。

或者,如果你发现/etc/fstab中有一个拼写错误,会混淆系统并使其无法启动,你可以用设备名称挂载根分区,然后编辑/etc/fstab来解决这个问题。

如果你有一个程序在启动时使系统死机,你需要停止该程序再次启动,你可以编辑/etc/rc.conf来禁用该程序,或者设置启动脚本的权限,使其无法执行。

所有这些例子都涉及从人为错误中恢复是有原因的。硬件故障并不常见,FreeBSD的故障就更少了。如果不是人为错误,我们的计算机几乎永远不会让我们失望。随着你对FreeBSD的了解越来越多,你在单用户模式下的能力也会越来越强。

要成为一名成功的系统管理员,您需要了解单用户模式,我们将在本书中引用它。不过,现在让我们看看加载器提示符。

加载器提示符

加载器提示符允许你对计算机的引导环境和在引导过程早期必须配置的变量进行基本更改。

这不是一个类Unix环境,它很狭窄,只支持最小的功能集,当你跳到加载器提示符时,你会看到以下内容:

这是加载器提示。虽然“OK”这个词可能很友好,令人放心,但它是加载器环境中为数不多的友好事物之一。这不是一个功能齐全的操作系统;它是一个用于配置系统启动的工具,既不适合无知的人,也不适合胆小的人。在加载器提示符下所做的任何更改都只会影响当前的启动。要撤消更改,请再次重新启动。(我们将在下一节中看到如何使加载器更改永久化。)

要查看所有可用命令,请输入问号:

许多加载器命令对除开发人员之外的任何人都没有用,因此我们将重点介绍对系统管理员有用的命令。

查看磁盘

要查看加载器知道的磁盘,请使用lsdev:

加载器检查CD驱动器➊,但没有找到。(只有从CD启动时,加载器才会找到CD驱动器,所以不要为此感到惊慌。)它会找到一个硬盘驱动器,BIOS称之为驱动器C➋。然后它会描述该硬盘驱动器上的分区。正如我们将在第10章中看到的,GPT分区用字母p和数字标识分区。分区disk0p1➌是一个FreeBSD引导分区,用于从BIOS引导FreeBSD。您可能会发现这些知识对启动有困难的陌生系统很有用。加载器还可以识别主机上的ZFS池➍。

加载器变量

加载器在内核内和配置文件中设置了变量。使用show命令查看这些变量及其设置,并使用空格键前进到下一页。

这些值包括低级内核可调项和从硬件BIOS或UEFI收集的信息。我们将在下面的“加载器配置”中看到加载器变量的部分列表,并在本书的相应章节中提出其他值。

您可以按名称显示特定变量。遗憾的是,您无法显示关键字的所有子变量。像show acpi.em这样的命令可以工作,但show acpi或show acpi.*不能。

使用set命令更改单次启动的值。例如,要将控制台设置更改为comconsole,您需要输入:

加载器允许您更改真正不应该更改的变量。将acpi.revision设置为4不会突然将您的系统升级到acpi版本4,并且您无法使用软件设置更改硬盘。

重启

你不是有意进入装载机吗?重新开始。

从加载器启动

现在您已经调整了系统的低级设置,您可能想启动系统。使用boot(8)命令。您可以使用手册页中讨论的引导标志进一步调整引导。

一旦你的系统按照你需要的方式启动,你可能想让这些设置永久化。FreeBSD允许您通过加载器配置文件来实现这一点。

加载器配置

使用配置文件/boot/loader.conf使加载程序设置更改永久化。此文件中的设置在系统启动时直接输入到引导加载程序中。当然,如果你喜欢每次系统启动时都在主机前,那么就不用费心了!

加载器有一个默认配置文件/boot/defaults/loader.conf。我们在这里覆盖了许多值。

如果你查看默认的加载器配置,你会看到许多类似于加载器中列出的变量的选项。例如,在这里我们可以设置控制台设备的名称:

在FreeBSD文档中,您将看到对启动时可调参数和加载程序设置的引用。所有这些都在loader.conf中设置,其中包括许多sysctl值,一旦系统启动,这些值就是只读的。(有关可调参数和sysctls的更多信息,请参阅第6章。)在这里,我们强制内核变量kern.maxusers为32:

其中一些变量在loader.conf中没有设置特定的值;相反,它们显示为空引号。这意味着加载器通常允许内核设置此值,但如果你想覆盖内核的设置,你可以。

内核知道kern.nbuf的值应该是什么,但如果必须的话,你可以让加载器指定一个不同的值。

我们将在适当的部分讨论通过引导加载程序进行系统调优——例如,内核值将在第6章中讨论,在那里它们会有类似的意义——但这里有一些常用的加载程序值,它们会影响加载程序本身的外观和操作以及基本的引导功能。随着FreeBSD的成熟,开发人员引入了新的加载器值并更改了旧加载器的功能,因此请务必在安装时检查/boot/defaults/loader.conf以获取当前列表。

boot_verbose="NO"

此值切换您可以通过引导菜单访问的详细引导模式。在标准引导中,内核在识别系统硬件时打印出关于每个设备的一些基本注释。在详细模式下启动时,内核告诉每个设备驱动程序打印出关于每个设备的所有信息,并显示与内核相关的各种设置详细信息。详细模式对于调试和开发很有用,但通常不适合日常使用。

autoboot_delay="10"

此值表示从显示启动菜单到自动启动之间的秒数。我经常把这个时间调低到2到3秒,因为我希望我的机器能尽快启动。

beastie_disable="NO"

此值控制启动菜单的外观(最初,BSD“Beastie”吉祥物的ASCII艺术图像装饰启动菜单)。如果设置为“YES”,则不会出现启动菜单。

loader_logo="fbsdbw"

此值允许您选择哪个徽标显示在启动菜单的右侧。fbsdbw选项为您提供ASCII艺术中的默认FreeBSD徽标。其他选项包括beastiebw(原始徽标)、beastie(彩色徽标)和none(无徽标)。

启动选项

启动菜单还提供了三个选项:选择内核、设置引导选项、选择引导环境。

此处仅做一些指导。

一个主机的/boot目录中可以有多个内核。点击Kernel选项告诉加载程序在可用选项之间循环。要使内核显示为选项,请在loader.conf的kernels变量中列出它:

菜单仅识别以/boot/kernel开头的目录中的内核。如果你在/boot/gerbil中有一个内核,你必须从加载器提示符加载它。

FreeBSD支持多种启动选项。选择“Configure Boot Options"项将显示最受欢迎的选项。

Load System Defaults

你搞砸了你的设置,想撤消所有这些吗?选择这个。您至少可以将系统引导到单用户模式并修复loader.conf。

ACPI Support

ACPI是高级配置和电源接口,是英特尔/东芝/微软的硬件配置标准。它取代并包含了一大堆模糊的标准。ACPI已经成为标准多年了,但如果某个特定的硬件在运行FreeBSD时遇到问题,你可以将其关闭,看看会发生什么。如果你想尝试这个选项,也请阅读第24章并提交一份错误报告。

Safe Mode

FreeBSD的安全模式几乎打开了操作系统中的所有保守选项。它关闭了硬盘上的DMA和写缓存,限制了它们的速度,但提高了它们的可靠性。它关闭ACPI。32位系统禁用SMP。USB键盘不再在安全模式下工作。此选项对于调试旧硬件很有用。

Verbose

FreeBSD内核在启动时探测每一块硬件。发现的大部分信息与日常使用无关,因此引导加载程序不会显示它。当您在详细模式下引导时,FreeBSD会打印出有关每个系统设置和连接设备的所有详细信息。稍后将在/var/run/dmesg.boot中提供这些信息,如下一节所述。我鼓励您在新机器上尝试详细模式,只是为了了解系统的复杂性。

最后,选择引导环境选项允许您在ZFS引导环境之间进行选择,如第12章所述。

启动消息

启动FreeBSD系统时会显示消息,指示连接到系统的硬件、操作系统版本以及各种程序和服务启动时的状态。当您首次安装系统和进行故障排除时,这些消息很重要。引导消息总是以相同的方式开头,并附有一份声明,列出了FreeBSD项目和加州大学董事会的版权:

此外,您还会收到启动FreeBSD版本的通知,以及编译日期和时间以及使用的编译器。您还可以看到是谁编译了这个内核,它是在什么机器上构建的,甚至可以看到这个内核是在文件系统的哪个位置构建的。如果你构建了大量的内核,在试图准确识别可用的系统功能时,这些信息可能是无价的。

内核将在整个引导过程中打印出诊断消息。前面的消息意味着我在这个特定的内核中启用了调试和故障识别代码,因此我的性能将受到影响。在这种情况下,我不关心对性能的影响,原因稍后会变得清楚。

此消息标识特定的硬件。计时器或硬件时钟是一种特殊的硬件,虽然你的计算机需要一个,但它是一个低级设备,最终用户真的无法直接使用它。偶尔,您会看到这样的消息,针对用户不直接可见但对系统至关重要的硬件。启动信息在显示太多细节和掩盖可能至关重要的细节之间摇摆不定。例如,它还将显示有关系统中CPU的所有信息:

你可能不知道一个简单的CPU可以有这么多细节和功能,是吗?但是,当您提交高级功能不起作用的故障报告时,开发人员可能会询问您的CPU是否具有特定功能。

这就是为什么我不担心前面显示的WITNESS选项会对性能造成影响:这个盒子非常快➊,支持一系列对现代CPU➋很重要的功能。虽然我当然想要我支付的所有性能,但我也想在出现任何问题时及时发现。我希望能够就这些问题提交好的bug报告,这样开发人员就会听取我的问题报告。毕竟,这就是为什么我运行的FreeBSD开发版本启用了WITNESS!

在这里,内核宣布它找到了所有八个CPU内核,并准备好管理它们。我有多余的CPU能力和相当多的内存。

实际内存➊是物理上安装在计算机中的RAM量,而可用内存➋是加载内核后剩余的内存量。我有31669MB的RAM➌可用于实际工作,这足以满足这个系统的负载。

这是一个相当典型的设备条目。这个设备被称为ioapic,内核发现这个硬件是2.0版本,并且有与之相关的额外信息➋。更重要的是,我们发现了两个这种类型的设备,编号为0➊和1➌。(所有设备都从零开始编号。)您可以通过阅读设备驱动程序的手册页来了解有关该设备的更多信息。几乎所有(但并非所有)设备驱动程序都有手册页。

并非所有设备驱动程序都在一行上打印所有信息。在这里,我们有一个设备usbus,它只占用一个设备实例的三条线路。要知道这是一条USB总线而不是三条单独的总线,唯一的方法就是检查设备的编号。所有这些都是针对设备编号0的,所以它是一个单一的设备。

引导消息的一个有趣之处是,它们显示了计算机的组件是如何相互连接的。这里,我们有pci0➊,一个直接在主板上的PCI接口。然后,有pcib8➋,连接到pci0➌的PCI桥8号。我们还发现PCI总线pci8➍连接到该PCI桥➎。继续阅读时,您会发现连接到该总线的各个设备。您现在可能没有足够的能力使用这些信息,但您会发现,当您必须解决问题时,提供这些信息将非常有价值。

此条目显示了em0,一种em(4)➊类型的网卡,并表示该卡讲千兆以太网➋。我们还看到了有关其内存地址、IRQ和PCI总线连接的各种信息。

计算机上的每个设备都有一个或多个这样的条目。总的来说,它们以合理的细节描述了您的计算机硬件。如果你在详细模式下启动,你会看到更多的细节——可能比你想要的要多得多。

FreeBSD将引导消息存储在/var/run/dmesg.boot文件中。这意味着,即使在系统已经启动并运行了几个月后,您也可以检查内核的硬件消息。

内核在引导消息中显示的一个关键点是每个硬件的设备名称。这是管理系统的关键信息。每个硬件都有一个设备节点名称,要配置它,您需要知道该名称。例如,前面我们看到一个名为em0的以太网卡条目。该卡使用em(4)驱动程序,由该驱动程序控制的第一个设备的编号为零。这种类型的第二个设备将是em1,然后是em2,以此类推。

大多数可以配置或管理的设备在/dev下都有一个设备节点条目。例如,第一个光盘驱动器由文件/dev/cd0表示。这些文件称为设备节点,它们是寻址特定硬件的一种方便方法。大多数设备节点不能作为常规文件直接访问;你不能猫(1)一个设备节点或将另一个文件复制到它。但是,设备节点被用作专用程序的参数。例如,启动时显示为ada4的硬盘驱动器与设备节点/dev/ada4相同。当你想挂载硬盘时,你可以使用设备节点名称,并确保你得到的是确切的硬件。

多用户启动

除了单用户模式,您还会发现多用户模式。这是类Unix操作系统的标准操作模式。如果你正在做实际工作,你的系统处于多用户模式。

当FreeBSD完成对硬件的检查并适当地附加所有设备驱动程序时,它会运行shell脚本/etc/rc。此脚本装载所有文件系统,启动网络接口,配置设备节点,识别可用的共享库,并执行使系统准备好正常工作所需的所有其他工作。大多数系统都有不同的启动要求;虽然几乎每台服务器都需要挂载硬盘,但web服务器的操作要求与数据库服务器的操作需求非常不同,即使它运行在完全相同的硬件上。这意味着/etc/rc必须非常灵活。它通过将所有内容委托给负责系统特定方面的其他shell脚本来实现灵活性。

/etc/rc脚本由/etc/defaults/rc.conf和/etc/rc.conf文件控制。

/etc/rc.conf, /etc/rc.conf.d, and /etc/defaults/rc.conf

与加载器配置文件非常相似,/etc/rc的配置分为两个文件:默认设置文件/etc/defaults/rc.conf和本地设置文件/etc/rc.conf。/etc/rc.conf中的设置覆盖/etc/defaults/rc.conf中给出的任何值,与加载器完全相同。

/etc/defaults/rc.conf文件很大,包含很多变量,通常称为旋钮或可调变量。我们不会讨论所有这些,不仅因为旋钮会不断添加,这样的列表会立即过时,而且因为相当多的旋钮在服务器上并不常用。标准FreeBSD系统中的几乎所有内容都有一个或多个rc.conf旋钮,从键盘映射到TCP/IP行为。有关完整的最新列表,请阅读rc.conf(5)。要更改rc.conf设置,您可以使用文本编辑器或sysrc(8)。

sysrc(8)

这是一个命令行程序,可以从命令行一致且安全、友好地更改/etc/rc.conf。此外sysrc(8)可以显示有关系统非默认设置的信息。

使用-a询问sysrc(8)它对主机了解多少,您将获得所有非默认/etc/rc.conf设置的列表:

要让sysrc(8)启用服务,请为其指定变量名、等号、新值。以下命令将rc_startmsgs设置为no:

记住,sysrc(8)是用于更改rc.conf的工具,而不是用于配置FreeBSD的工具。它不进行有效性检查。

使用-x标志并指定变量名可删除rc.conf中的一个变量:

许多FreeBSD配置文件与rc.conf非常相似,可以使用sysrc(8)通过添加-f标志和文件名来管理它们:

您应该编辑rc.conf还是使用sysrc(8)?如果您正在进行手动更改,请使用您喜欢的任何一种。自动化应该偏向于sysrc(8)。这本书混合了这两者的例子。

/etc/rc.conf.d/

如果您使用Puppet或Ansible等服务器配置系统,您可能更信任复制整个文件而不是编辑它们。使用/etc/rc.conf.d/文件通过这些工具启用服务。

要管理/etc/rc.conf.d/中的服务,请创建一个以服务命名的文件。也就是说,要管理bsnmpd(8),您需要创建/etc/rc.conf.d/bsnmpd。在此文件中启用或禁用该服务。

我通常使用Ansible的服务启用功能,直接更改/etc/rc.conf而不是/etc/rc.conf.d,但可以使用您喜欢的任何功能。

接下来的几节说明了可以在/etc/rc.conf中启用和禁用的内容类型。每种内容都出现在/etc/defaults/rc.conf中,并且可以被/etc/rc.conf条目覆盖。每个变量都以默认设置显示。

启动选项

以下rc.conf选项控制FreeBSD如何配置自身和启动其他程序。这些影响深远的设置会影响所有其他系统程序和服务的运行方式。

如果启动脚本本身有问题,可以在/etc/rc及其从属脚本上启用调试。这可以提供有关脚本启动或未启动原因的其他信息。

如果您不需要完整的调试输出,但想了解有关/etc/rc进程的其他信息,请使用rc_info启用信息性消息:

当引导进程启动多用户时,它会为启动的每个守护进程打印一条消息。使用rc_startmsgs选项删除这些消息。

文件系统选项

FreeBSD可以将内存用作文件系统,我们将在第13章中讨论。此功能的一个常见用途是通过使用内存而不是硬盘驱动器作为后端,使/tmp非常快。一旦你阅读了第13章,你可能会考虑实现这一点。rc.conf中的变量允许您启用内存支持的/tmp,并透明、轻松地设置其大小。您还可以选择FreeBSD将用于完成文件系统的选项。(你们中不耐烦的人可能想知道-S标志是什么意思。它意味着禁用软更新。如果你也不知道这意味着什么,请等待第11章。)如果你想使用内存文件系统/tmp,请将tmpmfs设置为YES,并将tmpsize设置为所需的/tmp大小。

FreeBSD文件系统的另一个流行特性是其集成的加密分区。FreeBSD支持两种不同的文件系统加密系统:GBDE和GELI。基于GEOM的磁盘加密(GEOM-Based Disk Encryption——GBDE)是FreeBSD第一个为军事级使用而设计的加密文件系统。GELI比GBDE更友好,符合不同标准。如果要使用任何一种加密,请仔细阅读第二十三章。

默认情况下,FreeBSD在实现多用户模式时以读写方式挂载根分区。如果你想以只读模式运行,你可以将以下变量设置为NO。许多人认为这更安全,但只读根目录会干扰某些软件的运行,而且它肯定会阻止你编辑根分区上的任何文件。

当启动的FreeBSD尝试挂载其文件系统时,它会检查它们的内部一致性。如果内核发现主要的文件系统系统,它可以尝试使用fsck -y自动修复它们。虽然这在某种情况下是必要的,但并不完全安全。在启用此功能之前,请仔细阅读第十一章。

内核也可能发现一些小的文件系统问题,当系统在多用户模式下运行时,它会使用后台fsck动态解决这些问题。在某些情况下使用此功能的安全性存在合理的担忧。你可以控制后台fsck的使用,并设置系统在开始后台fsck之前等待的时间。

各种网络守护进程

FreeBSD包含许多在后台运行以提供特定服务的小程序或守护进程。此处仅介绍一些系统管理员会感兴趣的具体服务。

一个流行的守护进程是syslogd(8)。第二十一章的大部分内容都是关于FreeBSD的日志记录主题。

当你决定运行日志守护进程,你可以通过为它设置命令行标志来准确选择它的运行方式。FreeBSD在启动守护进程时将使用这些标志。

对于rc.conf中包含的所有可以接受命令行标志的程序,标志的格式如下:

另一个流行的守护进程是inetd(8),它是小型网络服务的服务器,第二十章详细介绍inetd。

大多数系统使用Secure Shell(SSH)守护进程进行远程登录。如果你想通过网络远程连接到你的系统,你几乎肯定需要SSH服务。

虽然可以通过命令行配置SSH守护进程,但通常最好使用/etc/ssh/中的配置文件。详见第20章。

FreeBSD还集成了广泛的计时软件,其功能是确保系统时钟与世界其他地区保持同步。您需要对此进行配置,使其有用;我们将在第20章中介绍。

此外,FreeBSD还包括一个小型SNMP守护进程,用于使用基于SNMP的管理工具的设施。我们将在第21章中介绍配置SNMP。

网络选项

有一些旋钮可以控制FreeBSD在启动期间如何配置其网络设施。详见第七章对网络的讨论。

互联网上的每台机器都需要一个主机名。主机名是系统的完全限定域名,例如www.abc.org。没有它,许多程序将无法运行。

FreeBSD包括一些不同的集成防火墙包。我们将在第19章简要介绍数据包过滤器(PF)。在rc.conf中启用和禁用PF。

您可能对通过网络连接到系统的失败尝试感兴趣。这将有助于检测端口扫描和网络入侵尝试,但也会收集大量垃圾。将此设置为短时间是很有趣的,只是为了看看你的网络上到底发生了什么。(再说一次,知道真正发生的事情往往会导致胃灼热。)将此设置设置为1以记录失败的连接尝试。

路由器使用ICMP重定向来通知客户端机器特定路由的正确网络网关。虽然这是完全合法的,但在某些网络上,入侵者可以使用它来捕获数据。如果你的网络上不需要ICMP重定向,你可以设置此选项以增加极小的安全性。如果您不确定是否正在使用它们,请咨询您的网络管理员。

如果你就是那个网络管理员,但你不确定你的网络是否使用ICMP重定向,有一种简单的方法可以找到——只需将系统收到的所有重定向记录到/var/log/messages。请注意,如果你的服务器受到攻击,这可能会很快用重定向日志填满你的硬盘。

要接入网络,您需要为每个接口分配一个IP地址。我们将在第8章中对此进行详细讨论。您可以使用ifconfig(8)命令获取网络接口列表。列出每个网络接口所在的行,并在引号中注明其网络配置信息。例如,要为em0网卡提供172.18.11.3的IP地址和255.255.254.0的网络掩码,您可以使用:

如果你的网络使用DHCP,使用值dhcp作为IP地址:

同样,您可以为网卡分配别名。别名不是卡的实际IP地址,而是卡对该IP地址的应答,如第8章所述。FreeBSD在一张卡上支持数百个别名,rc.conf条目的格式如下:

aliasnumber必须是连续的,从0开始。如果编号中断,则启动时不会安装中断上方的别名。(这是一个常见问题,当你看到它时,检查你的别名列表。)例如,192.168.3.4的别名将列为:

网络路由选项

FreeBSD的网络堆栈包括许多用于路由互联网流量的功能。这些从非常基本的开始,例如为默认网关配置IP。虽然为网络接口分配有效的IP地址可以让您连接到本地网络,但默认路由器将允许您访问局域网以外的所有内容。

网络控制设备,如防火墙,必须在不同接口之间传递流量。虽然FreeBSD默认情况下不会这样做,但启用起来很简单。只需告诉系统它是一个网关,它将为您连接多个网络。

控制台选项

控制台选项控制显示器和键盘的行为方式。你可以更改键盘的语言、显示器的字体大小,或者任何你喜欢的东西。例如,键盘映射默认为标准的美国键盘,通常称为QWERTY。您可以在/usr/share/syscons/keymaps目录中找到各种密钥映射。我更喜欢Dvorak键盘布局,其中有一个条目为us.Dvorak。通过将键盘映射旋钮更改为us.dvorak,我的系统在启动到多用户模式后将使用dvorak键盘。

当键盘在空白时间旋钮中指定的时间内处于空闲状态时,FreeBSD会将显示器变暗。如果您将此设置为“否”,FreeBSD将不会使屏幕变暗。请注意,新硬件也会在一段时间后调暗显示器,以节省电力。如果您的屏幕变为空白,即使您已将空白时间旋钮设置为“否”,请检查您的BIOS和显示器手册。

FreeBSD还可以在控制台上使用各种字体。虽然默认字体适用于服务器,但您可能希望在台式机或笔记本电脑上使用不同的字体。我的笔记本电脑有一个17英寸的屏幕,比例适合看电影,默认字体在这个尺寸上看起来有点傻。您可以从/usr/share/syscons/fonts目录中选择新字体。尝试一些,看看它们在你的系统上是什么样子的。字体的名称包括大小,因此您可以设置相应的变量。例如,字体swiss-8x8.fnt是瑞士字体,8像素乘8像素。要使用它,您需要设置font8x8旋钮。

即使没有GUI,您也可以在控制台上使用鼠标。默认情况下,FreeBSD会尝试自动检测您的鼠标类型。如果你有一个PS/2或USB鼠标,它很可能只在你启用鼠标守护进程时工作,而不需要任何特殊配置。如moused(8)中所述,一些更老、更不寻常的小鼠需要手动配置。

您还可以根据需要更改显示器上的显示。如果你有一个奇怪大小的显示器,你可以更改文本行数及其长度以适应,更改文本颜色,更改光标和光标行为,以及进行各种其他小调整。您可以在man vidcontrol(1)中获得不同选项的完整列表。

同样,您几乎可以任意调整键盘行为。如kbdcontrol(1)中所述,可以配置从按键重复速度到功能键效果的所有内容。

其他选项

这最后一批旋钮在任何特定环境中都可能有用,也可能没有用,但它们经常被需要,值得一提。

例如,并非所有系统都可以访问打印机,但那些可以访问的系统会希望运行打印守护进程lpd(8)。我们在第20章中复习了打印机配置。

sendmail(8)守护进程管理系统之间电子邮件的传输和接收。虽然几乎所有的系统都需要发送电子邮件,但大多数FreeBSD机器不需要接收电子邮件。sendmail_enable旋钮专门处理传入邮件,而sendmail_outbound_enable允许机器传输邮件。详见第20章。

FreeBSD的一个更有趣的特性是它能够运行为Linux构建的软件。我们将在第17章讨论这一特性。运行Linux软件并不像扔这个开关那么容易,所以在没有先阅读那一章的情况下,不要启用Linux兼容模式!

共享库是任何类Unix操作系统的重要组成部分。您可以控制FreeBSD在哪里查找共享库。虽然默认设置通常是足够的,但如果您发现自己经常为用户设置LD_LIBRARY_PATH环境变量,则应考虑调整库路径。有关库路径的更多建议,请参阅第17章。

FreeBSD有一个安全配置文件系统,允许管理员控制基本的系统功能。您可以全局禁止挂载硬盘、访问特定的TCP/IP端口,甚至更改文件。有关如何使用这些工具的详细信息,请参阅第9章。

rc.d启动系统

FreeBSD通过shell脚本/etc/rc弥合了单用户模式和多用户模式之间的差距。此脚本读取配置文件/etc/defaults/rc.conf和/etc/rc.conf,并根据在其中找到的内容运行一组其他脚本。例如,如果您启用了网络时间守护进程,/etc/rc将运行专门为启动该守护进程编写的脚本。FreeBSD包括启动服务、挂载磁盘、配置网络和设置安全参数的脚本。

这些脚本位于/etc/rc.d和/usr/local/etc/rc.d.中。如果只是为了了解rc.d系统的工作原理,我建议阅读其中的一些。

使用service(8)控制这些脚本。

service(8)命令

所有的rc.d脚本都是可读的,它们组合在一起的方式非常简单。当你遇到问题时,你可以阅读脚本,看看它们是如何工作的,它们做了什么。但这很像工作,大多数系统管理员都有更有趣的工作要做。service(8)命令为rc.d脚本提供了一个友好的前端。您可以使用service(8)查看哪些脚本会自动运行;停止、启动和重新启动服务;检查服务的状态;以及更多。

列出并识别已启用的服务

使用service(8)的-e标志,可以查看将在系统启动时运行的所有脚本的完整路径,按其运行顺序排列。

这个小主机在启动时运行23个脚本。

这里的一个重要细节是脚本名称。您将在其他命令中使用脚本名称,如启动、停止和重新启动服务。

管理服务

虽然完全可以在命令行重新启动,例如sshd(8),但生产主机需要所有东西才能一致运行。最佳实践要求使用service(8)来管理流程。您需要如前所示的脚本名称,但不需要目录路径。

例如,假设我想重新启动sshd(8)服务。根据前面显示的服务-e输出,有一个脚本/etc/rc.d/shd。我强烈怀疑这个脚本管理sshd(8),但我想确定我不会意外重启愚蠢的同名骚扰守护进程。这就是describe(描述)命令的作用。让我们让service(8)描述sshd脚本。

这是个正确的守护进程,我们来重启它:

restart命令stop和start命令的组合。不过,此特定服务的作用不止于此。它首先验证配置文件➊,然后停止守护进程➋。然后反战配置➌,并启动守护进程➍。

SSH处理对此主机的远程访问。如果SSH服务中断,则没有人可以登录主机来修复SSH服务。是的,您可以使用远程KVM或IPMI或驱动器连接到托管设施,但任何一种都会延长停机时间。最好在关闭sshd(8)之前验证它是否可以重新启动。许多服务脚本都包含这种安全检查。如果服务抱怨无法停止,请仔细阅读输出以找出原因。

每个服务支持的命令各不相同。获取特定服务支持的完整命令列表的最简单方法是给服务一个伪参数。像“bert”这样的东西是相当虚假的。

您将获得此服务支持的命令的完整列表,分为两组。

第一组位于方括号内,包含命令的选项。以下是标准选项。将它们用作第二组中命令的前缀。

括号中的第二组包含以下命令:

extracommands命令对服务非常具体,仅列出此服务接受的其他命令。默认情况下,额外命令出现在默认命令之后。以下是一些常见的额外命令:

要准确确定服务的额外命令的作用,你需要阅读服务脚本。第十七章将讨论自定义和编写自己的rc.d脚本,并更详细地介绍rc.d。

系统关闭

FreeBSD使rc.d启动系统发挥双重作用;它不仅必须处理系统启动,还必须在断电时关闭所有这些程序。必须卸载所有这些硬盘,关闭守护进程,并在完成所有工作后进行清理。有些程序不在乎在系统晚上关闭时是否会被随意杀死——毕竟,在系统关闭后,任何通过SSH连接的客户端都会被关闭,任何半交付的网页都会不完整。然而,数据库软件非常关心如何关闭它,随意终止进程会损坏您的数据。许多其他管理实际数据的程序也同样特别,如果你不让它们自己清理,你会后悔的。

当您使用shutdown(8)、halt(8)或reboot(8)命令关闭FreeBSD时,系统会调用shell脚本/etc/rc.shutdown。此脚本使用stop选项依次调用每个rc.d脚本,颠倒启动时调用它们的顺序,从而允许服务器程序优雅地终止,并在电源关闭前整理磁盘。

串行控制台

所有这些控制台的东西都很好,但是当你的FreeBSD系统在另一个国家或另一个大陆的托管设施中时,你不能只是走到键盘前开始打字。许多数据中心没有空间容纳键盘或显示器。当机器对网络没有响应时,如何远程重置机器?使用串行控制台将计算机的键盘和视频重定向到串行端口,而不是键盘和显示器,有助于解决所有这些问题。

串行控制台可以是物理的,例如计算机背面的串行端口。通过将标准的零调制解调器电缆连接到串行端口,并将另一端连接到另一台计算机的串行端口,您可以从第二台计算机访问第一个系统的启动消息。

它们也可能是虚拟的,如IPMI的局域网串行(Serial-over-LAN——SOL)协议所提供的。您需要设置IPMI接口,并使用特殊软件配置和访问虚拟串行端口,而不是零调制解调器电缆(null modem cable)。

不过,在设置端口之前,让我们先谈谈串行端口协议。

串行协议

最早的一些计算机控制台是连接到电传打字机的串行端口。Serial已经存在了很长时间,并在几十年的时间里不断发展。与现代协议不同,串行线不能自动协商。您必须将串行链路的两侧配置为完全相同的设置。配置不匹配会导致屏幕空白或乱码。

原来的串行线工作速度很低。许多串行电缆基本保持不变,但我们开发了更好的软件和硬件,可以粘在每一端,使我们能够更快地传输数据。旧的串行连接以每秒300比特(波特)的速度运行,而一大堆现代硬件可以以115200波特的速度运行。然而,在各种硬件平台上,通用标准是9600波特,这是FreeBSD的默认控制台速度。9600的波特率足以以舒适的速度传输整个文本屏幕。

除非不能,否则物理连接应使用9600波特。一些现代硬件不支持9600波特。有些人声称支持9600波特,但事实并非如此。我曾使用硬编码为115200波特的设备。任何失败或完全拒绝做9600波特的东西都是设计破坏的,但我们通常无法控制硬件的选择。由于硬件限制以外的原因更改串行控制台速度会使您的连接更加脆弱,如果您正在使用控制台,则不会感到脆弱。当我提到改变端口速度时,这是只在必要时使用的。

SOL连接不是物理线,所以你不必担心线路噪音。你可以安全地以更高的速度运行它们。

串行协议还包括一系列超出其速度的设置。可以使用它们,但8个数据位、无奇偶校验和1个停止位的标准设置是使用最广泛的。在FreeBSD中,如果不重新编译内核,就无法更改这些内容,所以不要弄乱它们。

考虑到这一点,让我们设置一个控制台。

物理串行控制台设置

需要一根零调制解调器线缆。不要买最便宜的。

【略】

IPMI串行控制台设置

智能平台管理接口——Intelligent Platform Management Interface——IPMI。

用于在硬件级别管理计算机系统的标准。

IPMI与操作系统分开运行,使用一个称为基板管理控制器(baseboard management controller——BMC)的小型设备。

本质上讲,BMC充当你远程控制服务器的手和眼睛。要使用IPMI控制台,你需要配置BMC和主机的BIOS或UEFI。

BMC 设置

服务器的BMC有自己的IP地址,通常在主板上有一个专用的以太网端口。

每个供应商都可以按照自己的风格设计自己的BMC,这意味着配置BMC的方式并不通用。

大多数BMC有web界面。在BIOS或UEFI固件的设置菜单中设置大多数BMC IP信息。

通常BMC还包括诸如主系统的电源循环、通过某种下载的应用程序(通常是java)进行远程控制台访问、虚拟媒体等功能。

谨记,BMC是一台运行web服务器的小型嵌入式计算机,它是由一些负责构建最低可行产品的过度劳累的公司员工编写的。BMC通常没有进行过性能测试,如果它们给你带来麻烦,重新启动它。BMC的web界面中通常有一个”BMC Reset“或”Unit Reboot"菜单选项。

BMC并不比串行控制台更安全可靠。

IPMI在较慢的连接上比Java控制台小程序工作得更好。此外,我可以从任何现代操作系统的命令行使用IPMI控制台。

在BMC设置中,找到启动SOL的选项。这将打开一个小程序连接到主机的SOL接口,这将帮助您测试串行控制台配置。

UEFI/BIOS 串行控制台设置

一旦您的BMC准备就绪,您必须配置服务器硬件以将串行端口定向到BMC。转到硬件的“设置”菜单,在其中配置UEFI或BIOS。在这个错综复杂的小选项中,你会发现类似“串行端口控制台重定向”的东西。

这里的一个关键问题是,你的主机有多少个串行端口?也许它没有。也许它有几个。您可以选择重定向其中一个端口或添加一个额外的虚拟端口。我建议您不要使用现有的串行端口,而是添加一个专用于SOL的虚拟端口。它可能被称为“SOL控制台重定向”。启用它,然后进入该端口的设置。

以下是我认为对FreeBSD和SOL有帮助的一些设置:

棘手的部分是波特率(baud)、速度(speed)或每秒比特数的设置。保持默认速度。

配置FreeBSD的串行控制台

当FreeBSD启动时,加载器决定在哪里打印控制台消息以及从哪里接受输入。虽然这默认为显示器和键盘,但只需稍作调整,您就可以将控制台重定向到串行端口。串行控制台不会授予BIOS访问权限,但您几乎可以以任何方式调整FreeBSD引导本身。您可以在第一阶段或第二阶段引导加载程序中配置串行控制台。

第一阶段引导加载程序可让您尽早访问控制台,但要求您将第一个串行端口用作控制台。更改端口需要重新编译内核。第一阶段引导加载程序允许您执行诸如选择要从哪个磁盘加载第二阶段加载程序之类的任务,基本上是从BIOS或UEFI选择的磁盘以外的磁盘引导。这无疑是有用的,但很少有用户需要它。

第二阶段引导加载程序可以使用任何串行端口作为控制台,但您将获得的第一位输出是第55页“加载器提示”中讨论的引导菜单。对我们大多数人来说,这是完全可以接受的。

Console 选项

FreeBSD的默认配置使用显示器和键盘作为控制台。您可以选择仅切换到串行控制台或使用双控制台。使用/boot/loader.conf选项console选择哪个。

仅限串行的控制台可以防止一些随机的主机代管员工对您的机箱进行电源重启、插入显示器和使用菜单。是的,他们仍然可以从第一阶段加载程序或USB启动时进行混乱操作,但这需要更高的技能。将console变量设置为comconsole,以便仅将串行端口用作控制台。

对于大多数部署,我建议使用双控制台。双控制台显示串行端口和监视器上的控制台活动。您可以根据需要使用标准控制台或串行控制台。通过列出comconsole和vidconsole来指定双控制台配置。

如果你在服务器机房的情况下,你可能想在标准控制台和串行控制台之间来回切换。我通常通过串行控制台管理大型FreeBSD系统阵列,但会将视频控制台留在原地,以防出现问题。

控制台在重新启动后才会生效。您可以通过检查引导消息来查看FreeBSD是否将其控制台放在串行端口上。

第二行显示串行端口uart0使用默认设置配置为控制台。我们将在第79页的“使用串行控制台”中查看这些设置。

高级控制台选项

除了启用控制台外,您还可以调整控制台的端口和速度。

也许我需要使用控制台的第二个串行端口。也许第一个串行端口插入了什么,或者第二个端口是虚拟SOL端口。串行端口使用uart(4)设备驱动程序。请记住,FreeBSD设备从零开始编号,而COM端口从1开始编号。COM1是uart0,COM2是uart1,以此类推。您需要端口的基本I/O端口,可以从系统启动消息中获取。

单词port后的第一个数字是基本I/O端口➊。COM2或uart1的基址为0x2f8。将comconsole_port设置为该值➋。

您的主机现在位于串行端口COM2上。

如果我的串行连接不能达到9600波特,我可以使用comconsole_speed选项更改端口速度。

在物理端口上,不要仅仅因为可以就提高端口速度。

使用串行端口

现在您已经设置了物理和软件,请配置您的客户端以访问串行控制台。使用串行控制台的关键是要记住以下设置:

访问串行线路的方式取决于它是物理线路还是IPMI SOL连接。

物理串行线

将客户端连接到串行线的另一端。您可以找到适用于Microsoft平台(PuTTY是最著名的)、macOS和几乎任何其他操作系统的终端模拟器。很久以前,我使用带有串行电缆的Palm手持设备访问串行控制台。在终端模拟器中输入正确的值设置,串行控制台将“正常工作”。

FreeBSD使用tip(1)访问串行线,该程序允许您以类似于telnet的方式连接到远程系统。要运行tip,请以root身份执行以下操作:

端口名是指定串行端口上使用的串行端口号和速度的简写。/etc/remote文件包含端口名列表。此文件中的大多数条目都是eon的遗迹,当时UUCP是主要的数据传输协议,串行线是常态而不是例外。7在本文件末尾,您将看到一些条目,如:

uart条目是标准的Unix类型设备名称,而com名称是为了方便在x86硬件上长大的人而添加的。

假设您有两个背靠背连接的FreeBSD盒子,每个盒子的串行端口1为空模式,连接到串行端口2。两台机器都配置为使用串行控制台。您需要连接到本地串行端口2,以便与其他系统的串行控制台通信:

要断开串行控制台,请按ENTER键,然后随时键入断开顺序“波浪号点”:

你会优雅地断开连接。(这也适用于OpenSSH客户端。)

tip(1)程序使用波浪号(~)作为控制字符。阅读手册页,了解你可以用它做的事情的完整列表。

IPMI SOL 连接

您需要一个SOL客户端来连接到IPMI串行端口。测试配置的最快方法可能是使用BMC中包含的SOL客户端小程序。虽然该客户端具有控制台小程序的大部分缺点,但它是一个测试的好地方。如果BMC SOL客户端不工作,请检查您的SOL设置和FreeBSD配置。验证SOL客户端是否设置为使用与您在硬件和FreeBSD中设置的速度相同的速度。如果它不起作用,但您的所有设置似乎都匹配,请重新启动BMC。一旦它起作用,您就可以从另一台主机使用SOL。

标准IPMI SOL客户端是IPMItool(https://sourceforge.net/projects/ipmitool/),作为ipmitool包提供。(第15章讨论了软件包。)IPMItool可以通过网络与您的BMC交互,授予您所有的BMC功能,而无需登录笨重的web界面。您可以从命令行重新启动主机、检查硬件警报和传感器等。但目前,我们将继续使用SOL控制台。使用BMC的主机名或IP、用户名和密码登录SOL。

在这里,我使用用户名“bert”登录到我的web服务器的BMC,主机名为www-BMC

在提示处输入密码,SOL将确认您的登录:

我们有一个控制台。可能。让我们做最后的测试。

在控制台上工作

串行控制台的真正测试是你是否可以通过它获取数据。一旦你连接了控制台,按ENTER键。

FreeBSD默认允许在串行控制台上登录。登录主机并重新启动,您将收到通常的控制台消息。

当系统运行其BIOS例程并将控制权移交给串行控制台时,会有一段长时间的暂停。就在你决定机器永远不会回来的时候,你会看到加载器菜单。祝贺 你!您正在使用串行控制台。按空格键中断启动,就像你在键盘前一样。

系统有多远并不重要;您可以更改启动内核,获得详细的启动,以单用户模式启动,或手动fsck硬盘驱动器等。软件串行控制台可能不会显示BIOS,但很可能已经正确设置。一旦你使用了一段时间的串行控制台,机器是在世界的另一边还是在房间的另一边都不重要了;仅仅为了接近控制台而离开椅子会让人觉得工作量太大。

如果远程位置的系统完全锁定,您可以连接到串行控制台,让托管设施的“远程手”重新启动系统。这可能对你的电脑不好,但把它锁起来也不好。使用串行控制台,您可以启动到单用户模式,并通过挖掘日志和您认为能够进行的任何其他故障排除来解决问题。我们将在第24章讨论解决此类问题的方法。

现在你已经了解了FreeBSD是如何启动和关闭的,让我们来看看一些基本的工具,你可以使用这些工具来确保你的系统即使在你尝试过之后也能继续运行。