当前位置: 首页 > news >正文

安防监控项目---boa服务器的移植

文章目录

  • 前言
  • 一、boa服务器简介
  • 二、移植步骤
  • 三、测试结果
  • 四、A9平台移植BOA
  • 总结


前言

书接上期,在配置完成环境后,那么接下来呢还得移植两个非常关键的东西,一个呢时boa服务器,另一个呢时cgi接口,boa服务器能够使得我们更好的与web进行交互,cgi接口能够更好的实现c语言和html语言的交互;两者在网页和A9平台交互之间起着至关重要的作用;接下来呢,看我手把手教学,哈哈哈哈,大家好好学哦!


一、boa服务器简介

首先要清楚boa是一个web服务器,它其实就是用来实现网页和终端通信的一段软件代码;
其可执行代码只有大约60KB左右,Boa是一个单任务的HTTP服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。Boa支持CGI。
Boa的设计目标是速度和安全。(CGI只是一个进程,用来提供接口),自动目录生成和自动文件强制进行拼接。
Boa的主要设计目标是速度和安全性。安全性在“不能被恶意用户破坏”的意义上,不是“细粒度访问控制和加密通信”。
源码下载地址如下:http://www.boa.org/,大家可以根据自己需求进行下载;
在本项目中使用的版本是boa-0.94.13

二、移植步骤

  • 步骤一
    解压源码,生成Makefile文件,编译工程,进行安装
tar -xvf boa-0.94.13.tar.gz 	//解压工程文件
cd boa-0.94.13/src/				//进入源目录文件夹
./configure						//生成Makefile文件,如果执行不了调整权限为0777
make 							//进行编译

注意:在执行make编译文件的时候会出现一些问题,下面是一些解决办法:

