U盘格式介绍及vold进程简介
为了便于对于U盘设备的调试本文档整理了常见的U盘格式并对其进行说明。1. 技术点分析FAT32、exFAT 和 NTFSUUIDvold进程2. U盘设备2.1 U盘介绍U盘又称USB闪存盘、优盘闪存盘又称优盘是一种半导体存储器件利用Flash闪存芯片作为存储介质具备了防磁、防震、防潮等多种特性加强了数据的安全性。重量很轻体积很小方便携带。常与各种设备进行连接后使用USB接口是最常见的接口。使用时不需要驱动器无须外接电源即插即用支持热插拔带写保护功能。优盘主要可用来在没有联网的电脑之间交流较大的文件还可用来在笔记本电脑上替代软驱。2.2 接口目前市面上U盘主要分为USB-TYPE-A接口和USB-TYPE-C接口Type-A接口主要常见在电脑上Type-c接口是目前主流的手机和笔记本设备接口部分电脑主板也有Type-c接口。如果只是电脑使用只需购买普通U盘即可如果需要手机使用可以购买手机电脑两用U盘一般就含有Type-C接口。除了USB接口还有USB协议这个USB协会跟个小学生协会一样接口乱命名很多人看到usb3.2就以为比3.0高级其实不是的USB3.2Gen1 USB3.1Gen1 USB3.0 速率都是5Gbps也就是500MB/s的速度很多U盘都达不到该水平因此你看到商品宣传时看他读写速度即可不必太过关心USB3.x的版本。不过还好USB4.0版本2更新了USB接口命名规则USB2.0保留原命名其他协议命名为USB4 传输速率如下图所示2.3 U盘格式U盘格式包括三种FAT32、exFAT 和 NTFS2.3.1 FAT32(File Allocation Table 32bit)32位文件分配表FAT32文件系统用4个字节32位空间来表示每个扇区配置文件的情形所以叫FAT32。分区容量最低是512M而上限的话不同的操作系统都不一样。FAT32不支持4G或更大文件。2.3.2 exFAT(Extended File Allocation Table File System)exFATExtended File Allocation Table File System扩展FAT也称作FAT64即扩展文件分配表。exFAT文件系统是微软在windows embeded5.0以上引入的一种适合于闪存的文件系统主要是为了解决FAT32不支持4G或更大文件的问题而推出的。2.3.3 NTFSNew Technology File SystemNTFS文件系统是windows NT核心和高级服务器网络操作系统环境的文件系统。NTFS系统比FAT32的可靠性更高可以支持更大的分区和更大的文件此外还有不少FAT32没有的功能比如压缩分区、文件索引、数据保护和恢复、加密访问等。如果要拷贝超过4G大小的文件就得用NTFS格式。与FAT32相比exFAT能够支持容量为4GB及以上单个文件的传输、查看与编辑2.4 UUID属性说明UUID是linux区别插入U盘设备的重要属性该属性由制造商在U盘制造时定制。在linux下插入U盘设备键入blkid就可以看到U盘的UUID属性如图console:/# blkid/dev/block/sda1:UUID5304-2BFATYPEvfat// U盘设备如果遇到插入的多个U盘个别识别不到单独插入又能识别的情况可以查看是否是由于该属性一直造成的3. vold进程设备挂载3.1 vold进程介绍voldVolume Daemon是Android操作系统中负责设备存储卷管理的后台进程。它负责检测设备并将其挂载到文件系统中以便用户可以访问设备上的文件和数据。下面是vold进程检测设备并进行挂载的一般过程设备检测vold进程会周期性地扫描系统中连接的设备例如SD卡、USB存储设备、外部硬盘等。它使用Linux内核提供的设备节点信息来确定设备是否存在。设备识别一旦检测到设备vold会尝试识别设备的类型和文件系统格式。这通常通过读取设备的分区表或者特定的设备标识符来完成。根据设备类型和文件系统格式的不同vold会采取相应的挂载策略。设备挂载当设备被识别后vold进程会执行设备挂载操作。这包括创建设备的挂载点mount point、配置文件系统参数以及向操作系统发出挂载命令。文件系统准备在设备挂载之前vold需要确保文件系统可用并做好准备工作。这可能包括对文件系统进行修复如果有必要或者执行其他初始化操作。挂载结果处理vold会监听设备挂载的结果。如果挂载成功它会通知其他系统组件和应用程序使它们可以访问和使用挂载的设备。如果挂载失败vold可能会记录错误日志并尝试进行一些恢复操作。[内核空间]SD卡插入硬件检测 ↓[内核空间]生成/dev/block/mmcblk0发送 ueventadd/block/mmcblk0↓[vold进程]NetlinkHandler 收到 uevent ↓[vold进程]VolumeManager::handleBlockEvent()↓[vold进程]autodisknewDisk(devpath,...);// 创建 Disk 对象↓[vold进程]【调用 disk-create()】 │ ├──readMetadata()│ └──readPartitions()→ sgdisk → 识别分区 ↓[vold进程]createPublicVolume(partDevice)// 创建 Volume↓[内核空间]mount()系统调用 ← 图中虚线mount↓[vold进程]广播挂载状态给 StorageManagerService ↓[用户空间]StorageManagerService 更新状态通知 App3.2 设备挂载对于一个U盘设备而言vold进程会创建一个Disk对象并调用create函数读取U盘的每个分区进行挂载//release/system/vold/model/Disk.cppstatus_tDisk::create(){CHECK(!mCreated);mCreatedtrue;autolistenerVolumeManager::Instance()-getListener();if(listener)listener-onDiskCreated(getId(),mFlags);if(isStub()){createStubVolume();returnOK;}readMetadata();readPartitions();returnOK;}readPartitions函数调用了sgdisk命令读取U盘设备分区的信息并解析//release/system/vold/model/Disk.cppstatus_tDisk::readPartitions(){intmaxMinorsgetMaxMinors();if(maxMinors0){return-ENOTSUP;}destroyAllVolumes();// Parse partition tablestd::vectorstd::stringcmd;cmd.push_back(kSgdiskPath);cmd.push_back(--android-dump);cmd.push_back(mDevPath);std::vectorstd::stringoutput;status_tresForkExecvp(cmd,output);// 读取分区信息if(res!OK){LOG(WARNING)sgdisk failed to scan mDevPath;autolistenerVolumeManager::Instance()-getListener();if(listener)listener-onDiskScanned(getId());mJustPartitionedfalse;returnres;}Table tableTable::kUnknown;bool foundPartsfalse;for(constautoline:output){autosplitandroid::base::Split(line,kSgdiskToken);// 解析autoitsplit.begin();if(itsplit.end())continue;if(*itDISK){if(itsplit.end())continue;if(*itmbr){tableTable::kMbr;}elseif(*itgpt){tableTable::kGpt;}else{LOG(WARNING)Invalid partition table *it;continue;}...}分区检测成功后就会调用对应的函数创建卷并挂载分区。//release/system/vold/model/Disk.cppswitch(type){case0x06:// FAT16case0x07:// HPFS/NTFS/exFATcase0x0b:// W95 FAT32 (LBA)case0x0c:// W95 FAT32 (LBA)case0x0e:// W95 FAT16 (LBA)createPublicVolume(partDevice);break;default:// We should still create public volume here// cause some udisk partition types are not matched above// but can be mounted successfullycreatePublicVolume(partDevice);LOG(WARNING)unsupported table kMbr part type type;break;}}elseif(tableTable::kGpt){if(itsplit.end())continue;autotypeGuid*it;if(itsplit.end())continue;autopartGuid*it;if(android::base::EqualsIgnoreCase(typeGuid,kGptBasicData)){createPublicVolume(partDevice);}elseif(android::base::EqualsIgnoreCase(typeGuid,kGptAndroidExpand)){createPrivateVolume(partDevice,partGuid);}3.3 isEntireDiskAsPartition函数解析在解析分区过程中会调用此函数。函数中会检测/dev/block/sd*路径下对应块设备文件的生成主要就是做了这样的一个判断。如果U盘设备接入vold程序执行到此处时没有检测到块设备文件生成则会造成U盘设备挂载失败//release/system/vold/model/Disk.cppbool Disk::isEntireDiskAsPartition(constintpart){intiPosmSysPath.find(/block/);if(iPos0||part1){LOG(INFO)can not find block dir.;returnfalse;}std::string physicalDevStringPrintf(/dev/block/%s,mSysPath.substr(iPos7).c_str());intretry8;while(true){intretaccess(physicalDev.c_str(),F_OK);if(ret){LOG(INFO)fail to access physical dev:physicalDev;retry--;usleep(50000);}else{break;}if(!retry){LOG(INFO)physical dev: physicalDev doesnt exist;returnfalse;}}std::string partDevName;for(inti1;ipart;i){if(mFlagsFlags::kUsb){partDevNameStringPrintf(%s%d,physicalDev.c_str(),i);}elseif(mFlagsFlags::kSd){partDevNameStringPrintf(%sp%d,physicalDev.c_str(),i);}retry4;while(true){intretaccess(partDevName.c_str(),F_OK);if(ret){retry--;usleep(50000);}else{LOG(INFO)now can access :partDevName;returnfalse;}if(!retry){LOG(INFO)physical dev: partDevName doesnt exist;break;}}}LOG(INFO)physical dev: physicalDev[1-part] doesnt exist;returntrue;}4. 总结U盘设备有不同的接口类型和分区格式。比如type-Ctype-ANTFS,FAT等。UUID是linux区分U盘设备分区的属性每个U盘应该具有唯一的UUIDVold挂载U盘设备过程中会去检测/dev/block/sd*路径下设备文件是否生成如果该设备文件未生成会挂载失败。

