0、前言
系统选用:Ubbuntu
推荐使用海外云服务器竞价实例编译,cpu核心越多越好,节约时间,节约生命,价格也不贵
如果本地磁盘空间够用又不怕编译的慢也可以使用wsl或虚拟机,毕竟每次编译都要重新执行一次本文操作挺麻烦的;或者吧源码打包成7z后下下来也行,下一次再上传到服务器上
以下全程操作都不应在root账户下进行
1、依赖安装
[OpenWrt Wiki] Build system setup
sudo apt update
sudo apt install build-essential gawk gcc-multilib flex git gettext libncurses5-dev libssl-dev python3-distutils rsync unzip zlib1g-dev clang
旧版本使用
sudo apt update
sudo apt install build-essential ccache ecj fastjar file g++ gawk
gettext git java-propose-classpath libelf-dev libncurses5-dev
libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget
python-distutils-extra python3-setuptools python3-dev rsync subversion
swig time xsltproc zlib1g-dev
[OpenWrt Wiki] Build system usage
2、代码拉取
同步代码 ,源码大小约220Mb
git clone https://git.openwrt.org/openwrt/openwrt.git
# 海外主机用git clone https://github.com/openwrt/openwrt.git会快很多
git pull
选择分支
git branch -a
git tag
git checkout v21.03.2 # 选择最新的即可
这里如果不选择分支则会使用主干代码编译,而openwrt内核不能热更新,主干代码更新频繁,并不稳定
更新feeds
./scripts/feeds update -a
./scripts/feeds install -a
编辑feeds.conf.default中的feeds地址,将原先的地址改为
src-git-full packages https://github.com/openwrt/packages.git^72abf7e9f4cd6bbb9098ded9e9a0fe28e515d47f
src-git-full luci https://github.com/openwrt/luci.git^69231a7d62a3b809fc5972071e691fb02730a10e
src-git-full routing https://github.com/openwrt/routing.git^1ccc4e435175e6ba5ac60e626e1e95eb25c5757b
src-git-full telephony https://github.com/openwrt/telephony.git^1d2031a5c82816483c51bca15649e2957fbe2bc2
会快很多
添加常用插件
这里有两种方式添加插件,第一种是在feeds.conf.default文件中添加形如src-git helloworld https://github.com/fw876/helloworld 的源,但是这里建议使用下一种,因为有时会出现意想不到的问题,且编译好后这个源会被添加进opkg的默认源中
即在源码目录的package下直接克隆源码,如
cd package/
git clone https://github.com/vernesong/OpenClash.git # 源码很大很大,不是很理解
git clone https://github.com/lisaac/luci-app-diskman.git # 磁盘管理
git clone https://github.com/jerrykuku/luci-theme-argon.git # 主题
git clone https://github.com/davinyue/luci-theme-edge.git # 还是主题
git clone https://github.com/rufengsuixing/luci-app-adguardhome.git # 去广告
git clone https://github.com/cokebar/openwrt-vlmcsd.git # kms服务器
git clone https://github.com/cokebar/luci-app-vlmcsd.git # kms服务器的luci
git clone https://github.com/sirpdboy/luci-app-netdata.git # netdata监控(项目中汉化版本的netdata支持持x86)
git clone https://github.com/sirpdboy/luci-app-advanced.git # 一些插件的高级设置(直接编辑cfg)和文件管理
# 我用到的暂时就这么多,其他的后面可以再装,大多数插件都不受内核版本影响
3、编辑配置
make menuconfig # 有一个tui界面用于选择配置
根据硬件选择平台,修改一下ram大小和磁盘分区大小,磁盘分区大小不宜修改过大,因为会导致镜像过大,烧写时间过长,可以刷写后再扩容
进入Base System,取消勾选dnsmasq,改为dnsmasq-full(openclash的依赖)
其余勾选上需要的就行(尤其是需要的内核模块需要在这时勾选,自编译的固件内核版本与官方的不同,无法自行添加内核模块),如docker、dockerd、luci-app-dockerman、ntfs-3g(如果需要挂机械盘做网盘的话)、kmod-fs-antfs、antfs-mount(同样是ntfs驱动)、kmod-fs-ext4、kmod-fs-ntfs(装了ntfs-3g就可以不装这个,因为这个只支持ntfs读)、kmod-fs-exfat、luci、luci-base(这个主要是不装就没有图形界面,需要刷进去后再装)、kmod-nls-utf8、kmod-usb-ohci、kmod-usb-storage、kmod-usb-storage-extras、kmod-usb-uhci、kmod-usb2(usb2支持)、kmod-usb3(usb3支持)
除此之外记得选上上面git clone进package里面的第三方插件,否则默认编译
其在menuconfig中的位置可以在makefile中的define Package/PKG_NAME板块中看到
这里建议把可能用到的包都设定为M选项并保存下来,尤其是内核依赖模块,以便后续需要的时候手动安装。官方源会由于自编译固件的内核版本不符合要求而不可用。但是选中的模块越多,编译不通过的概率就越大
4、修改默认ip
默认ip为192.168.1.1,会和光猫ip冲突,修改为192.168.2.1
vim package/base-files/files/bin/config_generate
找到 lan) ipad=${ipaddr:-192.168.1.1} ;; 一行,改为 lan) ipad=${ipaddr:-192.168.2.1} ;;
5、编译
下载依赖源码(可能比较久)
make download 使用-j指定线程数可以提速
编译(官方建议使用编译的进程数为你的CPU个数 + 1)
make V=s -j $(($(nproc)+1))
编译完成后输出路径:bin/targets
如果编译过程中出现随机错误(每次不相同的错误,则建议不使用多线程编译)
需要需要单独编译某个包,可以执行 make package/[包名]/compile V=99 。编完后在bin/packages下会找到对应的ipk文件。
编译后包含生成物总空间占用约70G
1、如果编译好的镜像luci拒绝连接,连ssh装个luci和luci-base就好,编译固件默认没有web ui(如果编译的时候没有选上的话)
2、配置的时候,选择的东西越少,编译的速度就越快,出错的概率就越小
3、由于自编译的固件内核版本和官方不一致,所以需要内核依赖的包均不能通过官方库安装,需要自行编译
4、如果是二次编译,需要根据改动的幅度执行不同程度的清理操作,以免对编译的结果造成影响
5、编译成功后,可以把config文件保存下来(即镜像目录内的info文件),便于下次编译
6、附录
6.1、几种clean的区别
make clean: 清除bin目录
clean: FORCE
rm -rf $(BUILD_DIR) $(STAGING_DIR) $(BIN_DIR) $(OUTPUT_DIR)/packages/$(ARCH_PACKAGES) $(BUILD_LOG_DIR)
make dirclean: make clean+清除交叉编译工具及工具链目录
dirclean:clean
rm -rf $(STAGING_DIR_HOST) $(STAGING_DIR_HOSTPKG) $(TOOLCHAIN_DIR) $(BUILD_DIR_BASE)/host $(BUILD_DIR_BASE)/hostpkg $(BUILD_DIR_TOOLCHAIN)
rm -rf $(TMP_DIR)
make distclean: 清除所有相关的东西,包括下载的软件包,配置文件,feed内容等
6.2、smb共享的相关设置
以ksmbd为例:
需要安装luci-app-ksmbd(需要安装内核模块)
ksmbd.adduser -a test # 添加名为test的smb用户(需要输入密码)
/etc/inid.d/ksmbd restart # 重启ksmbd服务
# 然后luci中设置刚添加的用户即可



