2026-04-26 22:25:00
我的机械革命无界14Pro笔记本安装了debian forky(当下的 debian testing 系统,也是未来的 debian 14代号),今天终于成功驱动了扬声器和麦克风。
先贴出 fastfetch 数据
fastfetch
_,met$$$$$gg. dk@dkwujie14pro
,g$$$$$$$$$$$$$$$P. ---------------
,g$$P"" """Y$$.". OS: Debian GNU/Linux forky/sid (forky) x86_64
,$$P' `$$$. Host: WUJIE14 PRO
',$$P ,ggs. `$$b: Kernel: Linux 6.19.11+deb14-amd64
`d$$' ,$P"' . $$$ Uptime: 20 mins
$$P d$' , $$P Packages: 2976 (dpkg)
$$: $$. - ,d$$' Shell: bash 5.3.9
$$; Y$b._ _,d$P' Display (28U1): 3840x2160 @ 2x in 28", 60 Hz [External]
Y$$. `.`"Y$$$$P"' DE: GNOME 49.5
`$$b "-.__ WM: Mutter (Wayland)
`Y$$b WM Theme: Adwaita
`Y$$. Theme: Adwaita [GTK2/3/4]
`$$b. Icons: Adwaita [GTK2/3/4]
`Y$$b. Font: Adwaita Sans (11pt) [GTK2/3/4]
`"Y$b._ Cursor: Adwaita (32px)
`"""" Terminal: GNOME Terminal 3.60.0
Terminal Font: JetBrains Mono (14pt)
CPU: 12th Gen Intel(R) Core(TM) i7-12650H (16) @ 4.70 GHz
GPU: Intel UHD Graphics @ 1.40 GHz [Integrated]
Memory: 7.11 GiB / 15.35 GiB (46%)
Swap: 0 B / 977.00 MiB (0%)
Disk (/): 90.31 GiB / 1.83 TiB (5%) - ext4
Local IP (wlp3s0): 10.10.10.242/24
Battery (AEC3166124-4S1P): 99% [AC Connected]
Locale: en_US.UTF-8
声卡是 Realtek ALC256,驱动扬声器的过程比较简单,在网上搜一下就很容易得到一个能成功的配置。但是麦克风的驱动着实让我尝试了很多遍才搞定。
重要的参考网站:
https://www.kernel.org/doc/html/latest/sound/hd-audio/models.html
在此记录一下我这里的配置:
#ls
alsa-alc256.conf amd64-microcode-blacklist.conf inteldsp.conf intel-microcode-blacklist.conf
root@dkwujie14pro [22:01:04] /etc/modprobe.d
#cat alsa-alc256.conf
options snd-hda-intel model=laptop-amic
root@dkwujie14pro [22:01:07] /etc/modprobe.d
#cat inteldsp.conf
options snd-intel-dspcfg dsp_driver=3
重点:
配置:
options snd-hda-intel model=laptop-amic
这个参数的作用是:
强制 codec(ALC256)走 “analog internal mic” 路径
说明这台机器:
实际是 模拟内置麦(AMIC)
而不是 DMIC(数字麦)
系统很可能一开始:
误走了 DMIC / 错误 routing
或 SOF 没启用,UCM 不匹配
配置:
options snd-intel-dspcfg dsp_driver=3
这是关键一步,切到 SOF 路径,这一步让系统走:
Intel DSP + SOF(Sound Open Firmware)
而不是 legacy HDA。
在 12 代 Intel 上:
扬声器很多时候 两条路径都能响
但麦克风(尤其是 internal mic)
通常只在 SOF + UCM 配置下才能正确 routing
现在内置扬声器和内置麦克风终于都能工作了,太好了。见下图

