最近公司划定晚上走人后必需封锁电脑,可是像我们这样的人,常常会健忘了封锁电脑,并且封锁电脑之后再规复事情情况也是件挺贫苦的工作,无奈之下只能折腾一下,让linux按时休眠了。
休眠的范例
今朝或许由三种范例的休眠:
suspend(suspend to RAM)
指的是除了内存以外的大部门呆板部件都进入断电状态。 这种休眠状态规复速度出格快,但由于内存中的数据并没有被生存下来,因此这个状态的系统并没有进入真正意义上的休眠状态,还在一连耗电。
hibernate(suspend to disk)
这种休眠会将内存中的系统状态写入互换空间内,当系统启动时就可以从互换空间内读回系统状态。 这种环境下系统可以完全断电,但由于要生存/读取系统状态到/从互换空间,因此速度会较量慢,并且需要举办一些设置(下面会说到)
hybrid(suspend to both)
团结了上面两种休眠范例。它像hibernate一样将系统状态存入互换空间内,同时也像suspend一样并不封锁电源。 这种,在电源未耗尽之前,它能很快的从休眠状态规复。而若休眠期间电源耗尽,则它可以从互换空间中规复系统状态。
suspend 休眠
进入 suspend 出格简朴,无需特另外设置,在 systemd 系统上直接执行 systemctl suspend 就行了。\
systemctl suspend
它的实际行动由 systemd-suspend.service 所界说, 在 archlinux 上,它长成这样子的:
# SPDX-License-Identifier: LGPL-2.1+ # # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. [Unit] Description=Suspend Documentation=man:systemd-suspend.service(8) DefaultDependencies=no Requires=sleep.target After=sleep.target [Service] Type=oneshot ExecStart=/usr/lib/systemd/systemd-sleep suspend
Hibernation 休眠
由于 hibernation 休眠要求将内存中的内容写入到互换空间中,因此你至少要有一个空间大于内存的互换分区可能互换文件。 (其实若互换空间不足内存大也不是必然就无法举办hibernation休眠,可以实验运行 echo 0 |sudo tee /sys/power/image_size, 这会让系统在写入互换空间时尽大概的举办压缩,但这种要领也无法担保必然可以或许休眠乐成)
若之前没有建设互换分区,那么可以姑且建设一个互换文件来用。好比下面呼吁建设一个5G的互换文件
sudo dd if=/dev/zero of=/swapfile bs=10240 count=524288 sudo mkswap /swapfile sudo chmod 0600 /swapfile sudo swapon /swapfile sudo cp /etc/fstab /etc/fstab.bak echo "/swapfile swap swap default 0 0" |tee -a /etc/fstab
Setting up swapspace version 1, size = 5 GiB (5368705024 bytes) no label, UUID=d0f0c682-e1fa-416f-8fe2-b554b8ca363a /swapfile swap swap default 0 0
除此建设互换分区之外,我们还需要修改kernel的启动参数,让系统在启动时先实验从互换空间中规复状态。 详细操纵如下:
1. 假如利用互换分区来生存,则只需要为添加kernel的启动参数 resume=互换分区 即可
(1) 查察那块分区是互换分区
swapon NAME TYPE SIZE USED PRIO /dev/sda2 partition 8G 280K -2 /swapfile file 5G 0B -3
可以看出互换分区为 /dev/sda2
(2) 修改 /etc/default/grub, 为 GRUB_CMDLINE_LINUX_DEFAULT 行添加参数 resume=/dev/sda2
sudo sed -i '/GRUB_CMDLINE_LINUX_DEFAULT/ s!"$! resume=/dev/sda2"!' /etc/default/grub
2. 假如是利用互换文件,则需要添加两个参数 resume=互换文件地址磁盘 以及 resume_offset=互换文件在磁盘中的偏移位置:
(1) 查察互换文件地址磁盘
df /swapfile 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda3 55253696 27582224 24834972 53% /
说明磁盘为 /dev/sda3
(2) 查察互换文件的偏移位置
sudo filefrag -v /swapfile|head -5 Filesystem type is: ef53 File size of /swapfile is 5368709120 (1310720 blocks of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 32767: 4653056.. 4685823: 32768: 1: 32768.. 65535: 4685824.. 4718591: 32768:
这里可以看出物理偏移位置时4653056
(3) 修改 /etc/default/grub, 为 GRUB_CMDLINE_LINUX_DEFAULT 行添加参数 resume=/dev/sda3 resume_offset=4653056
sudo sed -i '/GRUB_CMDLINE_LINUX_DEFAULT/ s!"$! resume=/dev/sda3 resume_offset=4653056"!' /etc/default/grub
3. 从头生成 grub.cfg 文件
sudo grub-mkconfig -o /boot/grub/grub.cfg