OpenWRT 从零到壹

构建属于自己的OpenWRT/x86系统

背景/为什么

为什么要自己从源码编译一个操作系统?为了学习!为了兴趣!为了好玩!……

之前使用OpenWRT在ESXi虚拟机上构建了两个路由器,非常顺利,OpenWRT的设计与功能确实让人惊叹。特别是其中的uci和luci,非常让人着迷。在使用了这么久的Linux之后,终于看到一个能够统一各种配置文件格式的软件/OS出现了。所有软件的配置文件均使用相同格式、相同的路径,同类软件共用一个配置文件,使得用户不需要到处找软件配置文件,也不需要为编辑或解析配置文件分心。

既然OpenWRT这么好,那为什么要定制呢?OpenWRT是一个主要为嵌入式设备准备的操作系统,是一个开源的路由器操作系统,所以他在设计和编译时优先考虑的是目标文件大小问题,比如使用busybox代替了大部分工具,没有man文档等。但我们使用的是虚拟机,存储空间自然不是问题,没必要为了那几百M的空间纠结,所以我们希望把一些常见的GNU软件默认编译进系统,做到零配置部署。

从源码开始

安装依赖

我们使用Ubuntu 22.04编译OpenWRT,所以这里就以Debian/Ubuntu为例,其他系统可参考官方文档

由于OpenWRT需要构建一个完整的编译系统,所以安装的依赖比较多。不在乎这点空间,全装上吧!

1
2
3
sudo apt install build-essential clang flex bison g++ gawk gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev python3-distutils rsync unzip zlib1g-dev file wget genisoimage qemu-utils

sudo apt install libboost-dev libxml-parser-perl libusb-dev bin86 bcc sharutils gcc-multilib openjdk-8-jdk-headless b43-fwcutter zip

下载源码

OpenWRT的源码在github上,下载网速比较慢,有困难的兄弟可以从我的网盘下载压缩包,feeds也已经更新并一起打包,另外还有编译时所需要的软件包(downloads.tar.bz2)。

  • 使用某个tag进行编译
1
2
3
git clone https://github.com/openwrt/openwrt.git
cd openwrt 
git co v22.03.4 
  • 直接获取某个分支源码(推荐,不会把整个仓库历史拉下来)
1
git clone --depth 1 -b openwrt-22.03 https://github.com/openwrt/openwrt.git openwrt-22.03

==> 不要使用master分支,因为你不知道里面有什么BUG在等着你!!!

准备源码

  • 更新feeds
1
2
./scripts/feeds update -a
./scripts/feeds install -a  # install个鬼?到底install了个什么?
  • 准备配置文件
1
make defconfig && make menuconfig

或者我们也可以直接从某个官方发布的版本获取配置文件。

1
wget https://downloads.openwrt.org/releases/22.03.4/targets/x86/64/config.buildinfo -O .config

==> 警告:不要直接使用该配置文件,除非你想自己发布完整的OpenWRT,包括packages仓库。

编译源码

OpenWRT的编译系统有点小问题,多线程编译容易出问题,特别是在定制软件包的时候,似乎是软件之间的依赖关系没写好,导致某些软件编译出错。

1
2
3
4
5
6
# 单线程编译
make -j1 defconfig clean world

# 多线程编译
# 多线程编译之前一定要提前下载所有软件包
make -j$(nproc) defconfig download clean world

==> 进入bin/targets/x86/64/,我们要的东西就在这

进阶

配置文件管理

  • 使用diff配置文件(方便知道哪里做的修改)
1
2
3
4
5
6
7
8
9
# 生成diff配置
./scripts/diffconfig.sh > iOpenWRT.config 

# 直接使用diff配置
cp iOpenWRT.config .config
# OR 覆盖现有设置
cat iOpenWRT.config >> .config 

make defconfig

分段式编译

为什么要分离整个编译过程?

通过make -j1 world你可以看到整个编译顺序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#1 - 预先下载所有软件包,让多线程编译可以顺利进行
make defconfig && make -j$(nproc) download

#2 - toolchain - 这里多线程Ok
make -j$(nproc) tools/install toolchain/install

