颜言妍 發表於 2025-7-15 22:52:00

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

<h2 id="前言">前言</h2>
<p>事情是这样的</p>
<p>今天想用NAS上的服务突然发现NAS离线了</p>
<p>我看了下原来是关机了</p>
<p>很奇怪,这几天也没断电啊…</p>
<p>我又去分析了系统日志</p>
<p>注意到了关机前的这段日志</p>
<pre><code>Jul 13 23:24:33 pve systemd-logind: Power key pressed short.
Jul 13 23:24:33 pve systemd-logind: Powering off...
Jul 13 23:24:33 pve systemd-logind: System is powering down.
Jul 13 23:24:33 pve systemd: 104.scope: Deactivated successfully.
</code></pre>
<p>原来是不小心按了电源键</p>
<p>那这不行啊,NAS可不能一不小心就关机了</p>
<h2 id="修改电源键功能">修改电源键功能</h2>
<p>在 Linux(包括 PVE)中,电源键的行为是由 <code>systemd-logind</code> 控制的,你不仅可以禁用它,还能改成其他操作,比如:挂起(suspend)、休眠(hibernate)、锁屏、忽略(ignore)等。</p>
<h3 id="编辑-logind-配置文件">编辑 logind 配置文件</h3>
<p>打开配置文件:</p>
<pre><code class="language-bash">sudo nano /etc/systemd/logind.conf
</code></pre>
<p>找到这行(如果没有就添加):</p>
<pre><code class="language-bash">HandlePowerKey=poweroff
</code></pre>
<p>然后改成想要的行为,比如:</p>
<table>
<thead>
<tr>
<th>选项</th>
<th>行为说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ignore</code></td>
<td>忽略按键(推荐用于NAS)</td>
</tr>
<tr>
<td><code>poweroff</code></td>
<td>关机(默认)</td>
</tr>
<tr>
<td><code>reboot</code></td>
<td>重启</td>
</tr>
<tr>
<td><code>halt</code></td>
<td>关机但不切断电源</td>
</tr>
<tr>
<td><code>kexec</code></td>
<td>快速重启</td>
</tr>
<tr>
<td><code>suspend</code></td>
<td>挂起(休眠到RAM)</td>
</tr>
<tr>
<td><code>hibernate</code></td>
<td>休眠(保存状态到磁盘)</td>
</tr>
<tr>
<td><code>hybrid-sleep</code></td>
<td>挂起+休眠</td>
</tr>
<tr>
<td><code>lock</code></td>
<td>锁屏(可能需要桌面环境支持)</td>
</tr>
</tbody>
</table>
<h3 id="重启-logind-服务以生效">重启 logind 服务以生效</h3>
<pre><code class="language-bash">sudo systemctl restart systemd-logind
</code></pre>
<h2 id="扩展">扩展</h2>
<h3 id="自定义脚本">自定义脚本</h3>
<p>如果想要让按电源键触发<strong>自定义脚本</strong>,可以这样操作:</p>
<ol>
<li>设置 <code>HandlePowerKey=ignore</code>,避免 systemd 接管。</li>
<li>使用 <code>acpid</code> 监听 <code>/etc/acpi/events/powerbtn</code>,触发你自己的脚本。</li>
</ol>
<p>对于大多数 PVE 用户,<strong>把 power key 设置为 ignore 是最稳妥的方案</strong>,可以避免误关机、误触等麻烦。</p>
<h3 id="其他设置">其他设置</h3>
<p>如果是拿笔记本做服务器的话,还可以配置合盖功能什么的</p>
<pre><code class="language-bash"># /etc/systemd/logind.conf
HandlePowerKey=ignore
HandleRebootKey=ignore
HandleSuspendKey=ignore
HandleLidSwitch=ignore       # 如果有笔记本机箱盖
HandleLidSwitchDocked=ignore
</code></pre>
<h3 id="配置项速查表">配置项速查表</h3>
<p>以下是 <code>/etc/systemd/logind.conf</code> 文件里的配置说明</p>
<table>
<thead>
<tr>
<th>配置项</th>
<th>含义说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>NAutoVTs=6</code></td>
<td>自动生成的虚拟终端(tty)的数量。默认系统会生成 <code>/dev/tty1</code> 到 <code>/dev/tty6</code>。</td>
</tr>
<tr>
<td><code>ReserveVT=6</code></td>
<td>systemd-reserved 的虚拟终端编号(用于图形界面切换或紧急使用)。</td>
</tr>
<tr>
<td><code>KillUserProcesses=no</code></td>
<td>用户退出登录后是否强制终止其所有进程。</td>
</tr>
<tr>
<td><code>KillOnlyUsers=</code></td>
<td>仅对这些用户启用 KillUserProcesses 行为(白名单控制)。</td>
</tr>
<tr>
<td><code>KillExcludeUsers=root</code></td>
<td>排除哪些用户不受 KillUserProcesses 控制(默认排除 root)。</td>
</tr>
<tr>
<td><code>InhibitDelayMaxSec=5</code></td>
<td>在被抑制的关机/挂起行为上,等待的最长时间(秒)。</td>
</tr>
<tr>
<td><code>UserStopDelaySec=10</code></td>
<td>用户注销后等待多长时间再真正终止 session。</td>
</tr>
<tr>
<td><code>HandlePowerKey=poweroff</code></td>
<td>按下电源键时的操作(默认是关机)。</td>
</tr>
<tr>
<td><code>HandlePowerKeyLongPress=ignore</code></td>
<td>长按电源键时的操作(默认是忽略)。</td>
</tr>
<tr>
<td><code>HandleRebootKey=reboot</code></td>
<td>按下“重启按钮”时的操作。</td>
</tr>
<tr>
<td><code>HandleRebootKeyLongPress=poweroff</code></td>
<td>长按“重启按钮”时的操作。</td>
</tr>
<tr>
<td><code>HandleSuspendKey=suspend</code></td>
<td>按下挂起键时的操作(通常是笔记本或某些键盘上的 Sleep 键)。</td>
</tr>
<tr>
<td><code>HandleSuspendKeyLongPress=hibernate</code></td>
<td>长按挂起键时的操作。</td>
</tr>
<tr>
<td><code>HandleHibernateKey=hibernate</code></td>
<td>按下休眠键时的操作。</td>
</tr>
<tr>
<td><code>HandleHibernateKeyLongPress=ignore</code></td>
<td>长按休眠键时的操作。</td>
</tr>
<tr>
<td><code>HandleLidSwitch=suspend</code></td>
<td><strong>合上笔记本盖子</strong>时的操作(默认是挂起)。</td>
</tr>
<tr>
<td><code>HandleLidSwitchExternalPower=suspend</code></td>
<td>笔记本连接外部电源时合盖的操作。</td>
</tr>
<tr>
<td><code>HandleLidSwitchDocked=ignore</code></td>
<td>笔记本插入扩展坞时合盖的操作(默认忽略)。</td>
</tr>
<tr>
<td><code>PowerKeyIgnoreInhibited=no</code></td>
<td>是否忽略用户程序对电源键操作的抑制(inhibit)。</td>
</tr>
<tr>
<td><code>SuspendKeyIgnoreInhibited=no</code></td>
<td>是否忽略程序对挂起键的抑制。</td>
</tr>
<tr>
<td><code>HibernateKeyIgnoreInhibited=no</code></td>
<td>是否忽略程序对休眠键的抑制。</td>
</tr>
<tr>
<td><code>LidSwitchIgnoreInhibited=yes</code></td>
<td>是否忽略程序对合盖操作的抑制(通常设置为 yes)。</td>
</tr>
<tr>
<td><code>RebootKeyIgnoreInhibited=no</code></td>
<td>是否忽略程序对重启键的抑制。</td>
</tr>
<tr>
<td><code>HoldoffTimeoutSec=30s</code></td>
<td>防抖动保护:相邻两个事件之间的最小时间间隔。</td>
</tr>
<tr>
<td><code>IdleAction=ignore</code></td>
<td>空闲太久之后的操作(默认忽略)。</td>
</tr>
<tr>
<td><code>IdleActionSec=30min</code></td>
<td>判断空闲的时间(配合 IdleAction 使用)。</td>
</tr>
<tr>
<td><code>RuntimeDirectorySize=10%</code></td>
<td>每个用户的 <code>/run/user/UID</code> 目录可使用的最大空间(相对于内存总量)。</td>
</tr>
<tr>
<td><code>RuntimeDirectoryInodesMax=</code></td>
<td>每个用户的 <code>/run/user/UID</code> 可使用的最大 inode 数(未设置即不限)。</td>
</tr>
<tr>
<td><code>RemoveIPC=yes</code></td>
<td>用户退出登录后是否清除其 IPC(消息队列、信号量、共享内存)。</td>
</tr>
<tr>
<td><code>InhibitorsMax=8192</code></td>
<td>最大支持的 inhibit 锁数量(用于限制暂停/关机等)。</td>
</tr>
<tr>
<td><code>SessionsMax=8192</code></td>
<td>最大支持同时活跃的会话数。</td>
</tr>
<tr>
<td><code>StopIdleSessionSec=infinity</code></td>
<td>空闲会话保持多久之后自动终止(默认不终止)。</td>
</tr>
</tbody>
</table>
<h2 id="参考资料">参考资料</h2>
<ul>
<li>systemd-logind.service - logind服务官方文档</li>
<li>logind.conf.d(5) - 支持通过 drop-in 文件扩展 logind 配置</li>
<li>Inhibitor Locks - 控制程序如何暂时禁止系统挂起/关机等行为(比如视频播放时不让休眠)</li>
</ul>
<p>也可以在系统上直接用 man 命令看</p>
<pre><code class="language-bash">man logind.conf
</code></pre>


</div>
<div id="MySignature" role="contentinfo">
    微信公众号:「程序设计实验室」
专注于互联网热门新技术探索与团队敏捷开发实践,包括架构设计、机器学习与数据分析算法、移动端开发、Linux、Web前后端开发等,欢迎一起探讨技术,分享学习实践经验。<br><br>
来源:https://www.cnblogs.com/deali/p/18986490
頁: [1]
查看完整版本: 小心误关了NAS服务器!修改Linux的电源键功能