问题1: 	
目录: boa-0.94.13/src$ makeyacc  -d boa_grammar.ymake: yacc: Command not foundmake: *** [y.tab.c] Error 127
解决方法:/boa-0.94.13/src$ sudo apt-get install bison
问题2: yacc  -d boa_grammar.ygcc  -g -O2 -pipe -Wall -I.   -c -o y.tab.o y.tab.c......lex  boa_lexer.lmake: lex: Command not foundmake: *** [lex.yy.c] Error 127
解决方法:/boa-0.94.13/src$ sudo  apt-get install flex
WARNING: The following packages cannot be authenticated!libfl-dev flex
Install these packages without verification? [y/N] 
E: Some packages could not be authenticated
注意加参数-f 自动搜索依赖,下面选择y  : sudo  apt-get install flex -f
Do you want to continue? [Y/n] y
WARNING: The following packages cannot be authenticated!libfl-dev flex
Install these packages without verification? [y/N] y问题3: 	
util.c: In function ‘get_commonlog_time’:
util.c:100:39: error: pasting "t" and "->" does not give a valid preprocessing tokentime_offset = TIMEZONE_OFFSET(t);									   ^
compat.h:120:30: note: in definition of macro ‘TIMEZONE_OFFSET’#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff						  ^
make: *** [util.o] Error 1	
问题描述:在compat.h文件中的宏定义问题:  ‘TIMEZONE_OFFSET’
解决方法:修改 boa-0.94.13/src$ vi compat.h  +120找到#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff修改成#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff将boa.c中的 vi   boa.c225     #if 0     //注释掉226         if (setuid(0) != -1) {227             DIE("icky Linux kernel bug!");228         }229     #endif             这三行注释掉,否则boa启动时会出现“boa.c:226 - icky linux kernel bug!: No such file or directory错误”		
清除之前编译的内容 make clean (防止某些依赖的信息出现问题)
重新make 
再次boa-0.94.13/src$ make
make: Nothing to be done for `all'.
make主要检查的是时间戳, 只要target比依赖的文件时间靠后它就认为不需要编译
  • 步骤二
    建立安装目录,如果是在Ubuntu下测试,那我们可以安装在你想要安装的目录下,要是直接安装ARM版本的,那就是得在A9平台上使用,所以必须安装在根文件服务器下,这样是不是就直接可以在PC终端直接在A9平台直接运行该服务器啦,哈哈;

     sudo mkdir -p 	/boa 	/boa/www 	/boa/cgi-bin 	/boa/log (-p,--parents,此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录)将src/defines.h中的#define SERVER_ROOT "/etc/boa" 修改为#define SERVER_ROOT "/boa"(这样boa程序启动时会在/boa目录下寻找boa.conf配置文件,并且将/boa文件夹作为服务器的根目录)。将需要的文件复制到安装目录中将boa-0.94.13/src目录下生成的boa、boa_indexer二进制文件复制到/boa下sudo  cp  boa boa_indexer  /boa将boa-0.94.13目录下的boa.conf文件复制到/boa下sudo  cp  boa.conf  /boa可选项: arm-linux-strip boa(去掉boa中的调试信息,只是减小文件的大小可以执行也可以不执行)将/etc/mime.types复制到/boa目录下sudo cp  /etc/mime.types  /boa
    
  • 步骤三
    返回boa的顶层目录 — 修改配置文件
    boa-0.94.13$ ls
    boa.conf contrib docs extras README
    ChangeLog CREDITS examples Gnu_License src

     vi boa.conf //几乎全部指定到boa的目录下,这样方便我们进行管理重新指定一些文件的生成路径,因为重新指定这些路径后会帮助我们深刻的理解关于boa服务器的工作机制Port  80  User  0  Group 0  bind调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址#Listen 192.68.0.5 error_log和access_log会自动生成,只要指定生成路径就可以了。  ErrorLog /boa/log/error_log  AccessLog /boa/log/access_log    存放HTML文件的根路径  DocumentRoot /boa/www  UserDir public_html  默认页面,若之输入http://127.0.0.1/则会自动返回给浏览器默认页面index.html  DirectoryIndex index.html    保持默认  DirectoryMaker /boa/boa_indexer   //被修改KeepAliveMax 1000  KeepAliveTimeout 10  MimeTypes /boa/mime.types   //被修改DefaultType text/plain    指定传给cgi程序的PATH环境变量  CGIPath /bin:/usr/bin:/usr/local/bin   保持默认  Alias /doc /usr/doc   如果输入http://127.0.0.1/cgi-bin/test.cgi, 则boa服务器会到/boa/cgi-bin中寻找test.cgi程序。  ScriptAlias /cgi-bin/ /boa/cgi-bin/  
    

三、测试结果

大家先不要着急看结果,这里先给大家说一个注意事项,如果大家是把boa安装在根目录下,那不存在什么情况,如果是将服务器安装在任意目录下,那么要提醒大家的是在boa.conf文件中的boa目录必须使用绝对路径,不能使用相对路径;就比如下图一些路径(当然该文件中所有的类似路径都必须用绝对路径):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试条件:在www文件夹下放置index.html文件,这个是客户端访问boa服务器的默认返回页面,或者大家直接在cgi-bin目录下直接放值.cgi测试文件(当然我们还没有移植cgi,所以写个简单的html就行了),那么测试结果如下:
html文件内容:
在这里插入图片描述
测试结果:
在这里插入图片描述
这样就表示在Ubuntu下测试成功了;当然我们是不是要在A9平台与web通信,所以一定最终是要把boa服务器移植到A9平台上;

四、A9平台移植BOA

先来分析一下最大的不同点,下图是Ubuntu下的boa文件的属性,所以要想移植到ARM平台下,必须编译生成ARM版本的boa;其余的移植步骤基本相同;
在这里插入图片描述
必须编译生成ARM的版本:
在这里插入图片描述
接下来具体看看:
能力)
(1)移植boa到嵌入式linux上的方法和上面几乎一样,具体做法是

./configure
生成Makefile后将Makefile中的
CC = gcc   CPP=gcc -E 
改为
CC = arm-linux-gcc,
CPP = arm-linux-gcc -E,
然后make就OK

(2)重新拷贝修改后的文件:
将boa-0.94.13/src目录下生成的boa、boa_indexer二进制文件复制到/boa下
将boa-0.04.13目录下的boa.conf文件复制到/boa下
将/etc/mime.types复制到/boa目录下
将test.cgi放在/boa/cgi-bin目录下,
将index.html image.jpg 放在/boa/www目录下

(3)拷贝文件到rootfs文件系统目录下:
cd boa 进入boa文件目录
移植到开发板后:

	[root@fengjunhui boa]:~$ ./boaNo such user: nobody解决方法:sudo vi boa.conf(1)Group的修改修改 Group nogroup  为 Group 0(2)user的修改修改 User nobody 为 User 0[root@fengjunhui boa]:~$ ./boa

我遇到的问题:

[01/Jan/1970:00:23:10 +0000] boa.c:211 - getpwuid: Success
[01/Jan/1970:00:00:39 +0000] boa.c:211 - getpwuid: No such file or directory
解决:修改src/boa.c
注释掉下面两句话:
#if 0if (passwdbuf == NULL) {DIE(”getpwuid”);}if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {DIE(”initgroups”);}
#endif

就能够解决!!

测试结果
在这里插入图片描述


总结

到这里呢boa服务器的移植就完全移植完成啦,我遇到的问题我觉得还是比较少的,当然大家遇到问题也不要烦,我第一次移植的时候头也很大,觉得这是个啥呀,但后面做项目时间久了,知识点都沉淀下来了,对他的各个模块的功能清晰了以后,移植起来就相对简单了,就像我能写这篇博客,肯定是经过很长时间对这个东西有了解的,所以静下心来把每一步做好;下期带大家来移植CGI,把boa和CGI结合起来使用,哈哈哈!!!
最后,各位小伙伴们如果有收获,可以点赞收藏哦,你们的认可是我创作的动力,一起加油!

相关文章:

安防监控项目---boa服务器的移植

文章目录 前言一、boa服务器简介二、移植步骤三、测试结果四、A9平台移植BOA总结 前言 书接上期,在配置完成环境后,那么接下来呢还得移植两个非常关键的东西,一个呢时boa服务器,另一个呢时cgi接口,boa服务器能够使得我…...

Gson 字符串常用转换方式(集合转换为Json数组

数组转换为 Json 字符串&#xff1a; GsonUtils.toJson(itemListBean.getImgs())json 字符串转换为数组 Gson().fromJson(goodsDbBean.getImgs(), String[].class)Json 转换为已知实体类 GsonUtils.parseJSON(result, AFileInfoBean.class);Json 转换为已知实体类集合 List<…...

MyBatis的使用(XML映射文件)

MyBatis的使用&#xff08;XML映射文件&#xff09; MyBatis基于注解开发简单便捷&#xff0c;但是弊端是失去SQL语句的灵活性&#xff0c;不能根据实际情况产生不同的SQL语句 MyBatis除了支持注解开发以外&#xff0c;还支持一种开发方式&#xff1a;XML映射文件&#xff0c…...

localhost知识

文章目录 一、localhost是什么&#xff1f;二、localhost 在平时用到的地方三、 localhost 与 127.0.01 一、localhost是什么&#xff1f; localhost 是一个特殊的主机名&#xff0c;通常指代本机。它被用来进行本地开发和测试&#xff0c;也常被用作网络配置中的占位符&#…...

PyTorch入门学习(八):神经网络-卷积层

目录 一、数据准备 二、创建卷积神经网络模型 三、可视化卷积前后的图像 一、数据准备 首先&#xff0c;需要准备一个数据集来演示卷积层的应用。在这个示例中&#xff0c;使用了CIFAR-10数据集&#xff0c;该数据集包含了10个不同类别的图像数据&#xff0c;用于分类任务。…...

【EI会议征稿】 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)

2024年遥感、测绘与图像处理国际学术会议(RSMIP2024) 2024 International Conference on Remote Sensing, Mapping and Image Processing 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)将于2024年1月19日-21日在中国厦门举行。会议主要围绕遥感、测绘与图像处理等研究领…...

MySQL 8 - 处理 NULL 值 - is null、=null、is not null、<> null 、!= null

处理 NULL 值&#xff1a; IS NULL&#xff1a;IS NULL 用于检查一个列是否为 NULL。例如&#xff0c;如果查找一个表中某一列的值为 NULL 的行&#xff0c;可以使用以下语法&#xff1a; SELECT * FROM table_name WHERE column_name IS NULL;IS NOT NULL&#xff1a;IS NOT N…...

高教社杯数模竞赛特辑论文篇-2018年C题:大型百货商场会员画像描述(附获奖论文及MATLAB代码实现)

目录 摘 要 一、问题重述 1.1 问题背景 1.2 问题提出 二、问题分析 2.1 问题一的分析...

#力扣:2315. 统计星号@FDDLC

2315. 统计星号 - 力扣&#xff08;LeetCode&#xff09; 一、Java class Solution {public int countAsterisks(String s) {int cnt 0;boolean flag true;for(char c: s.toCharArray()) {if(c |) flag !flag;else if(c * && flag) cnt;}return cnt;} }...

设计模式——单例模式详解

目录 设计模式类型单例模式单例模式方式饿汉式静态常量方式静态代码块形式 懒汉式线程不安全&#xff08;不推荐&#xff09;懒汉式优化&#xff08;不推荐&#xff09; 双重检查&#xff08;推荐方式&#xff09;静态内部类&#xff08;推荐方式&#xff09;枚举方式&#xff…...

一、W5100S/W5500+RP2040树莓派Pico<静态配置网络信息>

文章目录 1. 前言2. 相关网络信息2.1 简介2.2 优点2.3 应用 3. WIZnet以太网芯片4. 静态IP网络设置示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 编译烧录 5. 注意事项6. 相关链接 1. 前言 从本章开始我们将用WIZnet的W5100S/W5500以太网芯片结合RP…...

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&…...

elementUI el-collapse 自定义折叠面板icon 和 样式 或文字展开收起

: :v-deep{.el-collapse-item__arrow {width: 40px;}.el-icon-arrow-right:before {content: "展开";font-size: 15px;font-family: heiti;color: #2295ff;font-weight: bold;}.el-collapse-item__arrow.is-active {transform: none;}.el-collapse-item__arrow.is-a…...

如何用个人数据Milvus Cloud知识库构建 RAG 聊天机器人?(上)

生成式人工智能时代,开发者可以借助大语言模型(LLM)开发更智能的应用程序。然而,由于有限的知识,LLM 非常容易出现幻觉。检索增强生成(RAG)https://zilliz.com/use-cases/llm-retrieval-augmented-generation 通过为 LLM 补充外部知识,有效地解决了这一问题。 在 Chat …...

2023年江西省“振兴杯”工业互联网安全技术技能大赛暨全国大赛江西选拔赛 Write UP

文章目录 一、协议分析 - modbus二、协议分析 - 异常的流量三、协议分析 - S7Error四、协议分析 - OmronAttack五、组态编程 - 工程的秘密六、组态编程 - 工程的秘密七、组态编程 - 简单的计算八、组态编程 - 交通灯九、组态编程 - 有趣的转盘十、应急处置 - 登录日志分析十一、…...

PostMan 之 Mock 接口测试

在测试的时候经常会碰到后端开发工程师的接口还没有开发完成&#xff0c;但是测试任务已经分配过来。没有接口怎么测试呢&#xff1f; 测试人员可以通过 mock server 自己去造一个接口来访问。mock server 可用于模拟真实的接口。收到请求时&#xff0c;它会根据配置返回对应的…...

LuatOS-SOC接口文档(air780E)--libgnss - NMEA数据处理

示例 -- 提醒: 本库输出的坐标,均为 WGS84 坐标系 -- 如需要在国内地图使用, 要转换成对应地图的坐标系, 例如 GCJ02 BD09 -- 相关链接: https://lbsyun.baidu.com/index.php?titlecoordinate -- 相关链接: https://www.openluat.com/GPS-Offset.html-- 方案1, 经lua层进行数…...

基于华为云 IoT 物联网平台实现家居环境实时监控

01 智能家居环境监测 智能家居环境监测采用 Ruff 开发板作为主控&#xff0c;串口线连接温湿度传感器 DHT11 和空气质量传感器 SDS011&#xff0c;每5分钟采集一次数据&#xff0c;通过 MQTT 协议发送到华为云 IoT 物联网平台&#xff0c;并基于数据分析服务实时计算出整个家庭…...

【开源框架】Glide的图片加载流程

本篇文章从Glide 4.11源码入手&#xff0c;简单的分析整个图片请求的流程&#xff0c;本着 ”只见树林&#xff0c;不见树木“ 的原则&#xff0c;宏观请求流程&#xff0c;不细究实现细节&#xff08;细节留坑埋点&#xff0c;之后慢慢写&#xff09; 引入依赖 以下的所有分…...

win10下Mariadb绿色版安装步骤

使用绿色版的mariadb数据库管理软件&#xff0c;免费开源&#xff0c;可以用来替换MySQL。首先从mariadb官网下载绿色版本的压缩包。解压后、配置好即可以使用。 把他解压缩到C:\mariadb\之下。打开powershell&#xff1a; Cd c:\mariadb\bin .\mysql_install_db.exe 这一…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...