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


13

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

我的问题如下:

  • 分发(或其他方式)何时以及如何进行“检查”以找到其Swap分区?
  • 它在启动期间发生吗?
  • 它只是检查所有可用磁盘并搜索带有“ swap”标志的分区?
  • 如果有几个这样的分区会怎样?
  • 另外,如果我在同一张磁盘上运行例如两个不同的发行版,例如Fedora和Ubuntu,我需要有几个交换分区?

17
请注意,在SSD上进行交换实际上是一个非常不错的交换(macOS这样做已经有很长时间了)。但是,它将对SSD进行额外的读/写操作,这可能会缩短其使用寿命。
Nonyme

20
您从哪里读到交换应该在HDD而不是SSD上?另外,文章或评论的年龄是多少?现代SSD在磨损均衡方面要好得多,并且在重复写入新SSD的方式后不会失败。另外,如果您有一台只有SSD的计算机,那么除了完全不使用交换功能之外,您实际上没有太多选择
JDS

2
@zakinster:那您的1TB驱动器何时总是装满怎么办?存储需求随存储需求的增加而增加。
Lightness Races in Orbit

3
换句话说,“是的,我同意,与我先前的说法相反,磁盘的实际大小无关紧要-您使用的磁盘数量是多少”
Lightness Races in Orbit

6
@DavidSchwartz而且,如果您“大量使用交换”,虽然SSD产生的系统性能损失要比HDD少得多,但更好的选择仍然是向系统添加更多RAM或减少虚拟磁盘。以某种方式停止工作负载的内存占用,以停止大量交换使用。还要注意的是,长时间运行的系统已经用几乎从未使用过的数据填充了交换,而正在主动交换和扫描的系统之间存在着区别……
twalberg

Answers:


24

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

典型的条目如下所示:

UUID=21618415-7989-46aa-8e49-881efa488132    none    swap     sw      0  0

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

在某些真正特定的情况下,您可能会改为动态配置交换空间,尽管这种情况很少见,因为它可能引起与内存管理有关的问题行为。在这种情况下,配置完全由用户空间组件处理,该组件在运行时根据需要创建并启用交换文件。

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

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

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


如果您有2个Linux发行版,则可能有一个系统交换分区...因此您可以尝试休眠和恢复...(最好使用其他用户顺便说一句,并且您也需要不同的/tmp分区/目录)。也许在这种情况下,最好有虚拟机……
Hastur

因此,建议他们在与Linux操作系统安装在同一SSD上有专用分区进行交换的建议,但是实际上并没有交换或正在使用它。如果我跑步,systemctl --all | grep swap我会得到两个结果。dev-disk-by\x2duuid-1c692cc4\x2df942\x2d4478\x2dad0f\x2d266b7484273a.swapswap.target这两者都是ACTIVE =无效SUB =死亡。如何使我的系统利用交换区?
Rockin4Life33

21

假设Fedora和Ubuntu?

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

systemd操作系统中会发生什么

本机机制

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

如果在这样的systemd操作系统上使用systemctl命令(带有--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已加载活动活动/ 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
Documentation = man:fstab(5)man:systemd-fstab-generator(8)

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

自动生成的单位文件

一个人可以手写。 一般然而,这样的.mount.swap单元文件是自动由称为程序生成的发电机。两个这样的生成器是systemd-fstab-generatorsystemd-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机制中,“文件”(即“ where”)字段是.mount单元的唯一键,嵌入到单元名称中。没有两个.mount单位可以共享它。对于.swap单位,“规格”(即“什么”)字段是单位的唯一键。没有两个.swap单位可以分享。因此,并非所有记录/etc/fstab都可以转换为本机机制并且可以正常工作,尤其是当人们出于诸如两个不同的目的列出同一安装点或以两种不同的方式列出同一交换分区之类的事情时。

同样,由于已转换/etc/fstab为本机机制,而systemd的本机机制具有其他激活单元的方式,因此其行为与非系统操作系统的行为有细微的差别。甲.mount单元将默认,可自动地由活化systemd-udevd,即使自举后,响应于的外观安装存储装置。或者可以将其列为一个Wants=Requires=多个.service或一个.socket单位,这意味着它们将被(重新激活)。甚至有RequiresMountsFor=

安装程序和系统方式

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

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

当然,在传统方案中,您确实可以使每个操作系统都有其自己的专用交换分区,而不必让它们彼此接触交换分区。实际上,如果您正在使用hibernate通过交换分区进行磁盘刻录,并且希望在休眠状态下能够多次引导至另一个操作系统(这是一个非常糟糕的主意,因为这样很容易导致文件系统损坏),这将是必要。

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

进一步阅读


非常好-谢谢您的解释!
安迪道尔顿

我当中有一部分人实际上只是为了谈论systemd而对您投反对票。但这当然是不公平的(而且系统化或否也并不意味着您错了),而且我通常也不会拒绝投票,因为在我看来,这从来都不是建设性的适当方法。但是,这是一篇不错的文章,因此尽管看到了对Lennart的引用,但我还是投票赞成该答案。如果没有别的,您会付出努力,应该受到赞扬。我已经简单阅读了有关无状态垃圾的信息,那是相当的……我什至不知道它会做什么,所以我就把它留在那儿。
Pryftan

13

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

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

/dev/sdb    none    swap     sw      0  0

我不熟悉如何systemd管理交换,但是我确实相信最终结果是相同的:用户空间进程知道分配了哪些空间用于交换,而用户空间进程则通知内核。


发问者询问了有关Linux的信息,这对于Linux来说并没有错。但是它是Linux特有的。其他操作系统,例如FreeBSD,/etc/fstabsw安装类型而不是从swapVFS类型识别交换记录。
JdeBP '18

1
答案并未解决问题的所有部分。
Sergiy Kolodyazhnyy

我还应该指出,这个答案在systemd操作系统领域也已经过时了。它没有考虑到systemd-gpt-auto-generator
JdeBP '18

2
您是什么意思systemd不使用fstab?当然可以!
psusi

1
@psusi:systemd可以理解,但不需要fstab。
MSalters

4

所有其他答案都提到了如何在启动时指向交换文件系统。

但是,有几点要补充到其他答案中:

  • 交换空间也可以是文件;
  • 交换空间分区通常标记为0x82类型;
  • 您可以在运行时的任何时候安装交换空间;
  • 为了标记/初始化分区/文件,以便稍后被识别和使用/挂载为交换空间,您需要使用以下命令mkswap
  • 要手动激活/使用交换分区/文件,请使用命令swapon
  • 同样地,您也可以选择进行交换swapoff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.