<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>硬件 on T.本秋的自留地</title>
    <link>https://blog.texsd.eu.org/tags/%E7%A1%AC%E4%BB%B6/</link>
    <description>Recent content in 硬件 on T.本秋的自留地</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <copyright>Copyright© 2026 T.本秋. Licensed under CC BY-NC-SA 4.0.</copyright>
    <lastBuildDate>Wed, 22 Apr 2026 23:00:09 +0800</lastBuildDate><atom:link href="https://blog.texsd.eu.org/tags/%E7%A1%AC%E4%BB%B6/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>UPS 折腾记</title>
      <link>https://blog.texsd.eu.org/posts/ups/</link>
      <pubDate>Wed, 22 Apr 2026 23:00:09 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/ups/</guid>
      <description>
&lt;h2 class=&#34;relative group&#34;&gt;前言
    &lt;div id=&#34;前言&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%89%8d%e8%a8%80&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;最近我突然有了两台 ups 的管理权，一台工作室的 APC Smart-UPS SPRM1K，另一台家里的 APC BACK-UPS BK650。由于手边只有前者，先更新前者的研究成果，后者择日更新。&lt;/p&gt;
&lt;p&gt;管理带通信的 UPS 的配套软件其实就两种，这里主要讲解 NUT，而 apcupsd 配置很简单，而且也可以作为 NUT 的驱动，这里不再详述。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;NUT 的配置
    &lt;div id=&#34;nut-的配置&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#nut-%e7%9a%84%e9%85%8d%e7%bd%ae&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;要理解 NUT，首先要明白几个概念：driver、monitor(client)、server（可选），三个服务都要单独启用。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;驱动层
    &lt;div id=&#34;驱动层&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e9%a9%b1%e5%8a%a8%e5%b1%82&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;driver 其实就是对接各种奇奇怪怪 ups 的，这里我这两台一个用的是串口（apcsmart）,另一个是 usbhid-ups，这里主要是以前者讲解的。&lt;/p&gt;
&lt;p&gt;配置 ups 驱动：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## /etc/nut/ups.conf &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## 根据需要填写,可用nut-scanner -U获取驱动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;driver&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; apcsmart 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;port&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; /dev/ups 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;cable&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 940-0024 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ignorelb &lt;span class=&#34;c1&#34;&gt;# 手动指定阈值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    override.battery.charge.low &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;70&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    override.battery.runtime.low &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动服务：&lt;code&gt;upsdrvctl start&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里有个小插曲，串口可能提示权限不够：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@pve:/etc/nut# upsdrvctl start
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Network UPS Tools - UPS driver controller 2.8.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Network UPS Tools - Generic HID driver 0.52 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;2.8.1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;USB communication driver &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;libusb 1.0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; 0.46
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;libusb1: Could not open any HID devices: insufficient permissions on everything
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;No matching HID UPS found
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;upsnotify: notify about state &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; with libsystemd: was requested, but not running as a service unit now, will not spam more about it
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;upsnotify: failed to notify about state 4: no notification tech defined, will not spam more about it
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Driver failed to start &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用 udev 规则，给 nut 权限：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39; &amp;gt; /etc/udev/rules.d/99-nut-ups.rules
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;SUBSYSTEM==&amp;#34;usb&amp;#34;, ATTR{idVendor}==&amp;#34;051d&amp;#34;, ATTR{idProduct}==&amp;#34;0002&amp;#34;, MODE=&amp;#34;0660&amp;#34;, GROUP=&amp;#34;nut&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;udevadm control --reload-rules
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;udevadm trigger
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再次启动：&lt;code&gt;upsdrvctl start&lt;/code&gt;&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;服务层
    &lt;div id=&#34;服务层&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%9c%8d%e5%8a%a1%e5%b1%82&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;nut 其实 c/s 架构很分明，如果只有一台机子，也得启动一个服务器。但是这也为拓展型带来了便利。&lt;/p&gt;
