====== 使用 OpenWrt 23.05.3 編譯固件 ======
===== 準備工作 =====
==== 環境 ====
* 系統:Ubunti 22.03 x64系統
* 網絡:可以訪問外網
* 磁盤:大約有 30G 的空閒空間
* 內存:至少 4G 物理內存
* CPU:越快越好,影響編譯速度
==== 依賴 ====
以 root 用戶執行以下命令或者有 root 權限的用戶
sudo apt update -y
sudo apt install -y ack antlr3 aria2 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip libpython3-dev qemu-utils \
rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
==== 源碼 ====
以下命令以普通用戶執行,不要用 root
# 下載源碼(-b 指定分支/標籤、 --single-branch 僅下載單個分支/標籤、 --depth=1 只下載最新的一次提交 )
git clone -b v23.05.3 --single-branch --depth=1 https://github.com/openwrt/openwrt.git
or
git clone -b v23.05.3 --single-branch --depth=1 git://git.openwrt.org/openwrt/openwrt.git
# 進入到該目錄
cd openwrt
===== 配置 =====
==== vermagic ====
自行編譯時,會出現內核的魔法值不一樣,需要完成如下修改:
=== 獲取值 ===
- 有序列表項目打開官方對應版本的下載鏈接:https://downloads.openwrt.org/releases
- 點擊:23.05.3 -> targets -> x86 -> 64
- 下載 Supplementary Files 中的 openwrt-23.05.3-x86-64.manifest 文件
- 使用文本編輯器打開該文件,記錄下 kernel 最後面的那串字符串 \\ (以此檔為例: e496746edd89318b9810e48e36a8bd9c)
- 執行以下腳本寫入到 vermagic 文件中 \\ (openwrt 目錄下)
echo '47964456485559d992fe6f536131fc64' > vermagic
=== 修改內核配置文件 ===
- # 編輯配置文件 \\ vim include/kernel-defaults.mk
- # 找到這一行,然後注釋掉! \\ grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | $(MKHASH) md5 > $(LINUX_DIR)/.vermagic
- # 再在下一行添加如下內容 \\ cp $(TOPDIR)/vermagic $(LINUX_DIR)/.vermagic
修改完成後效果如下:
define Kernel/Configure/Default
rm -f $(LINUX_DIR)/localversion
$(LINUX_CONF_CMD) > $(LINUX_DIR)/.config.target
# copy CONFIG_KERNEL_* settings over to .config.target
awk '/^(#[[:space:]]+)?CONFIG_KERNEL/{sub("CONFIG_KERNEL_","CONFIG_");print}' $(TOPDIR)/.config >> $(LINUX_DIR)/.config.target
echo "# CONFIG_KALLSYMS_EXTRA_PASS is not set" >> $(LINUX_DIR)/.config.target
echo "# CONFIG_KALLSYMS_ALL is not set" >> $(LINUX_DIR)/.config.target
echo "CONFIG_KALLSYMS_UNCOMPRESSED=y" >> $(LINUX_DIR)/.config.target
$(SCRIPT_DIR)/package-metadata.pl kconfig $(TMP_DIR)/.packageinfo $(TOPDIR)/.config $(KERNEL_PATCHVER) > $(LINUX_DIR)/.config.override
$(SCRIPT_DIR)/kconfig.pl 'm+' '+' $(LINUX_DIR)/.config.target /dev/null $(LINUX_DIR)/.config.override > $(LINUX_DIR)/.config.set
$(call Kernel/SetNoInitramfs)
rm -rf $(KERNEL_BUILD_DIR)/modules
cmp -s $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config.prev || { \
cp $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config; \
cp $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config.prev; \
}
$(_SINGLE) [ -d $(LINUX_DIR)/user_headers ] || $(KERNEL_MAKE) $(if $(findstring uml,$(BOARD)),ARCH=$(ARCH)) INSTALL_HDR_PATH=$(LINUX_DIR)/user_headers headers_install
grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | $(MKHASH) md5 > $(LINUX_DIR)/.vermagic
cp $(TOPDIR)/vermagic $(LINUX_DIR)/.vermagic
endef
==== 時區 ====
非必要
1. # 編輯配置文件
2. vim package/base-files/files/bin/config_generate +315
3. # 修改時區為 CST-8
4. set system.@system[-1].timezone='CST-8'
5. # 再在下一行添加如下內容
6. set system.@system[-1].zonename='Asia/Shanghai'
==== 默認IP ====
非必要\\
默認管理IP為 192.168.1.1 ,可以根據自己的需求進行修改
1. # 編輯配置文件
2. vim package/base-files/files/bin/config_generate +165
3. # 修改如下內容
4. lan) ipad=${ipaddr:-"192.168.188.1"} ;;
===== 使用 screen =====
因編譯須要很久, 萬一ssh斷了不會影響編譯。建議使用 screen
screen為多重視窗管理程序。此處所謂的視窗,是指一個全屏幕的文字模式畫面。通常只有在使用telnet登入主機或是使用老式的終端機時,才有可能用到screen程序。
# install
apt-get install -y screen
語法
screen [-AmRvx -ls -wipe][-d <作業名稱>][-h <行數>][-r <作業名稱>][-s ][-S <作業名稱>]
參數說明:
-A 將所有的視窗都調整為目前終端機的大小。
-d<作業名稱> 將指定的screen作業離線。
-h<行數> 指定視窗的緩衝區行數。
-m 即使目前已在作業中的screen作業,仍強制建立新的screen作業。
-r<作業名稱> 恢復離線的screen作業。
-R 先試圖恢復離線的作業。若找不到離線的作業,即建立新的screen作業。
-s 指定建立新視窗時,所要執行的shell。
-S<作業名稱> 指定screen作業的名稱。
-v 顯示版本信息。
-x 恢復之前離線的screen作業。
-ls或--list 顯示目前所有的screen作業。
-wipe 檢查目前所有的screen作業,並刪除已經無法使用的screen作業。
screen -S openwrt -h 100000
# Expamile
screen -S {screenName}
# Re-attach
screen -r {screenShellId_or_screenShellName}
# List screen shells
screen -ls
===== 軟件包 =====
cd openwrt
// 清除 bin 目錄
make clean
// 清除 bin 目錄 + 清除交叉編譯工具及工具鏈目錄
make dirclean
// 清除所有相關的東西,包括下載的軟件包,配置文件,feed內容等
make distclean
更新 feeds 包
./scripts/feeds update -a
./scripts/feeds install -a
===== 菜單配置 =====
Defconfig\\
執行以下命令打開菜單配置
make menuconfig
Target System (x86) --->
(X) x86 guration --->
Subtarget (x86_64) --->
(X) x86_64
Target Profile (Generic x86/64) --->
(X) Generic x86/64
選定好target後再執行defconfig
這會產生標準的設定,包含檢查相依性和建置的環境等。 會檢查相依性,是否有安裝遺漏的並再執行一次。
再重新執行以下命令打開菜單配置
make defconfig
建議選項
Target System (x86) --->
(X) x86 guration --->
Subtarget (x86_64) --->
(X) x86_64
Target Profile (Generic x86/64) --->
(X) Generic x86/64
LuCI -->
Collections -->
<*> luci
Applications-->
<*> luci-app-ddns
<*> luci-app-firewall
Themes-->全選
Base system -->
<*> dnsmasq
===== 編譯 =====
# 直接編譯
make
# 帶輸出debug信息編譯
make V=99
# 帶輸出debug信息並且並行編譯。N為你想使用的cpu核數。如果不帶參數默認是1。
make -j N V=99
# 如果編譯過程中報錯了,需要使用單線程模式,確認出錯的地方,然後排查(註:有時候單線程就不報錯了)
make V=s -j1
===== 獲取成果 =====
編譯完成後,鏡像文件地址是: ./bin/targets/x86/64/
==== Image 文件說明 ====
ext4 與 squashfs 格式的區別:
* ext4 格式的 rootfs 可以擴展磁盤空間大小,而 squashfs 不能。
* squashfs 格式的 rootfs 可以使用重置功能(恢復出廠設置),而 ext4 不能。
===== 燒錄 =====
==== Linux: ====
https://w2x.me/2019/03/13/openwrt-x86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/
- insert USB
- gunzip openwrt-18.06.2-x86-64-combined-ext4.img.gz
- dd if=openwrt-18.06.2-x86-64-combined-ext4.img of=/dev/sdX
==== Windows: ====
If you are using a Windows PC, you will need a program to extract the raw disk image from the compressed archive you downloaded.\\
Then you will need to open the raw image file with a program that can write it on the drive you want to install OpenWrt on.\\
A good free and opensource archiver program you can use is 7zip.\\
A good free and opensource raw disk image writer program you can use is Win32 Disk Imager , there is also Etcher .\\
[7zip]\\
https://www.7-zip.org/
[Win32 Disk Imager]\\
https://sourceforge.net/projects/win32diskimager/
[Etcher]\\
https://www.balena.io/etcher/
==== MacOS: ====
Same as with Windows.\\
The archiver program recommended by 7zip on MacOS is Keka\\
A good free and opensource raw disk image writer program you can use is Etcher .\\
[Keka]\\
https://www.keka.io/en/
[Etcher]\\
https://www.balena.io/etcher/
==== VMWare ====
gunzip openwrt-x86-generic-combined-ext4.img.gz
qemu-img convert -f raw -O vmdk openwrt-x86-generic-combined-ext4.img openwrt-x86-generic-combined-ext4.vmdk
qemu:
yum -y install qemu-img