相关新闻

LLM语义约束合成与自适应轨迹优化实战

LLM语义约束合成与自适应轨迹优化实战

1. 项目概述:这不是又一个“LLM机器人”的概念包装,而是一套可落地的语义-运动联合建模闭环“LLM驱动的语义约束合成与自适应轨迹优化”——光看标题,很多人第一反应是“高大上但难落地”,甚至怀疑是不是把几个热词硬凑在一起。我…

2026/7/7 11:53:48阅读更多 →
RAG 多索引路由:别让所有问题都冲向同一个向量库

RAG 多索引路由:别让所有问题都冲向同一个向量库

RAG 多索引路由:别让所有问题都冲向同一个向量库 一、多索引不是为了显得架构复杂 RAG 系统做大以后,知识来源会越来越多。产品文档、工单、代码仓库、FAQ、指标说明都可能进入知识库。如果全部塞进一个向量索引,召回会变得混乱。用户问代码错…

2026/7/7 11:53:48阅读更多 →
腾讯混元 Hy3 开源:多任务比肩大尺寸模型,多项指标显著优化

腾讯混元 Hy3 开源:多任务比肩大尺寸模型,多项指标显著优化

【导语:继 4 月底发布 Hy3 preview 后,腾讯混元 Hy3 现已开源,在推理、智能体、长上下文等任务上显著进步,多项指标优化明显,成为高性价比可靠选择。】混元 Hy3 开源:多维度升级亮点足 腾讯混元 Hy3 在发布…

