精华内容
下载资源
问答
  • 嵌入式系统中程序启动方法 在很多嵌入式系统中,由于可用资源较少,常常在系统启动后就直接让应用程序自动启动,以减少用户操作和节省资源。如何让自己的应用程序自动启动呢?在Linux系统中,配置应用程序自动...

    嵌入式系统中程序自启动方法

    在很多嵌入式系统中,由于可用资源较少,常常在系统启动后就直接让应用程序自动启动,以减少用户操作和节省资源。如何让自己的应用程序自动启动呢?    在Linux系统中,配置应用程序自动启动的方法有以下三种:
    1.通过/Linuxrc脚本直接启动
    Linux内核一旦开始执行,它将通过驱动程序来初始化所有硬件设备,这个初始化过程可以在启动时的PC显示器上看到,每个驱动程序都打印一些相关信息。初始化完成后,通常调用的是init,通过loader调用init内的init=/app_program语句(通过loader向核心传入init=/program可以定制首先运行的程序)
    比如在桌面Linux系统中,init进程会读取/etc/inittab文件,来决定执行级别和哪些脚本和命令。嵌入式应用开发中,可以根据实际情况决定是否使用标准的init执行方式,也许这个init是个静态程序,它能够完成我们的嵌入应用的特定任务,那完全不用考虑inittab了,在这里可以采用比较灵活的措施。
    2.在/etc/init.d下添加启动脚本

    主要用来启动一些系统服务,根据runlevel执行rcx.d, 而在rcx.d中都会在最后调用rc.local

    一般情况下,大多数的Linux操作系统使用/etc/init.d/(或/etc/rc.d/init.d)下的脚本来配置应用程序的自动启动。
    例如,在某些Linux系统中,corn程序通过/etc/init.d/corn脚本启动,Apache通过/etc/init.d/httpd启动,syslogd通过/etc/init.d/syslogd启动,而sshd则通过/etc/init.d/sshd脚本启动。
    通常这些脚本通过来自特定rc.d目录的符号链接运行。为了配置从哪个rc.d目录运行脚本,Linux系统提供了许多不同的工具,同时也可以手工进行配置。Linux系统有一个包含所有实际启动脚本文件的目录。它可能是/etc/init.d,也可能是/etc/rc.d/rc.d。同时对应每个运行级别(runlevel)又有一个另外的目录,它们可能是/etc/rc2.d,也可能是/etc/rc.d/rc2.d。这些目录中的文件通常是指向实际脚本文件的符号链接。
    3.直接在/etc/rc.d/rc.local脚本中添加命令
    在Linux系统中,有一个类似Windows系统中autoexec.bat的文件,它就是/etc/rc.d/rc.local,系统开机后自动运行用户的应用程序或启动系统服务的命令保存在开发板根文件系统的这个文件中。因此可以编辑rc.local文件,将要执行的程序(命令)添加到该文件夹中。Linux系统在启动后还未登录前,将自动执行该程序(命令),达到开机自动运行用户的应用程序的目的。

     

    运行级别

    Linux系统有7个运行级别(runlevel)
    运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
    运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
    运行级别2:多用户状态(没有NFS)
    运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
    运行级别4:系统未使用,保留
    运行级别5:X11控制台,登陆后进入图形GUI模式
    运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

    运行级别的原理:
    1.在目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service)(注:自己常用的有/etc/init.d/network...)
    2.在/etc/rc.d下有7个名为rcN.d的目录,对应系统的7个运行级别
    3.rcN.d目录下都是一些符号链接文件,这些链接文件都指向init.d目录下的service脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。
    4.系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件
         对于以K开头的文件,系统将终止对应的服务
         对于以S开头的文件,系统将启动对应的服务
    5.查看运行级别用:runlevel
    6.进入其它运行级别用:init N
    7.另外init0为关机,init 6为重启系统

    来自知乎
    下面是我的理解
    init 文件名,指的是系统启动的第一个脚本
    init.d 目录名,目录内放的是各个服务的启动脚本,比如sshd、httpd等
    rcX.d 目录名,后面的X代表着每个运行级别。目录内有每个服务在init.d内启动脚本的链接文件,根据链接文件的名字来的启动状态。K开头表示不启动服务,S打头表示启动服务
    rc.local 链接文件,指到/etc/rc.d/rc.local。是系统初始化及服务均启动完毕后,最后执行的一个脚本,一些简单的脚本可以放到其中
     

    linux系统开机流程

    1、机器开机通电bios质检,质检通过后,bios会根据boot菜单,选择从硬盘启动。

    2。读取硬盘中的MBR(主引导记录),加载引导程序(linux中是grub),grub程序会加载系统kernel和虚拟文件系统。

    3、系统会运行init程序,该进程会读取/etc/inittab配置文件,决定运行级别,运行/etc/rc.d/rc.sysinit脚本对系统进行初始化,该脚本会设置系统时间,主机名,开启卷管理,以读写的方式重挂root文件系统,挂载本地文件系统,开启本地磁盘配额,开启交换空间。

    4、运行该运行级别下的/etc/rc.d/rcN.d/下的脚本,开启系统服务进程。

    5、读取/etc/rc.d/rc.local下的命令,并逐条运行

    6、启动虚拟终端,进入登录界面。

    现实中碰到的问题

    1. 想自动启动一个应用程序,而应用程序依赖于一个环境变量

    2. 自动启动的应用程序可以使用Ctrl+C终止

    对于上面两个需求,碰到多个问题

    1. 将环境变量加入到/etc/profile中,然后/etc/rc.local中使用source将这个环境变量使能,但是由于rc.local脚本开始是#!bin/sh即为dash而不是bash, 导致从log可以看出rc.local执行失败,当然最后把#!bin/sh->#!bin/bash即可

    2. 如果在rc.local中执行./application则开机启动会一直停在rc.local中,导致无法exit,完成启动;如果./application &则会Ctr+C无法退出,目前使用后者

    #!bin/bash -e
    source /etc/profile
    (
    sleep 5
    cd /usr/local
    ./application
    )&

     

     

    转载于:https://www.cnblogs.com/aaronLinux/p/6804531.html

    展开全文
  • 一般情况下,服务器是不会重新启动的,但是在某些特定的情境下,我们需要重新启动服务器,例如断电、宕机或者做一些系统配置又或安装一些硬件驱动。但重启会遇到一个问题,即是我们在服务器上部署的一些软件也会随之...

            一般情况下,服务器是不会重新启动的,但是在某些特定的情境下,我们需要重新启动服务器,例如断电、宕机或者做一些系统配置又或安装一些硬件驱动。但重启会遇到一个问题,即是我们在服务器上部署的一些软件也会随之挂掉,还要手动启动,这样非常浪费时间并且有可能遗漏一些应该开启的软件和服务。此时,我们需要把部署在服务器上的服务程序自定义为系统服务,并设置开机自启。

    1、先说说开机自启

            实际上,如果仅仅让程序开机自启并不纳入系统服务管理的话,还是非常简单的。CentOS系统开机启动的配置文件路径一般为/etc/rc.d/rc.local,使用命令vim /etc/rc.d/rc.local来编辑这个文件,只要将软件的启动命令或者脚本写到这个文件中独占一行,即可让软件开机启动。

            例如,设置nginx开机启动,只要在文件中写如下内容。

    /usr/local/nginx/sbin/nginx

    2、将软件做成系统服务

            我们还可以将软件做成系统服务,用系统命令管理,这样做的优点非常明显,标准,有条理,方便。系统服务管理的命令为systemctl,其脚本存放在/usr/lib/systemd/目录下,有系统脚本和用户脚本,其中无需登录自启动的脚本应放在系统脚本中,即放在/usr/lib/systemd/system/目录下。在该目录下创建脚本文件,文件名为“服务名.service”,文件内容如下。

    [Unit]:服务的说明
    Description:描述服务
    After:描述服务类别
    
    [Service]服务运行参数的设置
    Type=forking是后台运行的形式
    ExecStart为服务的具体运行命令
    ExecReload为重启命令
    ExecStop为停止命令
    PrivateTmp=True表示给服务分配独立的临时空间
    注意:启动、重启、停止命令全部要求使用绝对路径
    
    [Install]服务安装的相关设置,可设置为多用户

            下面,还是以nginx为例,使用vim /usr/lib/systemd/system/nginx.service创建并编辑服务文件,内容如下。

    [Unit]
    Description=nginx - high performance web server
    After=network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop
    
    [Install]
    WantedBy=multi-user.target

    3、服务管理与开机自启

            还是以nginx做示例。

    启动nginx服务

    systemctl start nginx.service

    设置开机启动

    systemctl enable nginx.service

    取消开机启动

    systemctl disable nginx.service

    查看服务状态

    systemctl status nginx.service

    重新启动服务

    systemctl restart nginx.service

    查看正在运行的服务

    systemctl list-units --type=service

    4、其他软件注册服务文件示例

    mysql.service

    [Unit]
    Description=mysql
    After=network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    ExecStart=/usr/local/mysql/support-files/mysql.server start
    ExecReload=/usr/local/mysql/support-files/mysql.server restart
    ExecStop=/usr/local/mysql/support-files/mysql.server stop
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target

    redis.service

    [Unit]
    Description=Redis
    After=network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    ExecStart=/usr/local/bin/redis-server /etc/redis.conf
    ExecStop=kill -INT `cat /tmp/redis.pid`
    User=www
    Group=www
    
    [Install]
    WantedBy=multi-user.target

     

    转载于:https://my.oschina.net/chenxuanli/blog/1634964

    展开全文
  • 我购买的是无涯的MT7688A开发板,所以以它来介绍,但是发现基本OpenWRT的编译固件套路是一样的,所以应该通用。 1.下载官网源码 2.编译源码 (1)./scripts/feeds ...(4)usb摄像头驱动选择 Kernel module...

    我购买的是无涯的MT7688A开发板,所以以它来介绍,但是发现基本OpenWRT的编译固件套路是一样的,所以应该通用。

    1.下载官网源码

    2.编译源码

    (1)./scripts/feeds update -a

    (2)./scripts/feeds install -a

    (3)make menuconfig 选择板子对应的信息

    (4)usb摄像头驱动选择

    Kernel modules —> USB Support —> <*> kmod-usb-core. ##默认已经选了
    Kernel modules —> USB Support —> <*> kmod-usb-ohci. ## usb1.0
    Kernel modules —> USB Support —> <*> kmod-usb-uhci. ## usb1.1
    Kernel modules —> USB Support —> <*> kmod-usb-storage.
    Kernel modules —> USB Support —> <*> kmod-usb-storage-extras.
    Kernel modules —> USB Support —> <*> kmod-usb2. ##默认已经选了 usb2.0

    Kernel modules -->video Support -->kmod-video-core

    Multimedia --> mjpg-streamer

    (5)编译固件

    make V=99

    (6)编译成功的固件为./bin/ramips/openwrt-ramips-mt7688-HiWooya7688-squashfs-sysupgrade.bin

    3.烧写固件,此时OpenWRT的WAN口连接机箱的网口,开发板的串口波特率为57600,8,N,1

    设置完成后,系统会自动烧写固件,烧写成功后开发板会自动重启。

    4.固件烧写启动成功后,输入指令

    find / -name index.*   #查找web网页所对应的地址/www/webcam

    mjpg_streamer -i "input_uvc.so -f 15 -r 640*480 -d /dev/video0" -o "output_http.so -p 8080 -w /www/webcam"   #保持运行

    5.在网页上输入192.168.1.1:8080 即可查看到图像,ip地址为开发板eth0地址,此时OpenWRT的LAN口连接机箱的网口

    6.QT获取数据并显示。电脑设置IP地址需与开发板在同一网段。测试程序如下:

    //pro文件添加
    QT       += network
    
    
    
    //h文件
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QNetworkAccessManager>
    #include <QNetworkRequest>
    #include <QNetworkReply>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private slots:
        void mjpgStreamerUpdata(QNetworkReply *reply);
    
    private:
        Ui::Widget *ui;
    
        QNetworkAccessManager *manager;
        QNetworkRequest *request;
    };
    #endif // WIDGET_H
    
    
    
    //cpp文件
    #include "widget.h"
    #include "ui_widget.h"
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
        this->setWindowTitle("Mjpg Streamer Client");
    
        //连接到mjpg-streamer 服务器
        QString url;
        manager = new QNetworkAccessManager();
        url.append("http://192.168.1.1:8080/?action=snapshot");
        qDebug()<<url;
        request = new QNetworkRequest(QUrl(url));
        ui->label->setScaledContents(true);
        connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(mjpgStreamerUpdata(QNetworkReply *)));
        manager->get(*request);
    
        QEventLoop loop;
        connect(m_networkAccessManager, SIGNAL(finished(QNetworkReply *)), &loop, SLOT(quit()));
        loop.exec();
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::mjpgStreamerUpdata(QNetworkReply *reply)
    {
        //读取全部数据
        QByteArray byteArray = reply->readAll();
        //构建pixmap
        QImage image;
        image.loadFromData(byteArray, "JPEG");
        //Label 显示图像
        ui->label->setPixmap(QPixmap::fromImage(image));
        ui->label->show();
        //继续清理URL
        manager->get(*request);
        reply->deleteLater();
    }
    
    
    

    注: 若不加reply->deleteLater();这句话会存在内存泄漏的问题

    此时简单的OpenWRT调试完成。

    7.添加开机自启功能

    在/etc/init.d下添加文件test

    #!/bin/sh /etc/rc.common
    START=99
    
    boot(){
    mjpg_streamer -i "input_uvc.so -f 15 -r 640*480 -d /dev/video0" -o "output_http.so -p 8080 -w /www/webcam" </dev/null > /dev/null 2>&1 &
    }

    要使脚本在系统启动后自动别调用的话还需要创建软链接到 ”/etc/rc.d”目录下,如以上文件需要创建如下链接:

    ln -s /etc/init.d/test /etc/rc.d/S99test
    或者使用系统方法:

    /etc/init.d/test enable
    将会自动创建对应的软链接。

    同样的可以删除软链接或者使用disable取消脚本的自动启动

     

    8.将开发板的固定ip改成自动获取插入网线的ip

    vi /etc/config/network

    将里面的静态ip地址的static改成dhcp,将固定的ip地址相关的东西删掉就可以了,这样插入网线,就可以获取到网线的ip了。

     

    9.添加自己写的驱动或应用

    驱动模块添加:

    1:make menuconfig中的 kernel modules

    其中的各个配置选项来自于下面目录中的.mk文件

    这里以other.mk为对照,后续我们添加的驱动模块,添加到other分支当中

    2:建立模块目录,路径是package/kernel/example。mkdir -p package/kernel/example

    3:进行package/kernel/example目录,建立Makefile文件,内容如下

    #Kernel module example
    include $(TOPDIR)/rules.mk
     
    include $(INCLUDE_DIR)/kernel.mk
     
    PKG_NAME:=example
    PKG_RELEASE:=1
     
    include $(INCLUDE_DIR)/package.mk
     
     
    EXTRA_CFLAGS:= \
        $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
        $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \
     
    MAKE_OPTS:=ARCH="$(LINUX_KARCH)" \
        CROSS_COMPILE="$(TARGET_CROSS)" \
        SUBDIRS="$(PKG_BUILD_DIR)" \
        EXTRA_CFLAGS="$(EXTRA_CFLAGS)"
     
    define KernelPackage/example
      SUBMENU:=Other modules
      TITLE:=Support Module for example
      # DEPENDS:=@XXX   #如果有依赖,这个名字可去make menuconfig里面找到 Symbol:XXX
      FILES:=$(PKG_BUILD_DIR)/example.ko
      AUTOLOAD:=$(call AutoLoad,81,example) #系统启动时自动装载
    endef
     
    #PKG_BUILD_DIR:/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7621/example 
    #建立 PKG_BUILD_DIR ,并将代码拷贝到此处
    define Build/Prepare
        mkdir -p $(PKG_BUILD_DIR)/              
        $(CP) -R ./src/* $(PKG_BUILD_DIR)/
    endef
    define Build/Compile
        $(MAKE) -C "$(LINUX_DIR)" $(MAKE_OPTS) CONFIG_EXAMPLE=m modules
    endef
    $(eval $(call KernelPackage,example))

    4:在package/kernel/example目录下建立src目录,mkdir -p package/kernel/example/src
    5:在package/kernel/example/src目录下建立源码文件example.c和对应的Makefile,Kconfig

    example.c
    
    
    #include <linux/module.h>
    #include <linux/version.h>
    #include <linux/kmod.h>
     
    static int __init example_init(void)
    {
        printk("hello example openwrt\n");
        return 0;
    }
     
    static void __exit example_exit(void)
    {
        printk("hello example openwrt exit\n");
    }
     
    module_init(example_init);
    module_exit(example_exit);
     
    MODULE_AUTHOR("hello world");
    MODULE_DESCRIPTION("example driver");
    MODULE_LICENSE("GPL");
    MODULE_ALIAS("platform:" DRV_NAME);
    
    
    Makefile:
    
    obj-${CONFIG_EXAMPLE}+= example.o
    
    
    Kconfig:
    
    config EXAMPLE
        tristate "Just a example"
        help
        This is a example, for debugging kernel model.
        If unsure, say N.
    


    6:在trunk目录make menuconfig-->kernel module-->other module-->kmod-example选中。保存Config后,输入make ./package/kernel/example/compile V=s进行编译

    应用程序编译

    编译c文件:

    1:在package应用目录。参考其他的应用文件。创建helloworld文件夹,并进入。创建Makefile:

    ##############################################
    # OpenWrt Makefile for helloworld program
    #
    #
    # Most of the variables used here are defined in
    # the include directives below. We just need to
    # specify a basic description of the package,
    # where to build our program, where to find
    # the source files, and where to install the
    # compiled program on the router.
    #
    # Be very careful of spacing in this file.
    # Indents should be tabs, not spaces, and
    # there should be no trailing whitespace in
    # lines that are not commented.
    #
    ##############################################
    include $(TOPDIR)/rules.mk
     
    # Name and release number of this package
    PKG_NAME:=helloworld
    PKG_RELEASE:=1
     
    # This specifies the directory where we're going to build the program. 
    # The root build directory, $(BUILD_DIR), is by default the build_mipsel
    # directory in your OpenWrt SDK directory
     
    PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
     
    include $(INCLUDE_DIR)/package.mk
     
    # Specify package information for this program.
    # The variables defined here should be self explanatory.
    # If you are running Kamikaze, delete the DESCRIPTION
    # variable below and uncomment the Kamikaze define
    # directive for the description below
    define Package/helloworld
        SECTION:=utils
        CATEGORY:=Utilities
        TITLE:=Helloworld -- prints a snarky message
    endef
    # Uncomment portion below for Kamikaze and delete DESCRIPTION variable above
    define Package/helloworld/description
        If you can't figure out what this program does, you're probably
        brain-dead and need immediate medical attention.
    endef
    # Specify what needs to be done to prepare for building the package.
    # In our case, we need to copy the source files to the build directory.
    # This is NOT the default.  The default uses the PKG_SOURCE_URL and the
    # PKG_SOURCE which is not defined here to download the source from the web.
    # In order to just build a simple program that we have just written, it is
    # much easier to do it this way.
    define Build/Prepare
        mkdir -p $(PKG_BUILD_DIR)
        $(CP) ./src/* $(PKG_BUILD_DIR)/
    endef
    define Build/Configure
    endef
    define Build/Compile
        $(MAKE) -C $(PKG_BUILD_DIR) \
            CC="$(TARGET_CC)" \
            CFLAGS="$(TARGET_CFLAGS) -Wall" \
            LDFLAGS="$(TARGET_LDFLAGS)"
    endef
    # We do not need to define Build/Configure or Build/Compile directives
    # The defaults are appropriate for compiling a simple program such as this one
    # Specify where and how to install the program. Since we only have one file,
    # the helloworld executable, install it by copying it to the /bin directory on
    # the router. The $(1) variable represents the root directory on the router running
    # OpenWrt. The $(INSTALL_DIR) variable contains a command to prepare the install
    # directory if it does not already exist.  Likewise $(INSTALL_BIN) contains the
    # command to copy the binary file from its current location (in our case the build
    # directory) to the install directory.
    define Package/helloworld/install
        $(INSTALL_DIR) $(1)/bin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
    endef
    # This line executes the necessary commands to compile our program.
    # The above define directives specify all the information needed, but this
    # line calls BuildPackage which in turn actually uses this information to
    # build a package.
    $(eval $(call BuildPackage,helloworld))

    2:在helloworld目录创建src文件夹,并进入。创建Makefile和helloworld.c:

    # build helloworld executable when user executes "make"
    helloworld: helloworld.o
        $(CC) $(LDFLAGS) helloworld.o -o helloworld
    helloworld.o: helloworld.c
        $(CC) $(CFLAGS) -c helloworld.c
    # remove object files and executable when user executes "make clean"
    clean:
        rm *.o helloworld
    helloworld.c
    
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
     
    int main(int argc, char**argv)
    {
        printf("Hell! O' world, why won't my code compile?\n\n");
        return 0;
    }

    3:返回trunk目录,make menuconfig-->Utilities-->helloworld。然后make ./package/helloworld/compile V=s

    编译c++文件:

    1. 在package应用目录。参考其他的应用文件。创建helloworld文件夹,并进入。创建Makefile:

    ##############################################
    # OpenWrt Makefile for helloworld program
    #
    #
    # Most of the variables used here are defined in
    # the include directives below. We just need to
    # specify a basic description of the package,
    # where to build our program, where to find
    # the source files, and where to install the
    # compiled program on the router.
    #
    # Be very careful of spacing in this file.
    # Indents should be tabs, not spaces, and
    # there should be no trailing whitespace in
    # lines that are not commented.
    #
    ##############################################
    include $(TOPDIR)/rules.mk
     
    # Name and release number of this package
    PKG_NAME:=helloworld
    PKG_RELEASE:=1
     
    # This specifies the directory where we're going to build the program. 
    # The root build directory, $(BUILD_DIR), is by default the build_mipsel
    # directory in your OpenWrt SDK directory
     
    PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
     
    include $(INCLUDE_DIR)/package.mk
     
    # Specify package information for this program.
    # The variables defined here should be self explanatory.
    # If you are running Kamikaze, delete the DESCRIPTION
    # variable below and uncomment the Kamikaze define
    # directive for the description below
    define Package/multiFaceAcquisition
    	SECTION:=utils
    	CATEGORY:=Utilities
    	TITLE:=helloworld -- prints a snarky message
    endef
    # Uncomment portion below for Kamikaze and delete DESCRIPTION variable above
    define Package/multiFaceAcquisition/description
    	If you can't figure out what this program does, you're probably
    	brain-dead and need immediate medical attention.
    endef
    # Specify what needs to be done to prepare for building the package.
    # In our case, we need to copy the source files to the build directory.
    # This is NOT the default.  The default uses the PKG_SOURCE_URL and the
    # PKG_SOURCE which is not defined here to download the source from the web.
    # In order to just build a simple program that we have just written, it is
    # much easier to do it this way.
    define Build/Prepare
    	mkdir -p $(PKG_BUILD_DIR)
    	$(CP) ./src/* $(PKG_BUILD_DIR)/
    endef
    define Build/Configure
    endef
    define Build/Compile
    	$(MAKE) -C $(PKG_BUILD_DIR) \
    		CC="$(TARGET_CXX)" \
    		CFLAGS="$(TARGET_CPPFLAGS) -Wall" \
    		LDFLAGS="$(TARGET_LDFLAGS)"
    endef
    # We do not need to define Build/Configure or Build/Compile directives
    # The defaults are appropriate for compiling a simple program such as this one
    # Specify where and how to install the program. Since we only have one file,
    # the helloworld executable, install it by copying it to the /bin directory on
    # the router. The $(1) variable represents the root directory on the router running
    # OpenWrt. The $(INSTALL_DIR) variable contains a command to prepare the install
    # directory if it does not already exist.  Likewise $(INSTALL_BIN) contains the
    # command to copy the binary file from its current location (in our case the build
    # directory) to the install directory.
    define Package/helloworld/install
    	$(INSTALL_DIR) $(1)/bin
    	$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
    endef
    # This line executes the necessary commands to compile our program.
    # The above define directives specify all the information needed, but this
    # line calls BuildPackage which in turn actually uses this information to
    # build a package.
    $(eval $(call BuildPackage,helloworld))
    

    2:在helloworld目录创建src文件夹,并进入。创建Makefile和helloworld.cpp:

    # build helloworld executable when user executes "make"
    helloworld: helloworld.o
        $(CC) $(LDFLAGS) helloworld.o -o helloworld
    helloworld.o: helloworld.cpp
        $(CC) $(CFLAGS) -c helloworld.cpp
    # remove object files and executable when user executes "make clean"
    clean:
        rm *.o helloworld
     
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout<<"hello world"<<endl;
    }
    

    编译报错修改:

    提示缺少libc.so.6和libstdc++.so.6文件,解决办法:

    make menuconfig
    
    选则如下配置:
    
    OpenWrt Configuration > Base system >  <*>libc
                                           <*>libgcc
                                           <*>libpthread
                                           <*>librt
                                           <*>libstdcpp
    
    vim staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/pkginfo
    添加如下内容:
    libc.so.6
    libstdc++.so.6

    在写openwrt程序的Makefile时如果忘记加上依赖关系,编译时就会报这样的错:

    1

    2

    Package example is missing dependencies for the following libraries:

    libpthread.so.0

    解决方法是在定义程序包(Makefile)的时候加上依赖关系:

    1

    2

    3

    4

    5

    6

    define Package/example

     SECTION:=utils

     CATEGORY:=Utilities

     DEPENDS:=+libpthread

     TITLE:=example -- prints example 1 to 99

    endef

    展开全文
  • 1.开机启动时自动运行程序 Linux加载后,它将初始化硬件和设备驱动,然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在/etc/rc或/etc/rc.d或/etc/rc?.d目录下的脚本文件,...

    此文ubuntu使用sysvinit,而非upstart

    UBUNTU添加开机自动启动程序方法

    1. 开机启动时自动运行程序 
       Linux加载后它将初始化硬件和设备驱动然后运行第一个进程initinit根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在 /etc/rc /etc/rc.d  /etc/rc?.d 目录下的脚本文件,可以使init自动启动其它程序。例如:编辑/etc/rc.d/rc.local 文件(该文件通常是系统最后启动的脚本)在文件最末加上一行“xinit”“startx”,可以在开机启动后直接进入XWindow 

    2. 登录时自动运行程序 

     用户登录时,bash先自动执行系统管理员建立的全局登录script /ect/profile 
       然后bash在用户起始目录下按顺序查找三个特殊文件中的一个: 
         /.bash_profile 
         /.bash_login 
         /.profile 
       但只执行最先找到的一个。因此,只需根据实际需要在上述文件中加入命令就可以实 
       现用户登录时自动运行某些程序(类似于DOS下的Autoexec.bat)。 

    3. 退出登录时自动运行程序 
       退出登录时,bash自动执行个人的退出登录脚本 
         /.bash_logout 
       例如,在/.bash_logout中加入命令“tar cvzf c.source.tgz .c”,则在每次退出 
       登录时自动执行 “tar” 命令备份 *.c 文件。 

    4. 定期自动运行程序 
       Linux有一个称为crond的守护程序,主要功能是周期性地检查 /var/spool/cron目录 
       下的一组命令文件的内容,并在设定的时间执行这些文件中的命令。用户可以通过 
       crontab 命令来建立、修改、删除这些命令文件。 

       例如,建立文件crondFile,内容为“00 9 23 Jan * HappyBirthday”,运行“crontab 
       cronFile”命令后,每当元月23日上午9:00系统自动执行“HappyBirthday”的程序( 
       ”表示不管当天是星期几)。 

    5. 定时自动运行程序一次 
       定时执行命令at crond 类似(但它只执行一次):命令在给定的时间执行,但不自 
       动重复。at命令的一般格式为:at [ f file ] time ,在指定的时间执行file文件 
       中所给出的所有命令。也可直接从键盘输入命令: 
         $ at 12:00 
         at>mailto Roger s ″Have a lunch″ < plan.txt 
         at>Ctr
         Job 1 at 20001109 12:00 
       20001109 12:00时候自动发一标题为“Have a lunch”,内容为plan.txt文件内容 
       的邮件给Roger.

    ubuntu 自添加开机启动程序

    ubuntu (我的是 9.10)的开机启动会和 redhat suse 这些发行版会稍有差别,比如默认情况下没有 /etc/inittab 的配置文件,redhat 发行版在启动级别 上是文本模式登录,而 ubuntu 的启动级别2~都是一样的启动。现在,添加一个自定义的可执行文件或脚本,使其在开机启动时执行。

    以一个脚本为例,脚本的内容很简单 

    引用#! /bin/sh
    echo "hello start up script!" > /home/beyes/mystart.txt
    exit 0

     

    这个脚本的作用只是在我的家目录里建立一个文本文件,里面的内容就是 echo 后的内容hello start up script!

    编辑好这个脚本后,给其赋予相应的可执行文件,为了方便,就 chmod 777 /etc/init.d/mystart

    接着在 /etc/rc5.d 这个目录下做一个软链接:  ln -s /etc/init.d/mystart /etc/rc5.d/S99mystart

    那么,这个脚本开机启动生效了么?经过重启后,并没有发现在 /home/beyes 目录下生成 mystart.txt 文件。

    使用 sysv-rc-conf 配置一下启动服务:

    在第 2 运行级别也配置了让 mystart 启动。这个 sysv-rc-conf 会读取 /etc/init.d 里的文件以及 rcx.d (x为运行级别)下的软连接等信息。

    关于更多管理启动项的更多信息见:
    http://www.groad.net/bbs/read.php?tid-1392.html 

    置完后,重启。再到 /home/beyes 里查看,生成了 mystart.txt 文件,里面也有相应的内容。从这里,也看到了 ubuntu 默认的启动运行级别为 。另外,在 /etc/rc2.d 目录下,也发现了由 sysv-rc-conf 生成的软连接:S99mystart

     

     


     

    关于Ubuntu upstart启动管理方式扩展:

    linux启动过程综述
    http://www.ibm.com/developerworks/cn/linux/kernel/startup/index.html

    Upstartubuntu启动过程,简单原理
    http://www.linuxdiyf.com/viewarticle.php?id=102927

    Upstart: Ubuntu 的基于事件的启动进程
    http://www2.oklinux.cn/html/Basic/azpz/20080504/52808.htm

     


     

    sysv-rc-conf

    一、sysv-rc-conf简介
           sysv-rc-conf是一个强大的服务管理程序,群众的意见是sysv-rc-confchkconfig好用。

    二、背景知识

    Ubuntu运行级别

    Linux 系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不同,所要完成的工作和要达到的目的都不同,系统可以在这些运行级之间进行切换,以完成不同的工作。

    Ubuntu 的系统运行级别:
    0        系统停机状态
    1        单用户或系统维护状态
    2~5    多用户状态
    6        重新启动 

    查看当前运行级别,执行命令:
    runlevel
     runlevel 显示上次的运行级别和当前的运行级别,“N”表示没有上次的运行级别。)

    切换运行级别,执行命令:     
    int [0123456Ss]
     即在 init 命令后跟一个参数,此参数是要切换到的运行级的运行级代号,如:用 init 0 命令关机;用 init 6 命令重新启动。)

    Linux 系统主要启动步骤:
        1. 读取 MBR 的信息,启动 Boot Manager
                Windows 使用 NTLDR 作为 Boot Manager,如果您的系统中安装多个
                版本的 Windows,您就需要在 NTLDR 中选择您要进入的系统。
                Linux 通常使用功能强大,配置灵活的 GRUB 作为 Boot Manager
        2. 加载系统内核,启动 init 进程
                init 进程是 Linux 的根进程,所有的系统进程都是它的子进程。
        3. init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别,
           按顺序运行该运行级别对应文件夹下的脚本。脚本通常以 start 参数启
           ,并指向一个系统中的程序。
                通常情况下, /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是
                /etc/rcN.d/ 目录。例如您设定的运行级别为 3,那么它对应的启动
                目录为 /etc/rc3.d/ 
        4. 根据 /etc/rcS.d/ 文件夹中对应的脚本启动 Xwindow 服务器 xorg
                Xwindow 为 Linux 下的图形用户界面系统。
        5. 启动登录管理器,等待用户登录
                Ubuntu 系统默认使用 GDM 作为登录管理器,您在登录管理器界面中
                输入用户名和密码后,便可以登录系统。(您可以在 /etc/rc3.d/
                文件夹中找到一个名为 S13gdm 的链接)

    三、安装sysv-rc-conf
    sudo apt-get install sysv-rc-conf

    四、使用sysv-rc-conf
    sudo sysv-rc-conf
    操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择,用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出。

    常见的系统服务有:
    acpi-support 高级电源管理支持
    acpid acpi 守护程序.这两个用于电源管理,非常重要
    alsa 声音子系统
    alsa-utils
    anacron cron 的子系统,将系统关闭期间的计划任务,在下一次系统运行时执行。
    apmd acpi 的扩展
    atd 类似于 cron 的任务调度系统。建议关闭
    binfmt-support 核心支持其他二进制的文件格式。建议开启
    bluez-utiles 蓝牙设备支持
    bootlogd 启动日志。开启它
    cron 任务调度系统,建议开启
    cupsys 打印机子系统。
    dbus 消息总线系统(message bus system)。非常重要
    dns-clean 使用拨号连接时,清除 dns 信息。
    evms 企业卷管理系统(Enterprise Volumn Management system)
    fetchmail 邮件用户代理守护进程,用于收取邮件
    gdm gnome 登录和桌面管理器。
    gdomap
    gpm 终端中的鼠标支持。
    halt 别动它。
    hdparm 调整硬盘的脚本,配置文件为 /etc/hdparm.conf
    hibernate 系统休眠
    hotkey-setup 笔记本功能键支持。支持类型包括: HP, Acer, ASUS, Sony,Dell, 和 IBM
    hotplug and hotplug-net 即插即用支持,比较复杂,建议不要动它。
    hplip HP 打印机和图形子系统
    ifrename 网络接口重命名脚本。如果您有十块网卡,您应该开启它
    inetd 在文件 /etc/inetd.conf ,注释掉所有你不需要的服务。如果该文件不包含任何服务,那关闭它是很安全的。
    klogd 重要。
    linux-restricted-modules-common 受限模块支持。
    /lib/linux-restricted-modules/ 文件夹中的模块为受限模块。例如某些驱动程序,如果您没有使用受限模块,就不需要开启它。
    lvm 逻辑卷管理系统支持。
    makedev 创建设备文件,非常重要。
    mdamd 磁盘阵列
    module-init-tools /etc/modules 加载扩展模块,建议开启。
    networking 网络支持。按 /etc/network/interfaces 文件预设激活网络,非常重要。
    ntpdate 时间同步服务,建议关闭。
    pcmcia pcmcia 设备支持。
    powernowd 移动 CPU 节能支持
    ppp and ppp-dns 拨号连接
    readahead 预加载库文件。
    reboot 别动它。
    resolvconf 自动配置 DNS
    rmnologin 清除 nologin
    rsync rsync 守护程序
    sendsigs 在重启和关机期间发送信号
    single 激活单用户模式
    ssh ssh 守护程序。建议开启
    stop-bootlogd 在 2,3,4,5 运行级别中停止 bootlogd 服务
    sudo 检查 sudo 状态。重要
    sysklogd 系统日志
    udev & udev-mab 用户空间 dev 文件系统(userspace dev filesystem)。重要
    umountfs 卸载文件系统
    urandom 随机数生成器
    usplash 开机画面支持
    vbesave 显卡 BIOS 配置工具。保存显卡的状态
    xorg-common 设置 服务 ICE socket
    adjtimex 调整核心时钟的工具
    dirmngr 证书列表管理工具,和 gnupg 一起工作。
    hwtools irqs 优化工具
    libpam-devperm 系统崩溃之后,用于修理设备文件许可的守护程序。
    lm-sensors 板载传感器支持
    mdadm-raid 磁盘陈列管理器
    screen-cleanup 清除开机屏幕的脚本
    xinetd 管理其他守护进程的一个 inetd 超级守护程序

     

    转载于:https://www.cnblogs.com/nineep/p/6795678.html

    展开全文
  • Wox是用于Windows的由插件驱动的启动器,支持文件和Web搜索以及其他操作,您都可以通过点击程序的热键来访问它们。它的核心功能类似于Windows上的其他文件启动器(如Launchy)所提供的功能。您可以使用快捷键Alt-Space...
  • OK6410开发板首先确定烧写的Linux系统是带有SDIO WIFI驱动的内核(请从官网下载最新的)。 我采用的是RTL_8189WiFi模块。 1.把WiFi模块按照开发板的接口,插好。 2.打开电源,打开终端控制台 3.修改/etc/init.d/...
  • 挂在github上的个人博客:由hexo强力驱动 个人博客 准备:两台机子,三个ip(能互通{一般同一个网段}) nginx_01 ip:192.168.59.128 主机 nginx_02 ip:192.168.59.129 从机 漂浮ip:192.168.59.130 1.配置...
  • 修改开机启动文件rcS vi /etc/init.d/rcS   在modprobe fa_cpu_pfn 2>/dev/null 下面一行添加 insmod lib/modules/2.6.38-FriendlyARM/XX.ko  mknod /dev/HPI c 200 0 即可   额外修改:删除了qtopia,...
  • OpenWRT添加自启脚本

    千次阅读 2017-04-20 17:07:37
    OpenWRT的启动脚本放在 /etc/init.d 目录下,而...源码中init.d位置在:/package/base-files/files/etc/init.dvi package/base-files/files/etc/init.d然后,我们加入自己的脚本,实现模块驱动的加载、应用程序的开机
  • 开机启动时自动运行程序Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在/etc/rc或/etc/rc.d 或/etc/rc?.d目录下的脚本文件...
  • ssh安装,开机自启 terminal自动补全、大小写不敏感 开机自动挂载硬盘 .bashrc, .profile使用
  • 科沃兹gps模块驱动.ZIP

    2019-05-20 15:34:54
    科沃兹gps模块驱动 vk162/vk172,单驱动,科沃兹中配破解安装gps模块驱动,内部有教程,补充:...本人修改,支持热插拔,比超人GPS好用,设置驱动端口开机自启的软件,安装好后,打开一次,然后每次开机就自动启动gps了
  • 【电脑开机解锁后黑屏】 按win键却有反应,而且能启动应用,但是只能小窗浏览,点击小窗后再次黑屏。 最终解决办法: 改用本地账户。 无效的解决办法: 1.去官网下载显卡驱动 2.关闭向日葵开机自启 ...
  • 1、替换驱动文件 2、插入USB-GPS设备(某宝搜索vk162或vk172) 3、安装“超人GPS”软件,并设置开机自启 4、自行安装apk文件夹下的百度地图或高德地图
  • arch-2-i3-基本驱动

    2020-08-29 17:09:35
    基本驱动 安装包 #基本驱动 pacman -S xorg xorg-xinit ...#设置 显示管理器开机自启 sudo systemctl enable lightdm #如果修改 启动时显示管理器显示的背景 sudo lightdm-gtk-greeter-settings #壁纸放在/usr/share/
  • 问题描述:重装了win10的系统,结果第一次启动一直黑屏,然后...在“任务管理器”中可以看到所有开机自启项,右击需要关闭的启动项上,选择“禁用”。单击确定保存后,重新启动系统。 如果是显卡驱动问题导致的,可
  • 你电脑音效是不是经常不给力,或者你想享受剧场音效的效果,不妨安装一下这款——iPER4Windows音效驱动软件。ViPER4Windows音效驱动是一款用于...2、支持最小化启动(用于开机自启) 3、耳机环绕升级 4、音质提升
  • 下载后解压打开配合驱动可连接wifi,设置开机自启以及配置wifi
  • 一、制作PE启动盘制作PE启动盘的工具有很多,这里以“优通”为例(微PE也可),也可以根据自己的喜好选择(部分PE工具会有捆绑)选择U盘写入模式选“USB-HDD”分区格式选“exFAT”(支持单个4GB以上大文件,XP系统...
  • 1、制作PE启动盘制作PE启动盘的工具有很多,这里以“优通”为例(微PE也可),也可以根据自己的喜好选择(部分PE工具会有捆绑)选择U盘写入模式选“USB-HDD”分区格式选“exFAT”(支持单个4GB以上大文件,XP系统...
  • 由于采用的是不停机控制温度,避免了压缩机的停对房间温度的频繁冲击,控制温度精度可达到±0.5℃,避免了房间忽冷忽热对人造成的不舒适。 以制冷状态为例,图10表示的为常规空调的温度调节方法,其中T为室内温度...
  • realtek audio console 无法连接RPC

    千次阅读 2020-09-18 17:08:30
    打开之后显示realtek audio console 无法连接RPC; 1.确定驱动安装了 2.确定服务打开了 3.还不行,就在任务管理器里面,看看是不是禁用了开机自启
  • win10 上的VMware 15,虚拟机centos 虚拟机启动其他正常一直无法连接网络,换网络驱动器模式也没用。 解决: 查看主机的服务 ...原因应该是之前清理开机自启时把这些服务的自动启动给关了,调成自动就好了。 ...
  • kali

    2019-08-06 12:25:27
    系统登录,服务,端口,注册表 系统目录: windows program files 用户 perflogs 是windows7的日志信息,如磁盘扫描...启动目录里的程序开机自启。 windows是系统安装目录,windows下的systerm32是系统配置文件,co...
  • 不知道从什么时候开始的,每次一开机电脑内存就在87%以上,甚至在使用chrome浏览器和其他软件的过程中,qq管家多次提醒内存不足,明明电脑没开几个软件,开机自启项目也没几个,找各种原因,多次打开任务管理器等,...
  • 静态IP设置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 #驱动名称 DEVICE=eth0 #MAC地址 HWADDR=00:0C:29:60:68:4B TYPE=Ethernet UUID=70982bd8-d9d9-...#是否开机自启 ONBOOT=yes NM_CONTROLLED=yes #静态...
  • OpenStack Q版部署-cinder

    2020-10-21 21:58:14
    Q版 cinder安装前言一、简介二、安装1、前提条件2、安装和配置-controller修改配置文件cinder.confnova.conf初始化数据库验证设置开机自启并启动3、安装和配置-compute创建LVM卷安装软件修改配置文件cinder.conf设置...
  • sudo systemctl enable bluetooth.service #开启开机自启 系统及压缩软件问题求助 - 棒棒糖 :学校的台式机升级了没有蓝牙,我是用的lspci看的硬件信息,然后去github找的硬件驱动安装的,能解决蓝牙的问题, ...

空空如也

空空如也

1 2 3
收藏数 51
精华内容 20
关键字:

驱动开机自启