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
    

Github Action

接下来把 .config 提交到 github douo-19.07.4分支,便可以触发 github action 自动编译。

本地编译(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

自定义

Openwrt 折腾

源码

douo/openwrt,fork 自官方源

当前分支:douo-19.07.4

变动了:

  • 推送到 douo-19.07.4 会自动编译 ,见 openwrt/openwrt-ci.yml
  • 使用自己,另外因为 19.07.4 的 golang 版本只有 1.13,所以替换为 Lienol 的 package
  • tools 新增 upx ucl,因为 v2ray-plugin 硬编码 upx 依赖
  • .config 本地 make menuconfig 后的结果文件,提交上去是为了 github action 按这配置编译

Packages

douo/openwrt-package,方便自己折腾和写包。

安装

旁路由

在 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
    
  3. 建立两个网口:
    • eth0, Host-Only. 作为 mng(管理)接口,用于 Host 管理 openwrt 虚拟机(可选)
    • eth1, Bridged Adapter, Promiscuous mode 选择:Allow All 作为 lan 接口。
  4. 创建 Linux 2.6/3.x/4.x(64-bit) 虚拟机,硬盘选择转换的 vdi 文件
  5. 启动 openwrt,uci show network 确认 lan 分配在 eth0,把 IP 更新为虚拟机 Host-only 网络:

     uci set network.lan.ipaddr='192.168.56.2'
     uci commit
     reboot
    
  6. ssh 连上 root@192.168.56.2
  7. 配置 eth0 为管理接口

     uci batch <<EOF
     set network.mng=interface
     set network.mng.type='bridge'
     set network.mng.proto='static'
     set network.mng.netmask='255.255.255.0'
     set network.mng.ifname='eth0'
     set network.mng.ipaddr='192.168.56.2'
     delete network.wan
     delete network.wan6
     EOF
    
  8. 配置 eth1,连上 Host 局域网:

     uci batch <<EOF
     set network.lan=interface
     set network.lan.ifname='eth1'
     set network.lan.proto='static'
     set network.lan.ipaddr='192.168.1.111'
     set network.lan.netmask='255.255.255.0'
     set network.lan.gateway='192.168.1.1'
     set network.lan.dns='8.8.8.8'
     EOF
    
  9. uci commit && reboot
  10. 注意确保接口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'
    ...
    
  11. 设置局域网内其他主机的网关为 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
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-combined-ext4.img.gz root@192.168.1.1:/tmp/ # 上传镜像到路由

ssh 登陆到软路由,把 ext4 安装到 /dev/sdb3:

gunzip openwrt-x86-64-combined-ext4.img.gz
losetup -Pf openwrt-x86-64-combined-ext4.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 #把输出的菜单项追加到前面
keyboard_arrow_up