本文以高通平台为例,介绍其USB子系统启动以及USB各种配置动态切换的逻辑,它是以configfs架构实现动态配置USB。


相关文档


1. USB子系统的启动

1.1 on boot阶段

1.1.1 重启恢复用户选择的USB配置

当设备重启时恢复用户选择的USB配置,避免每次重启都回到默认模式,如果是第一次开机,则persist.vendor.usb.config为空,则使用默认值(MTP,文件传输)。

恢复的原理:当用户选择了对应的USB配置,例如MTP+adb调试,则系统会设置:setprop persist.vendor.usb.config mtp,adb,该属性被写入 /data/property/persist.vendor.usb.config,而persist属性重启时是不会丢失的。

on bootsetprop sys.usb.config ${persist.vendor.usb.config}

1.1.2 启用USB gadget HAL来控制USB功能

on boot && property:vendor.usb.use_gadget_hal=1setprop sys.usb.configfs 2

✅property:vendor.usb.use_gadget_hal=1表示启动USB gadget HAL来控制USB功能。该属性是高通平台特有的系统属性,取值1表示把USB配置由init.rc交给了Gadget HAL 服务来实现。

✅可以通过以下指令验证是否生效,当前设备的configfs=2,而且usb.gadget的HAL层服务android.hardware.usb.gadget@1.2-service-qti也在运行。

✅何时设置了该属性vendor.usb.use_gadget_hal,在高通平台下是由vendor_product.mk文件中设置该属性值:

// path: Vendor/android/vendor/qcom/opensource/usb/vendor_product.mk
ifneq ($(filter taro kalama neo parrot anorak,$(TARGET_BOARD_PLATFORM)),)PRODUCT_PROPERTY_OVERRIDES += vendor.usb.use_gadget_hal=1PRODUCT_PACKAGES += android.hardware.usb.gadget@1.2-service-qtiPRODUCT_PACKAGES += usb_compositions.conf
elsePRODUCT_PROPERTY_OVERRIDES += vendor.usb.use_gadget_hal=0
endif

如果当前设备的芯片平台是枚举中的其中之一,则设置vendor.usb.use_gadget_hal=1,并打包android.hardware.usb.gadget@1.2-service-qti服务和USB模式配置文件usb_compositions.conf。

✅usb_compositions.conf介绍
该文件列举了vendor支持的VID-PID组合USB

# /vendor/etc/usb_compositions.conf: HSUSB VID PID supported compositions# <properties>	                            <vid>	<pid>	<actual order of properties>
mass_storage								0x05C6	0xF000
mass_storage,adb							0x05C6	0x9015	adb,mass_storage
...
diag,qdss,rmnet								0x05C6	0x9083	diag,qdss_debug,rmnet
diag,qdss,rmnet,adb							0x05C6	0x9084	diag,qdss_debug,adb,rmnet
...
rndis,diag,diag_mdm,diag_mdm2,qdss,qdss_mdm,serial_cdev,dpl,adb		0x05C6	0x90F9

1.2 on post-fs阶段

1.2.1 只有on post-fs条件

on post-fs:在/data,/dev等关键文件系统挂在完成后执行,主要完成的动作如下:

  • 将内核的configfs文件系统挂载到/config
  • 创建Gadget实例g1(主设备)和g2(备用设备,例如反向充电时用)
  • 设置设备描述符(Strings相关操作)
  • 设置USB协议版本,0x200表示USB2.0,0x300表示USB3.0
  • 启用该Microsoft OS描述符,让 Windows 自动识别设备并加载正确驱动
  • 创建各种USB功能
  • 创建配置#1
  • FunctionFS挂载(用户空间)
  • 设置MTP设备类型为3
  • 执行脚本/vendor/bin/init.qcom.usb.sh
