Linux 如何知道它的交换分区在哪里?

Dis*_*ame 13 boot ssd swap

我读过您需要将交换分区放在 HDD 而不是 SSD 上。

我的问题如下:

  • 发行版(或其他东西)何时以及如何进行“检查”以找到其 Swap 分区?
  • 开机时会出现这种情况吗?
  • 它只是检查所有可用磁盘并搜索带有“交换”标志的分区?
  • 如果有几个这样的分区会发生什么?
  • 另外,如果我在同一个磁盘上运行两个不同的发行版,比如说 Fedora 和 Ubuntu,我需要有多少个交换分区?

Aus*_*arn 24

静态配置的交换空间(几乎每个发行版都使用这种类型)的配置/etc/fstab就像文件系统一样。

一个典型的条目类似于:

UUID=21618415-7989-46aa-8e49-881efa488132    none    swap     sw      0  0
Run Code Online (Sandbox Code Playgroud)

您还可以在标志字段(第四个字段)中看到discard或nofail指定。每一个这样的行对应的一个交换区域(不具备成为一个分区,你可以交换文件,甚至是整个交换磁盘)。

在某些非常具体的情况下,您可能会改为动态配置交换空间,尽管这种情况很少见,因为它会导致与内存管理相关的问题行为。在这种情况下,配置完全由用户空间组件处理,该组件在运行时根据需要创建和启用交换文件。

至于您需要多少个,这是一个需要回答的复杂问题,但是您计划运行的不同 Linux 发行版的数量对此的影响为零,除非您希望能够运行一个发行版而另一个处于休眠状态(并且您可能不想这样做,因为这是搞砸系统的一种非常简单的方法)。

当您为几乎所有主要发行版(包括 Fedora、OpenSUSE、Linux Mint、Debian 和 Ubuntu)运行安装程序时,它会检测系统上任何现有的交换分区,并将它们添加到您正在使用的发行版的配置中安装(除非您选择手动分区),并且在大多数情况下,这将导致以合理的方式配置系统。

除此之外,我个人建议避免使用多个交换分区,除非您谈论的是具有大量磁盘的服务器系统,即便如此,您确实需要知道自己在做什么才能进行设置以使其性能良好.


Jde*_*eBP 22

比如说 Fedora 和 Ubuntu?

……这两者都是当今的 systemd 操作系统。

在 systemd 操作系统中会发生什么

原生机制

Systemd 使用各种单元。 .mount单元文件指示它挂载卷。 .swap单元文件指示它告诉内核有关交换分区的信息。(.service单元文件指示它如何运行服务。等等。)这些是原生的 systemd 机制。为了实现它们,systemd 本身会派生出进行相关系统调用的子进程。

如果您在这样的 systemd 操作系统上使用systemctl命令 (with --all),它会告诉您有关已加载.swap单元的信息。例如:

dev-disk-by\x2dpartuuid-40549710\x2d05.swap 加载 active active /dev/disk/by-partuuid/40549710-05
dev-disk-by\x2duuid-1bb589e8\x2d929f\x2d4041\x2d81f4\x2dff2b339b4e2a.swap 加载主动/dev/disk/by-uuid/1bb589e8-929f-4041-82b3a39
dev-sda5.swap 加载活动活动 /dev/sda5

它还会告诉您有关.mount单位的信息。

系统管理员可实际上写这样.swap通过手部的文件,就像XE可以写.service,.socket和手工等单位的文件。systemd 本身只是在文件系统中查找单元文件。它们是它的原生机制。

甚至可以让 systemd 向您展示这些单元文件中的内容以及它们在文件系统中的位置:

$ systemctl cat dev-disk-by\\x2duuid-1bb589e8\\x2d929f\\x2d4041\\x2d81f4\\x2dff2b339b4e2a.swap 
# /run/systemd/generator/dev-disk-by\x2duuid-1bb589e8\x2d929f\x2d4041\x2d81f4\x2dff2b339b4e2a.swap
# 由 systemd-fstab-generator 自动生成

[单元]
SourcePath=/etc/fstab
文档=man:fstab(5) man:systemd-fstab-generator(8)

[交换]
What=/dev/disk/by-uuid/1bb589e8-929f-4041-81f4-ff2b339b4e2a
选项=sw
$ 

自动生成单元文件

一个人可以手写。 一般然而,这样的.mount和.swap单元文件是自动由称为程序生成的发电机。两个这样的生成器是systemd-fstab-generator和systemd-gpt-auto-generator。它们都在引导过程的早期运行并响应systemctl daemon-reload命令,并且(如您在上面看到的)它们将整个单元文件加载到/run/systemd/. systemd 本身只使用那些生成的单元文件。

