从零开始编译OpenWRT/LEDE固件

1.编译环境,本文使用的深度Deepin 15.7系统(64位版),也可以使用Ubuntu16.04 LTS 64位版

2.按CTRL+ALT+T进入终端,更新软件列表,下载安装更新。
(注意:仅使用非root账户操作,用root用户编译会出错。)
sudo apt-get update
sudo apt-get upgrade

3.安装基础环境:
sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev

4.下载源代码,建立工作目录,进入工作目录。
使用git clone https://github.com/coolsnowwolf/lede 命令下载好源代码,

然后输入 cd lede 进入工作目录lede


5.更新软件包 (feeds都是一些插件)
./scripts/feeds update -a
./scripts/feeds install -a

6.测试编译环境:
make defconfig

7.配置固件菜单:
make menuconfig

选择Soc、机型,<*>,表示将软件包编译进固件,,表示软件包会被编译,但不会编译进固件。

添选择选择CPU型号、路由器型号,<*>,表示将软件包编译进固件,,表示软件包会被编译,但不会编译进固件。
此处以斐讯K2 PSG1218为例:
Target System --> MediaTek Ralik MIPS
Subtarget --> MT7620 based boards
Target Images --> Phicomm PSG1218
添加luci网页界面
LuCI --> Collections -->luci
添加简体中文
LuCI --> Modules --> Translations -->Chinese(zh-cn)
添加网页界面主题
LuCI --> Themes -->luci-theme-openwrt (喜欢哪个主题就选择那个主题)
设置完毕,保存,最后选择Exit。

8.预先下载dl库,可以避免下载造成的编译失败。
make download V=s

9.文件下载完毕,开始编译固件。
make V=99 -j2              # -j参数设定全速编译 (-j参数可能会导致系统卡死,不建议老爷机使用)
----编译进行----
再次等待很长时间,第一次时间较长。

10.生成的bin文件路径:bin/targets/系列名/

11.编译好的固件名格式为 lede-xxxx-generic-xxx-squashfs-sysupgrade.bin 将bin文件复制到U盘或者电脑桌面,在breed下刷入固件,浏览器登录192.168.1.1,LEDE的管理界面。


12. 如果再次编译,需要先删除 build_dir 目录下的设置文件。或者执行命令 make clean


以下是个性化设置:

x86编译要点
1. 编译所有文件系统支持,包括ext2/ext3/ext4,还有NTFS,甚至是LVM;
2. 加入一个文本编辑器,例如vim或者nano,因为日常使用中需要用文本编辑器修改各种配置文件;
3. 加入所有关于无线网卡的驱动,模块,各种支持程序;
4. 一些其他常见应用--蓝牙、加密、PGP、SSL、SSH、virtual**、USB支持、3G上网卡;
5. 编译时要到网上下载相关源码,所以可以日后下载的包尽量不选择编译;
6. 编译好的文件在当前目录的bin文件夹下,如果是brcm-2.4,则 ls bin/brcm-2.4/ 就可以看到很多熟悉的文件了。

以上设置组件时只精简了此机型用不到的usb模块和IPv6支持,以腾出空间装中文和Material主题,其它未修改,所以第一次登录还是英文界面,需要手动选择中文。为了使用方便,可以在源码里修改默认的语言、主题、时区、主机名、IP地址、wifi等等。
         
修改默认语言主题:
修改 vim feeds/luci/modules/luci-base/root/etc/config/luci 文件

config core main
        option lang "zh_cn"
        option mediaurlbase /luci-static/material
        option resourcebase /luci-static/resources
               
config internal languages
        option zh_cn "普通话 (Chinese)"
               
config internal themes
        option Bootstrap "/luci-static/bootstrap"
        option Material "/luci-static/material"


修改主机名,设定时区,IP地址
修改位置:vim package/base-files/files/bin/config_generate

generate_static_system() {
uci -q batch <<-EOF
delete system.@system[0]
add system system
set system.@system[-1].hostname='LEDE'
set system.@system[-1].timezone='CST-8'                      #东八区
set system.@system[-1].zonename='Asia/Shanghai'       #这句话要加上,不然还是UTC

lan) ipad=${ipaddr:-"192.168.1.1"} ;;       #修改默认IP


修改WIFI名称
修改位置:vim package/kernel/mac80211/files/lib/wifi/mac80211.sh
set wireless.radio${devidx}.disabled=0          #改为0显示wifi