2026-04-25 11:02:00
我的 typecho 是基于 docker compose 部署安装的。当前的 compose 文件如下
services:
typecho:
container_name: typecho
image: joyqi/typecho:1.3.0-php7.4-apache
restart: unless-stopped
environment:
TIMEZONE: Asia/Shanghai
TYPECHO_DB_HOST: mysql-typecho
TYPECHO_DB_USER: typecho
TYPECHO_DB_PASSWORD: xxx
TYPECHO_DB_DATABASE: typecho
TYPECHO_SITE_URL: https://blog.xxx.com
TYPECHO_USER_NAME: xxx
TYPECHO_USER_PASSWORD: xxx
TYPECHO_USER_MAIL: xxx
MAX_POST_BODY: 100M
networks:
- typecho-net
volumes:
- ./typecho-data-1.3.0:/app
ports:
- 8090:80
depends_on:
- mysql
mysql:
container_name: mysql-typecho
image: mysql:8.0.29
restart: unless-stopped
networks:
- typecho-net
volumes:
- ./mysql-data:/var/lib/mysql
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: xxx
MYSQL_DATABASE: xxx
MYSQL_USER: xxx
MYSQL_PASSWORD: xxx
networks:
typecho-net:
docker compose up -d 后台启动docker compose down 删除网络、容器docker compose,不是老旧的 docker-compose
typecho.yml,运行 docker compose 命令时需加上 -f typecho.yml
这里我踩了几个坑,因为我有几个 typecho 环境:
1.3.0版本建议使用这个镜像 joyqi/typecho:1.3.0-php7.4-apache,joyqi/typecho:1.3.0-php8.2-apache这个镜像由于 php 版本过高,有运行时兼容性问题,甚至 blog 系统无法正常工作。
1.2.1版本可以使用 joyqi/typecho:1.2.1-php8.0-apache 这个镜像,我的实测是OK的。
1.2.0版本可以使用 joyqi/typecho:1.2.0-php7.4-apache 这个镜像,我的实测是OK的。
typecho 系统运行之后关键的用户数据在 usr/ 目录下,我之前只挂载了这个目录,但是和 usr/ 目录同级的还有 config.inc.php、.htaccess 等关键文件,其中config.inc.php可以在新版本安装之后重新走一遍安装流程生成。所以我上面的 compose 文件,我将挂载的容器内目录改成了 /app(即./typecho-data-1.3.0:/app),原本只挂载了/app/usr,这样数据更全,更新系统更安全。
因为我开启了系统地址重写功能,所以容器内的 /etc/apache2/apache2.conf 文件也需要备份一下,在新环境里直接将此文件覆盖过去即可。
所以对于我的这种环境部署,更新typecho版本需要备份的关键数据有:
usr/ 目录,这是用户目录,所有的插件,主题,上传的文件都在这里.htaccess 文件,一般在容器内 /app/.htaccess
/etc/apache2/apache2.conf 文件,备份它,新环境运行起来之后进入容器,使用这个文件替换原本的 apache2.conf 文件好了,关键就是这三份文件,如果你在寻找 typecho 博客更新的一些文章,或者遇到什么更新困难,错误之类的问题,你需要考虑到你是不是用的 joyqi/typecho:1.3.0-php7.4-apache 这种镜像!!!这个镜像包含了 typecho php 服务和 apache2 服务!!!数据库服务是单独部署的。但有些镜像可能没有 apache2 web server 服务。
再来说说官方的 upgrade 教程:https://docs.typecho.org/upgrade ,文中提到,更新 typecho 其实只需要升级这些文件,使用新版本的这些文件替换进去就行了。但因为我们是通过 docker 部署的,建议更新镜像 tag,作者除了维护这些文件,还有 php 运行时环境,可能还涉及到安全:比如镜像内基础镜像的更新、内核的更新。
/admin/
/var/
/index.php
/install.php
最后再说一点杂碎的可能被忽略的问题
/app 是否有写入权限。所有者最好是 www-data,权限最好是 755,可以直接在宿主机修改权限和拥有者/var/lib/mysql,数据库镜像tag也不需要更新.htaccess 或者 /etc/apache2/apache2.conf 文件,建议通过 docker compose restart 重启 stack 整个服务大功告成!
2026-03-24 14:59:00
一款可以在OpenWrt/ImmortalWrt上安装使用的文本剪贴板,可以在局域网使用,也可以在公网使用(如果你将LuCI WEB暴露在公网,但建议给LuCI WEB设置强密码)
github 地址:https://github.com/hellodk34/luci-app-pasteanytext
使用场景举例:
本程序只依赖 luci-base(正常安装的 OpenWRT 系统均已安装这个包),由于是第一次开发编译和构建 openwrt ipk 插件,构建出来的 ipk 是架构无关的,我在 ImmortalWrt 24.10.1 on x86_64 & arm64 上均成功安装和使用,如有问题(比如无法安装)欢迎提 issue 交流。因为没有测试 MIPS 等架构的设备。
事先将 release 中的 ipk 文件拷贝到系统,在正确目录执行以下命令安装
opkg install ./luci-app-pasteanytext_1.1-r4_all.ipk
重启 rpcd 服务后登录 LuCI WEB 查看“服务”目录下的 pasteanytext 即可使用
/etc/init.d/rpcd restart