前一个生成器读取/etc/fstab,识别该文件格式的几个 systemd 扩展名。正如我在回答评论中指出的那样,传统上交换分区的挂载类型为sw,这就是人们会发现其他操作系统识别此表中的交换记录的方式。但是 Linux 软件采取了替代方法,即识别VFS 类型,而是寻找swapVFS 类型。 systemd-fstab-generator这里也不例外,这就是它/etc/fstab在将其转换为本机机制时的解释方式。

后一个生成器处理位于保存 EFI 系统分区的同一磁盘上的 EFI 分区表,查找具有各种众所周知的分区类型GUID 的EFI 分区表条目。这些 GUID 之一是分配给 Linux 交换分区的常规 GUID;如果systemd-gpt-auto-generator找到具有该 GUID 的分区(满足 systemd doco 中给出的标准),它将为其创建一个.swap单元;根本不/etc/fstab涉及。

当然,这个过程有很多副作用。例如,因为/etc/fstab没有表的主键,记录可以有重复的“spec”和“file”(即“what”和“where”)字段。然而,在原生 systemd 机制中,“file”(即“where”)字段是.mount单元的唯一键,嵌入到单元名称中。没有两个.mount单位可以共享它。对于.swap单位,“spec”(即“什么”)字段是单位的唯一键。没有两个.swap单位可以共享这一点。因此,并非所有记录/etc/fstab都必须可以转换为本地机制并且可以工作,特别是如果人们为了两个不同的目的列出相同的挂载点或以两种不同的方式列出相同的交换分区。

同理,因为已经转化/etc/fstab为native机制,而systemd的native机制还有其他激活units的方式,所以行为与非systemd操作系统略有不同。甲.mount单元将默认,可自动地由活化systemd-udevd,即使自举后,响应于的外观安装存储装置。或者它可以被列为 aWants=或Requires=of some.service或.socketunit,这意味着它会在它们被(重新)激活时被激活。甚至有RequiresMountsFor=。

安装程序和 systemd 方式

传统上,操作系统安装程序以及随后重新配置系统的 systemd 管理员会将sw条目写入/etc/fstab. 这就是本机.mount和.swap单位最终自动生成的方式。安装/配置实用程序“知道”交换文件的放置位置,因为系统管理员在其用户界面中做出了某种选择,并写入了一个/etc/fstab匹配。有时这个选择是我需要你为我做一个交换分区作为安装的一部分。; 有时只是使用您已经在光盘上找到的交换分区。(安装人员也会查看分区类型)。

但是 systemd 的人有这样一种想法,即操作系统从一个很大的空/etc树中自动配置自己,即所谓的无状态系统,这就是读取 EFI 分区表的生成器之类的机制的全部内容。在 systemd 人的计划中,根本没有/etc/fstab,甚至根本没有持久化配置数据/etc,所有这些东西都是从磁盘分区表的内容中推导出来的,在每个引导程序和每个systemctl daemon-reload. 他们现在正在推广操作系统安装程序而不是不编写/etc/fstab.

在传统的方案中,当然你确实可以让每个操作系统都有自己的私有交换分区,而不是让它们接触彼此的交换分区。事实上,如果您通过交换分区使用休眠来磁盘并希望能够在休眠时多重引导到另一个操作系统(这是一个非常糟糕的主意,因为这样很容易导致文件系统损坏),那将是必要的。

在 systemd 方案中,即使操作系统还没有像 systemd 人所设想的那样“无状态”,上述生成器也会运行;因此所有systemd 操作系统都会自动使用所有具有必需分区类型的交换分区(在 ESP/root 磁盘上)。由于它们将共享所有自动发现的交换分区,因此实际上不需要为每个安装的操作系统创建一个交换分区。

进一步阅读


And*_*ton 13

从历史上看,交换分区是/etc/fstab用类型的条目指定的swap。在启动时,启动进程将读取该文件并将该配置推送到内核中。

输入的一个例子/etc/fstab是:

/dev/sdb    none    swap     sw      0  0
Run Code Online (Sandbox Code Playgroud)

我不熟悉如何systemd管理交换,但我相信最终结果是一样的:用户空间进程知道为交换分配了什么空间,用户空间进程通知内核。

  • 你是什​​么意思 systemd 不使用 fstab?当然可以! (2认同)