MoreRSS

site iconAllen Hua修改

Java工程师,常驻南京。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Allen Hua的 RSS 预览

机械革命无界14Pro笔记本debian forky成功驱动内置扬声器和麦克风

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

还要特别感谢这篇文章 https://inkcodes.com/2025/09/14/%E6%9C%BA%E6%A2%B0%E9%9D%A9%E5%91%BD%2015x%E7%9A%84%20linux%20%E9%9F%B3%E9%A2%91%E7%88%86%E9%9F%B3%20codec%E6%A3%80%E6%B5%8B%E4%B8%8D%E5%88%B0%E4%BF%AE%E5%A4%8D%E2%80%94%E2%80%94model%E5%8F%82%E6%95%B0/

在此记录一下我这里的配置:

#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

重点:

  1. options snd-hda-intel model=laptop-amic
  2. 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

现在内置扬声器和内置麦克风终于都能工作了,太好了。见下图

终于成功驱动了笔记本的内置扬声器和麦克风.jpg

记录 typecho 1.2.0 升级到 1.3.0 过程

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
  • 如果有将上述 compose 文件命名的比较特殊,比如叫做 typecho.yml,运行 docker compose 命令时需加上 -f typecho.yml

这里我踩了几个坑,因为我有几个 typecho 环境:

1.3.0版本建议使用这个镜像 joyqi/typecho:1.3.0-php7.4-apachejoyqi/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版本需要备份的关键数据有:

  1. 容器内 usr/ 目录,这是用户目录,所有的插件,主题,上传的文件都在这里
  2. .htaccess 文件,一般在容器内 /app/.htaccess
  3. /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

其他细碎问题

最后再说一点杂碎的可能被忽略的问题

  • 如果你进入到了 /install.php 页面,点击之后没有反应,你需要考虑到你当前本地挂载的目录是否正确,比如更新了镜像版本之后,你依然使用原本的本地目录,但是挂载到了容器中的 /app 下(你原本挂载到容器中的 /app/usr),所以会造成安装失败
  • 要关注容器内 /app 是否有写入权限。所有者最好是 www-data,权限最好是 755,可以直接在宿主机修改权限和拥有者
  • 新环境运行好之后可以将备份的 usr 目录完全替换新环境的 usr 目录,确保文件所有者和权限正确
  • 安装界面选择了正确的数据库驱动后,对应的数据库主机(也就是 host),可以直接填写 mysql 容器的名称,同一个 compose stack 下运行的服务相互之间可以通过容器名称找到彼此
  • 数据库挂载不要动,不论你是挂载到 volume 的,还是当前文件夹下的某个子文件夹,对应的容器内目录仍然是 /var/lib/mysql,数据库镜像tag也不需要更新
  • 修改了容器内 apache2 的配置,比如 .htaccess 或者 /etc/apache2/apache2.conf 文件,建议通过 docker compose restart 重启 stack 整个服务

大功告成!

开发了一款openwrt插件:文本剪贴板

2026-03-24 14:59:00

一款可以在OpenWrt/ImmortalWrt上安装使用的文本剪贴板,可以在局域网使用,也可以在公网使用(如果你将LuCI WEB暴露在公网,但建议给LuCI WEB设置强密码)

github 地址:https://github.com/hellodk34/luci-app-pasteanytext

使用场景举例:

  • send on device A
  • reveive on device B
  • search items
  • view history items
  • click item and copy it's content

本程序只依赖 luci-base(正常安装的 OpenWRT 系统均已安装这个包),由于是第一次开发编译和构建 openwrt ipk 插件,构建出来的 ipk 是架构无关的,我在 ImmortalWrt 24.10.1 on x86_64 & arm64 上均成功安装和使用,如有问题(比如无法安装)欢迎提 issue 交流。因为没有测试 MIPS 等架构的设备。

下载量统计

GitHub release downloads

安装使用方法

事先将 release 中的 ipk 文件拷贝到系统,在正确目录执行以下命令安装

opkg install ./luci-app-pasteanytext_1.1-r4_all.ipk

重启 rpcd 服务后登录 LuCI WEB 查看“服务”目录下的 pasteanytext 即可使用

/etc/init.d/rpcd restart

界面截图

pasteanytext文本传送ipk使用截图.jpg

解决机械革命笔记本内屏高刷240Hz闪屏问题

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 居然不闪烁了!

然后看了一下“机械革命电竞控制台”,默认是“游戏模式”。好的,我现在也不改“办公模式”了,说不一定就解决了突然关机问题。

哈哈哈 虽然前两天改成办公模式的确没有出现突然关机现象了,但是电脑响应某些动作明显慢了一拍。这哪能忍,好好的游戏本跑什么办公模式。

使用 Java 写了一个局域网端口扫描器

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


LanPortScanner - 局域网端口扫描器

一个用 Java 编写的局域网端口扫描工具,支持 TCP 和 HTTP 协议扫描。现成的 LanPortScanner.jar 文件(仅5.18KB)请在项目 release 页面下载。

我的使用场景举例

  1. 群晖 nas 设备接入了一个局域网,但是我没有局域网管理权限,可以借助本程序快速扫描群晖的 5000 web 端口
  2. 我的 x86 小主机安装了 immortalwrt 系统作为旁路网关使用,小主机开机后也可以借助本程序快速扫描出来 IP,可以使用 http 扫描 88 端口(luci web uhttpd 的服务端口默认是 80),也可以使用 tcp 扫描 1003 端口(dropbear ssh 服务默认端口是 22)

