小心误关了NAS服务器!修改Linux的电源键功能

前言

事情是这样的

今天想用NAS上的服务突然发现NAS离线了

我看了下原来是关机了

很奇怪,这几天也没断电啊...

我又去分析了系统日志

注意到了关机前的这段日志

复制代码
Jul 13 23:24:33 pve systemd-logind[1062]: Power key pressed short.
Jul 13 23:24:33 pve systemd-logind[1062]: Powering off...
Jul 13 23:24:33 pve systemd-logind[1062]: System is powering down.
Jul 13 23:24:33 pve systemd[1]: 104.scope: Deactivated successfully.

原来是不小心按了电源键

那这不行啊,NAS可不能一不小心就关机了

修改电源键功能

在 Linux(包括 PVE)中,电源键的行为是由 systemd-logind 控制的,你不仅可以禁用它,还能改成其他操作,比如:挂起(suspend)、休眠(hibernate)、锁屏、忽略(ignore)等。

编辑 logind 配置文件

打开配置文件:

bash 复制代码
sudo nano /etc/systemd/logind.conf

找到这行(如果没有就添加):

bash 复制代码
HandlePowerKey=poweroff

然后改成想要的行为,比如:

选项 行为说明
ignore 忽略按键(推荐用于NAS)
poweroff 关机(默认)
reboot 重启
halt 关机但不切断电源
kexec 快速重启
suspend 挂起(休眠到RAM)
hibernate 休眠(保存状态到磁盘)
hybrid-sleep 挂起+休眠
lock 锁屏(可能需要桌面环境支持)

重启 logind 服务以生效

bash 复制代码
sudo systemctl restart systemd-logind

扩展

自定义脚本

如果想要让按电源键触发自定义脚本,可以这样操作:

  1. 设置 HandlePowerKey=ignore,避免 systemd 接管。
  2. 使用 acpid 监听 /etc/acpi/events/powerbtn,触发你自己的脚本。

对于大多数 PVE 用户,把 power key 设置为 ignore 是最稳妥的方案,可以避免误关机、误触等麻烦。

其他设置

如果是拿笔记本做服务器的话,还可以配置合盖功能什么的

bash 复制代码
# /etc/systemd/logind.conf
HandlePowerKey=ignore
HandleRebootKey=ignore
HandleSuspendKey=ignore
HandleLidSwitch=ignore       # 如果有笔记本机箱盖
HandleLidSwitchDocked=ignore

配置项速查表

以下是 /etc/systemd/logind.conf 文件里的配置说明

配置项 含义说明
NAutoVTs=6 自动生成的虚拟终端(tty)的数量。默认系统会生成 /dev/tty1/dev/tty6
ReserveVT=6 systemd-reserved 的虚拟终端编号(用于图形界面切换或紧急使用)。
KillUserProcesses=no 用户退出登录后是否强制终止其所有进程。
KillOnlyUsers= 仅对这些用户启用 KillUserProcesses 行为(白名单控制)。
KillExcludeUsers=root 排除哪些用户不受 KillUserProcesses 控制(默认排除 root)。
InhibitDelayMaxSec=5 在被抑制的关机/挂起行为上,等待的最长时间(秒)。
UserStopDelaySec=10 用户注销后等待多长时间再真正终止 session。
HandlePowerKey=poweroff 按下电源键时的操作(默认是关机)。
HandlePowerKeyLongPress=ignore 长按电源键时的操作(默认是忽略)。
HandleRebootKey=reboot 按下"重启按钮"时的操作。
HandleRebootKeyLongPress=poweroff 长按"重启按钮"时的操作。
HandleSuspendKey=suspend 按下挂起键时的操作(通常是笔记本或某些键盘上的 Sleep 键)。
HandleSuspendKeyLongPress=hibernate 长按挂起键时的操作。
HandleHibernateKey=hibernate 按下休眠键时的操作。
HandleHibernateKeyLongPress=ignore 长按休眠键时的操作。
HandleLidSwitch=suspend 合上笔记本盖子时的操作(默认是挂起)。
HandleLidSwitchExternalPower=suspend 笔记本连接外部电源时合盖的操作。
HandleLidSwitchDocked=ignore 笔记本插入扩展坞时合盖的操作(默认忽略)。
PowerKeyIgnoreInhibited=no 是否忽略用户程序对电源键操作的抑制(inhibit)。
SuspendKeyIgnoreInhibited=no 是否忽略程序对挂起键的抑制。
HibernateKeyIgnoreInhibited=no 是否忽略程序对休眠键的抑制。
LidSwitchIgnoreInhibited=yes 是否忽略程序对合盖操作的抑制(通常设置为 yes)。
RebootKeyIgnoreInhibited=no 是否忽略程序对重启键的抑制。
HoldoffTimeoutSec=30s 防抖动保护:相邻两个事件之间的最小时间间隔。
IdleAction=ignore 空闲太久之后的操作(默认忽略)。
IdleActionSec=30min 判断空闲的时间(配合 IdleAction 使用)。
RuntimeDirectorySize=10% 每个用户的 /run/user/UID 目录可使用的最大空间(相对于内存总量)。
RuntimeDirectoryInodesMax= 每个用户的 /run/user/UID 可使用的最大 inode 数(未设置即不限)。
RemoveIPC=yes 用户退出登录后是否清除其 IPC(消息队列、信号量、共享内存)。
InhibitorsMax=8192 最大支持的 inhibit 锁数量(用于限制暂停/关机等)。
SessionsMax=8192 最大支持同时活跃的会话数。
StopIdleSessionSec=infinity 空闲会话保持多久之后自动终止(默认不终止)。

参考资料

也可以在系统上直接用 man 命令看

bash 复制代码
man logind.conf
相关推荐
snowfoootball15 分钟前
(自用)Linux 常用命令自查文档
linux·运维·服务器
R-G-B38 分钟前
Linux常见命令总结 合集二:基本命令、目录操作命令、文件操作命令、压缩文件操作、查找命令、权限命令、其他命令
linux·基本命令·目录操作命令·linux常见命令·压缩文件操作·权限命令·查找命令
Chukai12339 分钟前
Windows 和 Linux 系统下修改防火墙机制开放端口
linux·运维·windows
FL16238631291 小时前
[ubuntu][C++]onnxruntime安装cpu版本后测试代码
linux·c++·ubuntu
pound1272 小时前
Linux
linux·运维·服务器
learning_tom4 小时前
HTML图片标签及路径详解
linux·服务器·php
dbdr09015 小时前
Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十六天
linux·运维·服务器·网络·python·学习
大白的编程日记.5 小时前
【Linux学习笔记】信号的深入理解之软件条件产生信号
linux·笔记·学习
buyutang_5 小时前
C/C++ Linux系统编程:线程控制详解,从线程创建到线程终止
linux·c语言·c++·学习
云的牧人5 小时前
Ubuntu 22 redis集群搭建
linux·运维·ubuntu