欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识
原文出处: 暗无天日

最近公司划定晚上走人后必需封锁电脑,可是像我们这样的人,常常会健忘了封锁电脑,并且封锁电脑之后再规复事情情况也是件挺贫苦的工作,无奈之下只能折腾一下,让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