✨ 特性

  • 🔍 支持 TCP 和 HTTP 两种协议扫描
  • 🎯 精确的参数验证(IP格式、范围、端口等)
  • ⚡ 多线程并发扫描,提高效率
  • 📊 详细的扫描结果和统计信息
  • 🔒 仅支持局域网IP扫描,确保安全
  • 🔄 兼容 Java 8 到 Java 21+

🚀 快速开始

1. 编译项目

# 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

2. 运行扫描

# 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> <端口> [超时秒数]
参数 必需 说明 示例
协议 tcphttp(不区分大小写) tcp
起始IP 起始IP地址(必须是局域网IP) 192.168.1.1
结束IP 结束IP地址(必须是局域网IP) 192.168.1.254
端口 目标端口号(1-65535) 80
超时时间 超时秒数(默认2秒) 3

📋 支持的局域网IP范围

  • 10.0.0.0/8:10.0.0.0 - 10.255.255.255
  • 172.16.0.0/12:172.16.0.0 - 172.31.255.255
  • 192.168.0.0/16:192.168.0.0 - 192.168.255.255

🛡️ 安全特性

  • ❌ 禁止扫描公网IP地址
  • ❌ 严格的参数验证
  • ❌ 防止IP范围错误
  • ❌ 限制端口范围(1-65535)

📊 输出示例

========================================
🔍 局域网端口扫描器
========================================
协议类型: 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
========================================

⚠️ 注意事项

  1. 仅限局域网使用:本工具只能扫描局域网IP,无法扫描公网IP
  2. 遵守法律:请仅在自己拥有权限的网络中使用
  3. 性能建议
    • 建议扫描范围不要超过C类网段(254个IP)
    • 可根据网络情况调整超时时间
    • 大范围扫描时建议增加超时时间

🛠️ 技术细节

  • 兼容性:Java 8 - Java 21+
  • 并发:使用线程池实现并发扫描
  • 协议支持
    • TCP:使用Socket连接测试
    • HTTP:使用HttpURLConnection测试
  • 编码:UTF-8

📦 依赖

本项目为纯Java实现,无外部依赖,可直接编译运行。


运行截图

局域网端口扫描器使用截图.jpg

openwrt使用外置根extroot机制扩展根分区大小

2026-02-01 19:08:00

这里我们把整个 OpenWrt 系统迁移到 ext4 磁盘上,通过 extroot 机制实现一个更大的根分区。


extroot 机制简述(OpenWrt)

在 OpenWrt 中,extroot 是一种利用外部存储设备(USB / SATA / SD 卡)来扩展系统可写空间的机制。
它并不是对原有根分区进行在线扩容,而是通过启动后切换根文件系统或 overlay,让系统运行在一个容量更大的外部磁盘之上。

工作原理

  1. 启动阶段

    • OpenWrt 首先从内部 Flash 启动最小系统
    • 根文件系统通常是只读的 squashfs,配合一个很小的可写 overlay
  2. 挂载外部存储

    • 启动过程中,block-mount 根据 /etc/config/fstab
    • 挂载外部磁盘分区(通常是 ext4
  3. 根文件系统切换

    • 如果检测到 extroot 配置
    • 外部磁盘中的根文件系统会接管 /overlay(或直接接管 /
    • 系统随后运行在外部磁盘之上

效果

  • 从系统视角看:

    • //overlay 位于外部磁盘
    • 文件系统类型通常为 ext4
    • 可用空间显著增加
  • 对上层应用和用户来说:

    • 与普通根分区无差别
    • 所有软件、配置、日志都写入外部存储

为什么需要复制整个根文件系统

extroot 并不是只挂载一个空目录作为 overlay,
而是要求外部存储上存在完整、可启动的 OpenWrt 根文件系统结构

因此在启用 extroot 前,通常需要将当前系统的 / 完整复制到外部磁盘中,
以确保 init、库文件和配置在切换后仍然可用。

适用场景

  • 内置 Flash 空间很小的路由器
  • 需要安装大量软件包
  • 需要更高的写入寿命或更大的日志空间

一句话总结

extroot 通过在启动过程中将 OpenWrt 的可写根文件系统迁移到外部存储设备,实现“逻辑上的根分区扩容”。


好的,官话结束,我们来讲怎么做。很简单,建议安装 diskman luci 界面配合命令行操作。

一、安装 diskman

# 更新一下软件源
# opkg update

# 安装 diskman 程序和中文汉化包
# opkg install luci-app-diskman luci-i18n-diskman-zh-cn

二、新建分区并格式化(作为新的根使用,以此扩展根分区大小)

在 luci 界面中切换到“DiskMan 磁盘管理”,编辑当前磁盘,在“分区信息”最后一行直接新建分区,这样可以快捷创建分区,不需要手动计算“起始扇区”和“中止扇区”,新建好之后建议格式化此分区为 ext4 文件系统。

diskman磁盘管理.webp

分区管理-新建分区.webp

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

如下图

挂载点-存储区.webp

在“保存并应用”之前,执行如下命令(就是页面上显示的那几行),我添加了注释,更方便理解每一行干了啥,作用是什么

# 创建临时挂载点,用于访问当前正在运行的内部根文件系统
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

旧的根分区大小290.4兆.webp

四、重启生效

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

新的根分区大小28.4G.webp

扩展

上述是通过 ext4 + combined + efi 模式安装的系统。如果是 squashfs + combined + efi 安装的系统,那么方法稍稍有点不同

前面创建分区(磁盘剩余空间全都new出来一块分区)然后格式化成 ext4 格式的操作是一样的。最后回到挂载点设置

采用squashfs安装的系统需要将挂载点作为外部 overlay使用,作为根使用会造成启动失败.jpg

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