OpenWRT的ROM固件内置软件包修改与定制

原创
2015/03/27 16:49
阅读数 3.7W

1、下载Feeds 

       Feeds是OpenWrt环境所需要的软件包(opk)资源管理组件,在make menuconfig中配置built-in的软件包时会依赖Feeds。Feeds需要连接互联网才能执行更新操作。

        在执行更新之前可以通过查看’feeds.conf.default’文件,来检查哪些文件需要包含在环境中,例如:

src-git packages https://github.com/openwrt/packages.git;for-14.07
src-git luci https://github.com/openwrt/luci.git;luci-0.12
src-git routing https://github.com/openwrt-routing/packages.git;for-14.07
src-git telephony https://github.com/openwrt/telephony.git;for-14.07
src-git management https://github.com/openwrt-management/packages.git;for-14.07
src-git oldpackages http://git.openwrt.org/14.07/packages.git
#src-svn xwrt http://x-wrt.googlecode.com/svn/trunk/package
#src-svn phone svn://svn.openwrt.org/openwrt/feeds/phone
#src-svn efl svn://svn.openwrt.org/openwrt/feeds/efl
#src-svn xorg svn://svn.openwrt.org/openwrt/feeds/xorg
#src-svn desktop svn://svn.openwrt.org/openwrt/feeds/desktop
#src-svn xfce svn://svn.openwrt.org/openwrt/feeds/xfce
#src-svn lxde svn://svn.openwrt.org/openwrt/feeds/lxde
#src-link custom /usr/src/openwrt/custom-feed

        其中不需要使用的可以用#号注释掉。

        下载或更新feeds,执行如下命令:

$ ./scripts/feeds update -a

        安装feeds包,只有安装之后,在后面的make menuconfig时,才可以对相关配置进行勾选,执行如下:

$ ./scripts/feeds install -a

        如果更新了feeds的配置文件,需要添加新的软件包用于生成系统。需重复操作update和install。

        执行完下载更新操作后,会在/feeds文件夹下出现与feed名称对应的文件夹,例如:

feeds
├── luci
│   ├── applications
│   ├── build
│   ├── contrib
│   ├── i18n
│   ├── INSTALL
│   ├── libs
│   ├── LICENSE
│   ├── Makefile
│   ├── modules
│   ├── NOTICE
│   ├── po
│   ├── protocols
│   ├── THANKYOU
│   └── themes
│   ├── info
│   └── location
├── management
│   ├── freecwmp
│   ├── freenetconfd
│   ├── libev
│   ├── libfreecwmp
│   ├── libmicroxml
│   ├── libnetconf
│   ├── libssh
│   ├── shflags
│   └── shtool
├── oldpackages
│   ├── admin
│   ├── devel
│   ├── ipv6
│   ├── lang
│   ├── libs
│   ├── mail
│   ├── multimedia
│   ├── net
│   ├── skels
│   ├── sound
│   └── utils
└─── packages
    ├── admin
    ├── CONTRIBUTING.md
    ├── devel
    ├── ipv6
    ├── lang
    ├── libs
    ├── LICENSE
    ├── mail
    ├── multimedia
    ├── net
    ├── README.md
    ├── sound
    └── utils

    每个文件夹下还有子文件夹,这层的子文件夹是对软件进行分组归类的,把软件分成多类,以便于方便查找。而且归类的名称与make menuconfig中的归类名称对应,如果在make menuconfig中选软件包时不知道在哪一类时,可以先到此文件夹中查找,找到后就能在menuconfig中的对应位置找到,并选择编译ipk或built-in。

2、配置要Built-in的软件包

        使用make menuconfig进行配置,通过文本对话框进行选项配置,最主要的配置项有:

Target system(目标系统类型)
Package selection(软件包选择)
Build system settings  (编译系统设置)
Kernel modules  (内核模块)

[*]表示:这个包裹选中编译,并安装在firmware中;

[M]表示:这个软件包选中编译,但并不安装在firmware中。

在退出Menuconfig的时,会提示是否保存配置,选择保存退出。

3、修改默认配置文件

  1. 防火墙firewall初始化配置及其他相关文件位置:package/network/config/firewall/files/

  2. package/base-files/files/lib/functions/uci-defaults.sh文件是用来初始化设置网络参数的脚本,可以根据需要修改初始化的网络参数。target/linux/ar71xx/base-files/etc/uci-defaults/02_network脚本文件为编译系统时放在系统/etc/uci-defaults/路径下的网络初始化执行脚本。

4、编译

        执行make V=s,进行编译。

        编译到软件包阶段时会经历如下过程:

  1. 根据menuconfig中的软件包配置,并参考Feeds相关配置,下载软件源码;

  2. 解压源码到/builtd_dir/相应的Platform文件夹中;

  3. 执行/feeds/中指定feed文件夹下对应软件名的Makefile,该路径下一般包含/files,Makefile,/patches

    1. /files文件夹下一般包含某些配置文件,或者被Makefile所使用的文件,例如安装php5软件包时,php.init文件就在这个文件夹下,如果需要在软件built-in时就指定php.ini文件,就可以在这里进行修改。

    2. /patchs包含对软件相关调整的patch文件。

  4. 框架计划