&lt;p&gt;如果你只有一台机子，用 standalone 即可，作为“吹哨人”，用 netserver，接收命令关闭自己的机器，用 netclient。&lt;/p&gt;
&lt;p&gt;我这里改成服务器：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## /etc/nut/nut.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 服务器模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MODE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;netserver
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## /etc/nut/upsd.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 加上这一行，给局域网里面的设备提供服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 如果你是pve而且路由器不接ups，建议自己建一个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 自定义交换机&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;LISTEN 0.0.0.0 &lt;span class=&#34;m&#34;&gt;3493&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置用户，monuser 最好有，因为群晖用这个而且不能更改。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## /etc/nut/upsd.users&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;monuser&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;password&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; secret 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    upsmon slave 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;admin&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;password&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &amp;lt;your_password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    upsmon master 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;actions&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; SET
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;instcmds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; ALL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动服务：&lt;code&gt;systemctl enable --now nut-server&lt;/code&gt;&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;客户端/监视层
    &lt;div id=&#34;客户端监视层&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%ae%a2%e6%88%b7%e7%ab%af%e7%9b%91%e8%a7%86%e5%b1%82&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;配置 nut-monitor 以便自动关机：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MONITOR ups@localhost &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; monuser secret master &lt;span class=&#34;c1&#34;&gt;# slave也可以，后文（关机过程）讲&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你可以看到，最下面有个&lt;code&gt;shutdown&lt;/code&gt;命令，这个只要 monitor 服务启动了，在遇到低电量阈值的时候，就一定会执行的。&lt;/p&gt;
&lt;p&gt;启动服务：&lt;code&gt;systemctl enable --now nut-monitor&lt;/code&gt;&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;关机过程
    &lt;div id=&#34;关机过程&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%85%b3%e6%9c%ba%e8%bf%87%e7%a8%8b&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;断开电源，nut 检测到电池供电，其他客户端收到信号。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对于群晖这种设置了 upssched 的机子，他可以在检测到断电之后的一定时间开启安全模式（umount 所有分区，只保留必须的 nut 监听服务和关机逻辑），如果在此期间市电恢复，重新检测到后会进行自动重启。&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;电池到达所给定的阈值（电量/剩余事件/电池供电时间），发出警告信号。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这时候服务器自己会开始关机（执行 shutdown），其他客户端会收到信号，开始进行关机。&lt;/p&gt;
&lt;p&gt;在关机最后一刻，有一个有意思的脚本想和大家分享。&lt;/p&gt;
&lt;p&gt;这个脚本是 systemd 在关机的最后时刻执行的，位于&lt;code&gt;/usr/lib/systemd/system-shutdown/nutshutdown&lt;/code&gt;。我们来看看他的结构：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# This script requires both nut-server (drivers)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# and nut-client (upsmon) to be present locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# and on mounted filesystems&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -x &lt;span class=&#34;s2&#34;&gt;&amp;#34;/sbin/upsmon&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -x &lt;span class=&#34;s2&#34;&gt;&amp;#34;/sbin/upsdrvctl&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; /sbin/upsmon -K &amp;gt;/dev/null 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;1&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# The argument may be anything compatible with sleep&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# (not necessarily a non-negative integer)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;wait_delay&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;`/bin/sed -ne &amp;#39;s#^ *POWEROFF_WAIT= *\(.*\)&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$#&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;\1#p&amp;#39; /etc/nut/nut.conf`&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;wait_delay&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  /sbin/upsdrvctl shutdown
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$wait_delay&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    /bin/sleep &lt;span class=&#34;nv&#34;&gt;$wait_delay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# We need to pass --force twice here to bypass systemd and execute the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# reboot directly ourself.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    /bin/systemctl reboot --force --force
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以注意到经过一系列的判断，如果是真的断电（发出警告后）&lt;code&gt;upsmon -K&lt;/code&gt;会返回 1，那么就会使用&lt;code&gt;upsdrvctl shutdown&lt;/code&gt;来命令 ups 在一定时间后断电。&lt;/p&gt;
&lt;p&gt;但是这时候，系统已经解除了所有的磁盘 rw 的挂载，执行完脚本的下一步其实就是给 acpi 电源发送 S5 信号并断电，速度很快，其实断不断电也无所谓了。&lt;/p&gt;
&lt;p&gt;一般的断电延时 20s 绰绰有余。至于断电时间的设置，高级的 ups 可以设置（见后文&lt;code&gt;upsrw&lt;/code&gt;），普通的不可以。&lt;/p&gt;
&lt;p&gt;所以如果这是最后一个“吹哨人”执行的 killpower（让 ups 等会断电），最好关闭的时候要尽量比 slave 关得晚，否则就得尽量延长 ups 的延迟时间。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;常用命令
    &lt;div id=&#34;常用命令&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;

