menu

编译

  1. 下载源码:

     git clone https://github.com/douo/openwrt
     cd openwrt
    
  2. 更新 feeds

     ./scripts/feeds update -a
     ./scripts/feeds install -a
    
  3. 自定义编译选选项,这里会生成 .config

     make menuconfig
    

本地编译(Arch Linux)

  1. 下载

     make download -j8 # 8 线程下载
    
  2. 编译

    第一次单线程编译同时开启 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 自动编译。

启用分支:

自定义

Openwrt 折腾

源码

douo/openwrt,fork 自官方源 主要目的是记录

安装

旁路由

在 Host(本机) 上运行虚拟机,通过 Bridged Adapter 让虚拟机获得与 Host 相同局域网内的另外一个 ip,局域网内包括 Host 的其他主机可以把网关设置为虚拟机的 ip,实现虚拟机转发流量。

虚拟机用的是 VisualBox

  1. VirtualBox Tools -> Networks 设置Host-only Adapter 为 vboxnet0、192.168.56.1/24

  2. 镜像转换成 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
  1. 建立两个网口:
    • eth0, Host-Only. 作为 mng(管理)接口,用于 Host 管理 openwrt 虚拟机(可选)
    • eth1, Bridged Adapter, Promiscuous mode 选择:Allow All 作为 lan 接口。
  2. 创建 Linux 2.6/3.x/4.x(64-bit) 虚拟机,硬盘选择转换的 vdi 文件
  3. 启动 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
    
  4. ssh 连上 root@192.168.56.2
  5. 配置 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
  1. 配置 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

  1. uci commit && /etc/init.d/network restart
  2. 注意确保接口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'
    ...
    
  3. 设置局域网内其他主机的网关为 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
keyboard_arrow_up