音乐播放器
Dustin Blog
 
文章 标签
9

Powered by Dustin | Theme: Fog

OpenWrt 编译固件

👏 欢迎使用OpenWrtOpenWrt 是一个高度可定制化的开源项目,它为嵌入式设备提供了一套强大的操作系统。本教程将指导你如何在自己的系统上编译 OpenWrt,让你能够为你的路由器或其他嵌入式设备创建一个定制的固件!

👇 前期准备工作

在开始编译 OpenWrt 之前,请确保你的系统满足以下要求:

  • 操作系统:Linux、BSD 或 macOS(Windows 用户可以通过 WSL2 使用 Linux 环境)
  • 处理器:至少 2 GHz 双核处理器。
  • 内存:至少 4 GB RAM
  • 硬盘空间:至少 10 GB 可用空间。
  • 依赖软件:git, gcc, binutils, bzip2, flex, python, perl, make, findutils, grep, sed, awk, diff, patch等。

对于 Ubuntu/Debian 系统,可以通过以下命令安装所需的依赖。对于其他系统,请根据你的发行版安装相应的软件包。

sudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 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 libfuse-dev libglib2.0-dev libgmp3-dev \
libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libpython3-dev libreadline-dev \
libssl-dev libtool lrzsz mkisofs msmtp ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 \
python3-pyelftools python3-setuptools qemu-utils rsync scons squashfs-tools subversion swig texinfo \
uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

注意千万不要使用 root 用户进行编译操作。

👇 下载仓库源码

  • 由于我使用并非官方 OpenWrt,本文不对下载源码进行过多描述,此部分内容仅供参考。
git clone https://github.com/coolsnowwolf/lede
cd lede
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

👇 自定义应用

  • 分享一些个人添加的常用应用。如 diff、i2c-tools、pciutils、usbutils、libstdcpp、jansson(版本需要 2.13.1)、libaio、libevent、mount、wget、fio、lsblk、lscpu、auto-factory、lsscsi、taskset、ntpdate、无线用 hostapd-utils、wireless-tools、wpa-supplicant 等。
#make menuconfig
wget
i2c-tools
#make kernel_menuconfig
CONFIG_XSPEED_CONFIG_LOCK        # 硬件锁eeprom/spi驱动
GPIO_SYSFS                                         # gpio驱动
LEDS_BRIGHTNESS_HW_CHANGED   # LED驱动
LEDS_TRIGGER_DEFAULT_ON             # LED驱动定时器触发支持
USB_SERIAL_OPTION                          # USB串口驱动
RTC_DRV_PCF8563                              # RTC驱动
WATCHDOG                                         # 看门狗
CONFIG_USB_NET_CDCETHER           # USB网卡驱动
  • 介绍一些市面上比较常见使用的插件,按需自行添加。
luci-app-firewall                             # 防火墙和端口转发,必备
luci-app-adbyby-plus                    # 广告屏蔽大师 Plus+
luci-app-sfe                                    # Turbo ACC 网络加速(开启 Fast Path 转发加速)
luci-app-unblockNeteaseMusic    # 解锁网易云
luci-app-wol                                   # 网络唤醒
luci-app-accesscontrol                  # 上网时间控制
luci-app-arpbind                            # IP/MAC 绑定
luci-app-autoreboot                      # 计划重启
luci-app-ddns                                 # 动态域名解析
luci-app-filetransfer                       # 上传 ipk 文件功能
luci-app-frpc                                   # 内网穿透 Frp
luci-app-ipsec-vpnd                       # IPSec 服务端
luci-app-nlbwmon                          # 网络带宽监视器
luci-app-ramfree                            # 释放内存
luci-app-rclone                               # rclone
luci-app-samba                              # 网络共享(samba)
luci-app-upnp                                # 通用即插即用 UPnP(端口自动转发)
luci-app-vlmcsd                             # KMS 服务器(WIN 激活工具)
luci-app-vsftpd                              # FTP 服务器
luci-app-webadmin                       # Web 管理页面设置
luci-app-xlnetacc                           # 迅雷下载
luci-app-zerotier                            # 虚拟局域网
luci-app-aria2                                # Aria2 下载
luci-app-hd-idle                            # 硬盘休眠
luci-app-mwan3                            # MWAN 负载均衡
luci-app-openvpn                         # OpenVPN 客户端
luci-app-openvpn-server              # OpenVPN 服务端
luci-app-pptp-server                    # PPTP 服务端
luci-app-sqm                                 # 流量智能队列管理(QOS)
luci-app-transmission                   # BT 下载
luci-app-usb-printer                     # USB 打印服务器
luci-app-wireguard                       # VPN 服务器 WireGuard 状态
luci-app-wrtbwmon                      # 实时流量监测

👇 设备树部分

  • 系统启动需要内核镜像和设备树文件,即 dtb 文件。设备树文件在内核中的 arch/arm64/boot/dts/ 对应平台路径下。客户可以通过 dts 文件,修改 sysfs-led 的控制,gpio-keys 控制,以太网和交换芯片 DSA 等配置。
arch/arm64/boot/dts/marvell/armada-3720-nmxx.dts                                    # Armada平台
arch/arm64/boot/dts/rockchip/rk3566-xspeed-ra01-v010-linux_cfg1.dts     # RK平台
  • 设备树关于灯的配置。
gpio-leds {
	compatible = "gpio-leds";
	led-1 {
    		label = "DB1";
			linux,default-trigger = "timer";
			gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_LOW>;
			default-state = "on";
		};
};

👇 固件定制化部分

  • 修改 boot 文件,使其开机运行自定义脚本。
vi package/base-files/files/etc/init.d/boot
######文件修改内容如下######
#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org

START=10
STOP=98

