小心误关了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
相关推荐
人生苦短,菜的抠脚6 分钟前
Linux 内核IIO sensor驱动
linux·驱动开发
jz_ddk19 分钟前
[LVGL] 从0开始,学LVGL:进阶应用与项目实战(上)
linux·信息可视化·嵌入式·gui·lvgl·界面设计
望获linux43 分钟前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
MC丶科1 小时前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
江公望1 小时前
ubuntu kylin(优麒麟)和标准ubuntu的区别浅谈
linux·服务器·ubuntu·kylin
Lynnxiaowen1 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
生态笔记2 小时前
PPT宏代码
linux·服务器·powerpoint
mucheni2 小时前
迅为RK3588开发板Ubuntu 系统开发ubuntu终端密码登录
linux·运维·ubuntu
skywoodsky2 小时前
Ubuntu 24.04环境下的挂起转休眠
linux
小云数据库服务专线2 小时前
GaussDB 应用侧报Read timed out解决方法
linux·服务器·gaussdb