小心误关了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
相关推荐
t1987512841 分钟前
在Ubuntu 22.04系统上安装libimobiledevice
linux·运维·ubuntu
skywalk816342 分钟前
linux安装Code Server 以便Comate IDE和CodeBuddy等都可以远程连上来
linux·运维·服务器·vscode·comate
晚风吹人醒.2 小时前
缓存中间件Redis安装及功能演示、企业案例
linux·数据库·redis·ubuntu·缓存·中间件
Hard but lovely2 小时前
linux: pthread库的使用和理解
linux
这儿有一堆花4 小时前
Kali Linux:探测存活到挖掘漏洞
linux·运维·服务器
松涛和鸣4 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法
皮小白5 小时前
ubuntu开机检查磁盘失败进入应急模式如何修复
linux·运维·ubuntu
邂逅星河浪漫5 小时前
【CentOS】虚拟机网卡IP地址修改步骤
linux·运维·centos
hhwyqwqhhwy5 小时前
linux 驱动开发相关
linux·驱动开发
IT逆夜6 小时前
实现Yum本地仓库自动同步的完整方案(CentOS 7)
linux·运维·windows