uci_apply_defaults() {
        . /lib/functions/system.sh

        cd /etc/uci-defaults || return 0
        files="$(ls)"
        [ -z "$files" ] && return 0
        mkdir -p /tmp/.uci
        for file in $files; do
                ( . "./$(basename $file)" ) && rm -f "$file"
        done
        uci commit
}

update_ate_files() {
        blkdev=$(cat /proc/cmdline |awk -F 'rootdev=' '{print$2}'|awk '{print $1}')
        if [ "${blkdev}" = "" ]
        then
                blkdev="/dev/sda1"
                echo "rootdev is null,set it is ${blkdev} !"
        else
                echo "The rootdev is ${blkdev} !"
        fi

        if [ -b "$blkdev" ];then
                mount "$blkdev" /mnt
                /mnt/ate/ateinit.sh
                umount /mnt
        fi
}

boot() {
        [ -f /proc/mounts ] || /sbin/mount_root
        [ -f /proc/jffs2_bbc ] && echo "S" > /proc/jffs2_bbc
        [ -f /proc/net/vlan/config ] && vconfig set_name_type DEV_PLUS_VID_NO_PAD

        mkdir -p /var/run
        mkdir -p /var/log
        mkdir -p /var/lock
        mkdir -p /var/state
        mkdir -p /var/tmp
        mkdir -p /tmp/.uci
        chmod 0700 /tmp/.uci
        touch /var/log/wtmp
        touch /var/log/lastlog
        touch /tmp/resolv.conf.auto
        ln -sf /tmp/resolv.conf.auto /tmp/resolv.conf
        grep -q debugfs /proc/filesystems && /bin/mount -o noatime -t debugfs debugfs /sys/kernel/debug
        [ "$FAILSAFE" = "true" ] && touch /tmp/.failsafe

        #update auto factory test files
        update_ate_files

        /sbin/kmodloader

        [ ! -f /etc/config/wireless ] && {
                # compat for brcm47xx and mvebu
                sleep 1
        }

        /bin/config_generate
        uci_apply_defaults

        # temporary hack until configd exists
        /sbin/reload_config
}
######文件修改内容结束######
  • 修改 login.sh 使其串口登录需要密码。
vi package/base-files/files/usr/libexec/login.sh
######文件修改内容如下######
#!/bin/sh

[ "$(uci -q get system.@system[0].ttylogin)" == 1 ] || exec /bin/login

exec /bin/login
######文件修改内容结束######
  • 修改 shadow 文件,实现 root 用户拥有密码密码。
vi package/base-files/files/etc/shadow
######文件修改内容如下######
root:$1$7aqew7Sj$fsoq.EmzVZK8r7oLAJQrc0:18738:0:99999:7:::
daemon:*:0:0:99999:7:::
ftp:*:0:0:99999:7:::
network:*:0:0:99999:7:::
nobody:*:0:0:99999:7:::
######文件修改内容结束######
  • 设置默认的 network 配置。
vi package/base-files/files/etc/config/network
######文件修改内容如下######
config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fd28:36e7:8f84::/48'

config interface 'wan'
        option ifname 'MGMT'
        option proto 'dhcp'

config interface 'lte'
        option ifname 'usb0'
        option metric '2'
        option proto 'dhcp'
        option disabled '1'

config interface 'wwan'
        option metric '2'
        option proto 'dhcp'

config interface 'ppp'
        option proto '3g'
        option device '/dev/ttyUSB0'
        option service 'umts'
        option pppname 'ppp'
        option metric '2'
        option disabled '1'
######文件修改内容结束######
  • 设备 hostname 的修改操作,将 OpenWrt 替换为成你需要的名称。或者直接修改设备的 /etc/config/system 文件。
vi package/base-files/files/bin/config_generate
######文件修改内容如下######
                delete system.@system[0]
                add system system
                set system.@system[-1].hostname='OpenWrt'
                set system.@system[-1].timezone='UTC'
                set system.@system[-1].ttylogin='0'
                set system.@system[-1].log_size='64'
                set system.@system[-1].urandom_seed='0'
######文件修改内容结束######
  • 修改设备默认的 ssid 名字。
vi package/kernel/mac80211/files/lib/wifi/mac80211.sh
######文件修改内容如下######
set wireless.default_${name}.ssid=OpenWrt		 	# wifi名称
set wireless.default_${name}.encryption=psk2		# wifi加密方式,没有是none
set wireless.default_radio${devidx}.key=12345678	# wifi密码
######文件修改内容结束######
  • 设备终端的 banner 修改,可以使用 figlet 工具生成空心字。
figlet -f big HuangYanJie
vi package/base-files/files/etc/banner
######文件修改内容如下######
 _    _                      __     __              _ _
| |  | |                     \ \   / /             | (_)
| |__| |_   _  __ _ _ __   __ \ \_/ /_ _ _ __      | |_  ___
|  __  | | | |/ _` | '_ \ / _` \   / _` | '_ \ _   | | |/ _ \
| |  | | |_| | (_| | | | | (_| || | (_| | | | | |__| | |  __/
|_|  |_|\__,_|\__,_|_| |_|\__, ||_|\__,_|_| |_|\____/|_|\___|
                           __/ |
                          |___/
######文件修改内容结束######
  • 修改默认 IP,默认 ip 是 192.168.1.1,我们也可以设置成我们特殊需要的 IP
vi package/base-files/files/bin/config_generate
######文件修改内容如下######
static)
        local ipad
        case "$1" in
                lan) ipad=${ipaddr:-"192.168.1.1"} ;;
                *) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;;
        esac
######文件修改内容结束######
  • 关于增加luci的操作可以参考链接

😘 Thank you for browsing,Enjoy~