&lt;h3 class=&#34;relative group&#34;&gt;upscmd：执行一些驱动预设的指令
    &lt;div id=&#34;upscmd执行一些驱动预设的指令&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#upscmd%e6%89%a7%e8%a1%8c%e4%b8%80%e4%ba%9b%e9%a9%b1%e5%8a%a8%e9%a2%84%e8%ae%be%e7%9a%84%e6%8c%87%e4%bb%a4&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@SAST-Docker:~# upscmd -l ups
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Instant commands supported on UPS &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bypass.start - Put the UPS in bypass mode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bypass.stop - Take the UPS out of bypass mode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;load.off - Turn off the load immediately
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;load.on - Turn on the load immediately
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shutdown.return - Turn off the load and &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; when power is back
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shutdown.stayoff - Turn off the load and remain off
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;test.battery.start - Start a battery &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;test.battery.stop - Stop the battery &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;test.failure.start - Start a simulated power failure
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;test.panel.start - Start testing the UPS pane
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;upsrw：用于读写 eeprom 的
    &lt;div id=&#34;upsrw用于读写-eeprom-的&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#upsrw%e7%94%a8%e4%ba%8e%e8%af%bb%e5%86%99-eeprom-%e7%9a%84&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;使用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;upsrw -l &amp;lt;upsname&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;控制响声、复电延迟启动、复电要求电池水平、关电延迟停止 ups。&lt;/p&gt;
&lt;p&gt;比如我们工作室的 SPRM1K 可以设置的东西就很多，还贴心的用了 enum 告诉你：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@SAST-Docker:/etc/nut# upsrw -l ups
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;battery.alarm.threshold&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Battery alarm threshold
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;T&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;L&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;N&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;battery.charge.restart&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Minimum battery level &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; restart after power off &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;percent&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;15&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;50&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;90&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;battery.date&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Battery change date
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: STRING
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Maximum length: &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Value: 12/30/25
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;input.transfer.high&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;High voltage transfer point &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;V&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;231&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;242&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;253&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;264&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;input.transfer.low&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Low voltage transfer point &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;V&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;187&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;176&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;165&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;154&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;output.voltage.nominal&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Nominal output voltage &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;V&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;220&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;230&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;240&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups.delay.shutdown&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Interval to &lt;span class=&#34;nb&#34;&gt;wait&lt;/span&gt; after shutdown with delay &lt;span class=&#34;nb&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;seconds&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;020&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;180&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;300&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups.delay.start&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Interval to &lt;span class=&#34;nb&#34;&gt;wait&lt;/span&gt; before &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;re&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;starting the load &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;seconds&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;060&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;180&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;300&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups.id&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;UPS system identifier
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: STRING
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Maximum length: &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Value: UPS_IDEN
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups.test.interval&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Interval between self tests &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;seconds&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;1209600&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;604800&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我在这里改了&lt;code&gt;ups.delay.shutdown&lt;/code&gt;，原因很尴尬，esxi 只支持客户端模式的 nut，服务端只能用一台虚拟机来实现。那么希望在服务端发出 killpower 后，还能等待 esxi 关闭，这个时间就不可避免的延长。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我还改了&lt;code&gt;ups.delay.start&lt;/code&gt;，这个参数很有意思，他没有注释，根据字面意思理解，应该是断电之后延迟启动吧？&lt;/p&gt;
&lt;p&gt;但是不是这个意思。他指的是如果你发出了 killpower 的命令后中途来电，他断电后，应该在多少秒后开机？&lt;/p&gt;
&lt;p&gt;我觉得这句话得细品。&lt;/p&gt;
&lt;p&gt;对于我这台 SPRM1K 来说，发送 killpower 指令后，首先是等待&lt;code&gt;ups.delay.shutdown&lt;/code&gt;的时间，然后切断输出，然后过了硬编码的 1 分钟，关闭 ups 自己。&lt;/p&gt;
&lt;p&gt;那么就有几种情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在等待&lt;code&gt;ups.delay.shutdown&lt;/code&gt;时，市电恢复。&lt;/li&gt;
&lt;li&gt;在等待硬编码的 1 分钟的时候，市电恢复。&lt;/li&gt;
&lt;li&gt;ups 关机之后，市电恢复。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这三种情况中前两者会等待&lt;code&gt;ups.delay.start&lt;/code&gt;的时间，最后一种不会等待，初始化之后直接开机。&lt;/p&gt;
&lt;p&gt;我想应该是&lt;a
  href=&#34;https://www.chiphell.com/forum.php?mod=viewthread&amp;amp;tid=2605539&amp;amp;extra=page%3D1&amp;amp;mobile=no&#34;
    target=&#34;_blank&#34;
  &gt;这篇文章&lt;/a&gt;里面提到的问题，作者说如果断电的时间太短，那么 After AC Loss 就算设置为 Power On，也不一定能自动开机。所以才有这么一个选项。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;btw: 我并不太赞同链接里面的方案，复杂度太高了很难维护，其实里面很多东西厂家已经做好了。（排除 UPS 不够高端的问题，这个等我回去测试一下我的 BK650 再下定论）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 class=&#34;relative group&#34;&gt;奇怪的 bug
    &lt;div id=&#34;奇怪的-bug&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%a5%87%e6%80%aa%e7%9a%84-bug&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;根据 &lt;code&gt;man 8 usbhid-ups&lt;/code&gt; 中的说明，可以直接在 ups.conf 里面配置 &lt;code&gt;allow_killpower&lt;/code&gt; 来在启动的时候生效，但是&lt;a
  href=&#34;https://github.com/networkupstools/nut/issues/2605&#34;
    target=&#34;_blank&#34;
  &gt;这个 issue&lt;/a&gt; 说 &lt;code&gt;allow_killpower&lt;/code&gt; 在 2.8.3 之后才修复启动的时候硬编码的 0 会覆盖回去的问题，然而 trixie 是 2.8.1，就很难受。&lt;/p&gt;
