2026-09-21 · 约 2200 字
NAS树莓派飞牛OS
给树莓派 5 配了一块 ASM1166 六口 SATA 扩展卡,准备把闲置的两块机械盘挂上跑飞牛(fnOS)。装机过程比想象中折腾,主要卡在 PCIe 枚举和供电上,记录一下踩过的坑。
ASM1166 的 msi-parent 问题
ASM1166 挂在 PCIe 上之后,内核日志里反复出现 DMAR 相关的映射报错,盘能认到但读写时不时掉盘。排查一圈发现是 MSI 中断的父节点分配不对,需要在设备树里显式指定 msi-parent。
更直接的办法是写一个 udev 规则,在冷启动时让 usb_modeswitch 先复位一次控制器再交给内核,规避 ASM1166 和 USB 控制器抢总线的竞态。这个问题在冷启动时必现、热重启时消失,典型的枚举顺序问题。
dm-cache 加速机械盘
手头有一块闲置的 NVMe,正好拿来给机械盘做 dm-cache 读加速。飞牛的存储池界面不直接暴露 dm-cache,我是先在命令行用 dmsetup 建好 cache 设备再挂载的:
# 用 NVMe 分区做 cache,机械盘做 origin
dmsetup create cache1 --table \
"0 $(blockdev --getsz /dev/sda1) cache /dev/nvme0n1p1 /dev/sda1 64 1 writeback default 0"
实测大文件顺序读写提升不明显(瓶颈在机械盘本身),但目录树遍历和元数据操作快了很多。如果只做备份归档用途,writeback 模式要谨慎,掉电有风险。
供电教训
树莓派 5 用 5V/3.6A 的 USB 供电,接两块 3.5 寸盘是明显不够的。满载压测时虽然没触发欠压,但 18W 的输入已经顶在边缘。建议直接上 12V/5A 的电源加独立硬盘供电,别指望 USB 那点电流带机械盘。UPS 也备上了,家里面偶尔跳闸,数据比什么都金贵。
2026-09-16 · 约 1800 字
DNSdnsdistnginx
本地运营商的 DNS 污染越来越频繁,顺手用 dnsdist + nginx 搭了一套自建 DoH,域名统一走加密查询。中间踩了几个坑,记下来免得下次再犯。
链路结构
整体结构很简单:nginx 在 8444 端口监听,/dns-query 路径反代到本机的 dnsdist(3001 端口)。nginx 负责 TLS 终结,dnsdist 负责真正的递归解析和缓存。
# nginx 关键片段
location /dns-query {
proxy_pass https://127.0.0.1:3001/dns-query;
proxy_ssl_verify off;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
最大的坑:dnsdist 不认 JSON 参数
一开始照着网上的 curl 例子用 ?name=example.com&type=A 这种 JSON 风格传参,dnsdist 直接报 Unable to find the DNS parameter。查了半天才知道 dnsdist 的 DoH 只认标准 wire format,参数必须是 ?dns= 加上 base64url 编码的 DNS 报文:
# 正确的请求方式:先 base64url 编码 DNS 报文,再走 ?dns= 传
curl -s 'https://example.com/dns-query?dns=AAABAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE' \
-H 'accept: application/dns-message'
用 Python 构造报文最省事:
import base64, struct
def build_query(domain):
qname = b''.join(bytes([len(p)]) + p.encode() for p in domain.split('.')) + b'\x00'
header = struct.pack('>HHHHHH', 0x1234, 0x0100, 1, 0, 0, 0)
return header + qname + struct.pack('>HH', 1, 1)
dns = base64.urlsafe_b64encode(build_query('example.com')).rstrip(b'=')
print(dns.decode())
验证
用 dig +https 或直接查 wire format 的 rcode,返回 0 就是正常。被污染域名改走 DoH 后能拿到正确结果,算是彻底绕开运营商劫持了。
2026-09-09 · 约 1500 字
SMART硬盘RAID
收了几块二手机械盘组 NAS,上机前先做一轮 SMART 体检,顺便想想存储模式怎么选。二手盘翻车概率高,关键字段必须看清楚。
smartctl 必看字段
sudo smartctl -a /dev/sda
重点看三个属性:Reallocated_Sector_Ct(重映射扇区数,非零就要警惕)、Current_Pending_Sector(待定扇区,说明有读不稳的坏块)、Offline_Uncorrectable(离线不可修正)。只要 Current_Pending_Sector 不为零,这块盘就只配做冷备份,别放进常读写的池里。
RAID0 还是单盘 + 缓存
纯粹家用备份 + 影音场景,RAID0 的风险收益比很差:两块盘任何一块挂,数据全丢,而性能提升对千兆内网和机械盘来说毫无意义。我的选择是单盘直通 + dm-cache 读加速,重要数据再单独冷备一份。真要冗余就上 RAID1,别碰 RAID0 给自己找不痛快。
教训:重要数据盘要听劝。折腾可以当小白鼠,但存孩子照片和视频的那块盘,别热插拔、别改 EEPROM。
2026-08-28 · 约 1700 字
OpenWrtOpenClashDNS
家里路由器上跑 OpenClash,突然某天国外域名全部解析失败。排查半天,最后定位到 fallback 的 DoH 链路上。记录一下完整排障路径。
现象
国内网站正常,国外域名全部 SERVFAIL。第一反应是节点挂了,但换节点也没用,说明问题在 DNS 层。
排查
# 在路由器上直接查 clash DNS
nslookup example.com 127.0.0.1
# 看 rcode:0=正常,2=SERVFAIL
OpenClash 的 redir-host 模式下,nameserver 先答(这里配的 114),只有被污染的域名才走 fallback(自建 DoH)。国外域名全部 SERVFAIL,说明 fallback 那条 DoH 链路断了。
顺着往上查,发现是 DoH 反代的 location /dns-query 配置在重建 nginx 时丢了,导致 fallback 请求 404。补上配置、reload 之后恢复。
经验
clash 的 DNS 正常不代表 DoH 链路正常。redir-host 模式下 nameserver 先答,fallback 只有在被污染时才触发,所以 DoH 挂了平时根本感觉不到,只有国外域名解析时才暴露。这种"平时正常、特定场景才炸"的故障最坑人。
2026-08-12 · 约 1200 字
Samba电视盒子家庭
给孩子在电视上看动画片,资源放 NAS 上,盒子通过 Samba 直接播放。方案很简单,但有几个小坑值得记。
Samba 共享配置
[video]
path = /data/samba/video
browseable = yes
read only = yes
guest ok = no
动画资源按系列分目录放好,命名统一成 S01E01 这种格式,盒子的播放器能自动识别排序。
盒子上怎么播
盒子装个支持 SMB 协议的播放器,直接添加网络位置指向 NAS 的 /data/samba/video,就能浏览目录播放。软解 1080p 动画没压力,但高码率视频要确认播放器开了硬解,否则会卡。
整体体验就是:资源在 NAS 统一管理,盒子当纯播放终端,家长手机也能直接访问同一份目录。比 U 盘拷来拷去省心多了。