2026-02-27 23:10:00
今天,这破机械革命内置屏幕在连接到intel核显驱动的情况下,240Hz 居然不闪屏了!!!
解决了,解决方法居然是:进 bios,然后 load optimized defaults !!! 然后保存并退出!
我之前换屏幕的时候也遇到了这个问题的,当时改成了独显直连,可以 240Hz,参考以前的文章:给机械革命钛钽plus换屏:NY2换成NZ2
不过后来出现了“突然关机”这个问题,我就各种找解决办法,觉得可能是240Hz高刷负载高了,想方设法降低电脑负载,换成了混合显示模式,内置屏通过核显驱动,并且从bios里将整机从“游戏模式”改成了“办公模式”,没有从“机械革命电竞控制台”修改,因为觉得从bios修改更底层,更能生效。
今天发现电脑核显驱动有更新,我就更新了一下,并且测试了一下内屏 240Hz,但是仍然闪烁。。
在B站搜到这个视频: 【极光x2025闪屏解决方法,亲测实用!】 https://www.bilibili.com/video/BV1TMahzcEwD/
于是我尝试了一下视频中第三种方法:load optimized defaults,然后保存并退出。(实际就是 bios 恢复出厂设置,不做定制化变更)
再改成 240Hz 居然不闪烁了!
然后看了一下“机械革命电竞控制台”,默认是“游戏模式”。好的,我现在也不改“办公模式”了,说不一定就解决了突然关机问题。
哈哈哈 虽然前两天改成办公模式的确没有出现突然关机现象了,但是电脑响应某些动作明显慢了一拍。这哪能忍,好好的游戏本跑什么办公模式。
2026-02-26 14:11:43
一开始打算使用 web 来做的,但是发现浏览器没有那么高的权限,限制来自浏览器安全模型。浏览器不允许:创建任意 TCP Socket,主动向任意 IP:PORT 建立 TCP 连接,探测端口是否 open / closed / filtered
最终我改回了 Java 实现。并开源在了 https://github.com/hellodk34/LanPortScanner
直接下载 jar 包:https://github.com/hellodk34/LanPortScanner/releases
一个用 Java 编写的局域网端口扫描工具,支持 TCP 和 HTTP 协议扫描。现成的 LanPortScanner.jar 文件(仅5.18KB)请在项目 release 页面下载。
# Windows一键操作(双击运行)
build_win.bat
# linux/macOS一键操作
chmod +x build_linux.sh
./build_linux.sh
# 或者手动编译
javac -encoding UTF-8 LanPortScanner.java
jar cfe LanPortScanner.jar LanPortScanner LanPortScanner.class
# TCP 扫描(默认2秒超时)
java -jar target/LanPortScanner.jar tcp 192.168.1.1 192.168.1.254 80
# HTTP 扫描(自定义超时3秒)
java -jar target/LanPortScanner.jar http 192.168.10.1 192.168.10.254 8080 3
# 跨网段扫描
java -jar target/LanPortScanner.jar tcp 192.168.0.1 192.168.1.254 22 5
java -jar LanPortScanner.jar <协议> <起始IP> <结束IP> <端口> [超时秒数]
| 参数 | 必需 | 说明 | 示例 |
|---|---|---|---|
| 协议 | ✅ |
tcp 或 http(不区分大小写) |
tcp |
| 起始IP | ✅ | 起始IP地址(必须是局域网IP) | 192.168.1.1 |
| 结束IP | ✅ | 结束IP地址(必须是局域网IP) | 192.168.1.254 |
| 端口 | ✅ | 目标端口号(1-65535) | 80 |
| 超时时间 | ❌ | 超时秒数(默认2秒) | 3 |
========================================
🔍 局域网端口扫描器
========================================
协议类型: TCP
IP范围: 192.168.1.1 - 192.168.1.254
目标端口: 22
超时设置: 2 秒
扫描总数: 254 个IP
========================================
开始扫描...
✅ 发现设备: 192.168.1.100:22
✅ 发现设备: 192.168.1.150:22
========================================
🏁 扫描完成
========================================
总耗时: 15.23 秒
扫描IP数: 254
发现设备: 2 个
发现的设备列表:
- 192.168.1.100:22
- 192.168.1.150:22
========================================
本项目为纯Java实现,无外部依赖,可直接编译运行。

