编译
-
下载源码:
git clone https://github.com/douo/openwrt cd openwrt
-
更新 feeds
./scripts/feeds update -a ./scripts/feeds install -a
-
自定义编译选选项,这里会生成
.config
make menuconfig
本地编译(Arch Linux)
-
下载
make download -j8 # 8 线程下载
-
编译
第一次单线程编译同时开启 Verbose,方便排错。
make -j1 V=s
一次成功以后,可以直接多线程编译
make -j$(nproc)
最终生成文件在
bin
├── packages # 生成的 ipk 文件
└── targets # 镜像
比如 bin/targets/x86/64/openwrt-x86-64-combined-ext4.img.gz
Github Action
把 .config
提交到 github 特定分支,便可以触发 github action 自动编译。
启用分支:
自定义
源码
douo/openwrt,fork 自官方源 主要目的是记录
- douo-22.03
- 当前分支
- 使用自己的 package
- douo-19.07.4
- 推送到 douo-19.07.4 会自动编译 ,见 openwrt/openwrt-ci.yml
- 使用自己的 package
- tools 新增 upx ucl,因为 v2ray-plugin 硬编码 upx 依赖
.config
本地make menuconfig
后的结果文件,提交上去是为了 github action 按这配置编译
安装
旁路由
在 Host(本机) 上运行虚拟机,通过 Bridged Adapter 让虚拟机获得与 Host 相同局域网内的另外一个 ip,局域网内包括 Host 的其他主机可以把网关设置为虚拟机的 ip,实现虚拟机转发流量。
虚拟机用的是 VisualBox:
-
VirtualBox Tools -> Networks 设置Host-only Adapter 为 vboxnet0、192.168.56.1/24
-
镜像转换成 vdi 文件
gzip -d openwrt-x86-64-combined-ext4.img.gz
VBoxManage convertfromraw --format VDI openwrt-x86-64-combined-ext4.img openwrt-x86-64-combined-ext4.vdi
- 建立两个网口:
- eth0, Host-Only. 作为 mng(管理)接口,用于 Host 管理 openwrt 虚拟机(可选)
- eth1, Bridged Adapter, Promiscuous mode 选择:
Allow All
作为 lan 接口。
- 创建 Linux 2.6/3.x/4.x(64-bit) 虚拟机,硬盘选择转换的 vdi 文件
-
启动 openwrt,
uci show network
确认 lan 分配在eth0
,把 IP 更新为虚拟机 Host-only 网络:uci set network.lan.ipaddr='192.168.56.2' uci commit /etc/init.d/network restart
- ssh 连上
root@192.168.56.2
- 配置 eth0 为管理接口
uci batch <<EOF
del network.lan
del network.wan
del network.wan6
set network.mng=interface
set network.mng.proto='static'
set network.mng.ipaddr='192.168.56.2'
set network.mng.netmask='255.255.255.0'
set network.mng.device='eth0'
EOF
- 配置 eth1,连上 Host 局域网:
uci batch <<EOF
set network.lan='interface'
set network.lan.proto='static'
set network.lan.ipaddr='192.168.50.221'
set network.lan.netmask='255.255.255.0'
set network.lan.gateway='192.168.50.1'
set network.lan.device='eth1'
add_list network.lan.dns='8.8.8.8'
EOF
8.1 删除 bridge
- 21.02 ‘uci del network.device’
- 22.03 变成 devices 需要 uci -X show network
,找到编号再删除 uci del network.cfg030f15
uci commit && /etc/init.d/network restart
-
注意确保接口
lan
的防火墙允许 input/output/forward,uci show firewall
:... firewall.@zone[0]=zone firewall.@zone[0].name='lan' firewall.@zone[0].network='lan' firewall.@zone[0].input='ACCEPT' firewall.@zone[0].output='ACCEPT' firewall.@zone[0].forward='ACCEPT' ...
- 设置局域网内其他主机的网关为 192.168.1.111(openwrt eth1 地址),也可以在主路由的 dhcp 服务设置网关为 192.168.1.111
主路由
小马 v1 :
T | V |
---|---|
CPU | Intel(R) Pentium(R) CPU N3700 @ 1.60GHz |
Memory | 4g |
Disk | 8g |
Network | 四网口千兆 |
我的方案是双 openwrt 系统,一个常驻的 squashfs openwrt 作为 fallback,另外在 squashfs 上安装一个 ext4 日常折腾。这个 squashfs 也可以用 esxi 代替 ,不过考虑到内存达不到 8g,日常也没啥应用,暂时不折腾 esxi/pve 等虚拟化。
安装 squashfs openwrt
全新机器第一次安装才需要这个步骤。首先需要一个引导 u 盘,我选择 archlinux 的镜像。
squashfs 系统需要:
fdisk # 分区
rsync # 同步文件
losetup # 挂载 img,注意不要安装 busybox 的版本(不支持 -P)
blkid # 工具
进入引导系统后,直接 dd
把 squashfs 的镜像写入到硬盘:
gunzip -c *.img.gz | dd of=/dev/sdx
重启进入 openwrt 系统,fdisk 为剩余空间建立一个 ext4 分区:
Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 512 33279 32768 16M 83 Linux
/dev/sdb2 33792 558079 524288 256M 83 Linux
/dev/sdb3 559104 15649199 15090096 7.2G 83 Linux
安装 ext4
确保软路由运行的是 squashfs 的系统:
scp openwrt-x86-64-generic-ext4-combined.img.gz root@192.168.1.1:/tmp/ # 上传镜像到路由
ssh 登陆到软路由,把 ext4 安装到 /dev/sdb3
:
gunzip openwrt-x86-64-generic-ext4-combined.img.gz
losetup -Pf openwrt-x86-64-generic-ext4-combined.img # 一般挂载在 loop1,lsblk 可以看到
mkdir -p /tmp/boot; mount /dev/loop1p1 /tmp/boot # 挂载 /boot
mkdir -p /tmp/root; mount /dev/loop1p2 /tmp/root # 挂载 /
mkdir -p /tmp/hboot; mount /dev/sdx1 /tmp/hboot # 挂载软路由 boot
mkdir -p /tmp/hroot; mount /dev/sdx3 /tmp/hroot # 挂载准备安装的 root
rsync -av --delete /tmp/root/ /tmp/hroot # 同步镜像根目录,不放心可以先把旧清干净 mkfs.ext4 /dev/sdx3
如果是日常折腾:
# 非第一次直接更新内核就可以
cp /tmp/boot/boot/vmlinuz /tmp/hboot/boot/ # 更新内核
如果是第一次安装 ext4 还需要先修改引导,再更新内核:
# 第一次需要修改引导
cp -r /tmp/hboot/boot /tmp/hboot/boot_bk # 第一次的话先备份下 squashfs 的引导
# 修改 grub menu
mv /tmp/hboot/boot/vmlinuz /tmp/hboot/boot/vmlinuz-squashfs # 第一次重命名 squashfs 内核
sed -i 's/"OpenWrt/"OpenWrt squashfs/' /tmp/hboot/boot/grub/grub.cfg # 第一次重命名 grub 的菜单项
cp /tmp/boot/boot/vmlinuz /tmp/hboot/boot/ # 更新内核
export partuuid=blkid | sed -n -r 's/\/dev\/sd.3.*PARTUUID="([^"]*)"/\1/gp' # 获取本机新 root 分区的 partuuid
sed -n '/menuentry/,+6{s/PARTUUID=[a-zA-Z0-9-]*/'PARTUUID="$partuuid"'/g;p}' /tmp/boot/boot/grub/grub.cfg # 输出替换 partuuid 后的 grub 菜单项
vi /tmp/hboot/boot/grub/grub.cfg #把输出的菜单项追加到前面
备份
配置目录在 /etc/config
着重备份:
/etc/config/network
/etc/config/passwall
其他:
passwall 黑白名单:
/usr/share/passwall/direct_host
/usr/share/passwall/direct_ip
/usr/share/passwall/proxy_host
/usr/share/passwall/proxy_ip
adguardhome:
- dns rewrite:
/etc/adguardhome.yaml
- dhcp static lease:
/var/adguardhome/leases.db
备份脚本:
#!/bin/sh
list=("/etc/config/network" "/etc/config/passwall" "/usr/share/passwall/rules/direct_host" "/usr/share/passwall/rules/direct_ip" "/usr/share/passwall/rules/proxy_host" "/usr/share/passwall/rules/proxy_ip" "/etc/adguardhome.yaml" "/var/adguardhome/leases.db")
server=root@192.168.1.1 # 服务器
tmp="/tmp/" # 本地保存地址
# backup
for i in "${list[@]}"; do
scp ${server}:${i} ${tmp}
done
# restore
for i in "${list[@]}"; do
scp ${tmp}`basename $i` ${server}:${i}
done