banner
约 1,500 字
5 分钟

OpenWrt 挂 U 盘装 AdGuard Home

摘要

本文记录了将 AdGuard Home 从树莓派迁移至 OpenWrt 路由器的全过程。针对路由器内置存储不足的问题,通过挂载 U 盘、格式化为 ext4、修改 opkg 配置将软件安装至 U 盘,并成功部署 AdGuard Home。配置了上游 DNS、过滤规则及 OpenWrt DNS 重定向。文中总结了端口冲突、环境变量设置及 U 盘故障风险等注意事项,最终实现了广告拦截功能。

之前一直用树莓派跑 AdGuard Home,最近想把它移到路由器上省一台设备。问题来了:路由器内置存储 8MB,AdGuard Home 装不下。此文是挂 U 盘 + 装到 U 盘 + 跑起来的完整记录

背景

为什么把 AdGuard Home 从树莓派搬到路由器:

  • 树莓派 4B 干 DNS 太浪费了,想让它专心跑别的

  • 路由器一直开着,省一台设备的电

  • 少一个故障点(树莓派 SD 卡挂过一次,怕了

第一步:挂 U 盘

准备工作:

  1. U 盘或移动硬盘先备份(操作不当会清空)

  2. 插到路由器 USB 口

  3. 登录 OpenWrt 后台

OpenWrt 默认没有"挂载点"菜单,要自己装

bash
# ssh 进去或者用 ttyd 插件
opkg update
opkg install block-mount
reboot

重启后系统菜单里就有"挂载点"了。如果 U 盘没自动识别,还要装 USB 相关驱动:

bash
# 常见驱动包
opkg install kmod-usb-core kmod-usb2 kmod-usb3
opkg install kmod-usb-storage kmod-usb-storage-extra
opkg install kmod-fs-ext4 kmod-fs-vfat kmod-fs-exfat
opkg install ntfs-3g e2fsprogs usbutils mount-utils
opkg install blkid lsblk fdisk cfdisk smartmontools

手动分区格式化

如果 U 盘之前是 Windows 用过的 NTFS,建议重新格成 ext4(性能更好,权限也好处理):

bash
# 查看设备
fdisk -l

# 分区(假设设备是 /dev/sda)
fdisk /dev/sda

# 格式化
mkfs.ext4 -m 0 -L adguard /dev/sda1

大 U 盘(256G+)加 -T largefile 优化 inode:

bash
mkfs.ext4 -m 0 -L adguard -T largefile /dev/sda1

挂载

bash
# 建挂载点
mkdir -p /mnt/usb

# 临时挂载
mount -t ext4 /dev/sda1 /mnt/usb

# 检查
df -h | grep usb

在 OpenWrt 后台 → 系统 → 挂载点 → 添加,UUID 选你的 U 盘,挂载点填 /mnt/usb,启用。重启后自动挂载

顺手搞个 swap

路由器内存小(我这台 512MB),搞个 swap 防止 OOM:

bash
# 创建 512MB swap 文件
dd if=/dev/zero of=/mnt/usb/swapfile bs=1M count=512
mkswap /mnt/usb/swapfile
swapon /mnt/usb/swapfile

# 后台 → 挂载点 → 交换分区 → 添加
# 路径: /mnt/usb/swapfile
# 启用

第二步:让 opkg 装软件到 U 盘

默认 opkg 装到路由器内置存储,空间不够。要改配置指向 U 盘

编辑 /etc/opkg.conf,加一行:

bash
dest usb /mnt/usb

改环境变量,编辑 /etc/profile

bash
export LD_LIBRARY_PATH="/mnt/usb/usr/lib:/mnt/usb/lib"
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/mnt/usb/usr/bin:/mnt/usb/usr/sbin

立即生效:

bash
source /etc/profile

以后装软件加 -d usb 就装到 U 盘上:

bash
opkg install adguardhome -d usb

第三步:装 AdGuard Home

如果路由器配置还行(CPU 1GHz+ / RAM 512MB+),可以直接在后台搜索装:

  • 系统 → 软件包 → 搜 "adguardhome" → 安装

如果空间不够(这就是我的情况),用命令行装到 U 盘:

bash
opkg install adguardhome -d usb

装完后系统 → 启动项,找到 adguardhome,点启动

浏览器访问 http://<路由器IP>:3000,进初始化页面。配置:

  • 网页管理界面端口:80或者别的,避免冲突

  • DNS 服务器端口:53默认

  • 设置管理员账号密码

第四步:配 AdGuard Home

进控制台后:

上游 DNS

设置 → DNS 设置 → 上游 DNS 服务器:

bash
https://1.1.1.1/dns-query
https://8.8.8.8/dns-query
223.5.5.5:53

Bootstrap DNS:

bash
1.1.1.1
8.8.8.8
223.5.5.5

过滤规则

过滤器 → DNS 黑名单:

OpenWrt DNS 重定向

网络 → DHCP/DNS → DNS forwardings:

bash
127.0.0.1#53

注意是 # 不是 :,这是 OpenWrt 的特殊格式,填错端口号直接断网。

坑和注意

  1. 53 端口冲突:OpenWrt 自带 dnsmasq 占用 53 端口,AdGuard Home 也想用 53。要把 dnsmasq 的 DNS 服务关掉,只留 DHCP。或者改 AdGuard Home 的端口(但不推荐)。

  2. PATH 没改导致命令找不到/etc/profile 那两个环境变量必须加,不然后续所有装在 U 盘上的软件都跑不起来

  3. U 盘挂了所有服务一起挂:DNS 在 U 盘上跑,U 盘故障或接触不良全家断网。定期检查(U 盘便宜的可读写次数有限)。

  4. swap 用 swapfile 别用 swap 分区:swapfile 灵活,U 盘换电脑照样能用。swap 分区换 U 盘就麻烦。

  5. 断电后 U 盘文件系统可能坏ext4ntfs 强,但还是建议加个定时 fsck

  6. AdGuard Home 重启慢:装在 U 盘上启动比内置存储慢,大概 5-10 秒,能接受。

效果

搬过来一周,AdGuard Home 跑了几天,块率 18-22%。高峰期是视频 App 的广告 SDK 和智能家居的遥测。

Dashboard 长这样:

纯文本
Total queries: 28,341
Blocked: 5,612
Percent blocked: 19.8%
Top blocked: doubleclick.net, googlesyndication.com, umeng.com

顺手把科学上网也搞了——旁路由 + AdGuard Home 一把抓,舒服

写在最后

U 盘 + AdGuard Home 是穷人方案——不花一分钱(家里闲置 U 盘肯定有)就能上全家广告过滤。但别指望它比树莓派或 NUC 稳

如果只是想试水,先在树莓派或 docker 上跑 AdGuard Home;真要上路由器,买个靠谱的 U 盘(带掉电保护那种企业级的,二手几十块)。

END