&lt;p&gt;能用点 hack 的办法，启动的时候修改。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl edit nut-driver@ups.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 写入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Service&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 延迟几秒确保驱动已经完全初始化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ExecStartPost&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/bin/sh -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;sleep 5 &amp;amp;&amp;amp; /usr/bin/upsrw -s driver.flag.allow_killpower=1 -u admin -p &amp;lt;你的密码&amp;gt; ups&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是这台设备不再身边，所以我还是选择了保守的 apcupsd 方案关机+nut 桥接给群晖，这篇文章之后还会更新的。&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>给老机 x200 刷开源 BIOS--Coreboot！</title>
      <link>https://blog.texsd.eu.org/posts/upgrade_my_thinkpad_x200/</link>
      <pubDate>Sat, 30 Aug 2025 12:33:31 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/upgrade_my_thinkpad_x200/</guid>
      <description>&lt;p&gt;这篇文本来是想写一下升级过程的，因为我在家里面翻出了这台 x200，也算是我早期用得比较久的本子了（B 站就是在这上面注册的）。&lt;/p&gt;
&lt;p&gt;出于情怀，给它换了无线网卡，换了风扇，内存 4G-&amp;gt;8G，换了原来坏了的键盘，总共没超过 200 元。&lt;/p&gt;
&lt;p&gt;不过暂时没带来学校，所以图片的话，以后再补充吧。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;刷入 Coreboot 注意事项
    &lt;div id=&#34;刷入-coreboot-注意事项&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%88%b7%e5%85%a5-coreboot-%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;这里记载了折腾过程中遇到的坑。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;请不要购买 CH341A！
    &lt;div id=&#34;请不要购买-ch341a&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e8%af%b7%e4%b8%8d%e8%a6%81%e8%b4%ad%e4%b9%b0-ch341a&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;为什么我会在这里得出跟 libreboot 一样的结论呢？&lt;/p&gt;
&lt;p&gt;CH341A 无法设置 spispeed，而是默认 2M，这就造成一个问题，如果你的连接质量不好的话，这已经是一个相当高的速率了。可能会使得你根本没法看到你的芯片读取到。这里还是推荐买正版的 pico 吧，这玩意用的 buck-boost 电路，相比国产的 pico 来说，发热肯定会小不少，这可能对稳定刷写有一定的帮助。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;刷写
    &lt;div id=&#34;刷写&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%88%b7%e5%86%99&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;在&lt;a
  href=&#34;https://libreboot.org/docs/install/spi.html&#34;
    target=&#34;_blank&#34;
  &gt;libreboot 的教程&lt;/a&gt;中，告诉你&lt;code&gt;1, 9&lt;/code&gt;脚分别是 WP/HOLD，据说主板自带上拉电阻，所以不用连接。&lt;/p&gt;