on post-fs// 将内核的configfs文件系统挂载到/config mount configfs none /config//创建Gadget实例g1(主设备)和g2(备用设备,例如反向充电时用)mkdir /config/usb_gadget/g1 0770mkdir /config/usb_gadget/g2 0770//设置设备描述符,序列号-厂商-产品名mkdir /config/usb_gadget/g1/strings/0x409 0770mkdir /config/usb_gadget/g2/strings/0x409 0770write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}write /config/usb_gadget/g2/strings/0x409/serialnumber ${ro.serialno}write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}write /config/usb_gadget/g2/strings/0x409/manufacturer ${ro.product.manufacturer}write /config/usb_gadget/g1/strings/0x409/product ${vendor.usb.product_string}write /config/usb_gadget/g2/strings/0x409/product ${vendor.usb.product_string}//设置USB协议版本,0x200表示USB2.0,0x300表示USB3.0write /config/usb_gadget/g1/bcdUSB 0x0200write /config/usb_gadget/g2/bcdUSB 0x0200//启用该Microsoft OS描述符,让 Windows 自动识别设备并加载正确驱动//MSFT100是微软的签名write /config/usb_gadget/g1/os_desc/use 1write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100"//创建各种USB功能mkdir /config/usb_gadget/g1/functions/mass_storage.0mkdir /config/usb_gadget/g1/functions/mtp.gs0mkdir /config/usb_gadget/g1/functions/ptp.gs1mkdir /config/usb_gadget/g1/functions/accessory.gs2mkdir /config/usb_gadget/g1/functions/audio_source.gs3mkdir /config/usb_gadget/g1/functions/midi.gs5mkdir /config/usb_gadget/g1/functions/ffs.adbmkdir /config/usb_gadget/g1/functions/ffs.diagmkdir /config/usb_gadget/g1/functions/ffs.diag_mdmmkdir /config/usb_gadget/g1/functions/ffs.diag_mdm2mkdir /config/usb_gadget/g1/functions/diag.diagmkdir /config/usb_gadget/g1/functions/diag.diag_mdmmkdir /config/usb_gadget/g1/functions/diag.diag_mdm2mkdir /config/usb_gadget/g1/functions/cser.dun.0mkdir /config/usb_gadget/g1/functions/cser.nmea.1mkdir /config/usb_gadget/g1/functions/cser.dun.2mkdir /config/usb_gadget/g1/functions/gsi.rmnetmkdir /config/usb_gadget/g1/functions/gsi.rndismkdir /config/usb_gadget/g1/functions/gsi.dplmkdir /config/usb_gadget/g1/functions/qdss.qdssmkdir /config/usb_gadget/g1/functions/qdss.qdss_mdmmkdir /config/usb_gadget/g1/functions/qdss.qdss_swmkdir /config/usb_gadget/g1/functions/rndis_bam.rndismkdir /config/usb_gadget/g1/functions/rndis.rndismkdir /config/usb_gadget/g1/functions/rmnet_bam.rmnetmkdir /config/usb_gadget/g1/functions/rmnet_bam.dplmkdir /config/usb_gadget/g1/functions/rmnet_bam.rmnet_bam_dmuxmkdir /config/usb_gadget/g1/functions/rmnet_bam.dpl_bam_dmuxmkdir /config/usb_gadget/g1/functions/ncm.gs6mkdir /config/usb_gadget/g1/functions/ccid.ccidmkdir /config/usb_gadget/g1/functions/uac2.0mkdir /config/usb_gadget/g1/functions/uvc.0write /config/usb_gadget/g1/functions/diag.diag/serial ${ro.serialno}//创建配置#1mkdir /config/usb_gadget/g1/configs/b.1 0770mkdir /config/usb_gadget/g2/configs/b.1 0770mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770mkdir /config/usb_gadget/g2/configs/b.1/strings/0x409 0770//设置功率write /config/usb_gadget/g1/configs/b.1/MaxPower 900//FunctionFS挂载(用户空间)mkdir /dev/usb-ffs 0775 shell systemmkdir /dev/usb-ffs/adb 0770 shell systemmount functionfs adb /dev/usb-ffs/adb uid=2000,gid=1000,rmode=0770,fmode=0660mkdir /dev/ffs-diag 0770 shell systemmount functionfs diag /dev/ffs-diag uid=2000,gid=1000,rmode=0770,fmode=0660,no_disconnect=1mkdir /dev/ffs-diag-1 0770 shell systemmount functionfs diag_mdm /dev/ffs-diag-1 uid=2000,gid=1000,rmode=0770,fmode=0660,no_disconnect=1mkdir /dev/ffs-diag-2 0770 shell systemmount functionfs diag_mdm2 /dev/ffs-diag-2 uid=2000,gid=1000,rmode=0770,fmode=0660,no_disconnect=1//设置MTP设备类型为3setprop sys.usb.mtp.device_type 3//执行脚本exec u:r:vendor_qti_init_shell:s0 -- /vendor/bin/init.qcom.usb.sh

