我读到您需要将交换分区放在 HDD 而不是 SSD 上。
我的问题如下:
- 发行版(或其他东西)何时以及如何进行“检查”以找到其交换分区?
- 它会在启动过程中发生吗?
- 它只是检查所有可用磁盘并搜索带有“交换”标志的分区?
- 如果有多个这样的分区会怎样?
- 另外,如果我在同一磁盘上运行两个不同的发行版(例如 Fedora 和 Ubuntu),我需要有多少个交换分区?
答案1
静态配置的交换空间(几乎每个发行版都使用的类型)的配置/etc/fstab
就像文件系统一样。
典型的条目类似于:
UUID=21618415-7989-46aa-8e49-881efa488132 none swap sw 0 0
您还可以在标志字段(第四个字段)中看到discard
或指定。nofail
每一条这样的行对应一个交换区域(它不有作为一个分区,您可以拥有交换文件,甚至整个交换磁盘)。
在某些非常特殊的情况下,您可能会动态配置交换空间,尽管这种情况相当罕见,因为它可能会导致与内存管理相关的问题行为。在这种情况下,配置完全由用户空间组件处理,该组件在运行时根据需要创建并启用交换文件。
至于您需要多少,这是一个需要回答的复杂问题,但是您计划运行的不同 Linux 发行版的数量对此影响为零,除非您希望能够在运行一个发行版的同时让另一个发行版处于休眠状态(并且您可能不想这样做,因为这是搞砸系统的一种非常简单的方法)。
当您运行几乎所有主要发行版(包括 Fedora、OpenSUSE、Linux Mint、Debian 和 Ubuntu)的安装程序时,它会检测系统上任何现有的交换分区,并将它们添加到您要使用的发行版的配置中。安装(除非您选择手动分区),并且在大多数情况下,这将导致系统以合理的方式配置。
即使除此之外,我个人还是建议避免使用多个交换分区,除非您正在谈论具有大量磁盘的服务器系统,即使如此,您也确实需要知道您正在做什么才能进行设置,以便其性能良好。
答案2
比如说 Fedora 和 Ubuntu?
...这两个都是现在的 systemd 操作系统。
systemd 操作系统中会发生什么
原生机制
Systemd 使用各种类型的单元。 .mount
单元文件指示它安装卷。 .swap
单元文件指示它告诉内核有关交换分区的信息。 (.service
单元文件指示它如何运行服务。等等。)这些是本机 systemd 机制。为了实现它们,systemd 本身会分叉出进行相关系统调用的子进程。
如果您在这样的 systemd 操作系统上使用systemctl
命令(with ),它会告诉您有关加载的单元的信息。例如:--all
.swap
dev-disk-by\x2dpartuuid-40549710\x2d05.swap 已加载活动活动 /dev/disk/by-partuuid/40549710-05 dev-disk-by\x2duuid-1bb589e8\x2d929f\x2d4041\x2d81f4\x2dff2b339b4e2a.swap 加载活动活动 /dev/disk/by-uuid/1bb589e8-929f-4041-81f4-ff2b339b4e2a dev-sda5.swap 已加载 active active /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自动生成 [单元] 源路径=/etc/fstab 文档=man:fstab(5) man:systemd-fstab-generator(8) [交换] 什么=/dev/disk/by-uuid/1bb589e8-929f-4041-81f4-ff2b339b4e2a 选项=sw $
自动生成单元文件
人们可以手写它们。 通常然而,此类文件.mount
和.swap
单元文件是由称为发电机。两个这样的生成器是systemd-fstab-generator
和systemd-gpt-auto-generator
。它们都在引导过程的早期运行并响应systemctl daemon-reload
命令,并且(如您在上面看到的)它们将整个单元文件加载到/run/systemd/
.系统本身仅使用那些生成的单元文件。
前一个生成器读取/etc/fstab
,识别该文件格式的几个 systemd 扩展。正如我在回答评论中指出的那样,传统上交换分区具有安装类型这就是sw
人们如何发现其他操作系统识别该表中的交换记录的方式。但 Linux 软件采取了另一种方法来识别VFS型相反,寻找swap
VFS 类型。 systemd-fstab-generator
这里也不例外,这就是它/etc/fstab
在将其转换为本机机制时的解释方式。
后一个生成器处理保存 EFI 系统分区的同一磁盘上的 EFI 分区表,查找具有各种众所周知的 EFI 分区表条目隔断类型GUID。这些 GUID 之一是分配给 Linux 交换分区的传统 GUID;如果systemd-gpt-auto-generator
找到具有该 GUID 的分区(满足 systemd doco 中给出的标准),它将.swap
为其创建一个单元;/etc/fstab
完全没有参与。
当然,这个过程有很多副作用。例如,由于/etc/fstab
表没有主键,记录可能具有重复的“spec”和“file”(即“what”和“where”)字段。然而,在本机 systemd 机制中,“文件”(即“位置”)字段是单元的唯一键.mount
,嵌入到单元名称中。任何两个.mount
单位都不能共享它。对于.swap
单位,“规格”(即“内容”)字段是单位的唯一键。没有两个.swap
单位可以共享这一点。因此,并非所有记录都/etc/fstab
一定可以转换为本机机制并且可以工作,特别是当人们执行诸如出于两种不同目的列出相同安装点或以两种不同方式列出相同交换分区之类的操作时。
同样,因为已经翻译/etc/fstab
成了native机制和systemd的native机制有其他激活单位的方法,其行为与非 systemd 操作系统略有不同。默认情况下,一个.mount
单位是自动激活systemd-udevd
,即使在引导之后,也会响应已安装存储设备的出现。或者它可以被列为一个Wants=
或Requires=
一些.service
或.socket
单元,这意味着当它们被激活时它将被(重新)激活。甚至还有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/根磁盘上)。由于它们将共享所有自动发现的交换分区,因此实际上不需要为每个已安装的操作系统创建一个交换分区。
进一步阅读
- https://unix.stackexchange.com/a/332797/5132
- https://unix.stackexchange.com/a/233581/5132
- 伦纳特·珀特林等人。 (2016)。可发现分区规范。 freedesktop.org。
- 伦纳特·珀特林等人。 (2017)。
systemd.swap
。 系统手册页。 freedesktop.org。 - 伦纳特·珀特林等人。 (2017)。
systemd-fstab-generator
。 系统手册页。 freedesktop.org。 - 伦纳特·珀特林等人。 (2017)。
systemd-gpt-auto-generator
。 系统手册页。 freedesktop.org。 - 伦纳特·珀特林 (2014-06-17)。恢复出厂设置、无状态系统、可重复系统和可验证系统。 0pointer.net。
- 伦纳特·珀特林 (2014-09-01)。重新审视我们如何组合 Linux 系统。 0pointer.net。
- 伦纳特·珀特林 (2017-06-28)。mkosi — 生成操作系统映像的工具。 0pointer.net。
答案3
从历史上看,交换分区是/etc/fstab
用类型为 的条目指定的swap
。启动时,启动进程将读取该文件并将该配置推送到内核中。
条目的示例/etc/fstab
是:
/dev/sdb none swap sw 0 0
我不熟悉如何systemd
管理交换,但我相信最终结果是相同的:用户空间进程知道为交换分配了哪些空间,并且用户空间进程通知内核。
答案4
所有其他答案都提到了如何在启动时指向交换文件系统。
不过,有几点需要补充其他答案:
- 交换空间也可以是一个文件;
- 交换空间分区通常标记为类型 0x82;
- 你可以安装一个交换运行时任意点的空间;
- 为了标记/初始化分区/文件,以便稍后将其识别并使用/安装为交换空间,您需要使用以下命令
mkswap
; - 要手动激活/使用交换分区/文件,您可以使用以下命令
swapon
; - 同样,要关闭它,您可以选择
swapoff
.