&lt;p&gt;经过测试，发现夹子连接正确的话，这两个脚会有 3.1v 左右的电压，稍微低了一点但是不影响。&lt;/p&gt;
&lt;p&gt;如果原始的固件你可能根本刷不进去，写入没一会就提示擦除失败，我试了连接这两个脚是无关事项，所以后来者可以不用连接。&lt;/p&gt;
&lt;p&gt;请看过程：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ flashprog -p serprog:dev&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/dev/ttyACM0,spispeed&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;16M -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F&amp;#34;&lt;/span&gt; -w x200_bios.rom
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Using clock_gettime &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; delay loops &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;clk_id: 1, resolution: 1ns&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;serprog: Programmer name is &lt;span class=&#34;s2&#34;&gt;&amp;#34;pico-serprog&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Found Macronix flash chip &lt;span class=&#34;s2&#34;&gt;&amp;#34;MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8192&lt;/span&gt; kB, SPI&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; on serprog.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Reading old flash chip contents... &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Erasing and writing flash chip... FAILED at 0x00130000! &lt;span class=&#34;nv&#34;&gt;Expected&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0xff, &lt;span class=&#34;nv&#34;&gt;Found&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x2f, failed byte count from 0x00130000-0x00137fff: 0x44aa
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERASE FAILED!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FAILED!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Uh oh. Erase/write failed. Checking &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; anything has changed.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Reading current flash chip contents... &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Apparently at least some data has changed.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Your flash chip is in an unknown state.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;那这个问题如何解决呢？答案是&lt;strong&gt;先擦除，再写入&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;像这样：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ flashprog -p serprog:dev&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/dev/ttyACM0,spispeed&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;16M -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F&amp;#34;&lt;/span&gt; -E
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Using clock_gettime &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; delay loops &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;clk_id: 1, resolution: 1ns&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;serprog: Programmer name is &lt;span class=&#34;s2&#34;&gt;&amp;#34;pico-serprog&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Found Macronix flash chip &lt;span class=&#34;s2&#34;&gt;&amp;#34;MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8192&lt;/span&gt; kB, SPI&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; on serprog.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Erasing flash chip... Erase &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后就可以完美写入了：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ flashprog -p serprog:dev&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/dev/ttyACM0,spispeed&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;16M -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F&amp;#34;&lt;/span&gt; -w x200_bios.rom
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Using clock_gettime &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; delay loops &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;clk_id: 1, resolution: 1ns&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;serprog: Programmer name is &lt;span class=&#34;s2&#34;&gt;&amp;#34;pico-serprog&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Found Macronix flash chip &lt;span class=&#34;s2&#34;&gt;&amp;#34;MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8192&lt;/span&gt; kB, SPI&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; on serprog.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Reading old flash chip contents... &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Erasing and writing flash chip... Erase/write &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Verifying flash... VERIFIED.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;提醒一句，尽量不要接在 hub 或者台式机的前面板，很可能会供电不足导致写入之后验证失败。&lt;/p&gt;
&lt;p&gt;如果杜邦线的长度太长（最好 10cm），夹子的质量不好，可能会导致你根本无法用 16M 的 spispeed 写入，甚至根本没法读取到芯片，经过我测试，现在我手上的这套设备已经不太行了，只能在 64K 的速度稳定写入，这消耗了大概 50 分钟进行一轮读取 - 擦除/写入 - 读取，所以当你成功刷入 coreboot 后，最好保守一点，直接在目标机子上面刷吧。&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>中国移动 RAX3000Me USB3.0 版折腾小记</title>
      <link>https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/</link>
      <pubDate>Sat, 12 Jul 2025 13:47:15 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/</guid>
      <description>
&lt;h2 class=&#34;relative group&#34;&gt;前言
    &lt;div id=&#34;前言&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%89%8d%e8%a8%80&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;这几天在闲鱼蹲路由器，终于让我蹲到了一台 65 的 RAX3000Me，遂开始折腾。&lt;/p&gt;
&lt;p&gt;买之前看了下恩山发现可以免拆，无非就是导出导入配置文件破解 ssh 呗，但是到手之后，发现我大意了。&lt;/p&gt;
&lt;p&gt;这台没法按照&lt;cite&gt;标准流程&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt;破解密码，通过爬帖得知，无法导出配置的自己的加密都存在问题，没办法免拆。&lt;/p&gt;
&lt;p&gt;那？！CH340，启动！&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;刷写教程
    &lt;div id=&#34;刷写教程&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%88%b7%e5%86%99%e6%95%99%e7%a8%8b&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;教程大部分都是参考这篇文章，在此感谢。&lt;/p&gt;
&lt;p&gt;&lt;a
  href=&#34;https://www.right.com.cn/forum/thread-8408539-1-1.html&#34;
    target=&#34;_blank&#34;
  &gt;CMCC RAX3000Me 可通过 mtk_uartboot 启动刷机，拆机刷 OpenWRT/ImmortalWRT 无障碍！&lt;/a&gt;&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;拆机
    &lt;div id=&#34;拆机&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%8b%86%e6%9c%ba&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;先把贴纸撕下来，拧下两颗螺丝。&lt;/p&gt;