set wireless.default_radio${devidx}=wifi-iface
set wireless.default_radio${devidx}.device=radio${devidx}
set wireless.default_radio${devidx}.network=lan
set wireless.default_radio${devidx}.mode=ap
set wireless.default_radio${devidx}.ssid=LEDE               #wifi名称
set wireless.default_radio${devidx}.encryption=psk2   #wifi加密方式,没有是none
set wireless.default_radio${devidx}.key=password       #wifi密码

其它还有很多可以修改的地方,有兴趣可以自行研究。
如果之前编译过固件,build_dir里可能会有之前的设置,需要一起修改或者删除,新编译的固件才会更新设置。
如果make menuconfig的时候瞎搞,导致编译冲突,可以使用命令rm -f .config && rm -f .config.old 把配置还原到初始状态。

修改后的固件,登录界面已经是中文了,地区、WiFi等默认设置已经变成自定的。

SSH/TELNET显示信息修改方式:
修改vim package/base-files/files/etc/banner文件。

修改路由连接数
vim package/base-files/files/etc/sysctl.conf
net.netfilter.nf_conntrack_max=65535


Base system
取消选中dnsmasq
选中dnsmasq-full
因为dnsmasq-full支持ipset功能,对于基于域名的xx很有用。

Network->File Transfer中选中
curl
wget
【两个下载工具】

Network->IP Addresses and Names中选中
bind-dig
ddns-scripts_No-IP_com。(用来支持no-ip.com的ddns服务)
一个是测试工具;另一个是某个ddns支持,还有其他ddns支持,也可以酌情选中。

Network->Routing and Rediction中选中
ip-full
这个很关键。

Network中选中
iperf3
ipset
一个是测试工具;
另一个是ipset,用于支持基于域名的xx。

Network->Web Servers/Proxies选中那些SS,如果您需要使用SS的话。

Utilities->Editors中选
nano (也可以选vim)

Utilities->Shells中选中
bash

点击Save,保存为.config。
一路Exit退出。在输入make开始编译。