#3 - target/linux
make -j$(nproc) target/compile

#4 - 单独编译某个包
make package/xxx/compile
make package/index

## - 解决button-hotplug编译失败 - 尽量避免使用单线程,实在是太慢了
make -j$(nproc) buildinfo package/compile # 会失败
make -j1 V=sc package/kernel/button-hotplug/compile

定制 - 前奏

添加feeds

  • passwall - 干什么用的就不用我说了 – deprecated
1
2
3
4
5
6
echo "src-git passwall https://github.com/xiaorouji/openwrt-passwall.git;packages" >> feeds.conf.default
echo "src-git passwall_luci https://github.com/xiaorouji/openwrt-passwall.git;luci" >> feeds.conf.default
# ==> src-git 后面的名称不能含有‘-’。指定tag或commit: ^commit 指定分支: ;branch 

./scripts/feeds update -a
./scripts/feeds install luci-app-passwall

== update 2023-05-22, 多方面原因导致passwall不是很好用(对比N2N),放弃了

添加软件包

  • luci-theme-argon - 一个非常好用的主题,替代默认主题
1
2
3
4
5
6
cd package
git clone https://github.com/jerrykuku/luci-theme-argon.git feeds/luci/themes/luci-theme-argon
cd -

make menuconfig
# LUCI - Theme - Luci-theme-argon

覆盖系统文件

  • 禁用ipv6

其实ipv6对普通人来说没什么用,而且那一大串数字让人看着都心烦,所以我们禁用ipv6。但是我们不能在menuconfig中禁用ipv6,否则将导致编译错误,且让我们的版本与官方的更新源不兼容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
mkdir -p files/etc/
cp package/base-files/files/etc/sysctl.conf files/etc/
vim files/etc/sysctl.conf

# 往文件中添加以下行
# ip forward
net.ipv4.ip_forward = 1
# TFO: tcp fast open
net.ipv4.tcp_fastopen = 3
# disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
  • 默认设置

默认语言:简体中文,相应的设置时区、NTP、opkg源等

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
mkdir -p files/etc/config
vim files/etc/config/system

# add lines into file
config system
	option zonename 'Asia/Shanghai'
	option timezone 'CST-8'
	option hostname 'iOpenWRT'
	option description 'iOpenWRT x86-64'
	option log_size '8192'
	option log_file '/tmp/log/system.log'

config timeserver 'ntp'
	option enable_server '1'
	list server 'ntp.aliyun.com'
	list server 'ntp1.aliyun.com'
	list server 'ntp2.aliyun.com'

定制 - menuconfig

定制Target - x86/64

CleanShot 2023-05-05 at 17.58.13@2x

定制Image - ext4

  • 每种虚拟机文件都打包一个
  • 分区大小调整
  • /var不再链接到/tmp

CleanShot 2023-05-05 at 17.59.30@2x ==> 注意: 这里生成的vmdk不能用于ESXi,vmkfstools转换会报错,可使用StarWind V2V将img转换成vmdk。

  • 使用单独downloads目录
  • 使用单独logs目录

2023-05-05 at 18.00.21@2x

定制系统 - 需要定制的地方比较多

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
- Base system
    - dnsmasq-full 
    - wireless-tools
    
- Administration
    - htop
    - syslog-ng # 与logd冲突,找不到在哪
    
- Firmware 
    - amd64-microcode
    - r8152-firmware
    - rtl8xxx-firmware

- Fonts - DejaVu # 等宽字体,TODO:设置为默认
    - dejavu-fonts-ttf-DejaVuSansMono

- Languages
    - perl
    - Python - python3

- LUCI 
    - Collections - luci-ssl-openssl
    - Modules - luci-compat
    - Applications
        - luci-app-passwall
        - luci-app-samba4
        - luci-app-uhttpd
        - luci-app-wol
    - Themes - luci-theme-argon

