安卓的根文件系统
安卓的根文件系统比较特殊它不遵循传统 Linux 的 FHS文件系统层次结构标准因此你熟悉的/usr、/usr/bin等目录在根目录下并不存在。️ 根文件系统用的是什么现代安卓的根文件系统通常是system-as-root。从 Android 10 开始构建系统会将原本属于根目录的内容合并到system.img中并在启动时直接把它挂载为根文件系统/。因此你在安卓根目录/下能看到的内容很大程度上就是system分区里的内容。 那/usr和/usr/bin在哪里它们并不在根目录下而是被移到了/system/usr目录内。具体来说/system/usr这个目录存放的是非启动必要的程序和数据比如键盘布局、共享文件、时区数据等。关于/system/usr/bin传统的 Linux 发行版里/usr/bin存放用户命令。而在安卓中所有系统级的可执行二进制文件包括核心命令和工具统一放在/system/bin目录下。 安卓根目录下实际有什么为了让你更清晰地了解安卓的文件结构以下是根目录/下常见的关键目录/system存放系统核心文件相当于 Windows 的C:\Windows。/data用户数据分区存放你的 App、照片、设置等个人数据。/vendor存放设备制造商如高通、联发科的私有驱动和配置。/proc、/sys、/dev内核和设备的虚拟文件系统用于进程、设备和系统信息交互。/sbin存放一些启动阶段必需的二进制文件但现代安卓中很多命令都是指向/system/bin的软链接。所以如果你在安卓设备上运行ls /usr通常会提示目录不存在。只有在Termux这类模拟了标准 Linux 环境的 App 里/usr才会以“前缀路径”如/data/data/com.termux/files/usr的形式存在。 安卓系统更新系统更新是一个跨分区协作的过程但核心写入目标是“系统分区”及其相关分区。现代安卓采用A/B 无缝更新或动态分区机制具体流程如下下载更新包更新包通常下载到/data分区的一个临时目录如/data/ota_package。写入非活动槽位在 A/B 更新中设备有两个系统槽位Slot A 和 Slot B。当前运行的是 A更新时会把新系统写入B 槽位的系统分区包括system、vendor、boot等。切换启动写入完成后重启设备引导程序切换到 B 槽位启动。此时新的系统分区生效。/data 分区的角色/data不会被系统更新直接覆盖。更新后系统会执行数据迁移将旧版本的用户数据适配到新系统。如果新系统与旧数据不兼容可能会提示清除数据即清空/data。A/B分区在 A/B 设备上每个需要更新的静态分区如boot、vendor_boot、dtbo都存在两份副本。它们的实际分区名会直接加上槽位后缀例如boot_a和boot_b、vendor_boot_a和vendor_boot_b。动态分区逻辑名称带槽位标识对于包含system、vendor、product等子分区的super动态分区槽位区分方式略有不同。super分区本身不带后缀但其中的逻辑分区在元数据层面会通过后缀来标识例如system_a和system_b、vendor_a和vendor_b。在系统的设备映射器device-mapper中它们会呈现为/dev/block/mapper/system_a或/dev/block/mapper/system_b。挂载点名称不带后缀尽管底层物理或逻辑分区名带有_a/_b但系统在启动后挂载这些分区时使用的挂载点名称是统一的、不带后缀的。例如无论是system_a还是system_b被激活它都会被挂载到/system这个路径下同理vendor_a或vendor_b都会挂载到/vendor。系统通过内核命令行参数androidboot.slot_suffix来告知引导加载程序当前应选择哪个槽位的分区。总结系统更新主要写入的是“系统分区”system、vendor、boot等以及可能包含product、system_ext等动态分区。/data分区是用户数据的家系统更新会尽量保留它但更新过程中的临时文件也存放在这里。