事情是這樣的
今天想用NAS上的服務(wù)突然發(fā)現(xiàn)NAS離線了
我看了下原來是關(guān)機(jī)了
很奇怪,這幾天也沒斷電啊…
我又去分析了系統(tǒng)日志
注意到了關(guān)機(jī)前的這段日志
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可不能一不小心就關(guān)機(jī)了
修改電源鍵功能#
在 Linux(包括 PVE)中,電源鍵的行為是由 systemd-logind
控制的,你不僅可以禁用它,還能改成其他操作,比如:掛起(suspend)、休眠(hibernate)、鎖屏、忽略(ignore)等。
編輯 logind 配置文件#
打開配置文件:
sudo nano /etc/systemd/logind.conf
找到這行(如果沒有就添加):
HandlePowerKey=poweroff
然后改成想要的行為,比如:
選項 | 行為說明 |
---|
ignore | 忽略按鍵(推薦用于NAS) |
poweroff | 關(guān)機(jī)(默認(rèn)) |
reboot | 重啟 |
halt | 關(guān)機(jī)但不切斷電源 |
kexec | 快速重啟 |
suspend | 掛起(休眠到RAM) |
hibernate | 休眠(保存狀態(tài)到磁盤) |
hybrid-sleep | 掛起+休眠 |
lock | 鎖屏(可能需要桌面環(huán)境支持) |
重啟 logind 服務(wù)以生效#
sudo systemctl restart systemd-logind
擴(kuò)展
自定義腳本
如果想要讓按電源鍵觸發(fā)自定義腳本,可以這樣操作:
- 設(shè)置
HandlePowerKey=ignore
,避免 systemd 接管。 - 使用
acpid
監(jiān)聽 /etc/acpi/events/powerbtn
,觸發(fā)你自己的腳本。
對于大多數(shù) PVE 用戶,把 power key 設(shè)置為 ignore 是最穩(wěn)妥的方案,可以避免誤關(guān)機(jī)、誤觸等麻煩。
其他設(shè)置
如果是拿筆記本做服務(wù)器的話,還可以配置合蓋功能什么的
HandlePowerKey=ignore
HandleRebootKey=ignore
HandleSuspendKey=ignore
HandleLidSwitch=ignore
HandleLidSwitchDocked=ignore
配置項速查表
以下是 /etc/systemd/logind.conf
文件里的配置說明
配置項 | 含義說明 |
---|
NAutoVTs=6 | 自動生成的虛擬終端(tty)的數(shù)量。默認(rèn)系統(tǒng)會生成 /dev/tty1 到 /dev/tty6 。 |
ReserveVT=6 | systemd-reserved 的虛擬終端編號(用于圖形界面切換或緊急使用)。 |
KillUserProcesses=no | 用戶退出登錄后是否強(qiáng)制終止其所有進(jìn)程。 |
KillOnlyUsers= | 僅對這些用戶啟用 KillUserProcesses 行為(白名單控制)。 |
KillExcludeUsers=root | 排除哪些用戶不受 KillUserProcesses 控制(默認(rèn)排除 root)。 |
InhibitDelayMaxSec=5 | 在被抑制的關(guān)機(jī)/掛起行為上,等待的最長時間(秒)。 |
UserStopDelaySec=10 | 用戶注銷后等待多長時間再真正終止 session。 |
HandlePowerKey=poweroff | 按下電源鍵時的操作(默認(rèn)是關(guān)機(jī))。 |
HandlePowerKeyLongPress=ignore | 長按電源鍵時的操作(默認(rèn)是忽略)。 |
HandleRebootKey=reboot | 按下“重啟按鈕”時的操作。 |
HandleRebootKeyLongPress=poweroff | 長按“重啟按鈕”時的操作。 |
HandleSuspendKey=suspend | 按下掛起鍵時的操作(通常是筆記本或某些鍵盤上的 Sleep 鍵)。 |
HandleSuspendKeyLongPress=hibernate | 長按掛起鍵時的操作。 |
HandleHibernateKey=hibernate | 按下休眠鍵時的操作。 |
HandleHibernateKeyLongPress=ignore | 長按休眠鍵時的操作。 |
HandleLidSwitch=suspend | 合上筆記本蓋子時的操作(默認(rèn)是掛起)。 |
HandleLidSwitchExternalPower=suspend | 筆記本連接外部電源時合蓋的操作。 |
HandleLidSwitchDocked=ignore | 筆記本插入擴(kuò)展塢時合蓋的操作(默認(rèn)忽略)。 |
PowerKeyIgnoreInhibited=no | 是否忽略用戶程序?qū)﹄娫存I操作的抑制(inhibit)。 |
SuspendKeyIgnoreInhibited=no | 是否忽略程序?qū)炱疰I的抑制。 |
HibernateKeyIgnoreInhibited=no | 是否忽略程序?qū)π菝哝I的抑制。 |
LidSwitchIgnoreInhibited=yes | 是否忽略程序?qū)仙w操作的抑制(通常設(shè)置為 yes)。 |
RebootKeyIgnoreInhibited=no | 是否忽略程序?qū)χ貑㈡I的抑制。 |
HoldoffTimeoutSec=30s | 防抖動保護(hù):相鄰兩個事件之間的最小時間間隔。 |
IdleAction=ignore | 空閑太久之后的操作(默認(rèn)忽略)。 |
IdleActionSec=30min | 判斷空閑的時間(配合 IdleAction 使用)。 |
RuntimeDirectorySize=10% | 每個用戶的 /run/user/UID 目錄可使用的最大空間(相對于內(nèi)存總量)。 |
RuntimeDirectoryInodesMax= | 每個用戶的 /run/user/UID 可使用的最大 inode 數(shù)(未設(shè)置即不限)。 |
RemoveIPC=yes | 用戶退出登錄后是否清除其 IPC(消息隊列、信號量、共享內(nèi)存)。 |
InhibitorsMax=8192 | 最大支持的 inhibit 鎖數(shù)量(用于限制暫停/關(guān)機(jī)等)。 |
SessionsMax=8192 | 最大支持同時活躍的會話數(shù)。 |
StopIdleSessionSec=infinity | 空閑會話保持多久之后自動終止(默認(rèn)不終止)。 |
參考資料
也可以在系統(tǒng)上直接用 man 命令看
man logind.conf