- Network
    - File Transfer
        - aira2
        - rsync 
        - wget-ssl
    - Firewall 
        - iptables-nft
    - IP Addresses and Names
        - bind-tools
        - mdns-utils & mdnsd
    - Routing and Redirection
        - ip-full
    - SSH 
        - openssh-client
        - openssh-client-utils
        - openssh-server
        - openssh-sftp-client
        - openssh-sftp-server
    - VPN 
        - openvpn-openssl
    - Version Control Systems
        - git-http
    - WirelessAPD 
        - wpad-openssl
    - bwping
    - httping
    - iperf & iperf3
    - iputils-ping
    - net-tools-route 
    - open-iscsi
    - samba4-client & samba4-server
    - tcpdump
    - tcping
    - vnstat2

- Utilities
    - Disc
        - fdisk
        - hdparm
        - lvm2
        - mdadm
        - parted
    - Editors
        - vim-fuller
        - vim-help
        - vim-runtime
    - Filesystem
        - btrfs-progs
        - dosfstools
        - e2fsprogs
        - exfat-fsck & exfat-mkfs 
        - nfs-utils
        - ntfs-3g-utils
    - Shells 
        - bash
        - zsh
    - Terminal - screen
    - bc/coreutils/dmesg/file/findutils/gawk/getopt/grep/less/sed/tar ## GNU tools
    - logger
    - open-vm-tools
    - pciutils
    - procps-ng
    - smartd & smartmontools
    - usbutils 
    - whereis
    - which 
    - whois
    - xxd

- Xorg - Font-Utils - fontconfig

定制内核

OpenWRT的内核配置文件分成了两部分:x86通用配置 + x64专用配置

==> 警告:you won’t be able to install kernel packages from the official repositories

1
2
3
4
# x86通用配置: target/linux/x86/config-5.10
make kernel_menuconfig CONFIG_TARGET=target
# x64专用配置: target/linux/x86/64/config-5.10
make kernel_menuconfig CONFIG_TARGET=subtarget
  • 直接从官方Release获取内核配置文件
1
2
3
wget https://downloads.openwrt.org/releases/22.03.4/targets/x86/64/openwrt-imagebuilder-22.03.4-x86-64.Linux-x86_64.tar.xz
tar -xvf openwrt-imagebuilder-22.03.4-x86-64.Linux-x86_64.tar.xz
cp openwrt-imagebuilder-22.03.4-x86-64.Linux-x86_64/build_dir/target-x86_64_musl/linux-x86_64/linux-5.10.176/.config target/linux/x86/64/config-5.10 

内核我们就暂不动它,待日后再说。

清理

1
2
3
4
5
6
7
8
# 仅清理编译结果(bin目录)
make clean

# 清理所有编译文件(除了.config、dl文件夹和feeds以外都清理)
make dirclean

# 清理所有编译文件以及相关依赖(完全清理干净,一键回到刚git clone下来的时候)
make distclean

结束语

开源软件确实是个宝,只要你遵守相关开源软件协议,你可以随意使用。

最后,百度网盘链接:

链接: https://pan.baidu.com/s/1xsuUZEtynFWSiF8wgi9tLw?pwd=2cqd 提取码: 2cqd

内容包括:

  • OpenWrt 22.03 分支源码及feeds
  • 系统配置文件
  • 编译所需的软件包
  • 已经编译好的目标文件

==> 警告:如果你使用我打包的源码,一定不要执行make distclean,否则会将下载好的feeds清除掉。

参考

  1. Developer guide: https://openwrt.org/docs/guide-developer/start
  2. OpenWrt编译 – 说明:https://oldwiki.archive.openwrt.org/zh-cn/doc/howto/build

2023-05-22

我在寻找一个Argon的替代品,实话说,我不知道能不能找到。用过的几个主题,都不太像专业人员做的,或者说太专业了。

作为一个路由器,我们关心什么,不关心什么?这些主题完全没有Get到重点。从这个方面来讲,OpenWrt和10年前的Linux是一样的。

作为一个路由器,状态监控是重中之重,但OpenWrt的状态监控就像小孩子过家家一样,连看个连接网络实时流量都要安装第三方软件。

作为一个路由器,应该有主次之分,上网与路由相关应该是重点,其他是辅助。这方面OpenWrt好像完全没考虑,一团乱麻。


小酌怡情
Built with Hugo
主题 StackJimmy 设计
访问量 -    访客数 - 人次