1.2.2 在post-fs和vendor.usb.use_ffs属性为1的条件

on post-fs && property:vendor.usb.use_ffs_mtp=1mkdir /config/usb_gadget/g1/functions/ffs.mtpmkdir /config/usb_gadget/g1/functions/ffs.ptpmkdir /dev/usb-ffs/mtp 0770 mtp mtpmount functionfs mtp /dev/usb-ffs/mtp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1mkdir /dev/usb-ffs/ptp 0770 mtp mtpmount functionfs ptp /dev/usb-ffs/ptp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1
  • post-fs阶段是文件系统已挂载,可以创建设备节点。
  • vendor.usb.use_ffs_mtp=1表示仅当启用FFS版的MTP时才支持。
  • 主要操作:
  1. 创建usb_gadget/g1实例下的功能目录functions/ffs.mtp和functions/ffs.ptp
  2. 创建用户空间访问目录/dev/usb-ffs/mtp,权限是rwxrwx---,所属用户和组均是mtp
  3. mount functionfs mtp /dev/usb-ffs/mtp ...:mount把内核functions把USB底层时间打包成文件交给用户空间。
  4. 同理ptp配置
参数含义
mountLinux 系统调用,挂载一个文件系统
functionfs特殊文件系统,用于用户空间与 USB Gadget 通信
mtp挂载源(对应 /config/usb_gadget/g1/functions/ffs.mtp
/dev/usb-ffs/mtp挂载点
rmode=0770目录权限
fmode=0660文件权限
uid=1024,gid=1024强制所有者(通常是 mtp 用户)
no_disconnect=1关键参数:防止用户空间服务重启时USB断开

1.2.3 各种 USB 功能(Functions)

功能类型用途
mass_storage.0内核态大容量存储(U盘模式)
mtp.gs0ptp.gs1内核态文件传输(MTP)、相机传输(PTP)
accessory.gs2内核态Android Accessory 模式(AOA)
audio_source.gs3内核态音频输入(如 USB 麦克风)
midi.gs5内核态MIDI 设备
uac2.0内核态USB Audio Class 2.0
uvc.0内核态USB Video Class(摄像头)
ffs.adb用户态ADB 调试(通过 FunctionFS)
ffs.diagffs.diag_mdm用户态高通诊断端口(diag)
cser.dun.0cser.nmea.1内核态串口功能(DUN 拨号、NMEA GPS)
gsi.rmnetgsi.rndisgsi.dpl内核态GSI(Generic Signaling Interface)网络
qdss.qdssqdss.qdss_mdm内核态QDSS( Qualcomm Debug Support)
rndis.rndisrndis_bam.rndis内核态RNDIS(以太网)
rmnet_bam.rmnetrmnet_bam.dpl内核态RMNET(高通专有网络)
ncm.gs6内核态NCM(网络控制模型)
ccid.ccid内核态智能卡接口设备

2 充电模式下USB子系统的启动

适用场景:手机关机但插 USB 线充电,电量极低自动进入充电模式,长按电源键 + 音量下进入“充电画面”。此时 Zygote、System Server、SurfaceFlinger 等核心服务未启动,系统处于极简状态。

  • 将内核的configfs文件系统挂载到/config
  • 只创建Gadget实例g1
  • 设置设备描述符(Strings相关操作)
  • 设置USB协议版本,0x200表示USB2.0,0x300表示USB3.0
  • 只创建mass_storage.0大容量存储功能
  • 创建配置#1
  • 执行脚本/vendor/bin/init.qcom.usb.sh
  • 启用USB大容量存储功能和设置configfs标志
on chargermount configfs none /configmkdir /config/usb_gadget/g1 0770mkdir /config/usb_gadget/g1/strings/0x409 0770write /config/usb_gadget/g1/bcdUSB 0x0200write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}mkdir /config/usb_gadget/g1/functions/mass_storage.0mkdir /config/usb_gadget/g1/configs/b.1 0770mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770write /config/usb_gadget/g1/configs/b.1/MaxPower 900exec u:r:vendor_qti_init_shell:s0 -- /vendor/bin/init.qcom.usb.shwrite /config/usb_gadget/g1/strings/0x409/product ${vendor.usb.product_string}setprop sys.usb.config mass_storagesetprop sys.usb.configfs 1

