背景/为什么
为什么要自己从源码编译一个操作系统?为了学习!为了兴趣!为了好玩!……
之前使用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)。
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在等着你!!!
准备源码
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/
,我们要的东西就在这
进阶
配置文件管理
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。但是我们不能在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'
|
定制Target - x86/64
定制Image - ext4
- 每种虚拟机文件都打包一个
- 分区大小调整
- /var不再链接到/tmp
==> 注意: 这里生成的vmdk不能用于ESXi,vmkfstools转换会报错,可使用StarWind V2V将img转换成vmdk。
- 使用单独downloads目录
- 使用单独logs目录
定制系统 - 需要定制的地方比较多
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
|
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清除掉。
参考
- Developer guide: https://openwrt.org/docs/guide-developer/start
- OpenWrt编译 – 说明:https://oldwiki.archive.openwrt.org/zh-cn/doc/howto/build
2023-05-22
我在寻找一个Argon的替代品,实话说,我不知道能不能找到。用过的几个主题,都不太像专业人员做的,或者说太专业了。
作为一个路由器,我们关心什么,不关心什么?这些主题完全没有Get到重点。从这个方面来讲,OpenWrt和10年前的Linux是一样的。
作为一个路由器,状态监控是重中之重,但OpenWrt的状态监控就像小孩子过家家一样,连看个连接网络实时流量都要安装第三方软件。
作为一个路由器,应该有主次之分,上网与路由相关应该是重点,其他是辅助。这方面OpenWrt好像完全没考虑,一团乱麻。