美文网首页物联网loT从业者物联网相关技术研究HCLAB
MT7688学习笔记(7)——OpenWrt下编译添加自启动程序

MT7688学习笔记(7)——OpenWrt下编译添加自启动程序

作者: Leung_ManWah | 来源:发表于2018-10-19 11:19 被阅读0次

    一、OpenWrt启动流程

    大概流程:
    1.CFE
    2.linux
    3./etc/preinit
    4./sbin/init
    5./etc/inittab
    6./etc/init.d/rcS
    7./etc/rc.d/S*

    OpenWrt的启动脚本放在/etc/init.d目录下,所以应用程序需要在boot时自动运行,则需要在/etc/init.d中增加相应的脚本文件。而系统开机时自动运行/etc/rc.d目录下的脚本。所以在rc.d目录下、有init.d下脚本的链接文件。

    二、创建文件

    2.1 创建files目录

    按OpenWrt的习惯,一般在package下创建一个自己程序的工程目录,里面分为src和files子目录和Makefile。src目录下一般放自己设计的全部源代码文件。Makefile见MT7688学习笔记(3)——定制OpenWrt系统及添加自开发软件。files目录下放安装文件。

    2.2 创建init脚本

    在files目录下创建自己程序的init脚本,如(cpp.init)。

    三、编写Makefile脚本

    MT7688学习笔记(3)——定制OpenWrt系统及添加自开发软件
    如果用户空间的应用程序在boot时要自动运行,则需要在安装方法说明中增加自动运行的脚本文件安装和配置文件安装方法。

    define Package/cpp/install
        $(INSTALL_DIR) $(1)/bin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/cpp $(1)/bin/
        $(INSTALL_DATA) ./files/cpp.config $(1)/etc/config/cpp
    
        $(INSTALL_DIR) $(1)/etc/init.d  
        $(INSTALL_BIN) ./files/cpp.init $(1)/etc/init.d/cpp
    endef
    

    INSTALL_DIR: =install -d -m0755 意思是创建所属用户可读写和执行,其他用户可读可执行的目录。

    INSTALL_BIN: =install -m0755 意思编译好的文件存放到镜像文件目录。

    $(1)表示嵌入式系统的镜像目录。

    四、编写init脚本

    #!/bin/sh /etc/rc.common
    # Copyright (C) 2010-2011 OpenWrt.org
    
    START=99
    STOP=10
    

    第一行称为shebang line,它使用/etc/rc.common脚本作为包装器。

    脚本文件需要START参数,说明在boot时的优先级,如果在boot过程启动后再关闭,则需要进一步设置STOP参数。如果STOP参数存在,其值必须大于START。

    /etc/rc.d/S10boot知道,装载内核驱动模块的优先级为10,需要使用自己设计的内核驱动模块的程序其START的值必须大于10。同样由/etc/rc.d/S40network知道,使用网络通信的程序其START的值必须大于40。

    start() {
    
      echo 'JWR1 start.' >/tmp/cpp.log
    
      if [ -b /dev/mmcblk0p1 ];then
        if  mountpoint -q /mnt
        then
          echo 'mount is mount' >>/tmp/cpp.log
          sd_state=1;
        else
          echo 'mount /dev/mmcblk0p1 /mnt/' >>/tmp/cpp.log
          mount /dev/mmcblk0p1 /mnt/      #......SD...
          if [ $? -eq 0 ];then
            echo 'mount /dev/mmcblk0p1 /mnt/ ok' >>/tmp/cpp.log
            sd_state=1;
          else
            echo 'mount /dev/mmcblk0p1 /mnt/ fail' >>/tmp/cpp.log
            sd_state=0;
          fi
        fi
      else  #没有SD卡
        echo '-b /dev/mmcblk0p1 null' >>/tmp/cpp.log
        sd_state=0;
      fi
    ......
    ......
    
    stop() {
      echo 'cpp stop.'
        
      ps | grep mysqld | grep  -v grep
    
      if [ $? -eq 0 ];then
        killall mysqld
      fi 
    }
    

    脚本文件需要start()和stop()两个函数,start()是执行程序,stop()是关闭程序。关闭程序一般需要执行killall命令。

    五、示例代码

    以启动mysql和自定义程序(cpp)为例。

    #!/bin/sh /etc/rc.common
    # Copyright (C) 2010-2011 OpenWrt.org
    
    START=99
    STOP=10
    
    #SERVICE_DAEMONIZE=1
    #SERVICE_WRITE_PID=1
    #SERVICE_STOP_TIME=9
    
    
    HOSTNAME="127.0.0.1"
    PORT="3306"
    USERNAME="root"
    PASSWORD="1234"
    DB_NAME="project"
    TABLE_NAME_SERVICE_OBJECT="serviceObject_t"
    TABLE_NAME_EVENT="event_t"
    TABLE_NAME_ACTION="action_t"
    TABLE_NAME_IFTTT_LOG="iftttLog_t"
    
    
    create_db_sql="CREATE DATABASE IF NOT EXISTS ${DB_NAME}"
    
    
    create_table_serviceObject_sql="CREATE TABLE IF NOT EXISTS ${TABLE_NAME_SERVICE_OBJECT} (
      id int(11) unsigned NOT NULL,
      gid smallint unsigned DEFAULT NULL,
      type tinyint unsigned NOT NULL,
      matchCode smallint unsigned NOT NULL,
      tag tinyint unsigned NOT NULL,
      name varchar(255) DEFAULT NULL,
      PRIMARY KEY (id)
    ) ENGINE=MyISAM;"
    
    
    create_table_event_sql="CREATE TABLE IF NOT EXISTS ${TABLE_NAME_EVENT} (
      id smallint unsigned NOT NULL,
      type tinyint unsigned NOT NULL,
      pri tinyint unsigned DEFAULT NULL,
      mode tinyint unsigned DEFAULT NULL,
      upperLimit int(11) unsigned DEFAULT NULL,
      lowerLimit int(11) unsigned DEFAULT NULL,
      actionId int(11) DEFAULT NULL,
      actionType smallint unsigned DEFAULT NULL,
      PRIMARY KEY (id)
    ) ENGINE=MyISAM;"
    
    
    create_table_action_sql="CREATE TABLE IF NOT EXISTS ${TABLE_NAME_ACTION} (
      id smallint unsigned NOT NULL,
      parm varchar(255) DEFAULT NULL,
      PRIMARY KEY (id)
    ) ENGINE=MyISAM;"
    
    
    create_table_IftttLog_sql="CREATE TABLE IF NOT EXISTS ${TABLE_NAME_IFTTT_LOG} (
      id  int(11) NOT NULL AUTO_INCREMENT ,
      d_id  varchar(255) NOT NULL ,
      e_type  int(11) NOT NULL ,
      e_value  int(11) NOT NULL ,
      a_type int(11) NOT NULL ,
      datetime  datetime NOT NULL ,
      uploadFlag int NOT NULL DEFAULT 0,
      PRIMARY KEY (id)
    ) ENGINE=MyISAM;"
    
    
    sd_state=0;
    mysql_state=0;
    
    databaseCreate(){
        echo "mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD} -e "${create_db_sql}"" >>/tmp/cpp.log
        mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD} -e "${create_db_sql}"
        if [ $? -eq 0 ];then
            echo "mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD}  -D ${DB_NAME} -e "${create_table_serviceObject_sql}"" >>/tmp/cpp.log
            mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD}  -D ${DB_NAME} -e "${create_table_serviceObject_sql}"
            if [ $? -eq 0 ];then
                echo "mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD}  -D ${DB_NAME} -e "${create_table_event_sql}"" >>/tmp/cpp.log
                mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD}  -D ${DB_NAME} -e "${create_table_event_sql}"
                    if [ $? -eq 0 ];then
                        echo "mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD}  -D ${DB_NAME} -e "${create_table_action_sql}"" >>/tmp/cpp.log
                        mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD}  -D ${DB_NAME} -e "${create_table_action_sql}"
                            if [ $? -eq 0 ];then
                                echo "mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD}  -D ${DB_NAME} -e "${create_table_IftttLog_sql}"" >>/tmp/cpp.log
                                mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD}  -D ${DB_NAME} -e "${create_table_IftttLog_sql}"
                                if [ $? -eq 0 ];then
                                    mysql_state=1
                                    echo 'mysql_state='yes'' >>/tmp/cpp.log
                                else
                                    echo 'create_table_IftttLog_sql fail' >>/tmp/cpp.log
                                fi
                        else
                            echo 'create_table_action_sql  fail' >>/tmp/cpp.log
                        fi          
                    else
                        echo 'mysql create_table_event_sql  fail' >>/tmp/cpp.log
                    fi
                else
                    echo 'mysql create_table_serviceObject_sql  fail' >>/tmp/cpp.log
                fi
    
        else
            echo 'mysql  create_db_sql fail' >>/tmp/cpp.log
        fi
    }
    
    error() {
            echo "${initscript}:" "$@" 1>&2
    }
    
    #程序开始
    start() {
    
            echo 'JWR1 start.' >/tmp/cpp.log
    
            if [ -b /dev/mmcblk0p1 ];then
                    if  mountpoint -q /mnt
                    then
                            echo 'mount is mount' >>/tmp/cpp.log
                            sd_state=1;
                    else
                            echo 'mount /dev/mmcblk0p1 /mnt/' >>/tmp/cpp.log
                            mount /dev/mmcblk0p1 /mnt/      #......SD...
                            if [ $? -eq 0 ];then
                                    echo 'mount /dev/mmcblk0p1 /mnt/ ok' >>/tmp/cpp.log
                                    sd_state=1;
                            else
                                    echo 'mount /dev/mmcblk0p1 /mnt/ fail' >>/tmp/cpp.log
                                    sd_state=0;
                            fi
                    fi
            else    #没有SD卡
                    echo '-b /dev/mmcblk0p1 null' >>/tmp/cpp.log
                    sd_state=0;
            fi
    
        
        if [ $sd_state -eq 0 ]; then
            mysqlPath="/usr/data";
            echo 'sed -i "s/mnt/usr/g" /etc/my.cnf' >>/tmp/cpp.log
            sed -i 's/mnt/usr/g' /etc/my.cnf  #将/etc/my.cnf里所有mnt替换为etc
        else
            mysqlPath="/mnt/data";
        fi
    
        if [ $? -eq 0 ];then
            if [ ! -d "$mysqlPath" ]; then
                echo 'mysql initialize' >>/tmp/cpp.log
                echo "mkdir ${mysqlPath}/mysql -p" >>/tmp/cpp.log
                echo "mkdir ${mysqlPath}/tmp -p" >>/tmp/cpp.log
                echo 'mysql_install_db --force' >>/tmp/cpp.log
        
                #echo 'ps | grep mysqld | grep -v grep' >>/tmp/cpp.log
                #ps | grep mysqld | grep  -v grep
    
                #if [ $? -eq 0 ];then
                #   echo 'killall mysqld' >>/tmp/cpp.log
                #   killall mysqld
                #   if [ $? -eq 0 ];then    
                #       echo 'killall mysqld ok' >>/tmp/cpp.log 
                #   fi
                #else
                #   echo 'mysqld not run, no need killall' >>/tmp/cpp.log
                #fi     
                chmod o+x /etc/init.d/mysqld
                mkdir ${mysqlPath}/mysql -p
                mkdir ${mysqlPath}/tmp -p
                mysql_install_db --force
            
    
                if [ $? -eq 0 ];then
                    echo '/etc/init.d/mysqld start' >>/tmp/cpp.log
                    /etc/init.d/mysqld start
                    if [ $? -eq 0 ];then
                        echo "mysqladmin -u root password ${PASSWORD}" >>/tmp/cpp.log
                        sleep 1s
                        mysqladmin -u root password ${PASSWORD}
                        if [ $? -eq 0 ];then
                            databaseCreate
                        else
                            echo 'mysqladmin -u root password '1234' fail' >>/tmp/cpp.log
                        fi
                    else
                        echo '/etc/init.d/mysqld start fail' >>/tmp/cpp.log
                    fi
    
                else
                    echo 'mysql_install_db --force fail' >>/tmp/cpp.log
                fi
            else
                echo 'mysql No need to initialize' >>/tmp/cpp.log
                #echo 'ps | grep mysqld | grep -v grep' >>/tmp/cpp.log
                #ps | grep mysqld | grep  -v grep
    
                #if [ $? -eq 0 ];then
                #   echo 'killall mysqld' >>/tmp/cpp.log
                #   killall mysqld
                #else
                #   echo 'mysqld not run, no need killall' >>/tmp/cpp.log
                #fi
    
                #if [ $? -eq 0 ];then
                while ((find /tmp/run -name mysqld.sock) -ne 0)
                do
                    echo '/etc/init.d/mysqld restart' >>/tmp/cpp.log
                    /etc/init.d/mysqld restart
                done
                #   echo '/etc/init.d/mysqld restart' >>/tmp/cpp.log
                #   /etc/init.d/mysqld restart
                #   if [ $? -eq 0 ];then
                #       sleep 1s
                #       databaseCreate
                #   else
                #       echo '/etc/init.d/mysqld restart fail' >>/tmp/cpp.log
                #   fi
                #else
                #   echo 'killall mysqld fail' >>/tmp/cpp.log
                #fi
            fi
        else
            echo 'sed -i "s/mnt/tmp/g" /etc/my.cnf fail' >>/tmp/cpp.log
        fi
        
        echo "/bin/cpp ${mysql_state} ${sd_state}" >>/tmp/cpp.log
        /bin/cpp  ${mysql_state} ${sd_state};
    }
    
    stop() {
            echo 'cpp stop.'
        
            ps | grep mysqld | grep  -v grep
    
            if [ $? -eq 0 ];then
                    killall mysqld
            fi 
    }
    

    • 由 Leung 写于 2018 年 10 月 19 日

    • 参考:F403科技创意室(www.f403tech.com)
        Init Scripts [OpenWrt Wiki]

    相关文章

      网友评论

        本文标题:MT7688学习笔记(7)——OpenWrt下编译添加自启动程序

        本文链接:https://www.haomeiwen.com/subject/qpxyzftx.html