OpenWrt
记录 OpenWrt 的安装与实践经验
前言
OpenWrt 是开源的基于 Linux 的路由器系统,除官方版本,还有其他社区或个人的定制版。
推荐使用 ImmortalWrt,安装与配置均以此版本为例。
最近更新版本 OpenWrt 25.12.1
官方版
社区版
安装 OpenWrt 系统
在安装 OpenWrt 系统之前,需要准备 OpenWrt 的固件,有两种方法可以获取,一种是直接从官方或者第三方社区下载已经编译好的固件,另一种是自己下载 OpenWrt 的源码进行编译固件。
这里以 OpenWrt 的官方版为例,其他定制版的操作流程基本相同。
准备编译环境
不同 Linux 系统下的需要的编译环境不同,推荐在 Ubuntu 系统中编译,其他定制版都是推荐在该系统下编译,也可以使用 docker 容器进行编译。
注意
各个定制版的 OpenWrt 系统在相同 Linux 系统下的所需要的编译环境也是不同的,需要到相应 git 仓库阅读 README 文档。
- Ubuntu 18.04 LTS
sudo apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache gettext libssl-dev xsltproc zip- Arch Linux
pacman -S --needed asciidoc bash bc binutils bzip2 fastjar flex git gcc util-linux gawk intltool zlib make cdrkit ncurses openssl patch perl-extutils-makemaker rsync unzip wget gettext libxslt boost libusb bin86 sharutils b43-fwcutter findutils time其他 Linux 系统参考这里
编译固件
# clone源代码
git clone https://github.com/openwrt/openwrt.git
# 切换分支
git checkout openwrt-18.06
# 更新package
./scripts/feeds update -a
# 安装package
./scripts/feeds install -a
# 选择编译的硬件架构及模块
make menuconfig
# 开始编译(第一次编译推荐单线程)
make -j1 V=sNote
如果是在 VirtualBox,VMWare 虚拟机中安装,则可以勾选编译选项中的 vmdk 或 vdi 输出选项。
编译好的固件放在 bin 目录下。
开始安装
使用自己编译好的固件或者是在snapshots/targets/x86/64/处下载镜像
解压缩后,拿到 squashfs 文件格式的 img 镜像,写入到 U 盘作为启动盘即可。
写入到 tf 卡
# img镜像512字节对齐
dd if=openwrt-x86-64-combined-squashfs.img of=/dev/sdx bs=512 conv=syncimg 镜像转换为 vdi/vmdk 虚拟介质
如果是在 VirtualBox,VMWare 虚拟机中安装,则需要将 img 镜像转换为 vdi,vmdk 等虚拟介质,一般编译固件会直接输出 vmdk 或 vdi 直接使用。
通过 VirtualBox 的命令行的工具可以转换 img 镜像为 vdi 或 vmdk 虚拟介质。
# img镜像转换为vdi
VBoxManage convertfromraw --format VDI lede-x86-64-combined-squashfs.img lede-x86-64-combined-squashfs.vdi注意事项
VirtualBox 需要 img 镜像 512 字节对齐,需要先将 img 镜像进行字节对其后,再进行转换
配置 OpenWrt 系统
首次进入系统,必要的配置如下
修改 lan 口 IP
OpenWrt 的 lan 口默认地址为 192.168.1.1,需要根据实际情况修改该默认 IP
编辑 /etc/config/network
修改高亮处的 IP 地址即可
config interface 'lan'
option device 'br-lan'
option proto 'static'
option ipaddr '192.168.1.1' // [!code highlight]
option netmask '255.255.255.0'
option ip6assign '60'也可以通过 web 后台管理界面直接修改 lan 口 IP
扩容
默认 openwrt 镜像分配的初始空间较少,此时需要扩容。
ext4 固件扩容十分容易,直接使用分区软件进行操作即可。而 squashfs 固件扩容操作较为复杂,一般主要有两种方案。
overlay 分区扩容
该方法同时也适用于以下固件
- x86 架构的
ext4固件 - ARM 架构的
ext4固件
假设要扩容的存储设备是 /dev/sda
通常会包含以下两个分区
/dev/sda1GRUB 和内核所在分区/dev/sda2root 文件系统所在分区 (通常有两种类型的分区 squashfs 和 ext4)
- 扩展 root 分区
使用 parted 分区工具对 /dev/sda 进行扩容
# Install packages
apk update
apk add parted
# Identify disk name and partition number
parted -l -s
# Expand root partition
parted -f -s /dev/sda resizepart 2 100%
# Apply changes
reboot# Install packages
opkg update
opkg install parted
# Identify disk name and partition number
parted -l -s
# Expand root partition
parted -f -s /dev/sda resizepart 2 100%
# Apply changes
reboot- 扩展 root 文件系统
使用 losetup 映射 /dev/loop0 到 /dev/sda2 并用 resize2fs 扩展 /dev/loop0
# Install packages
apk update
apk add losetup resize2fs
# Map loop device to root partition
losetup /dev/loop0 /dev/sda2 2> /dev/null
# Expand root filesystem
resize2fs -f /dev/loop0
# Apply changes
reboot# Install packages
opkg update
opkg install losetup resize2fs
# Map loop device to root partition
losetup /dev/loop0 /dev/sda2 2> /dev/null
# Expand root filesystem
resize2fs -f /dev/loop0
# Apply changes
reboot针对 f2fs 文件系统的 overlay 分区
如果是 ARM 架构的 squashfs 固件,则需要用另外的办法扩容,因其使用 f2fs 文件系统的分区,之前的 resize2fs 命令不适用这类分区。
这里感谢 Sm00shed 大神提供的解决方案和脚本。
#!/bin/sh
echo "=== Installing required packages ==="
apk update
apk add losetup f2fs-tools
echo -e "\n=== Current status ==="
df -h | grep -E '(overlay|Filesystem)'
mount | grep overlay
echo -e "\n=== Getting loop device info ==="
LOOP="$(losetup -n -O NAME | sort | sed -n -e "1p")"
echo "Current LOOP: $LOOP"
ROOT="$(losetup -n -O BACK-FILE ${LOOP} | sed -e "s|^|/dev|")"
echo "ROOT device: $ROOT"
OFFS="$(losetup -n -O OFFSET ${LOOP})"
echo "Offset: $OFFS"
echo -e "\n=== Creating new loop device ==="
NEW_LOOP="$(losetup -f)"
echo "New LOOP: $NEW_LOOP"
losetup -o ${OFFS} ${NEW_LOOP} ${ROOT}
echo -e "\n=== Filesystem check ==="
fsck.f2fs -f ${NEW_LOOP}
echo -e "\n=== Mount/Unmount trick ==="
mount ${NEW_LOOP} /mnt && echo "Mount: OK" || echo "Mount: FAILED"
umount ${NEW_LOOP} && echo "Unmount: OK" || echo "Unmount: FAILED"
echo -e "\n=== Resizing f2fs ==="
resize.f2fs ${NEW_LOOP}
echo -e "\n=== Done - rebooting ==="
rebootextroot 扩容方案
这个方案主要流程如下
- 新建分区格式化为 ext4 分区
- 将原有 overlay 分区数据复制到新分区
- 挂载新的 overlay 分区
除此之外,也可以将 overlay 分区挂载到U盘等外部存储。
- 新建分区格式化为 ext4 分区
fdisk /dev/mmcblk0 # 对当前分区进行操作
n # 新建分区
...
mkfs.ext4 /dev/mmcblk0p3- 将原有 overlay 分区数据复制到新分区
# 挂载新分区到临时目录
mkdir -p /mnt/mmcblk0p3
mount /dev/mmcblk0p3 /mnt/mmcblk0p3
# 将当前的 /overlay 内容全量复制到新分区
tar -C /overlay -cvf - . | tar -C /mnt/mmcblk0p3 -xf -
# 取消挂载
umount /mnt/mmcblk0p3- 挂载新的 overlay 分区
# 自动生成或配置挂载点
block detect > /etc/config/fstab编辑 /etc/config/fstab 找到新分区修改如下
config mount
option target '/overlay'
option uuid '新分区UUID'
option enabled '1'重启即可生效
自定义域名映射
dnsmasq 可以自定义域名映射,但需要设置 DNS 重定向

例如将 example.local 及其子域名的 IP 地址指定为 192.168.1.2
/example.local/192.168.1.2关闭 IPv6
TIP
如果没有 IPv6 公网地址,最好直接关闭 IPv6
- 删除 wan6 接口

- 接口 lan -> DHCP 服务 -> IPv6 服务
RA 服务 DHCPv6 服务 NDP 代理 设置已禁用

- 勾选
过滤IPv6 AAAA记录

保存所有操作,重启生效。
配置 IPv6
等待实践...
安装必要包
openssh-sftp-server用 sftp 上传文件
其他
使用新版包管理 APK 安装第三方包
WARNING
从 openwrt 25.10 版本起,官方正式将包管理从 opkg 全部迁移到 apk
直接在Luci界面上通过上传是无法安装的,会报错,显示不可信任的签名
ERROR: /tmp/upload.apk: UNTRUSTED signature此时只能使用命令加自定义参数才能安装
apk add xxx.apk --allow-untrusted