5、固件完全定制示例

  现以生成ar9331平台的OpenWRT内置安装lighttpd、php5的最小系统固件为例:

  1. 下载并更新feeds;

  2. 在menuconfig中选择以下软件包:

    lighttpd
    lighttpd-mod-cgi
    lighttpd-mod-fastcgi
    lighttpd-mod-alias
    lighttpd-mod-access
    libsqlite3
    php5
    php5-cgi
    php5-fastcgi
    php5-mod-ctype
    php5-mod-pdo
    php5-mod-sqlite
    php5-mod-pdo-sqlite
    php5-mod-session
    php5-mod-tokenizer
    php5-mod-sqlite3
    php5-mod-sockets
    php5-mod-json
  3. 修改/feeds/oldpackages/lang/php5/files/php.ini文件

    extension=sqlite3.so
    extension=ctype.so
    extension=pdo.so
    extension=pdo_sqlite.so
    extension=session.so
    extension=tokenizer.so

         取消这几行的注释,以启用相关扩展功能。

  4. 修改feeds/packages/net/lighttpd/files/lighttpd.conf文件,找到如下几项,并按需求修改:

    server.modules = (
            "mod_access",
            "mod_alias",
            "mod_cgi",
            "mod_fastcgi"
    )
    
    index-file.names = ( "index.php", "index.html", "default.html", "index.htm", "default.htm" )
    
    #cgi程序的默认扩展名由以下配置决定,可以自己添加自己的扩展名:
    static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".cgi" )
    
    #添加后给相应扩展名的文件分配执行程序:
    cgi.assign = ( ".php"  => "/usr/bin/php-cgi" ,  ".cgi" => "/bin/sh")
  5. 如果使用FastCGI,做如下配置,如果只用CGI,可以跳过这一步:

    fastcgi.server = (
        ".php" => (
        "localhost" => (
        "socket" => "/tmp/php-fastcgi.socket",
        "bin-path" => "/usr/local/bin/php"
            )
        )
    )
  6. 这一步可以跳过,为了节省系统编译时间,可以修改barrier_breaker/target/linux/ar71xx/image/Makefile文件,此文件中包含了最后生成image镜像的路由器型号,全部注释掉,只留下自己需要的,能节省大量编译时间;

  7. 这一步也可以跳过,根据需要修改下面两个文件:

    1. target/linux/ar71xx/image/Makefile

      $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,GLINET,gl-inet-v1,GL-INET,ttyATH0,115200,0×08000001,1,8Mlzma))

      可以只保留需要的,其余可以全部注释掉;

    2. tools/firmware-utils/src/mktplinkfw.c

      .id             = "GL-INETv1",
      .hw_id          = HWID_GL_INET_V1,
      .hw_rev         = 1,
      .layout_id      = "8Mlzma",

      根据Flash大小,修改8Mlzma位置,单位是MB(兆字节)。

  8. 默认的wifi参数设置,在文件package/kernel/mac80211/files/lib/wifi/mac80211.sh件中,有这样一段代码:

                    cat <<EOF                   
    config wifi-device  radio$devidx            
            option type     mac80211            
            option channel  ${channel}          
            option hwmode   11${mode_band}      
    $dev_id                                     
    $ht_capab                                   
            # REMOVE THIS LINE TO ENABLE WIFI:  
            #option disabled 1                  
                                                
    config wifi-iface                           
            option device   radio$devidx        
            option network  lan                 
            option mode     ap                  
            option ssid     OpenWrt             
            option encryption none              
                                                
    EOF

       这段代码是出厂时,对wifi的设置,也就是/etc/config/wireless文件的模板,可以根据需要进行修改。

  9. 目录package/base-files/files/下的文件是文件系统中最基本的组成文件,这些文件都可以根据需要进行修改与ding

  10. 源码中package/base-files/files/lib/functions/uci-defaults.sh,该脚本包含了系统设置的默认值,根据需要修改值

    比如修改默认的LAN口IP设置:

    ucidef_set_interface_lan() {
            local ifname=$1
    
            uci batch <<EOF
    set network.lan='interface'
    set network.lan.ifname='$ifname'
    set network.lan.force_link=1
    set network.lan.type='bridge'
    set network.lan.proto='static'
    set network.lan.ipaddr='192.168.6.1'
    set network.lan.netmask='255.255.255.0'
    set network.lan.ip6assign='60'
    EOF
    }
  11. 执行make编译OpenWRT;

  12. 编译后生成的镜像文件保存在开发目录bin文件夹下

  13. OpenWRT编译后的rootfs目录在“build_dir/target-mips_34kc_uClibc-0.9.33.2/root-ar71xx/”,可以直接在该目录下看到编译完的文件系统中的所有文件。






展开阅读全文
打赏
2
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
2
分享
返回顶部
顶部