3 USB配置切换

高通的usb配置和谷歌默认的init.usb.configfs.rc中动态配置USB状态的方式基本上是一致的,差别有:QC多了很好USB功能,常规功能参考init.usb.configfs.rc的USB动态配置中5.1 sys.usb.config取值

3.1 高通专有的USB配置

取值含义用途
diagQualcomm Diagnostics Port,诊断

读取 Modem、AP、BP 的日志(dmesgerrlog

发送诊断命令(如重启、读寄存器)

获取电池、温度、电压等传感器数据

刷写 EFS、NV 数据

diag_cnss

Diag for CNSS (Connectivity SubSystem)

专门用于 Wi-Fi / Bluetooth / GNSS(GPS)子系统 的诊断。

用于wifi驱动调试,蓝牙连接、GPS定位、射频校准等问题

diag_mdmDiag for Modem (mdm=Mobile Data Modem)

专门用于与基带处理器(modem)通信的诊断通道

读取 Modem 的 dmesgerrlog

获取蜂窝网络日志(RRC、NAS、PHY 层)

抓取通话、短信、注册过程日志

diag_mdm2Diag for Modem (mdm=Mobile Data Modem)

同diag_mdm,多个诊断是为了支持多SIM卡或者多Modem实例。

diag_mdm:主modem,通常是SIM1

diag_mdm2:副modem,通常是SIM2

serial_cdev

cser(Character Serial)

创建一个虚拟串口设备,

提供类似 UART 的字符设备接口,类似插入一个USB转串口设备

rmnetRemote Networking高通专有的网络传输通道,这是“通过 USB 使用蜂窝数据上网”的底层通道

dpl

Device Porting Layer

高通专有的高速数据下载通道

刷机(Flashing):下载 boot.imgsystem.img 等

固件升级

qdss

Qualcomm Debug Support Subsystem

芯片级性能分析和跟踪

抓取 CPU 执行轨迹(Instruction Trace)

监控内存访问

分析功耗热点

实时性能 profiling

qdss_mdmQDSS for Modem 

为 Modem 处理器 提供 芯片级性能跟踪和调试

抓取 Modem CPU 的指令执行流

监控内存访问

分析 Modem 任务调度延迟

定位 5G PHY 层性能瓶颈

3.2 高通SOC中多处理器介绍

高通芯片SOC中有多个独立的处理器,运行不同的OS,通过共享内存和IPC通信。

处理器代号作用
APApps Processor (A55/A7xx)运行 Android 系统
MPModem Processor (MDM)处理 2G/3G/4G/5G 通信
LPASSAudio Subsystem处理音频
CNSSConnectivity Subsystem处理 Wi-Fi/蓝牙
SPSSSecurity Subsystem处理安全加密

3.3 USB动态配置

以diag,adb的配置为例

  • 更新configuration为”diag_adb“
  • 删除配置#1中链接到functions的符号f1-f9
  • 创建配置#1的软连接,将os_desc/b.1指向configs/b.1
  • 配置USB描述符,将os_desc/b.1指向configs/b.1
  • 将b.1/f1执行内核的diag function
  • 将b.1/f2指向内核的ffs.adb function
on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,adb && property:sys.usb.configfs=1write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_adb"rm /config/usb_gadget/g1/configs/b.1/f1rm /config/usb_gadget/g1/configs/b.1/f2rm /config/usb_gadget/g1/configs/b.1/f3rm /config/usb_gadget/g1/configs/b.1/f4rm /config/usb_gadget/g1/configs/b.1/f5rm /config/usb_gadget/g1/configs/b.1/f6rm /config/usb_gadget/g1/configs/b.1/f7rm /config/usb_gadget/g1/configs/b.1/f8rm /config/usb_gadget/g1/configs/b.1/f9symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1write /config/usb_gadget/g1/idVendor 0x05C6write /config/usb_gadget/g1/idProduct 0x901Dwrite /config/usb_gadget/g1/functions/diag.diag/pid 0x901dsymlink /config/usb_gadget/g1/functions/${vendor.usb.diag.func.name}.diag /config/usb_gadget/g1/configs/b.1/f1symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2write /config/usb_gadget/g1/UDC ${sys.usb.controller}setprop sys.usb.state ${sys.usb.config}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94953.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94953.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/94953.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker的常用命令及简单使用

1、docker的常用命令 1.1、帮助命令 docker version # 显示docker的版本信息 docker info # 显示docker的系统信息&#xff0c;包括镜像和容器的数量 docker 指令 --help # 查看某个指令的帮助命令可以通过docker --help查看docker常用命…

HGDB全文检索/中文分词的使用

文章目录文档用途详细信息文档用途 本文用于HGDB全文检索/中文分词的介绍&#xff0c;其介绍内容在附件&#xff0c;使用案例见正文 详细信息 一、创建扩展 highgo# create extension zhparser;CREATE EXTENSION highgo# \dFp List of text search parsers Schema…

baijian xiaomaodawang

我将为你创建一个基于Go 1.20.8和Gin框架的博客系统项目。以下是完整的实现方案&#xff1a; 项目创建流程 打开Goland&#xff0c;创建新项目选择Go项目&#xff0c;设置GOROOT为Go 1.20.8项目名称&#xff1a;blog-system启用Go Modules 项目结构 blog-system/ ├── cmd/ │…

Node.js的特性

Node.js的特性 Node.js具有几个显著特性&#xff1a; 事件驱动&#xff1a;Node.js采用事件驱动机制来处理请求和响应&#xff0c;这种机制可以帮助开发者处理大量并发请求&#xff0c;提高系统的性能和可靠性。 非阻塞I/O&#xff1a;Node.js使用异步I/O原语来实现非阻塞I/O操…

交叉编译linux-arm32位程序

目标平台rv1126 芯片 arm32位架构 在ubuntu22.04上交叉编译&#xff1a; 编译器下载地址&#xff1a; Linaro Releases 或者&#xff1a; wget http://releases.linaro.org/components/toolchain/binaries/6.4-2017.11/arm-linux-gnueabihf/gcc-linaro-6.4.1-2017.11-x86_6…

S 3.1深度学习--卷积神经网络

卷积层 图像原理 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09; 图像在计算机中是一堆按顺序排列的数字&#xff0c;数值为 0 到 255。0 表示最暗&#xff0c;255 表示最亮。 图像识别 上图是只有黑白颜色的灰度图&#xff0c;而更普遍的图片表达…

【7】SQL 语句基础应用

SQL 语句基础应用where (筛选)where 子句可使用到运算符查询表中所有的数据查询表中的数据&#xff0c;必须满足 11&#xff08;相当于恒成立&#xff09;查询表中的 分数(score) 大于 80 分的学生查询表中 名称(name) 是 赵六 的数据查询表中 名称(name) 不等于 哈哈 的数据.查…

android 嵌套webview 全屏展示 页面延伸到状态栏且不被底部导航栏遮挡

我的项目是使用webview嵌套了一个uniapp打包出的h5 本来展示很正常&#xff0c;某天突然发现uniapp的底部导航被手机底部的导航栏挡住了&#xff0c;离奇&#xff0c;某天突然出现的 有些手机会设置展示底部导航按钮&#xff0c;有些手机会关闭底部导航 以下代码对这两种情况通…

【大前端】React Native 调用 Android、iOS 原生能力封装

&#x1f4d6; React Native 调用 Android、iOS 原生能力封装 1. 原理 React Native 的 核心思想&#xff1a;JS 层&#xff08;React 代码&#xff09;不能直接调用 Android/iOS 的 API。RN 提供了 Native Module 机制&#xff1a; Android&#xff1a;Java/Kotlin → 继承 Re…

HOOK安卓木马重大升级,勒索功能扩展至107项

勒索覆盖屏成新特征网络安全研究人员发现名为HOOK的安卓银行木马新变种&#xff0c;该恶意软件新增勒索软件式覆盖屏功能用于显示勒索信息。Zimperium zLabs研究员Vishnu Pratapagiri表示&#xff1a;"最新变种的显著特征是能够部署全屏勒索覆盖界面&#xff0c;旨在胁迫受…

GeoScene Maps 完整入门指南:从安装到实战

什么是GeoScene MapsGeoScene Maps是一套功能强大的Web地图开发平台&#xff0c;它基于现代Web技术构建&#xff0c;为开发者提供了丰富的地图服务和开发工具。与其他地图API相比&#xff0c;GeoScene Maps具有以下特点&#xff1a;核心优势全面的地图服务&#xff1a;支持2D/3…

本地大模型部署:Ollama 部署与 Python 接口调用全攻略

本地大语言模型实践&#xff1a;Ollama 部署与 Python 接口调用全攻略 一、引言 过去我们使用大语言模型&#xff08;LLM&#xff09;&#xff0c;更多依赖于 OpenAI API、Claude API 等云端服务。它们虽然强大&#xff0c;但存在两大问题&#xff1a; 隐私与数据安全&#xff…

OpenFeign:让微服务间调用像本地方法一样简单

引言&#xff1a;微服务通信的演进之路什么是OpenFeign&#xff1f;核心特性概览快速开始&#xff1a;搭建OpenFeign环境环境准备与依赖配置启用OpenFeign功能基础用法&#xff1a;从简单示例开始定义第一个Feign客户端在服务中调用Feign客户端进阶配置&#xff1a;深度定制Ope…

openharmony之一多开发:产品形态配置讲解

OpenHarmony 的“一多开发”指的是 一次开发&#xff0c;多端部署&#xff08;简称“一多”&#xff09;&#xff0c;即使用 一套代码工程&#xff0c;一次开发上架&#xff0c;按需部署到不同终端设备上 &#x1f3af; 核心概念速览 产品形态定义 写在前面&#xff1a;1.不同的…

被迫在linux上用R(真的很难用啊)之如何在linux上正常使用R

总有一些情况&#xff0c;让你不得不在linux上使用R。。。 在我不断试错&#xff0c;不断尝试过程中&#xff08;恩&#xff0c;新手疯狂踩坑&#xff09; 发现最简单的办法是&#xff1a; 1 mamba创建一个新环境&#xff0c;在新环境中使用R 2 转变思维&#xff0c;都在linux上…

【STM32】G030单片机的独立看门狗

目录 一、简单介绍 二、特性 三、窗口选项 四、cubeMX配置 不使用窗口功能 使用窗口功能 五、工程链接 一、简单介绍 独立看门狗&#xff0c;顾名思义&#xff0c;是不依靠系统而独立存在的看门狗 可以脱离应用运行&#xff0c;但缺陷在于时序精度比窗口看门狗低 主要…

VR党建工作站-红色教育基地

近几年在市场爆火的VR党建工作站提升了传统的党建方式&#xff0c;利用VR/AR技术&#xff0c;为广大党员提供沉浸式、多维度的党建学习。佩京利用VR技术搭建的教育场景&#xff0c;可以更加直观地了解党的发展历程&#xff0c;提高学习效果&#xff0c;激发奋斗精神。VR党建工作…

配置 Gitlab 和 Elasticsearch/Zoekt 并使用 Docker Metadata 数据库、Camo 代理服务

配置 Gitlab 和 Elasticsearch/Zoekt 并使用 Docker Metadata 数据库、Camo 代理服务 本文章首发于&#xff1a;连接 Gitlab 和 Elasticsearch/Zoekt 并使用 Docker Metadata 数据库、Camo 代理服务 - Ayaka 的小站 为确保更好阅读格式和阅读体验&#xff0c;更建议前往个人博客…

2025年渗透测试面试题总结-36(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 一、计算机网络基础 1. HTTP 状态码&#xff08;502/503/501&#xff09; 2. HTTP 请求方式及作用 3. 计…

QT5.15.2 - 安装时如果下载不了停了,需要加速

文章目录QT5.15.2 - 安装时如果下载不了停了&#xff0c;需要加速概述笔记安装的选项可用的国内镜像站点也有很多ENDQT5.15.2 - 安装时如果下载不了停了&#xff0c;需要加速 概述 在 https://download.qt.io/archive/online_installers 中找在线安装包。 用qt-online-instal…