我在笔记本中配置了一个新的Ubuntu安装,以使用交换文件,而不是使用交换分区。
默认情况下,Ubuntu无法使用交换文件进行休眠,所以我试过这个教程,但它特定于grub1,而Ubuntu现在使用的是grub2。
有人知道如何做这个吗?
sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | awk '/MemTotal/ {print $2}') count=1024 conv=notrunc
sudo mkswap /swapfile
sudo swapon /swapfile
/swapfile
的分区的UUID:$ sudo findmnt -no UUID -T /swapfile
20562a02-cfa6-42e0-bb9f-5e936ea763d0
uswsusp
以正确使用交换文件:sudo dpkg-reconfigure -pmedium uswsusp
# Answer "Yes" to continue without swap space
# Select "/dev/disk/by-uuid/20562a02-cfa6-42e0-bb9f-5e936ea763d0" replace the UUID with the result from the previous findmnt command
# Encrypt: "No"
sudo systemctl edit systemd-hibernate.service
编辑SystemD休眠服务,并填入以下内容:[Service]
ExecStart=
ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
ExecStart=/usr/sbin/s2disk
ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep
$ sudo swap-offset /swapfile
resume offset = 34818
/etc/default/grub
并修改以下行:GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
sudo update-grub
/etc/initramfs-tools/conf.d/resume
:RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
# Resume from /swapfile
sudo update-initramfs -u -k all
现在您可以使用sudo systemctl hibernate
进入休眠模式。
您还可以创建这些脚本:
sudo tee /usr/local/bin/gotosleep <<EOF
dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
sleep 2
sudo /usr/sbin/s2both
EOF
sudo chmod +x /usr/local/bin/gotosleep
sudo tee /usr/local/bin/gotohibernation <<EOF
dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
sleep 2
sudo systemctl hibernate
EOF
sudo chmod +x /usr/local/bin/gotohibernation
所以你可以使用 gotosleep
进入睡眠状态,或者使用 gotohibernation
进入休眠状态。
为了让上述脚本能够正常工作,你必须能够执行 sudo s2both
、sudo s2ram
和 sudo systemctl hibernate
而无需输入密码。
你可以通过创建一个名为 powerdev
的用户组,并将当前用户添加到该用户组中,并配置以下sudoers配置文件(使用 sudo visudo -f /etc/sudoers.d/powerdev
来编辑):
%powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate
使用的文档:
bs=$(cat /proc/meminfo..)
看起来很奇怪,默认值是 512
。这里的单位是以百万字节计算的。这是怎么回事呢? - Timosudo systemctl hibernate
时出现了Failed to hibernate system via logind: Sleep verb not supported
的错误。事实证明,cat /sys/power/state
必须返回freeze mem disk
,但在我的情况下,disk
是缺失的。为了解决这个问题,我只需要在BIOS中禁用安全启动即可。完成后,cat /sys/power/state
将返回freeze mem disk
,而sudo systemctl hibernate
将正常工作。 - Dmitry Franksudo systemctl hibernate
的输出如下:通过 logind 无法使系统休眠:休眠所需的交换空间不足
。我尝试增加交换空间,但没有成功。现在我有100GB的交换空间和32GB的RAM,但问题依然存在。 - pieroxy虽然可以通过设置内核参数在swap文件中进行休眠,并且据说它与systemd休眠一起工作。但是,我无法使其恢复,所以改用了uswsusp(用户空间软件挂起)。以下是我在Ubuntu 17.04/17.10上使用的步骤。
创建一个格式化的4GiB交换文件,并将其挂载并添加到/etc/fstab
中的命令:
sudo fallocate -l 4g /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
sudo findmnt -no SOURCE,UUID -T /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233
sudo apt install uswsusp
创建/etc/uswsusp.conf
并重新创建initramfs
:
sudo dpkg-reconfigure -pmedium uswsusp
是
对于 '继续没有有效的交换空间?' (向导尚未设置交换文件。)findmnt
的详细信息进行交叉参考。(注意:不是交换文件本身)注意:手动对/etc/uswsusp.conf
进行的任何更改都需要使用以下命令重新创建initramfs
:
sudo update-initramfs -u
sudo s2disk
sudo systemctl edit systemd-hibernate.service
[Service]
ExecStart=
ExecStart=/usr/sbin/s2disk
ExecStartPost=/bin/run-parts -a post /lib/systemd/system-sleep
这将创建一个具有覆盖详细信息的/etc/systemd/system/systemd-hibernate.service.d/override.conf
文件。
systemctl hibernate
systemctl status systemd-hibernate.service
参考资料:
ExceStart=run-parts -a post /lib/systemd/system-sleep
改为 ExceStartPost=run-parts -a post /lib/systemd/system-sleep
。 - Joaquín Aramendíasystemctl
的 enable
选项会从 /etc/systemd/system/
创建一个符号链接到 /lib/systemd/system/
。你不应该直接复制到 /etc/systemd/system/
。 - Auspex/etc/systemd/system
目录下。你可以参考这个链接:https://wiki.archlinux.org/index.php/systemd#Writing_unit_files - Casconf
文件的替代方法,但仍然建议使用其中任何一种方式。 - Cassudo s2disk
只记录了“保存快照”,然后关闭显示器,停顿约5分钟,然后关机。然而,当我重新启动后,它像没有休眠一样正常启动。 - m93a/etc/default/grub
中的GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sdaX quiet splash"
中添加resume=/dev/sdaX
,以使此工作生效(更新grub后也要运行sudo update-grub
)。其中sdaX
是具有交换文件的分区。来源:https://wiki.debian.org/Hibernation/Hibernate_Without_Swap_Partition - Martin Beckersudo s2disk s2disk: Could not use the resume device (try swapon -a). Reason: No such device
的提示。 - user1915011sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swap
应该改成 sudo findmnt -no SOURCE,UUID -T /swapfile
。 - user1915011fallocate
来创建交换文件是不推荐的,因为它可能导致创建一个带有空洞的文件,建议使用dd
代替。点击此处了解更多信息。 - ManSamVampireGRUB_CMDLINE_LINUX="resume=... resume_offset=..."
之后,运行sudo update-grub
使更改生效。
更改GRUB_CMDLINE_LINUX
不会影响您拥有的其他Linux安装(因为/etc/grub.d/30_os-prober
不使用此变量)。
关于您遇到的问题:交换文件分区是否加密?如果是,则无法休眠。如果不是,则filefrag -v /swapfile
的输出可能会有所帮助。
/etc/default/grub
之后,你需要运行update-grub
命令。 - JanC/etc/grub.d/30_os-prober
,你会发现GRUB_CMDLINE_LINUX
没有被使用,所以改变它不会影响其他Linux安装。 - Andrea Corbelliniuswusp已被弃用。您仍然可以在Ubuntu <= 20.04中使用它。要在Ubuntu 22.04上查找交换偏移量:
运行sudo filefrag -v /swapfile
"physical_offset"
列中,复制第一行的数字(不包括点号!)。
值示例:1234567
。由于之前的回答似乎没有完全涵盖所有方面,这里是我为了在Debian Bullseye上顺利运行一切所采取的步骤,因此应该适用于使用grub2而不使用已经不存在的软件包uswsusp
和整个s2*
功能的Ubuntu 22及更高版本。我认为这也适用于较低版本:
/tmpdisk/system/swap.file
的交换文件。如何准备它,请参考this answer。# filefrag -v /tmpdisk/system/swap.file
获得结果后,偏移量就是第一个物理偏移片段的编号。
Filesystem type is: ef53
File size of /tmpdisk/system/swap.file is 68719476736 (16777216 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 63487: 34816.. 98303: 63488:
1: 63488.. 126975: 100352.. 163839: 63488: 98304:
2: 126976.. 190463: 165888.. 229375: 63488: 163840:
…
通过简单地发出以下命令,可以获取相同的信息:
# filefrag -v /tmpdisk/system/swap.file | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'
直接获取偏移值:
34816
/tmpdisk/system/swap.file
位于分区上,挂载在挂载点/tmpdisk
上):# findmnt -no UUID,SOURCE -T /tmpdisk
结果类似于这样:
6b127402-e917-4ab0-9490-00faa74e88e5 /dev/sdb1
/etc/default/grub
中的偏移量:GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=6b127402-e917-4ab0-9490-00faa74e88e5 resume_offset=34816"
/etc/initramfs-tools/conf.d/resume
中获取的交换文件分区的UUID和偏移量,按照以下方式进行操作:resume=UUID=6b127402-e917-4ab0-9490-00faa74e88e5
resume_offset=34816
[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes
pri=0
,一个大的swap文件pri=1
,对我们两个都有效。 - Thomas Guyot-Sionnest