&lt;p&gt;左手握着长边，右手握着短边，像这样：&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img
    class=&#34;my-0 rounded-md&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;
    fetchpriority=&#34;auto&#34;
    alt=&#34;操作手法&#34;
    width=&#34;1039&#34;
    height=&#34;841&#34;
    src=&#34;https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image-3_hu_72df38cb10784c8c.webp&#34;
    srcset=&#34;https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image-3_hu_72df38cb10784c8c.webp 800w, https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image-3.webp 1280w&#34;
    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
    data-zoom-src=&#34;https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image-3.webp&#34;&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;用力往下掰，会出现一条缝，用薄点的拆机片或者卡片撬开，小心别把卡扣弄断了。&lt;/p&gt;
&lt;p&gt;拧下 5 颗螺丝，卸下散热片，上面涂有硅脂，要稍微移动一下散热片才好下来，装回去的时候得重新涂一下。&lt;/p&gt;
&lt;p&gt;（其实不卸下也行，但是我探针就太难插了）&lt;/p&gt;
&lt;p&gt;推一下下面和右边的卡扣，把主板撬出来，小心不要弄断天线连接处了。&lt;/p&gt;
&lt;p&gt;你会看到这样：&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img
    class=&#34;my-0 rounded-md&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;
    fetchpriority=&#34;auto&#34;
    alt=&#34;拆机图&#34;
    width=&#34;1736&#34;
    height=&#34;923&#34;
    src=&#34;https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image_hu_850f85c7558569ba.webp&#34;
    srcset=&#34;https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image_hu_850f85c7558569ba.webp 800w, https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image_hu_a0bc269f80f97c3e.webp 1280w&#34;
    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
    data-zoom-src=&#34;https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image.webp&#34;&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;电源线左边，分别是&lt;code&gt;GND&lt;/code&gt; &lt;code&gt;TX&lt;/code&gt; &lt;code&gt;3.3v&lt;/code&gt; &lt;code&gt;RX&lt;/code&gt;。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;文件准备
    &lt;div id=&#34;文件准备&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%96%87%e4%bb%b6%e5%87%86%e5%a4%87&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;准备好这些东西：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ ls -lah
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;总计 2.3M
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; texsd texsd  &lt;span class=&#34;m&#34;&gt;148&lt;/span&gt;  7月19日 14:11 .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwx------ &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; texsd texsd 1.3K  7月18日 21:58 ..
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-r--r-- &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; texsd texsd 248K  7月14日 18:10 mt7981-cmcc_rax3000me-nand-ddr3-fip-fit.bin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxrwxr-x &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; texsd texsd 206K 2024年 2月 2日 mt7981-ddr3-bl2.bin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr-x &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; texsd texsd 1.9M 2024年 3月 2日 mtk_uartboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a
  href=&#34;https://www.right.com.cn/forum/thread-8400306-1-1.html&#34;
    target=&#34;_blank&#34;
  &gt;天灵的 U-Boot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
  href=&#34;https://www.lanzouw.com/ioTYu1pvi23g&#34;
    target=&#34;_blank&#34;
  &gt;bl2&lt;/a&gt; &lt;cite&gt;（预构建，也可自行编译）&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
  href=&#34;https://github.com/981213/mtk_uartboot/releases/tag/v0.1.1&#34;
    target=&#34;_blank&#34;
  &gt;mtk_uartboot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;打开你的&lt;code&gt;shell&lt;/code&gt;，&lt;code&gt;cd&lt;/code&gt;到此文件夹，连接你的 CH340，你应该能在设备管理器看到对应的串口。我是&lt;code&gt;/dev/ttyUSB0&lt;/code&gt;，如果你使用 Windows，一般是&lt;code&gt;COMX&lt;/code&gt;，请自行替换。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./mtk_uartboot -s /dev/ttyUSB0 -p ./mt7981-ddr3-bl2.bin -f mt7981-cmcc_rax3000me-nand-ddr3-fip-fit.bin --brom-load-baudrate &lt;span class=&#34;m&#34;&gt;115200&lt;/span&gt; --bl2-load-baudrate &lt;span class=&#34;m&#34;&gt;115200&lt;/span&gt; -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;这里要记得加&lt;code&gt;-a&lt;/code&gt;，否则可能识别成 aarch32 导致超时。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这时候应该会提示：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mtk_uartboot - 0.1.1
