Archlinux休眠设置
2017-03-11 更新:
- 优化部分文字描述;
- 默认情况下禁用 swap 分区, 当执行休眠操作时先启用 swap 分区, 然后再执行休眠操作(给
/usr/bin/{swapon,swapoff}添加 S 权限位, 以便普通用户修改 swap 配置);
基础配置
因为笔记本只有 180GB 的固态硬盘, 当初安装系统就使用 swap 文件代替 swap 分区. 首先检查下 swap 文件大小, 确定其足以 dump 整个内存:
$ swapon -s
文件名 类型 大小 已用 权限
/swapfile file 8388604 1467244 -1
然后就是配置 GRUB 启动参数:
title Arch
kernel (hd0,5)/boot/vmlinuz-linux root=/dev/sda6 rw quiet resume=/dev/sda6 resume_offset=2537472
initrd (hd0,5)/boot/initramfs-linux.img
其中 resume 参数是 swap 文件所在分区, resume_offset 是真正存储内存 dump 数据(physical_offset)的偏移, 可通过 filefrag 命令获取:
# filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 8589934592 (2097152 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 2537472.. 2537472: 1:
1: 1.. 2047: 2537473.. 2539519: 2047: unwritten
2: 2048.. 4095: 2899968.. 2902015: 2048: 2539520: unwritten
3: 4096.. 6143: 2914304.. 2916351: 2048: 2902016: unwritten
....
在我的电脑上, resume_offset 值就是 2537472.
测试和问题分析
完成以上准备工作后执行 systemctl hibernate 命令执行休眠(dump 内存到 swap 文件并关机), 重启时发现, 只有少数几次能够从休眠中复原环境, 大多数是恢复失败直接进入登录页面(另外, 4.4 版本的内核对休眠支持有bug, 重启后黑屏, 升级 4.9 后解决该问题). 查看日志发现:
2月 25 20:10:07 hostname systemd[1]: Starting Hibernate...
2月 25 20:10:39 hostname kernel: PM: Hibernation image not present or could not be loaded.
2月 25 20:10:39 hostname kernel: PM: Hibernation image partition 8:6 present
2月 25 20:10:39 hostname kernel: PM: Hibernation image not present or could not be loaded.
为什么会提示 Hibernation image not present or could not be loaded, 但为什么有时候又能成功呢? 猜测在某些情况下将内存 dump 到 swap 文件时出错了.
查看 Wiki 发现有个 /sys/power/image_size 参数配置, Wiki 说:
/sys/power/image_size 用来控制将内存 dump 到硬盘时所占空间的大小. 在 dump 内存时, 所占用的硬盘空间不会超过 /sys/power/image_size 的大小. 如果内存数据太多, 那就只会 dump 最小的镜像到硬盘. 如果该文件值为 0, 则在 dump 内存时尽可能压缩数据占用最少的硬盘空间(上限是 swap 分区/文件的大小). 该文件的默认值是内存的 2/5 .
看了上面这段描述, 猜测是/sys/power/image_size 值过小致使内存 dump 文件不完整, 从而导致无法从休眠中启动恢复环境. 于是将其修改为 0:
$ sudo tee /sys/power/image_size <<< 0
[sudo] username 的密码:
0
在内存使用率超过 2/5 的情况下测试通过.
然而, 重启后 /sys/power/image_size 配置值又恢复为默认的内存大小的 2/5, System: Temporary Files 介绍了一种方法:
新建文件 /etc/tmpfiles.d/modify_power_image_size.conf, 内容为:
w /sys/power/image_size - - - - 0
重启后确认已生效:
$ cat /sys/power/image_size
0
扩展配置
通过 acpid 捕获合上笔记本屏幕事件
安装并启用 acpid:
sudo pacman -S acpid
sudo systemctl enable acpid
编辑 /etc/acpi/handler.sh 的 button/lid 部分, 当合上笔记本屏幕时, 执行锁屏和挂起(睡眠)操作:
DISPLAY=:0.0 su -c - your_username /usr/bin/slimlock &
systemctl suspend
处理合上笔记本屏幕事件:
button/lid)
case "$3" in
close)
logger 'LID closed'
DISPLAY=:0.0 su -c - your_username /usr/bin/slimlock &
systemctl suspend
;;
open)
logger 'LID opened'
;;
*)
logger "ACPI action undefined: $3"
;;
附 /etc/acpi/handler.sh 完整文件:
#!/bin/bash
# Default acpi script that takes an entry for all actions
case "$1" in
button/power)
case "$2" in
PBTN|PWRF)
logger 'PowerButton pressed'
;;
*)
logger "ACPI action undefined: $2"
;;
esac
;;
button/sleep)
case "$2" in
SLPB|SBTN)
logger 'SleepButton pressed'
;;
*)
logger "ACPI action undefined: $2"
;;
esac
;;
ac_adapter)
case "$2" in
AC|ACAD|ADP0)
case "$4" in
00000000)
logger 'AC unpluged'
;;
00000001)
logger 'AC pluged'
;;
esac
;;
*)
logger "ACPI action undefined: $2"
;;
esac
;;
battery)
case "$2" in
BAT0)
case "$4" in
00000000)
logger 'Battery online'
;;
00000001)
logger 'Battery offline'
;;
esac
;;
CPU0)
;;
*) logger "ACPI action undefined: $2" ;;
esac
;;
button/lid)
case "$3" in
close)
logger 'LID closed'
DISPLAY=:0.0 su -c - your_username /usr/bin/slimlock &
systemctl suspend
;;
open)
logger 'LID opened'
;;
*)
logger "ACPI action undefined: $3"
;;
esac
;;
*)
logger "ACPI group/action undefined: $1 / $2"
;;
esac
# vim:set ts=4 sw=4 ft=sh et:
借助 zenity 编写系统操作的小程序
借助 zenity 编写系统操作APP, 支持 睡眠(挂起)/深度睡眠/休眠/关机/重启(在休眠前启用 swap 分区):
#!/bin/sh
function Suspend() {
slimlock &
sleep 1
systemctl suspend
}
HybridSleep() {
slimlock &
sleep 1
/usr/bin/swapon /swapfile && systemctl hybrid-sleep
}
function Hibernate() {
slimlock &
/usr/bin/swapon /swapfile && systemctl hibernate
}
function Shutdown() {
zenity --question --text="确定关机?" && \
# echo "do shutdown" \
systemctl poweroff
}
function Reboot() {
zenity --question --text="确定重启?" && \
# echo "do reboot" \
systemctl reboot
}
type=$(zenity --list \
--timeout="10" \
--width="200" \
--height="240" \
--title="要抛弃我啦?" \
--column="操作" \
"Suspend" \
"HybridSleep" \
"Hibernate" \
"Shutdown" \
"Reboot"
)
ret=$?
if [ $ret == 1 ]
then
# 点击 "关闭" 或 "取消"
echo "no choice, exit"
exit
elif [ $ret == 5 ]
then
echo "timeout"
exit
fi
eval $type
参考链接:
- Archlinux Wiki: Power management/Suspend and hibernate
- Archlinux Wiki: Systemd
- Archlinux BBS: Updating systemd sometimes causes total freeze and unbootable
- Archlinux BBS: systemctl hibernate can't find my swap file
Archlinux休眠设置的更多相关文章
- Arch Linux 的休眠设置
https://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate_(简体中文)https://wiki.archl ...
- Archlinux风扇设置
在笔记本(ThinkPad T440)连续两天因过热而死机后, 对内核的风扇控制算法果断失去信心. 风扇的用户层控制接口是 /proc/acpi/ibm/fan, 但为防止用户控制不当烧坏机器, 默认 ...
- [adminitrative][archlinux][setfont] 设置console的字体大小
电脑的分辨率高了之后,用命令行进入的时候,完全看不清楚,是否容易导致眼瞎. 第一步便把字体调大就成了很必要的操作. 使用一个命令能马上生效: setfont 使用配置文件 /etc/vconsole. ...
- Ubuntu:笔记本计算机屏幕合盖后进入/不进入休眠设置
造冰箱的大熊猫,本文在Ubuntu 18.04上验证通过@cnblogs 2019/5/12 1.问题描述 安装有Ubuntu的笔记本计算机与KVM控制器相连,同时一台台式机也与KVM相连.启动笔记本 ...
- 取消Debian屏保及显示器休眠
在产品展示场合,屏保及休眠会带来不好的体验,很多时候需要关闭掉. dpms显示器休眠设置: 开启:$ sudo xset dpms 1 1 2取消:$ sudo xset -dpms xset设置屏保 ...
- 自己家里搭建NAS服务器有什么好方案?
转自:https://www.zhihu.com/question/21359049 作者:陈二发链接:https://www.zhihu.com/question/21359049/answer/6 ...
- Andriod WIFI驱动模块
一:什么是WIFI WIFI是一种无线连接技术,可用于手机.电脑.PDA等终端.WIFI技术产生的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11标 ...
- ACPI
高级配置与电源接口(Advanced Configuration and Power Interface),简称ACPI.1997年由Intel.Microsoft.Toshiba 所共同制定提供操作 ...
- UE4网络同步属性笔记
GameMode只有服务端有,适合写游戏逻辑.PlayerController每个客户端拥有一个,并拥有主控权.GameState在服务端同步到全端. CLIENT生成的Actor对其有Authori ...
随机推荐
- Mysql 死锁
http://www.cnblogs.com/benshan/archive/2013/05/09/3068886.html 声明:以下讨论只是针对InnoDB存储引擎. 何为死锁? 死锁是对资源 ...
- POJ 2983:Is the Information Reliable?(差分约束)
题目大意:有n个点在一条直线上,有两类关系:P(x,y,v)表示x在y北边v距离处,V(x,y)表示x在y北边至少1距离出,给出一些这样的关系,判断是否有矛盾. 分析: 差分约束模板题,约束条件P:a ...
- 省选算法学习-插头dp
插头dp?你说的是这个吗? 好吧显然不是...... 所谓插头dp,实际上是“基于连通性的状态压缩dp”的简称,最先出现在cdq的论文里面 本篇博客致力于通过几道小小的例题(大部分都比较浅显)来介绍一 ...
- BZOJ 3462 DZY Loves Math II ——动态规划 组合数
好题. 首先发现$p$是互质的数. 然后我们要求$\sum_{i=1}^{k} pi*xi=n$的方案数. 然后由于$p$不相同,可以而$S$比较小,都是$S$的质因数 可以考虑围绕$S$进行动态规划 ...
- 自制wifi信号放大器
自制wifi信号放大器 只要家里安装了一台无线路由器,在家里的任何地方都可以使用带上网功能的电子产品上网,但是由于距离的问题,WiFi信号有强弱之分,离无线路由器稍微远点,信号就有所降低,上网速度受影 ...
- 树的合并 connect
树的合并 connect 题目描述 话说moreD经过不懈努力,终于背完了循环整数,也终于完成了他的蛋糕大餐. 但是不幸的是,moreD得到了诅咒,受到诅咒的原因至今无人知晓. moreD在发觉自己得 ...
- 免费tk域名+freewebhostingarea空间
1.申请免费域名 进入http://www.dot.tk(推荐注册tk域名),申请一个新的域名,每次申请12个月以下是免费的,到期前14天可以免费续期 在此页面执行下一步之前,需要进行设置DNS服务器 ...
- linux下的用户管理(一)
linux下有三类用户: 1.超级用户:root具有操作系统的一切权限,UID值为0的是超级用户 2.普通用户:只具有操作系统有限的权限,UID是从500到6000范围 3.伪用户:是为了方便系统管理 ...
- 使用CXF框架,发布webservice服务,并使用客户端远程访问webservice
使用CXF框架,发布webservice服务,并使用客户端远程访问webservice 1. CXF介绍 :soa的框架 * cxf 是 Celtrix (ESB框架)和 XFire(webs ...
- C#将图片进行马赛克处理
/// <summary> /// 马赛克处理 /// </summary> /// <param name="bitmap"></par ...