2026/7/7 11:53:48阅读更多 →
小微企业低成本勒索软件防护实战指南:从攻击链分析到自动化脚本部署

小微企业低成本勒索软件防护实战指南:从攻击链分析到自动化脚本部署

1. 项目概述:为什么小微企业必须自己动手防勒索?勒索软件,这个词对很多小微企业主来说,可能既熟悉又陌生。熟悉是因为新闻里隔三差五就有某大公司被攻击、数据被锁、被迫支付巨额赎金的消息;陌生则是觉得“那是大公司才…

2026/7/7 12:48:53阅读更多 →
数据挖掘 4大核心任务对比:分类、聚类、回归、关联规则(附 Scikit-learn 实现)

数据挖掘 4大核心任务对比:分类、聚类、回归、关联规则(附 Scikit-learn 实现)

数据挖掘四大核心任务深度解析:从原理到Scikit-learn实战数据挖掘正悄然重塑商业决策与科学研究的范式。当企业面对TB级用户行为数据时,如何精准识别高价值客户?当医疗机构积累百万份电子病历后,怎样预测疾病风险?这些…

2026/7/7 12:48:53阅读更多 →
浏览器中的SVG绘图神器:SVG-edit免费矢量图形编辑器入门指南

浏览器中的SVG绘图神器:SVG-edit免费矢量图形编辑器入门指南

浏览器中的SVG绘图神器:SVG-edit免费矢量图形编辑器入门指南 【免费下载链接】svgedit Powerful SVG-Editor for your browser 项目地址: https://gitcode.com/gh_mirrors/svg/svgedit 还在为复杂的矢量图形软件而发愁吗?想找一个既免费又强大的S…

2026/7/7 12:48:53阅读更多 →
Fast-GitHub终极指南:如何让国内GitHub下载速度飙升20倍以上

Fast-GitHub终极指南:如何让国内GitHub下载速度飙升20倍以上

Fast-GitHub终极指南:如何让国内GitHub下载速度飙升20倍以上 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub GitHub作为…

2026/7/7 12:48:53阅读更多 →
Linux 环境变量课堂笔记

Linux 环境变量课堂笔记

一、什么是环境变量1. 基础概念环境变量是操作系统 / Shell 提供的键值对 变量名值,用于存储会话、系统配置信息,程序、脚本可直接读取使用。作用:在内存持久存储数据,方便 Shell、应用程序调用。命名规范:系统自带环境…

2026/7/7 12:48:53阅读更多 →
Photoshop全版本安装部署指南:兼容性、离线安装与错误排查

Photoshop全版本安装部署指南:兼容性、离线安装与错误排查

1. 项目概述:为什么一个“PS安装包合集”值得花2000字讲清楚? Photoshop,这个在设计、摄影、电商、新媒体甚至学生作业里无处不在的软件,它的安装过程,远比“双击下一步”复杂得多。我从2012年开始带设计团队&#xf…

2026/7/7 12:43:53阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/7 1:03:28阅读更多 →
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8…

2026/7/7 0:02:41阅读更多 →
国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot) 🌐 演示地址:http://ruoyioffice.com | 📦 源码1GitHub:ruoyi-office | 📦 源码2GitCode:ruoyi-o…

2026/7/7 0:02:41阅读更多 →
CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS SSH连接故障排查:从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时,突然遭遇"Connection refused"或"Connection timed out"的错误提示,这种经历对任何运维人员或开发者来…

2026/7/7 0:02:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/7 5:11:21阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →