我已经在笔记本中配置了新的 Ubuntu 安装以使用交换文件,而不是使用交换分区。
默认情况下,无法使用交换文件让 Ubuntu 进入休眠状态,因此我尝试本教程,但它具体到grub1Ubuntu 现在使用grub2。
有人知道怎么做这个吗?
答案1
以下是我为使其与 Ubuntu 18.04 兼容所做的操作。
- 确保你的
/swapfile
内存至少与你的 RAM 大小相同
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
- 请记下包含以下内容的分区的 UUID
/swapfile
:
$ 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"
- 使用编辑 SystemD 休眠服务
sudo systemctl edit systemd-hibernate.service
并填充以下内容:
[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
- 请注意您的恢复偏移量
/swapfile
:
$ sudo swap-offset /swapfile
resume offset = 34818
/etc/default/grub
通过编辑和修改以下行来配置 Grub 以从交换文件恢复:
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
- 更新 Grub:
sudo update-grub
- 创建以下内容
/etc/initramfs-tools/conf.d/resume
:
RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
# Resume from /swapfile
- 更新 initramfs:
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
所用文档:
答案2
使用 uswusp 进行 Hibernate 和交换文件
虽然可以通过设置内核参数来切换文件,并且据说可以通过 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
配置 uswsusp
创建/etc/uswsusp.conf
并重新创建initramfs
:
sudo dpkg-reconfigure -pmedium uswsusp
Yes
到 '在没有有效交换空间的情况下继续吗?‘(向导尚未设置交换文件。)- 选择分割交换文件所在的位置,请与
findmnt
上面的详细信息进行交叉引用。(笔记:不是交换文件本身)
注意:任何手动更改都/etc/uswsusp.conf
需要initramfs
随后使用此命令重新创建:
sudo update-initramfs -u
测试 uswusp hibernate
sudo s2disk
snapshot
休眠和恢复时屏幕上应该有消息。
将 s2disk 与 systemd hibernate 结合使用
默认情况下,systemd 将使用它自己的休眠命令,因此通过覆盖以下命令将它们替换为 uswusp 命令systemd-hibernate.service
:
sudo systemctl edit systemd-hibernate.service
在打开的文本编辑器中输入以下文本(需要空白的 ExecStart)。然后保存并退出:
[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
包含覆盖详细信息的文件。
测试 systemd 休眠:
systemctl hibernate
注意:要检查 systemdoverride.conf
是否已创建、加载且没有错误,请运行:
systemctl status systemd-hibernate.service
参考:
答案3
Ubuntu 22.04
乌斯沃普已弃用。你仍然可以使用它Ubuntu <= 20.04要在 Ubuntu 22.04 上查找交换偏移量:
Run sudo filefrag -v /swapfile
- 在
"physical_offset"
列中,复制第一个行号(不带点!)。值示例:1234567
。
来源:如何在 Ubuntu 上启用休眠模式(使用交换文件时)
对于 Ubuntu 22.04,所有其他步骤保持不变,因此除了安装和使用之外,您可以按照其他答案进行操作乌斯沃普。
答案4
由于之前的答案似乎没有一个能完全涵盖所有方面,因此这里列出了所有对我有用的步骤,使一切在 Debian Bullseye 上顺利运行,因此应该适用于 Ubuntu 22,希望更高版本也能使用 grub2,而无需使用不再存在的软件包uswsusp
和整个s2*
工具。我希望这也适用于较低版本:
- 假设我们已经准备好了名为 的交换文件
/tmpdisk/system/swap.file
。如何准备,请参阅示例这个答案。 - 通过确定交换文件在分区上的第一个片段的位置来获取有关交换偏移的信息,例如:
# 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
- 找到包含交换文件的分区的 UUID(在我的例子中,文件
/tmpdisk/system/swap.file
放在分区上,挂载在挂载点上/tmpdisk
,因此):
# findmnt -no UUID,SOURCE -T /tmpdisk
结果是这样的
6b127402-e917-4ab0-9490-00faa74e88e5 /dev/sdb1
- 使用获取的包含交换文件的分区的 UUID 和偏移量
/etc/default/grub
:
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=6b127402-e917-4ab0-9490-00faa74e88e5 resume_offset=34816"
- 使用获取的包含交换文件的分区的 UUID 和偏移量
/etc/initramfs-tools/conf.d/resume
:
按照以下方式
resume=UUID=6b127402-e917-4ab0-9490-00faa74e88e5
resume_offset=34816
- 更新所有使用的内核的 ramdisk:
# update-initramfs -u -k all
- 更新 grub:
# update-grub
就是这样...
备注:UUID=6b127402-e917-4ab0-9490-00faa74e88e5 和 resume_offset=34816 的值在每个系统上都是单独的。