Using serial port: /dev/ttyUSB0
Handshake...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;准备完成！&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;刷入 UBOOT
    &lt;div id=&#34;刷入-uboot&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%88%b7%e5%85%a5-uboot&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;把你的 CH340 插上线，用杜邦线什么的都行，但是最好有带弹簧的测试探针，这是我的工具：&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img
    class=&#34;my-0 rounded-md&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;
    fetchpriority=&#34;auto&#34;
    alt=&#34;CH340&#34;
    width=&#34;1681&#34;
    height=&#34;1015&#34;
    src=&#34;https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image-2_hu_d8edd934ec3918e7.webp&#34;
    srcset=&#34;https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image-2_hu_d8edd934ec3918e7.webp 800w, https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image-2_hu_2b0be9a9ae98c7f9.webp 1280w&#34;
    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
    data-zoom-src=&#34;https://blog.texsd.eu.org/posts/flashing_cmcc_rax3000me_usb/image-2.webp&#34;&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;找出 CH340 的&lt;code&gt;GND&lt;/code&gt; &lt;code&gt;RX&lt;/code&gt; &lt;code&gt;TX&lt;/code&gt;，从左往右依次按上主板的触点（不用接 3.3v），这时候右手还可以操作电脑。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你不确定是否插好，可以退出 mtk_uartboot，打开任意串口工具并连接，直接插电启动，应该能看到调试信息。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;确认插好了，就直接上电，大概 30 秒左右，mtk_uartboot 输出以下内容并交还 shell：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mtk_uartboot - 0.1.1
Using serial port: /dev/ttyUSB0
Handshake...
hw code: 0x7981
hw sub code: 0x8a00
hw ver: 0xca00
sw ver: 0x1
Baud rate set to 115200
sending payload to 0x201000...
Checksum: 0x55cf
Setting baudrate back to 115200
Jumping to 0x201000 in aarch64...
Waiting for BL2. Message below:
==================================
NOTICE:  BL2: v2.10.0   (release):v2.4-rc0-5845-gbacca82a8-dirty
NOTICE:  BL2: Built : 20:18:08, Feb  2 2024
NOTICE:  WDT: Cold boot
NOTICE:  WDT: disabled
NOTICE:  EMI: Using DDR3 settings
NOTICE:  EMI: Detected DRAM size: 512MB
NOTICE:  EMI: complex R/W mem test passed
NOTICE:  CPU: MT7981 (1300MHz)
NOTICE:  Starting UART download handshake ...
==================================
BL2 UART DL version: 0x10
Baudrate set to: 115200
FIP sent.
==================================
NOTICE:  Received FIP 0x3df58 @ 0x40400000 ...
==================================
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后路由器就会亮起蓝灯（正常进官方系统没联网是红灯），网线插 LAN 口连到电脑，输入&lt;code&gt;192.168.1.1/uboot.html&lt;/code&gt;，上传之前下载的 uboot。&lt;/p&gt;

&lt;h4 class=&#34;relative group&#34;&gt;一些问题
    &lt;div id=&#34;一些问题&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e4%b8%80%e4%ba%9b%e9%97%ae%e9%a2%98&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;mtk_uartboot&lt;/code&gt;异常退出，提示 coredump&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这大概率是连接不好/接上了 3.3v。建议不要接 3.3v，否则每次连上都会导致 CH340 断开连接。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;无论怎么尝试，总是提示&lt;code&gt;Timeout waiting for specified message.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;有下面两种情况：&lt;/p&gt;
&lt;p&gt;第一种：没有加&lt;code&gt;-d&lt;/code&gt;参数。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Jumping to 0x201000 in aarch32...
Waiting for BL2. Message below:
==================================
==================================
Timeout waiting for specified message.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这就是默认使用了&lt;code&gt;aarch32&lt;/code&gt;，请严格按照上面的命令执行！&lt;/p&gt;
&lt;p&gt;第二种：没识别出内存。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;==================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NOTICE:  BL2: v2.10.0   &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;release&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:v2.4-rc0-5845-gbacca82a8-dirty
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NOTICE:  BL2: Built : 20:20:25, Feb  &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;2024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NOTICE:  WDT: Cold boot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NOTICE:  WDT: disabled
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NOTICE:  EMI: Using DDR4 settings
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NOTICE:  EMI: Detected DRAM size: &lt;span class=&#34;nv&#34;&gt;0MB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;==================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你的 bl2 用错了，请确认你的 ddr 类型，或者尝试另外一种 ddr 类型。&lt;/p&gt;
&lt;p&gt;第三种：是&lt;code&gt;aarch64&lt;/code&gt;，但是没有输出。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Jumping to 0x201000 in aarch64...
Waiting for BL2. Message below:
==================================
==================================
Timeout waiting for specified message.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可能是以下情况：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;自己编译的 bl2 没成功。&lt;/li&gt;
&lt;li&gt;下载中出现损坏。&lt;/li&gt;
&lt;li&gt;使用了 immortalwrt 官方的 preloader，此文件我试了很多次都没成功，原因未知。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 class=&#34;relative group&#34;&gt;刷入固件
    &lt;div id=&#34;刷入固件&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%88%b7%e5%85%a5%e5%9b%ba%e4%bb%b6&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;