2026-02-01 19:08:00
这里我们把整个 OpenWrt 系统迁移到 ext4 磁盘上,通过 extroot 机制实现一个更大的根分区。
在 OpenWrt 中,extroot 是一种利用外部存储设备(USB / SATA / SD 卡)来扩展系统可写空间的机制。
它并不是对原有根分区进行在线扩容,而是通过启动后切换根文件系统或 overlay,让系统运行在一个容量更大的外部磁盘之上。
启动阶段
squashfs,配合一个很小的可写 overlay
挂载外部存储
block-mount 根据 /etc/config/fstab
ext4)根文件系统切换
/overlay(或直接接管 /)从系统视角看:
/ 或 /overlay 位于外部磁盘ext4
对上层应用和用户来说:
extroot 并不是只挂载一个空目录作为 overlay,
而是要求外部存储上存在完整、可启动的 OpenWrt 根文件系统结构。
因此在启用 extroot 前,通常需要将当前系统的 / 完整复制到外部磁盘中,
以确保 init、库文件和配置在切换后仍然可用。
一句话总结:
extroot 通过在启动过程中将 OpenWrt 的可写根文件系统迁移到外部存储设备,实现“逻辑上的根分区扩容”。
好的,官话结束,我们来讲怎么做。很简单,建议安装 diskman luci 界面配合命令行操作。
一、安装 diskman
# 更新一下软件源
# opkg update
# 安装 diskman 程序和中文汉化包
# opkg install luci-app-diskman luci-i18n-diskman-zh-cn
二、新建分区并格式化(作为新的根使用,以此扩展根分区大小)
在 luci 界面中切换到“DiskMan 磁盘管理”,编辑当前磁盘,在“分区信息”最后一行直接新建分区,这样可以快捷创建分区,不需要手动计算“起始扇区”和“中止扇区”,新建好之后建议格式化此分区为 ext4 文件系统。


三、回到挂载点将上述分区挂载为根/
如下图

在“保存并应用”之前,执行如下命令(就是页面上显示的那几行),我添加了注释,更方便理解每一行干了啥,作用是什么
# 创建临时挂载点,用于访问当前正在运行的内部根文件系统
mkdir -p /tmp/introot
# 创建临时挂载点,用于挂载即将作为 extroot 的外部磁盘分区
mkdir -p /tmp/extroot
# 将当前根目录 / 绑定挂载到 /tmp/introot,便于完整复制现有系统
mount --bind / /tmp/introot
# 挂载外部磁盘分区(ext4),作为未来的 extroot 根文件系统
mount /dev/sda1 /tmp/extroot
# 使用 tar 管道方式,将整个根文件系统原样复制到外部磁盘分区
tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
# 卸载临时挂载的内部根文件系统
umount /tmp/introot
# 卸载外部磁盘分区,确保数据完整写入磁盘
umount /tmp/extroot
逐行执行之后,再“保存并应用”。
现在通过 df -hT 查看根分区大小是 290.4MB

四、重启生效
重启之后查看根分区大小,变成了磁盘余下空间 28.4G,成功实现根分区扩容。

上述是通过 ext4 + combined + efi 模式安装的系统。如果是 squashfs + combined + efi 安装的系统,那么方法稍稍有点不同
前面创建分区(磁盘剩余空间全都new出来一块分区)然后格式化成 ext4 格式的操作是一样的。最后回到挂载点设置

这里是重点,要将挂载点设置为“作为外部overlay使用(/overlay)”,选择挂载为根使用会启动失败,找不到 extroot