SONiC架构DOCKER组件交互分析
BGP组件交互分析
- 内核中的bgp socket收到BGP更新报文,然后被上送到bgpd进程
- bgpd处理该报文,并通知zebra进程新增前缀和关联下一跳
- zebra确定该目的可达后,生成一个路由网络链接信息,并将该信息信息注入到内核中
- zebra进程通过fpm的接口将该该路由网络链接信息传递给fpmsyncd进程
- fpmsyncd将此状态推送到APPL_DB中
- orchagent订阅了(5)当中的message
- orchagent处理收到的信息,并调用sairedis APIs将新状态注入到ASIC_DB中
- syncd订阅orchagent生成的消息,并生成新的状态
- syncd调用SAI API将此状态注入到ASIC驱动的对应的状态
- 新的路由被写入硬件中,并进行转发
- bgpcfgd阅CONFIG_DB变化,通过vtysh下发配置到zebra/bgp等
DHCP_RELAY组件交互分析
- 设备起机后,dhcp_relay进程通过直接解析config_db.json里面相关的dhcp_relay的配置,然后Dhcp-relay docker里相关的配置文件/etc/supervisor/conf.d/docker-dhcp-relay.supervisord.conf
- /usr/bin/dhcp_relay.sh wait通过监听数据库里的接口状态,并动态获取接口的IP地址
- 当硬件收到一个dhcp报文(当报文是单播且单播地址非本地IP地址,则直接硬件转发,如果报文是广播或者且单播地址为本地IP,则上送到CPU),根据协议上送到CPU,CPU在根据对应的过滤规则,发送到内核空间对应的socker套接字,dhcp_relay进程从内核空间的dhcp的套件字获取到dhcp的数据包,并解析该数据包,是否转发或者丢弃
- dhcp_relay进程处理完数据包后,发到内核空间,由内核转发给硬件进行转发
host系统组件交互分析
/usr/bin/sensorspoll | 用于起机拉起sensorspoll.py |
---|---|
/usr/bin/sensorspoll.py | 周期性读取电源、风扇、子卡的mib信息,并写入STATE DB |
/usr/bin/hostcfgd | AAA配置下发 |
sshd | ssh远程登入和scp功能 |
/usr/bin/sensorspoll.py | 周期性读取电源、风扇、子卡的mib信息,并写入STATE DB |
/usr/bin/hostcfgd | AAA配置下发 |
sshd | ssh远程登入和scp功能。 |
/usr/sbin/rsyslogd | 日志记录 |
cli | 用户命令行交互, 并把对应的CLI写入到CONFIG DB |
/usr/sbin/ntpd | ntp主进程,用于和ntp server时间同步 |
/usr/local/bin/fancontrol.py | 锐捷风扇控制进程,由 device_i2c 启动 |
LLDP组件交互分析
- lldpmgrd订阅数据库中STATE_DB获取端口的实时状态,并同步给lldpd
- lldpd进程从内核空间的lldp的套件字获取到lldp的数据包,并解析此状态,lldp_syncd通过执行lldp cli命令获取到该状态
- lldp_syncd将该新状态发布到database中的APPL_DB
- SNMP使用订阅方式获取到该message的变动并进行处理
PMON组件交互分析
PMON doncker软件组件主要用于管理平台硬件,包括风扇,热传感器,SFP,收发器,pmon等,其交互流程主要如下:
- syseepromd进程从内核空间的syseepromd的套件字获取到数据包,并解析此状态,xcvrd/sysmonitor/pmon_syslog通过syseepromd提供的接口进行信息获取
- xcvrd/sysmonitor/pmon_syslog通过syseepromd将该新状态发布到database中的STATE_DB
- SNMP使用订阅方式获取到该message的变动并进行处理
redis-server与client交互分析
docker | 组件 | 与redis之间的联系 | 测试点 |
lldp | lldpd: monitor | unix |
1、攻击UNIX连接下,做LLDP相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
lldp_syncd | TCP/unix |
1、攻击击UNIX/TCP连接下,做LLDP相关配置拷机,组件和server的连接可正常稳定运行, 无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
|
/usr/bin/lldpmgrd | TCP |
1、攻击TCP连接下,做LLDP相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
|
lldp-mgmt | lldpd: monitor | unix |
1、攻击UNIX连接下,做LLDP相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
lldp_syncd | TCP/unix |
1、攻击击UNIX/TCP连接下,做LLDP相关配置拷机,组件和server的连接可正常稳定运行, 无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
|
/usr/bin/lldpmgrd | TCP |
1、攻击TCP连接下,做LLDP相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
|
snmp | /usr/sbin/snmpdr | unix |
1、攻击UNIX连接下,做SNMP相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
python3.6 -m sonic_ax_impl | unix | 1、攻击UNIX连接下,做SNMP相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
dhcp-relay | /usr/sbin/dhcrelay | udp/unix |
1、攻击UNIX连接下,做dhcp-relay相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
teamd | /usr/bin/teammgrd | unix |
1、攻击UNIX连接下,做teamd相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
/usr/bin/teamsyncd | unix | 1、攻击UNIX连接下,做teamd相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/python /usr/bin/teamshow | TCP | 1、攻击TCP连接下,做teamd相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
teamdctl | unix | 1、攻击UNIX连接下,做teamd相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
syncd | /usr/bin/dsserve | unix | 1、攻击UNIX连接下,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
/usr/bin/syncd --diag -u -p /etc/sai.d/sai.profile | unix | 1、攻击UNIX连接下,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/syncd --diag -u -p /etc/sai.d/sai.profile | unix | 1、攻击UNIX连接下,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
swss | /usr/bin/orchagen | unix | 1、攻击UNIX连接下,做orchagen相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
/usr/bin/portsyncd | unix | 1、 | |
unix | 1、攻击UNIX连接下,做port相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | ||
/usr/bin/vrfmgrd | unix | 1、攻击UNIX连接下,做VRF相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/vlanmgrd | unix | 1、攻击UNIX连接下,做vlan相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/intfmgrd | unix | 1、攻击UNIX连接下,做intf相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/portmgrd | unix | 1、攻击UNIX连接下,做port相关配置拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/buffermgrd | unix | 1、攻击UNIX连接下,做占用/释放BUFFER相关内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/nbrmgrd | unix | 1、攻击UNIX连接下,做生成和删除nbr相关内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/switchmgrd | unix | 1、攻击UNIX连接下,做生成和删除switch相关内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/neigh_update | TCP | 1、攻击TCP连接下,做neigh_update更新相关内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/no_stack_neigh.py | TCP | 1、攻击TCP连接下,做去堆叠更新相关内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
bgp | python /usr/bin/bgpcfgd | TCP | 1、攻击TCP连接下,做BGP配置相关内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
fpmsyncd | TCP/unix | 1、攻击TCP/UNIX连接下,做BGP配置相关内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/lib/frr/zebra | TCP/unix | 1、攻击TCP连接下,做路由表项更新和删除相关内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/lib/frr/bgpd | TCP/unix | 1、攻击TCP/unix连接下,做BGP配置相关内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
pmon | /usr/bin/python /usr/bin/pmon_syslog | unix | 1、攻击UNIX连接下,做光模块相关的内容拷机后读取syslog,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
/usr/bin/python /usr/bin/xcvrd | TCP | 1、攻击TCP连接下,做光模块相关的内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/python /usr/bin/sysmonitor | unix | 1、攻击UNIX连接下,做monitor相关的内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 | |
/usr/bin/python /usr/bin/bmcmgrd.py | TCP | 1、攻击TCP连接下,做BMC相关的内容拷机,组件和server的连接可正常稳定运行,无数据读写异常问题/无组件稳定性问题 2、数据库容器进行warm start后,组件状态和重启前一致,无上下层表项不一致问题 |
SNMP组件交互分析
0、Config Manager从CLI / Rest接受配置请求,或者从Minigraph检索设备上的LAG和IP over LAG数据,然后将对象更新到ConfigDB中
1、teammgrd订阅ConfigDB的LAG对应的KEY值(PORTCHANNEL,PORTCHANNEL_MEMBER),经过teammgrd、teamdsyncd处理,将状态更新到APPL_DB,
对于相应的ConfigDB表中的任何更改,teammgrd/teamdsyncd将针对LAG和LAG成员执行Linux主机配置,一旦成功,它们将继续更新APPL_DB/STATE_DB中的LAG_TABLE /LAG_MEMBER_TABLE状态表。
2、orchagent,intfmgrd组件订阅APPl_DB/STATE_DB中的LAG_TABLE /LAG_MEMBER_TABLE状态表
3、经过进程处理后,转换成ASIC信息写入ASIC_DB
4、syncd订阅ASIC_DB的LAG信息,处理后写入SDK
SWSS组件交互分析
端口初始化:
(0)在初始化期间,portsyncd与redis引擎中的主数据库建立通信通道。 Portsyncd声明打算充当APPL_DB和STATE_DB的发布者,以及CONFIG_DB的订阅者。同样,portsyncd也订阅系统的netlink通道,该通道负责传送端口/链接状态信息。
(1)Portsyncd首先通过解析与系统中正在使用的硬件配置文件/ sku相关联的端口配置文件(port_config.ini)(有关更多详细信息,请参阅配置部分)。与端口相关的信息(例如通道,接口名称,接口别名,速度等)在通过此通道传输到APPL_DB的过程中。
(2)Orchagent听到了所有这些新状态,但是将推迟对其执行操作,直到portsyncd通知它已完全完成解析port_config.ini信息为止。一旦发生这种情况,orchagent将继续进行硬件/内核中相应端口接口的初始化。 Orchagent调用sairedis API来传递此请求,以通过常规ASIC_DB接口进行同步。
(3)Syncd通过ASIC_DB接收此新请求,并准备调用满足Orchagent的请求所需的SAI API。
(4)Syncd利用SAI API + ASIC SDK创建与正在初始化的物理端口相关的内核主机接口。
(5)上一步将生成一个netlink消息,该消息将被portsyncd接收。与先前从port_config.ini解析的所有端口相关的消息到达portsyncd后(在步骤1中),portsyncd将继续声明“初始化”过程已完成。
(6)作为上一步的一部分,portsyncd将一个记录条目写入到STATE_DB中,该条目与成功初始化的每个端口相对应。
(7)从现在开始,以前订阅STATE_DB内容的应用程序将收到通知,以允许这些应用程序开始使用它们所依赖的端口。
端口down:
1、ASIC光模块造成的载波丢失,该消息被发送到ASIC驱动,ASIC驱动发送给syncd模块
2、syncd调用通知处理程序来把端口关闭时间发送给ASIC_DB
3、orchagent使用其通知处理程序来收集ASIC_DB中的新状态,并发布端口更新状态到:
<3a>发布新的状态到APPL_DB中,用于警告依靠这个端口状态进行操作的应用程序
<3b>调用sairedis APIs来警告更新与主机接口关联的接口被关闭
4、syncd通过ASIC_DB接收此新请求,并调用SAI API去满足 orchagent的请求
5、syncd使用SAI APIs + ASIC SDK使用
受影响的主机接口的最新操作状态(DOWN)
6、与上一步关联的netlink消息是在portsyncd接收到,并作为所有SONiC静默丢弃,组件现在完全了解端口关闭事件
7、作为上一步的一部分,portsyncd将记录条目写入与成功初始化的每个端口相对应的STATE_DB中。
8、从现在开始,以前订阅STATE_DB内容的应用程序将收到通知,以允许这些应用程序开始使用它们所依赖的端口。 换句话说,如果在STATE_DB中找不到用于特定端口的有效条目,则任何应用程序都将无法使用它。
Syncd组件交互分析
端口初始化:
0、在初始化期间,portsyncd与redis引擎中的主数据库建立通信通道。 Portsyncd声明打算充当APPL_DB和STATE_DB的发布者,以及CONFIG_DB的订阅者。同样,portsyncd也订阅系统的netlink通道,该通道负责传送端口/链接状态信息。
1、Portsyncd首先通过解析与系统中正在使用的硬件配置文件/ sku相关联的端口配置文件(port_config.ini)(有关更多详细信息,请参阅配置部分)。与端口相关的信息(例如通道,接口名称,接口别名,速度等)在通过此通道传输到APPL_DB的过程中。
2、Orchagent听到了所有这些新状态,但是将推迟对其执行操作,直到portsyncd通知它已完全完成解析port_config.ini信息为止。一旦发生这种情况,orchagent将继续进行硬件/内核中相应端口接口的初始化。 Orchagent调用sairedis API来传递此请求,以通过常规ASIC_DB接口进行同步。
3、Syncd通过ASIC_DB接收此新请求,并准备调用满足Orchagent的请求所需的SAI API。
4、Syncd利用SAI API + ASIC SDK创建与正在初始化的物理端口相关的内核主机接口。
/5、上一步将生成一个netlink消息,该消息将被portsyncd接收。与先前从port_config.ini解析的所有端口相关的消息到达portsyncd后(在步骤1中),portsyncd将继续声明“初始化”过程已完成。
/6、作为上一步的一部分,portsyncd将一个记录条目写入到STATE_DB中,该条目与成功初始化的每个端口相对应。
/7、从现在开始,以前订阅STATE_DB内容的应用程序将收到通知,以允许这些应用程序开始使用它们所依赖的端口。
端口down:
1、ASIC光模块造成的载波丢失,该消息被发送到ASIC驱动,ASIC驱动发送给syncd模块
2、syncd调用通知处理程序来把端口关闭时间发送给ASIC_DB
3、orchagent使用其通知处理程序来收集ASIC_DB中的新状态,并发布端口更新状态到:
<3a>发布新的状态到APPL_DB中,用于警告依靠这个端口状态进行操作的应用程序
<3b>调用sairedis APIs来警告更新与主机接口关联的接口被关闭
4、syncd通过ASIC_DB接收此新请求,并调用SAI API去满足 orchagent的请求
5、syncd使用SAI APIs + ASIC SDK使用
受影响的主机接口的最新操作状态(DOWN)
6、与上一步关联的netlink消息是在portsyncd接收到,并作为所有SONiC静默丢弃,组件现在完全了解端口关闭事件
7、作为上一步的一部分,portsyncd将记录条目写入与成功初始化的每个端口相对应的STATE_DB中。
8、从现在开始,以前订阅STATE_DB内容的应用程序将收到通知,以允许这些应用程序开始使用它们所依赖的端口。 换句话说,如果在STATE_DB中找不到用于特定端口的有效条目,则任何应用程序都将无法使用它。
TEAMD组件交互分析
0、Config Manager从CLI / Rest接受配置请求,或者从Minigraph检索设备上的LAG和IP over LAG数据,然后将对象更新到ConfigDB中
1、teammgrd订阅ConfigDB的LAG对应的KEY值(PORTCHANNEL,PORTCHANNEL_MEMBER),经过teammgrd、teamdsyncd处理,将状态更新到APPL_DB,
对于相应的ConfigDB表中的任何更改,teammgrd/teamdsyncd将针对LAG和LAG成员执行Linux主机配置,一旦成功,它们将继续更新APPL_DB/STATE_DB中的LAG_TABLE /LAG_MEMBER_TABLE状态表。
2、orchagent,intfmgrd组件订阅APPl_DB/STATE_DB中的LAG_TABLE /LAG_MEMBER_TABLE状态表
3、经过进程处理后,转换成ASIC信息写入ASIC_DB
4、syncd订阅ASIC_DB的LAG信息,处理后写入SDK
SONiC架构DOCKER组件交互分析相关推荐
- Docker源码分析(一):Docker架构
1 背景 1.1 Docker简介 Docker是Docker公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议.目前,Docker可以在容器内 ...
- 转载:Docker源码分析(一):Docker架构
原文地址: http://www.infoq.com/cn/articles/docker-source-code-analysis-part1 作者:孙宏亮 1 背景 1.1 Docker简介 D ...
- docker containerd 架构和源码简单分析
docker containerd 架构和源码简单分析 本文结合docker1.12简单说明一下docker 的现有框架,简单分析docker containerd的架构和源码. docker发展到现 ...
- Docker源码分析(十一):镜像存储
http://www.infoq.com/cn/articles/docker-source-code-analysis-part11 1.前言 Docker Hub汇总众多Docker用户的镜像,极 ...
- Docker源码分析(十):Docker镜像下载
http://www.infoq.com/cn/articles/docker-source-code-analysis-part10 1.前言 说Docker Image是Docker体系的价值所在 ...
- Docker源码分析(八):Docker Container网络(下)
http://www.infoq.com/cn/articles/docker-source-code-analysis-part8 1.Docker Client配置容器网络模式 Docker目前支 ...
- Docker源码分析(六):Docker Daemon网络
http://www.infoq.com/cn/articles/docker-source-code-analysis-part6 1. 前言 Docker作为一个开源的轻量级虚拟化容器引擎技术,已 ...
- 网站(B/s)架构发展探索、分析
1.系统概况图 图1.1 系统架构概况图 图1.2 较为完整的系统架构图 2.系统使用的主要技术 下列排名不分先后 2.1前端 JavaScript,html,css,silverlight,flas ...
- Apache Hive入门:模拟实现Hive功能、Hive架构、 组件
一.Apache Hive概述 什么是Hive Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化.半结构化数据文件映射为一张数据库表, 基 ...
最新文章
- 【Python初级】009-错误与异常
- gradle中的增量构建
- mysql客户端版本太低_windows一机多装mysql,5.5低版本+5.8高版本
- 【转】ABP源码分析十九:Auditing
- 像A + B一样容易
- 2021,前方路艰,与君共勉
- POJ 1155 TELE 树形DP
- STL vector的迭代器的熟练运用及lower_bound和upper_bound的使用
- 在虚函数 声明中写override的作用
- 你会用 JSON.stringify()? JSON.stringify一些坑
- jrtplib linux编译,linux下编译jrtplib、jthreadlib
- 企业双运营商出口负载均衡同时冗余备份
- html编写红头文件
- 《DFS》《剪枝》Problem C. 买蛋糕
- 基于itchat获取微信好友头像
- 利用好 git bisect 这把利器,帮助你快速定位疑难 Bug
- uni-app(H5)拼图游戏
- wps斜杠日期格式_使用WPS处理日期数据格式的方法
- 【Linux编程】UVC摄像头采集与显示(V4L2编程)
- Mircrosoft Visual C++ Runtime Library提示窗口为何黏着桌面