&lt;h4 class=&#34;relative group&#34;&gt;新版固件
    &lt;div id=&#34;新版固件&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%96%b0%e7%89%88%e5%9b%ba%e4%bb%b6&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;新版的&lt;code&gt;immortalwrt&lt;/code&gt;（23.05 和我打算用的 24.10）已经在使用一种新的镜像文件&lt;code&gt;*.itb&lt;/code&gt;，这个镜像同时包含&lt;code&gt;dtb&lt;/code&gt; &lt;code&gt;ramdisk&lt;/code&gt; &lt;code&gt;kernel&lt;/code&gt;。想要详细了解的可以参考&lt;a
  href=&#34;http://www.wowotech.net/u-boot/fit_image_overview.html&#34;
    target=&#34;_blank&#34;
  &gt;u-boot FIT image 介绍&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;直接刷入&lt;code&gt;sysupgrade&lt;/code&gt;的&lt;code&gt;itb&lt;/code&gt;可能会出现不成功的情况，表现为一直闪蓝灯，这里我们需要先刷入&lt;code&gt;initramfs&lt;/code&gt;的&lt;code&gt;itb&lt;/code&gt;，重启进入系统之后，再刷入对应的&lt;code&gt;sysupgrade&lt;/code&gt;镜像。&lt;/p&gt;
&lt;p&gt;请注意&lt;code&gt;uboot&lt;/code&gt;版本可能与固件版本相关，经过测试天灵 25 年 3 月编译的&lt;code&gt;uboot&lt;/code&gt;是可以使用我上面的方法刷入 237 固件。&lt;/p&gt;
&lt;p&gt;&lt;a
  href=&#34;https://github.com/padavanonly/immortalwrt-mt798x-6.6&#34;
    target=&#34;_blank&#34;
  &gt;padavanonly/immortalwrt-mt798x-6.6&lt;/a&gt;&lt;/p&gt;

&lt;h4 class=&#34;relative group&#34;&gt;旧版固件
    &lt;div id=&#34;旧版固件&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%97%a7%e7%89%88%e5%9b%ba%e4%bb%b6&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;如果你想使用原汁原味的&lt;a
  href=&#34;https://cmi.hanwckf.top/p/immortalwrt-mt798x/&#34;
    target=&#34;_blank&#34;
  &gt;immortalwrt-mt798x&lt;/a&gt;，你可能得使用原版的 hanwckf 的&lt;code&gt;uboot&lt;/code&gt;，这个版本没有&lt;code&gt;dhcp&lt;/code&gt;需要手动设置静态地址。建议使用 24.11 的版本，因为尝试了 22 年的版本发现不认复旦微的这颗 NAND，导致&lt;code&gt;uboot&lt;/code&gt;无法启动，只能使用 CH340 重新刷一遍。&lt;/p&gt;
&lt;p&gt;而且，使用最新源码编译出来会导致 wifi 设置中缺少加密方式的问题，此问题亦有在 issues 里面提及，但感觉修复的可能性不大。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;参考
    &lt;div id=&#34;参考&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%8f%82%e8%80%83&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a
  href=&#34;https://github.com/Daniel-Hwang/RAX3000Me&#34;
    target=&#34;_blank&#34;
  &gt;Daniel-Hwang/RAX3000Me: RAX3000Me 路由器开发与固件刷入详细教程&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a
  href=&#34;https://www.cnblogs.com/p123/p/18046679&#34;
    target=&#34;_blank&#34;
  &gt;MediaTek Filogic 系列路由器串口救砖教程 - 暗云 - 博客园&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
      
    </item>
    
  </channel>
</rss>