点赞
  1. zzmo说道:
    Google Chrome Windows 10

    以上是目前的源码config_generate里边的内容

  2. zzmo说道:
    Google Chrome Windows 10

    #!/bin/sh

    CFG=/etc/board.json

    . /usr/share/libubox/jshn.sh

    [ -s $CFG ] || /bin/board_detect || exit 1
    [ -s /etc/config/network -a -s /etc/config/system ] && exit 0

    generate_static_network() {
    uci -q batch <<-EOF
    delete network.loopback
    set network.loopback='interface'
    set network.loopback.ifname='lo'
    set network.loopback.proto='static'
    set network.loopback.ipaddr='127.0.0.1'
    set network.loopback.netmask='255.0.0.0'
    EOF
    [ -e /proc/sys/net/ipv6 ] && {
    uci -q batch <<-EOF
    delete network.globals
    set network.globals='globals'
    set network.globals.ula_prefix='auto'
    EOF
    }

    if json_is_a dsl object; then
    json_select dsl
    if json_is_a atmbridge object; then
    json_select atmbridge
    local vpi vci encaps payload nameprefix
    json_get_vars vpi vci encaps payload nameprefix
    uci -q batch <<-EOF
    delete network.atm
    set network.atm='atm-bridge'
    set network.atm.vpi='$vpi'
    set network.atm.vci='$vci'
    set network.atm.encaps='$encaps'
    set network.atm.payload='$payload'
    set network.atm.nameprefix='$nameprefix'
    EOF
    json_select ..
    fi

    if json_is_a modem object; then
    json_select modem
    local type annex firmware tone xfer_mode
    json_get_vars type annex firmware tone xfer_mode
    uci -q batch <<-EOF
    delete network.dsl
    set network.dsl='dsl'
    set network.dsl.annex='$annex'
    set network.dsl.firmware='$firmware'
    set network.dsl.tone='$tone'
    set network.dsl.xfer_mode='$xfer_mode'
    EOF
    json_select ..
    fi
    json_select ..
    fi
    }

    addr_offset=2
    generate_network() {
    local ifname macaddr protocol type ipaddr netmask

    json_select network
    json_select "$1"
    json_get_vars ifname macaddr protocol ipaddr netmask
    json_select ..
    json_select ..

    [ -n "$ifname" ] || return

    # force bridge for multi-interface devices (and lan)
    case "$1:$ifname" in
    *\ * | lan:*) type="bridge" ;;
    esac

    uci -q batch <<-EOF
    delete network.$1
    set network.$1='interface'
    set network.$1.type='$type'
    set network.$1.ifname='$ifname'
    set network.$1.proto='none'
    EOF

    [ -n "$macaddr" ] && uci -q batch <<-EOF
    delete network.$1_dev
    set network.$1_dev='device'
    set network.$1_dev.name='$ifname'
    set network.$1_dev.macaddr='$macaddr'
    EOF

    case "$protocol" in
    static)
    local ipad
    case "$1" in
    lan) ipad=${ipaddr:-"192.168.10.25"} ;;
    *) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;;
    esac

    netm=${netmask:-"255.255.255.0"}

    uci -q batch <<-EOF
    set network.$1.proto='static'
    set network.$1.ipaddr='$ipad'
    set network.$1.netmask='$netm'
    EOF
    [ -e /proc/sys/net/ipv6 ] && uci set network.$1.ip6assign='60'
    ;;

    dhcp)
    # fixup IPv6 slave interface if parent is a bridge
    [ "$type" = "bridge" ] && ifname="br-$1"

    uci set network.$1.proto='dhcp'
    [ -e /proc/sys/net/ipv6 ] && {
    uci -q batch <<-EOF
    delete network.${1}6
    set network.${1}6='interface'
    set network.${1}6.ifname='$ifname'
    set network.${1}6.proto='dhcpv6'
    EOF
    }
    ;;

    pppoe)
    uci -q batch <<-EOF
    set network.$1.proto='pppoe'
    set network.$1.username='username'
    set network.$1.password='password'
    EOF
    [ -e /proc/sys/net/ipv6 ] && {
    uci -q batch <<-EOF
    set network.$1.ipv6='1'
    delete network.${1}6
    set network.${1}6='interface'
    set network.${1}6.ifname='@${1}'
    set network.${1}6.proto='dhcpv6'
    EOF
    }
    ;;
    esac
    }

    generate_switch_vlans_ports() {
    local switch="$1"
    local port ports role roles num attr val

    #
    # autogenerate vlans
    #

    if json_is_a roles array; then
    json_get_keys roles roles
    json_select roles

    for role in $roles; do
    json_select "$role"
    json_get_vars ports
    json_select ..

    uci -q batch <<-EOF
    add network switch_vlan
    set network.@switch_vlan[-1].device='$switch'
    set network.@switch_vlan[-1].vlan='$role'
    set network.@switch_vlan[-1].ports='$ports'
    EOF
    done

    json_select ..
    fi

    #
    # write port specific settings
    #

    if json_is_a ports array; then
    json_get_keys ports ports
    json_select ports

    for port in $ports; do
    json_select "$port"
    json_get_vars num

    if json_is_a attr object; then
    json_get_keys attr attr
    json_select attr
    uci -q batch <<-EOF
    add network switch_port
    set network.@switch_port[-1].device='$switch'
    set network.@switch_port[-1].port=$num
    EOF

    for attr in $attr; do
    json_get_var val "$attr"
    uci -q set network.@switch_port[-1].$attr="$val"
    done
    json_select ..
    fi
    json_select ..
    done

    json_select ..
    fi
    }

    generate_switch() {
    local key="$1"
    local vlans

    json_select switch
    json_select "$key"
    json_get_vars enable reset blinkrate cpu_port

    uci -q batch <<-EOF
    add network switch
    set network.@switch[-1].name='$key'
    set network.@switch[-1].reset='$reset'
    set network.@switch[-1].enable_vlan='$enable'
    set network.@switch[-1].blinkrate='$blinkrate'
    EOF

    generate_switch_vlans_ports "$1"

    json_select ..
    json_select ..
    }

    generate_static_system() {
    uci -q batch <<-EOF
    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'

    delete system.ntp
    set system.ntp='timeserver'
    set system.ntp.enabled='1'
    set system.ntp.enable_server='0'
    add_list system.ntp.server='0.openwrt.pool.ntp.org'
    add_list system.ntp.server='1.openwrt.pool.ntp.org'
    add_list system.ntp.server='2.openwrt.pool.ntp.org'
    add_list system.ntp.server='3.openwrt.pool.ntp.org'
    EOF

    if json_is_a system object; then
    json_select system
    local hostname
    if json_get_var hostname hostname; then
    uci -q set "system.@system[-1].hostname=$hostname"
    fi

    if json_is_a ntpserver array; then
    local keys key
    json_get_keys keys ntpserver
    json_select ntpserver
    uci -q delete "system.ntp.server"

    for key in $keys; do
    local server
    if json_get_var server "$key"; then
    uci -q add_list "system.ntp.server=$server"
    fi
    done
    json_select ..
    fi
    json_select ..
    fi
    }

    generate_rssimon() {
    local key="$1"
    local cfg="rssid_$key"
    local refresh threshold

    json_select rssimon
    json_select "$key"
    json_get_vars refresh threshold
    json_select ..
    json_select ..

    uci -q batch <<-EOF
    delete system.$cfg
    set system.$cfg='rssid'
    set system.$cfg.dev='$key'
    set system.$cfg.refresh='$refresh'
    set system.$cfg.threshold='$threshold'
    EOF
    }

    generate_led() {
    local key="$1"
    local cfg="led_$key"

    json_select led
    json_select "$key"
    json_get_vars name sysfs type trigger default

    uci -q batch <<-EOF
    delete system.$cfg
    set system.$cfg='led'
    set system.$cfg.name='$name'
    set system.$cfg.sysfs='$sysfs'
    set system.$cfg.trigger='$trigger'
    set system.$cfg.default='$default'
    EOF

    case "$type" in
    gpio)
    local gpio inverted
    json_get_vars gpio inverted
    uci -q batch <<-EOF
    set system.$cfg.trigger='gpio'
    set system.$cfg.gpio='$gpio'
    set system.$cfg.inverted='$inverted'
    EOF
    ;;

    netdev)
    local device mode
    json_get_vars device mode
    uci -q batch <<-EOF
    set system.$cfg.trigger='netdev'
    set system.$cfg.mode='$mode'
    set system.$cfg.dev='$device'
    EOF
    ;;

    usb)
    local device
    json_get_vars device
    uci -q batch <<-EOF
    set system.$cfg.trigger='usbdev'
    set system.$cfg.interval='50'
    set system.$cfg.dev='$device'
    EOF
    ;;

    usbport)
    local ports port
    json_get_values ports ports
    uci set system.$cfg.trigger='usbport'
    for port in $ports; do
    uci add_list system.$cfg.port=$port
    done
    ;;

    rssi)
    local iface minq maxq offset factor
    json_get_vars iface minq maxq offset factor
    uci -q batch <<-EOF
    set system.$cfg.trigger='rssi'
    set system.$cfg.iface='rssid_$iface'
    set system.$cfg.minq='$minq'
    set system.$cfg.maxq='$maxq'
    set system.$cfg.offset='$offset'
    set system.$cfg.factor='$factor'
    EOF
    ;;

    switch)
    local port_mask speed_mask mode
    json_get_vars port_mask speed_mask mode
    uci -q batch <<-EOF
    set system.$cfg.port_mask='$port_mask'
    set system.$cfg.speed_mask='$speed_mask'
    set system.$cfg.mode='$mode'
    EOF
    ;;

    portstate)
    local port_state
    json_get_vars port_state
    uci -q batch <<-EOF
    set system.$cfg.port_state='$port_state'
    EOF
    ;;

    timer|oneshot)
    local delayon delayoff
    json_get_vars delayon delayoff
    uci -q batch <<-EOF
    set system.$cfg.trigger='$type'
    set system.$cfg.delayon='$delayon'
    set system.$cfg.delayoff='$delayoff'
    EOF
    ;;
    esac

    json_select ..
    json_select ..
    }

    generate_gpioswitch() {
    local cfg="$1"

    json_select gpioswitch
    json_select "$cfg"
    local name pin default
    json_get_vars name pin default
    uci -q batch <<-EOF
    delete system.$cfg
    set system.$cfg='gpio_switch'
    set system.$cfg.name='$name'
    set system.$cfg.gpio_pin='$pin'
    set system.$cfg.value='$default'
    EOF
    json_select ..
    json_select ..
    }

    json_init
    json_load "$(cat ${CFG})"

    if [ ! -s /etc/config/network ]; then
    touch /etc/config/network
    generate_static_network

    json_get_keys keys network
    for key in $keys; do generate_network $key; done

    json_get_keys keys switch
    for key in $keys; do generate_switch $key; done
    fi

    if [ ! -s /etc/config/system ]; then
    touch /etc/config/system
    generate_static_system

    json_get_keys keys rssimon
    for key in $keys; do generate_rssimon $key; done

    json_get_keys keys gpioswitch
    for key in $keys; do generate_gpioswitch $key; done

    json_get_keys keys led
    for key in $keys; do generate_led $key; done
    fi
    uci commit

  3. zzmo说道:
    Google Chrome Windows 10

    感谢大佬 :win: 2019,09,27 lean源码用这个方法修改默认ip成功。爬了不少15 16年的帖子和现在的代码不一样了。顺便请教下,想把宽带账号密码写进固件是改哪里呢,直接把pppoe那里的username和password改了就会生效吗。wan默认貌似是dhcp模式的,还需要修改哪里先变成pppoe模式么

    1. admin说道:
      Google Chrome Windows 10

      抱歉,你说的这个,我没做过,不知道在哪改的。你先研究一下吧

发表评论