当前有3种suspend模式:
suspend to RAM
(suspend
):状态保存和恢复都在内存中,节约的主机的电能。对于在电池状态运行的笔记本或者合上屏幕的笔记本推荐使用。suspend to disk
(hibernate
):状态保存在swap
空间并完全关闭主机。当主机电源启动,状态从swap
恢复。这也是完全没有电能消耗的模式。hybrid suspend
(suspend to both
):状态保存在swap
,但是并不关闭主机电源。相反,它激活suspend to RAM
。这样,如果电池没有耗尽时,就会从RAM中恢复主机状态。如果电池耗尽,则可以从磁盘恢复,此时恢复的时间比suspend to RAM
较长,但是不会丢失数据。
- (按照文档要求)软件包要求
emerge --ask sys-power/suspend
emerge --unmerge sys-power/upower
emerge --ask sys-power/upower-pm-utils
必须卸载掉
sys-power/upower
并安装sys-power/upower-pm-utils
,这样才会在桌面环境出现Suspend
和Hibernate
按钮。另一种替代选择是使用sys-power/hibernate-script
,这种方式适用于打过swsusp
和TuxOnIce
补丁包的内核。
- 内核配置
Power management and ACPI options --->
[*] Suspend to RAM and standby
[*] Hibernation (aka 'suspend to disk')
通过以下命令检查可用的suspend
模式
cat /sys/power/state
显示输出
freeze mem disk
使用以下命令执行suspend
pm-suspend
或者
s2ram
或者
hibernate
也可以通过底层方式
echo mem > /sys/power/state
或者(对于Tol)
echo 3 > /sys/power/tuxonice/powerdown_method
或者(对于TuxOnIce)
echo > /sys/power/tuxonice/do_hibernate
要能够suspend to disk需要确保系统中有swap分区或者swap文件,并且swap文件要在使用前激活
- 首先检查是否具备swap分区
swapon -s
假设使用/dev/sdc2
分区
编辑/etc/default/grub
并添加GRUB_CMDLINE_LINUX_DEFAULT
选项有关swap分区
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sdc2"
重建grub2配置
grub2-mkconfig -o /boot/grub/grub.cfg
更新initramfs
genkernel --install initramfs
添加以下行到/etc/pm/config.d/gentoo
SLEEP_MODULE="kernel"
重启系统
reboot
然后就可以尝试
pm-hibernate
对于我自己的实践,我是采用Mac双启动方式来在MacBook上安装Gentoo Linux。由于分区限制,只划分了一个分区给Gentoo Linux,所以实际是采用swap文件来实现hibernate的。
- 创建swap文件
mkdir /swap
dd if=/dev/zero of=/swap/file0 bs=512M count=32
mkswap /swap/file0
显示输出
Setting up swapspace version 1, size = 16 GiB (17179865088 bytes)
no label, UUID=1a6170e7-a38d-4829-be72-90f185e94289
- 查出swap文件所在磁盘分区的UUID
blkid /dev/sda4
显示输出
/dev/sda4: LABEL="Gentoo" UUID="6d6de45b-52b9-4c13-81b2-aff34a6791bd" TYPE="ext4" PARTLABEL="Gentoo" PARTUUID="ce1d1c89-8ca1-48b0-b4ef-5a312ae8c710"
- 计算出swap文件的偏移量
swap-offset /swap/file0
显示输出
resume offset = 5382144
man swap-offset
可以看到swap-offset
命令的解释是program to calculate the offset of a swap file in a partition
,所以这里我使用的是/dev/sda4
分区的UUID
- 修改GRUB配置
/etc/defaults/grub
(我没有进行这步,仅供使用grub的用户参考;我使用的是rEFInd的EFI bootloader,没有使用grub2)
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=6d6de45b-52b9-4c13-81b2-aff34a6791bd resume_offset=5382144"
然后重建GRUB配置
grub2-mkconfig -o /boot/grub/grub.cfg
然后重启系统尝试hibernate
- 我使用的是EFI bootloader
rEFInd
,所以跳过刚才的配置GRUB步骤(如果你是用GRUB,没有使用rEFInd
可以忽略这步),配置EFI/refind/refind.conf
menuentry cloud_partuuid_hibernate {
icon EFI/refind/icons/os_gentoo.png
loader EFI/gentoo/vmlinuz-4.5.0-gentoo-r1-cloud
options "ro root=PARTUUID=ce1d1c89-8ca1-48b0-b4ef-5a312ae8c710 resume=UUID=6d6de45b-52b9-4c13-81b2-aff34a6791bd resume_offset=5382144 rootfstype=ext4 init=/usr/lib/systemd/systemd"
}
这里添加的配置就是
resume=UUID=6d6de45b-52b9-4c13-81b2-aff34a6791bd resume_offset=5382144
不过,实际我测试还是没有成功,日志中显示
Thu Apr 7 22:50:44 CST 2016: performing hibernate
s2disk: Could not stat the resume device file. Reason: No such file or directory
待探索!!!
我使用xfce桌面环境,其内置的xfce-extra/xfce4-power-manager
则依赖sys-power/upower
而且不能很好地和upower-pm-utils
协作(休眠后会不断亮起screensaver),所以前述设置仅供参考
最终我还是卸载了upower-pm-utils
软件包,而采用xfce内建的xfce4-power-manager
(依赖sys-power/upower
软件包)。
emerge --unmerge sys-power/suspend
emerge --unmerge sys-power/upower-pm-utils
emerge --ask sys-power/upower
使用suspend to RAM
方式