两个交换文件,休眠工作,如何正确配置休眠以防止空间不足或以某种方式失败

Leo*_*Mew 2 ssd hibernate swap

我已经配置了休眠,它可以工作,只是为了确保它不会在某个时候失败 - 这个问题。

我在不同的设备上有两个交换文件,第一个是 SSD 上的小交换,第二个是 HDD 上的 ram 大小。Hibernate 配置为小一。它现在工作正常,因为休眠并不总是需要太多(不是所有的写或压缩,我不知道)。

如何配置休眠以使用两个交换?或者它会自动处理它们而无需执行任何操作?在内核选项中,我设置了第一个小交换,如果它首先使用它(最快)然后第二次使用它,那就太好了。
我不想让 SSD 交换更大,因为 SSD 很小。

leonid@DevSSD:~$ grep resume < /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=UUID=050f8852-d8f6-4979-a4e4-c3d9b981bee9 resume_offset=34816"
Run Code Online (Sandbox Code Playgroud)

/etc/fstab

UUID=050f8852-d8f6-4979-a4e4-c3d9b981bee9   /   ext4    relatime,grpquota,data=ordered,usrquota,rw,errors=remount-ro,quota  0   1
UUID=3bcf1591-7033-416a-addf-9cf8e2e10c93   /home/leonid/hdd    ext4    defaults,rw,errors=remount-ro   0   1
/swapfile                   none    swap    sw  0   0
/home/leonid/hdd/swapfile   none    swap    sw  0   0
UUID=26DA-1C76  /boot/efi   vfat    defaults    0   1
Run Code Online (Sandbox Code Playgroud)

更新:我为测试和设置优先级做了更小的交换。休眠不会以更高的优先级进行交换:

leonid@DevSSD:~$ swapon
NAME                      TYPE SIZE USED PRIO
/swap64k                  file  60K   0B    1
/home/leonid/hdd/swapfile file   8G   0B  100
leonid@DevSSD:~$ systemctl hibernate
Failed to hibernate system via logind: Sleep verb not supported
Run Code Online (Sandbox Code Playgroud)

Cha*_*een 5

简而言之,您不必使用单个文件或分区进行休眠。

TL; 博士

睡眠状态电源接口的基本内核文档中没有任何内容表明交换必须在单个文件中。实际上,有一些迹象表明休眠数据已写入计算机上的可用交换空间:

然而,进一步的探索将我们引向 swsusp 的文档,其中有一个简短的常见问题部分,以及引用

问:swsusp(到磁盘)是只使用一个交换分区还是可以使用多个交换分区(将它们聚合到一个逻辑空间中)?

A:只有一个交换分区,抱歉。

尽管这仅直接与分区有关,但我肯定会将其解释为适用于您机器上的交换空间

“如果我的交换文件上没有足够空间怎么办”的潜在问题。在这里,我们遇到了一些含糊不清的情况。该文档向我们保证,系统将默认尝试创建大约为内存大小的 2/5 的图像:

/sys/power/image_size 控制休眠图像的大小。

它可以写成一个表示非负整数的字符串,该字符串将用作图像大小的最大努力上限,以字节为单位。休眠核心将尽最大努力确保图像大小不会超过该数字。但是,如果结果证明无法实现,仍会创建休眠图像,并且其大小将尽可能小。特别是,将“0”写入此文件将强制休眠图像尽可能小。

然而,文件没有说明如果图像超过交换大小可能会发生什么。当我不小心关闭掉交换并试图休眠时,我自己的经验是没有任何反应。

稍后编辑

这是否说明了我,Ubuntu 用户或 Linux 用户?

我很好奇如果交换文件太小会发生什么,所以我创建了一个 44KB 的交换文件(有效!)并尝试休眠:

chick@dad:~$ swapon
NAME   TYPE SIZE USED PRIO
/swap2 file  44K   0B   -2
chick@dad:~$ sudo systemctl hibernate
Failed to hibernate system via logind: Not enough swap space for hibernation
Run Code Online (Sandbox Code Playgroud)

我通过使用两个交换文件进一步测试,较小的一个优先级更高:

chick@dad:~$ sudo swapon /swap2 -p 1
chick@dad:~$ sudo swapon /swapfile -p 2
chick@dad:~$ swapon
NAME      TYPE SIZE USED PRIO
/swap2    file  44K   0B    1
/swapfile file  16G   0B    2
chick@dad:~$ sudo systemctl hibernate
Failed to hibernate system via logind: Not enough swap space for hibernation
Run Code Online (Sandbox Code Playgroud)

  • @ leonid - `man 2 swapon` 似乎表明交换区域也有“订单加载”偏好。这是一个有趣的问题,我可能建议对于正常操作,您以高优先级加载 SSD 交换,并以低优先级加载 HDD 交换,但首先在 fstab 中加载 HDD 交换。 (2认同)
  • @dessert 我认为编写脚本以添加交换文件或更改交换文件的想法很有趣,但我认为此时无法轻松完成。命令 systemctl hibernate 作为它的第一个动作检查交换,这似乎是 systemctl.c 不可或缺的一部分。也许可以修补和重新编译,但这是一大堆蠕虫! (2认同)