首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
Android 9.0 system分区挂载读写:原理、步骤与避坑指南
📅 2026/9/18 20:46:59
✍️ 爱科研究院
👁 阅读 3,247
1. 为什么Android 9.0的system分区这么难搞先弄懂三件事在Android 9.0Pie上折腾“挂载system文件夹读写”最让人崩溃的不是命令记不住而是一堆似懂非懂的报错mount: /system not in /proc/mounts、adb: failed to remount partition: Permission denied严重一点的直接给你来个dm-verity verification failed然后黑屏、无限重启。很多人的第一反应是我权限不够那就adb root结果root了还是不行再网上搜教程有人让你adb disable-verity有人让你mount -o rw,remount /system一顿操作下来系统可能更糟了。我的经验是在Android 9.0上这件事之所以“难”核心不在命令而在你没有理解系统对system分区的管控逻辑。先把下面三件事弄明白后面所有操作都是顺水推舟。1.1 system-as-rootsystem分区已经被“升级”成了根文件系统从Android 9.0开始Google全面推行了system-as-root机制。什么意思呢在Android 8.0及更早的版本里内核启动时会加载一个ramdiskrootfs就在这个ramdisk里system分区只是挂在rootfs下面的一个普通目录。你可以理解为系统先有一个小“家”ramdisk再往家里摆家具system、vendor、data分区。Android 9.0之后ramdisk的内容被并入了system分区system分区本身直接作为根文件系统挂载。也就是说system分区和根目录/在某种意义上是一体的。这个变化对普通用户影响不大但对想做“挂载system读写”的人来说是致命的你要修改system等于在修改整个根文件系统内核和Android框架对根文件系统的保护级别自然是最高的。这也解释了一个常见困惑为什么mount | grep system的时候看不到system的独立挂载点了因为system已经挂在/上你看到的/system就是根文件系统的一部分或者是一个bind mount。不了解这个背景很容易在后续操作里找错挂载目标。1.2 dm-verity真正的“拦路虎”不是权限而是完整性校验很多教程只教你adb disable-verity但没说清楚它到底解决什么问题。dm-verity是Linux内核里的一个块设备层完整性校验机制简单说它会给system分区的每个块算好哈希再把这些哈希组成一棵默克尔树启动时逐块校验。只要有一个块内容和出厂时不一样内核就认为分区被篡改轻则拒绝读写重则直接拒绝正常启动。Android 9.0上verity的默认开启程度比之前更高。所以当你执行mount -o rw,remount /system时哪怕你是root用户哪怕你已经解锁了bootloader内核也会因为dm-verity在“保护”这个分区而报Permission denied。这根本不是你权限不够而是内核在拒绝一个“被篡改”的挂载行为。这也是为什么很多人改完文件、重启后一切恢复原样的原因dm-verity在启动时发现分区内容与出厂哈希不一致会自动使用“错误处理模式”或者直接回滚到原始内容你写进去的东西等于白写。理解这一点后你就会明白挂载读写的前提是先让内核放弃对system分区的完整性校验。1.3 为什么非要去动system分区以“多应用同时录音”为例聊完原理说点实际的。为什么中文网络上“Android9.0挂载system文件夹读写”这个主题热度一直很高因为很多实用功能绕不开它。举一个典型的例子让Android设备支持多个应用同时录音。默认情况下Android的音频策略是“录音输入端互斥”的一个App占用了麦克风其他App就只能拿到无声流或者直接报错。这是/system/etc/audio_policy_configuration.xml这个配置决定的。想实现微信、录音机、语音转文字等应用同时录音必须修改这个文件加入并发输入的配置然后重启生效。而这类配置文件就躺在system分区里你不做挂载读写根本没有修改它的入口。类似的需求还有很多精简厂商预装应用、替换系统内置字体、修改开机动画、调整默认权限策略、去掉状态栏里的某些限制。你会发现这些操作的核心路径都是一样的——先把system分区变成可写的再往里写文件最后通过重启验证修改是否真的持久生效。2. 动手前的准备工作解锁、root、备份一个都不能少我知道很多人看到“准备工作”四个字就想跳过直接奔着命令去。但在这个场景下准备工作直接决定你是“改一个文件”还是“变砖返厂”。尤其是Android 9.0这个版本厂商定制差异极大准备工作一旦漏掉一环后面的命令成功率会直线下降。2.1 确认Bootloader已解锁且能拿到root shell挂载system分区属于系统级操作所以你的设备必须满足两个硬性条件Bootloader已解锁能拿到root权限。Bootloader解锁一般通过厂商官方工具完成不同品牌的命令和流程差异很大。Pixel系列是fastboot flashing unlock部分国产机型需要在开发者选项里先打开“OEM解锁”开关。解锁会清空所有数据这一点必须先有心理准备。然后是root环境。这里有个很多新手会踩的坑你以为的root和系统真正需要的root不是一回事。比如你执行adb root如果设备返回adbd cannot run as root in production builds说明当前系统是release版本adbd不允许直接以root运行。解决办法通常是刷入Magisk修补过的boot镜像然后在设备端通过adb shell su来获得root。判断自己是否已经拿到root权限最简单的方式是执行adb shell su -c whoami如果输出root说明环境OK。注意有部分Magisk环境不需要adb root直接adb shell su -c 命令就能提权这两种方式在后面的流程里我会分开说明。2.2 备份system分区省五分钟后面可能省五小时我见过太多人在修改system分区前信誓旦旦“我就改一个小文件”结果改出一个无法开机。Android 9.0的system分区一旦和verity机制纠缠在一起出了问题就不是“删掉重改”那么简单了。所以在动手前建议给system分区做个镜像备份。以高通平台的设备为例分区路径一般在/dev/block/bootdevice/by-name/system可以通过下面命令备份adb shell su -c dd if/dev/block/bootdevice/by-name/system bs4096 | gzip /sdcard/system_backup.img.gz不同品牌的分区路径命名规则不一样有的是by-name有的是by-num建议先执行adb shell su -c ls /dev/block/bootdevice/by-name/看一下实际的名称。备份的镜像文件可能会很大system分区动辄2GB起步建议先确认手机存储空间充足。备份是枯燥的但这玩意儿和保险一样用不上最好一旦用上就是救命稻草。2.3 “你需要来自system的权限”这个报错可能是Windows在捣乱在搜索热词里我注意到一个很典型的疑惑“你需要来自system的权限才能对此文件夹进行更改”。这里必须先说清楚这个提示大概率不是手机报的而是Windows资源管理器报的。当你用数据线连接手机、通过MTP方式浏览设备内部存储时Windows会对部分系统目录显示这个提示尤其是你想在资源管理器里直接删除或覆盖system目录下的文件时。这是MTP协议的数据访问限制不是手机的真实权限控制。所以别在Windows窗口里和system目录死磕这条路走不通。正确的操作方式是通过adb命令在设备端操作或者先把文件push到/sdcard/下的某个临时目录再用su权限复制到system目录。这个细节看似简单却劝退了不少刚开始尝试的人。3. 完整操作流程从禁用dm-verity到真正写入文件环境确认完毕下面进入正题。我给的步骤会在“通用性”和“成功率”之间做个平衡优先使用Google官方工具链支持的方案再补充手工挂载的进阶手段最后讲清怎么验证修改是不是真的生效了。3.1 一条标准路线disable-verity 重启 remount先上最常用的标准流程适用绝大多数“bootloader已解锁、已root、system分区为ext4”的设备# 1. 让adbd以root身份运行 adb root # 2. 关闭dm-verity校验部分设备还要顺便关掉AVB adb disable-verity # 3. 重启让disable-verity的启动参数生效 adb reboot # 4. 等待设备重新连接 adb wait-for-device # 5. 再次获取root权限 adb root # 6. 尝试重新挂载system分区为可写 adb remount这里有两个极其容易踩的坑。第一个坑disable-verity之后必须重启。很多人执行完adb disable-verity紧接着就执行adb remount然后报错接着怀疑教程有问题。其实disable-verity只在重启时改变内核启动参数不重启就不生效这是机制决定的不是命令错了。第二个坑adb remount失败时不要立刻放弃。部分设备在adb remount之前需要先执行一次adb root否则会报adbd cannot run as root in production builds。如果你用的是Magisk环境adb remount可能压根不可用这时候就要用下面3.2节的手工方案。3.2 手工挂载当adb remount失效时的进阶方案如果adb remount报错或者你不知道系统里有没有这个工具可以直接手工挂载。先看一下当前system挂载在哪里、是什么状态adb shell su -c mount | grep / 在system-as-root设备上system分区直接作为根文件系统所以你需要重新挂载根目录而不是/system。常见命令是adb shell su -c mount -o rw,remount /有些设备则显式指定设备节点adb shell su -c mount -o rw,remount /dev/block/bootdevice/by-name/system /如果这一步仍然报Permission denied大概率是verity没有真正关闭或者SELinux在那里拦着。可以先临时降低SELinux限制再试adb shell su -c setenforce 0 adb shell su -c mount -o rw,remount /我个人更推荐在安卓9.0机型上优先尝试mount -o rw,remount /因为很多设备的/system只是根目录下的一个子目录你改了/system的挂载标志实际数据还是在根文件系统里反而容易造成“看起来可写、实际写不进去”的假象。而重新挂载根目录能直接解决这个逻辑不一致的问题。3.3 写入文件挂载只是开始权限和SELinux才是细节等系统提示挂载成功后你可以用adb push把文件传到设备端再通过su复制到system目录。以修改音频策略配置为例完整流程是这样的# 先把修改好的文件推送到临时目录 adb push audio_policy_configuration.xml /sdcard/ # 复制到system/etc目录 adb shell su -c cp /sdcard/audio_policy_configuration.xml /system/etc/audio_policy_configuration.xml # 修正属主和权限 adb shell su -c chown root:root /system/etc/audio_policy_configuration.xml adb shell su -c chmod 644 /system/etc/audio_policy_configuration.xml # 恢复SELinux上下文 adb shell su -c restorecon /system/etc/audio_policy_configuration.xml # 强制落盘 adb shell su -c sync这里每一步都别省。chown和chmod决定配置文件能不能被系统进程正常读取restorecon是恢复SELinux上下文的关键步骤如果不执行哪怕文件权限对了audio服务也可能因为SELinux类型不匹配而读取失败。最烦人的是这种失败通常不会直接报“文件不存在”而是服务启动时静默跳过排查起来特别费劲。另一个小技巧修改任何XML配置文件前先备份原文件。比如mv /system/etc/audio_policy_configuration.xml /system/etc/audio_policy_configuration.xml.bak。因为XML一旦出现格式错误可能会导致音频服务崩溃、声音消失甚至无法开机有原文件在手就能随时恢复。3.4 重启后修改消失你可能没写进“真正的system”这是所有人都会遇到的疑惑。明明挂载显示rw文件也成功push进去了但一重启system目录里的改动要么消失要么又变成只读。原因多半是你的写入只落在了overlayfs的临时层里没有真正写进底层分区。在Android 9.0上adb remount的实现方式类似于在system分区上叠加一层可写的overlay让修改“看起来生效”但重启后overlay销毁一切还原。验证方法是在重启前查看挂载信息adb shell su -c cat /proc/mounts | grep system如果输出里出现了overlay字样恭喜你你很可能遇到了“伪成功”挂载。这种情况下想让修改持久化两条路一是彻底关闭overlay机制直接以rw方式重新挂载底层ext4分区二是走镜像级修改方案第5节在PC上改好system镜像再整体刷回去。后者更稳但操作门槛稍高。4. 常见问题速查报错、原因与解决办法这一节我把实际操作中最容易遇到的报错整理成了速查表方便大家对照排查。这些坑都是从真机测试里一个个踩出来的比看十篇教程都管用。报错/现象根本原因快速解决办法dm-verity verification failedsystem分区内容被修改但校验未关闭先进入fastboot刷回原版system或从备份恢复再走一遍disable-verity流程mount: Permission deniedbootloader未解锁 / adbd无root / verity未关闭检查解锁状态adb root或su提权重启前确认disable-verity已执行adb: failed to remount partitionadb remount工具不可用或verity仍开启改用mount -o rw,remount /手工挂载Magisk环境建议用su提权后执行Read-only file system挂载参数没生效或启动参数强制只读setenforce 0后重试确认挂载目标是/而不是/systempush成功但文件找不到SELinux上下文或属主错误执行restorecon、chown、chmod再用ls -lZ检查上下文重启后修改全部还原overlayfs临时层写入未写到底层分区查看/proc/mounts确认是否有overlay改用镜像级修改方案开机卡Logo或无限重启修改损坏了系统关键文件用备份镜像恢复或重新刷入原厂system分区Windows提示“需要来自system的权限”MTP协议对系统目录的限制放弃资源管理器直接改文件改用adb shell或先push到sdcard再复制4.1 三个“不要”都是血泪教训第一个“不要”不要在Windows资源管理器里直接拖拽system目录的文件。除了前面说的MTP权限问题这种方式还可能因为复制中断导致半截文件系统直接崩溃。第二个“不要”不要以为adb remount是万能钥匙。我见过一些教程过度简化仿佛只要敲了这一条命令system分区就永久可写了。实际上它在很多环境中只是一个“临时可写”的工具不能替代对verity和overlay的理解。第三个“不要”不要在没备份的情况下修改系统配置文件。很多人改的是XML顺手改错一个标点系统服务就直接罢工。配置文件的原件一定要在改之前保存好最好保存在电脑本地和sdcard两个位置双保险。4.2 我的习惯改文件前先做一次“现场快照”除了备份system分区镜像这种重操作我还有一个轻量级习惯在修改某个具体配置文件前先把这个文件复制一份到sdcard同时用sha1sum记录原始哈希值。这样万一改坏了我不用恢复整个system镜像只要用原来的文件覆盖回去就行。对于只改一两个配置文件的场景这个习惯比全量备份快得多。5. 从“临时可写”到“永久修改”镜像级刷写与Magisk模块方案挂载system读写只是手段最终目的是让修改“稳”。你肯定不希望每次重启都重新来一遍挂载流程。所以我强烈建议在理解了手工挂载之后还要知道两条真正能“一劳永逸”的路子。5.1 镜像级修改最稳定的持久化方案所谓镜像级修改就是把system分区整个dump到电脑上在电脑端解包、修改、重新打包再通过fastboot整体刷回手机。这个方案的优点是修改真正写进了底层分区没有任何overlay干扰重启也不会还原缺点是流程长、速度慢、刷错一步就是砖。大致流程是# 1. 备份system分区到PC adb shell su -c dd if/dev/block/bootdevice/by-name/system bs4096 system_raw.img # 2. 如果用到了稀疏镜像需要先转换 # Android镜像常见格式是sparse image先用simg2img转成raw simg2img system_raw.img system_raw_ext4.img # 3. 在Linux上挂载镜像或使用ext4工具直接操作 mkdir -p /mnt/system_mnt mount -o loop system_raw_ext4.img /mnt/system_mnt # 修改/mnt/system_mnt下的文件 # 4. 重新打包并刷回 umount /mnt/system_mnt img2simg system_raw_ext4.img system_new.img fastboot flash system system_new.img镜像级修改的难点在于dd备份出来的镜像可能是raw格式也可能是sparse格式文件大小动辄几个GB电脑磁盘空间要提前准备好。而且不同厂商的分区表不同刷回时还要注意分区槽位slot A/B不是无脑fastboot flash system就行的。5.2 Magisk模块方案不想动底层时的聪明选择如果你的需求只是“让某些系统文件看起来被修改了”并不强求真正写进system底层那Magisk模块才是现代安卓上更推荐的做法。它的原理是在启动时用overlayfs机制把模块目录里的文件映射到/system对应路径上实现“覆盖式修改”但底层system分区完全不碰。做Magisk模块的优点显而易见修改可以随时启用/停用不用反复刷机不影响dm-verity不需要关闭系统校验即使模块出问题删除模块目录就能恢复。缺点是它并不能修改那种要求“物理上改变system分区”的底层行为而且每个模块的目录结构需要按规范写。如果你只是想让“多应用同时录音”这类配置生效我个人现在更倾向于先用Magisk模块方案验证配置是否有效确认无误后再决定要不要走镜像级修改。毕竟在Android 9.0之后直接改底层system分区的风险已经越来越高能靠overlay解决的就别硬刷。5.3 从Android 9.0往后看为什么越来越直接改不动system写到这里还是想多说一句方向性的判断。Android 9.0之后系统对system分区的保护只会越来越严。Android 10、11引入动态分区super分区后/system、/vendor、/product这些分区都被合并进super分区里不再是独立的物理分区手工remount的路径再一次变化。同时AVBAndroid Verified Boot的推广让校验链条更完整你改一个块启动时就会被发现。所以“挂载system文件夹读写”这个操作正在从普通玩家可行的日常小技巧慢慢变成一个更小众、更偏向底层开发者的技术活。如果你现在还在用Android 9.0设备还能用这篇文章里的方法轻松搞定那真的要珍惜了。往后兼容的路径我更建议尽早适应Magisk模块、镜像级修改这些“更现代”的工具链。6. 最后一点私人建议先跑通流程再动真格我自己的最大教训是越急着改越容易翻车。第一次改音频并发录音配置时我全程都没留意overlay这个变量连续三次费劲挂载、写入、重启结果开机后配置又变回原样白白折腾了大半天。直到认真看了/proc/mounts才发现自己一直在跟临时层较劲根本没有触碰到底层分区。所以不管你打算改什么文件我都建议先在旧设备或模拟器上完整跑一遍流程从disable-verity到挂载、写入、重启验证确认每一步都在自己的掌控范围内之后再拿到主力设备上实操。同时每次改完都做一次重启验证看看你的修改是不是真的留住了而不是只在内存覆盖层里“自嗨”。运气好的话一次成功运气不好备份还在一切可以从头再来。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/18 20:41:59
OpenClaw 模型通道不走官方,改到 TaoToken 通道行不行?
2026/9/18 20:41:59
BabelDOC:一条命令把英文 PDF 论文翻成中英对照,排版公式原样保留
2026/9/18 20:41:59
VS Code C/C++头文件报错真相:IntelliSense路径配置指南
2026/9/18 21:17:01
用 Fleet 检测 Mini Shai-Hulud npm 供应链蠕虫:从感染链拆解到双层检测实战
2026/9/18 21:17:01
中国象棋将帅问题与单字节状态压缩:基于 leetcode 仓库每日一题的位运算编码实战
2026/9/18 21:17:01
TOGAF中文课件:国产化场景下的企业架构落地实战指南
2026/9/18 21:17:01
全员网络安全意识培训:从钓鱼演练到效果量化的实战指南
2026/9/18 21:17:01
Ubuntu 20.04 软件中心与软件安装:apt/snap 恢复指南
2026/9/18 21:12:01
Security-101 身份与访问管理(IAM)核心概念:最小权限、职责分离与认证授权实战指南
2026/9/18 0:04:47
AReaL 调试指南:从 Agent Workflow 验证到分布式训练死锁诊断
2026/9/18 0:04:47
MATLAB实现GPS L1 C/A信号仿真与二维捕获验证
2026/9/18 0:04:47
彻底搞懂ASCII、Unicode与UTF-8:从乱码根源到编码实战
2026/9/18 16:05:49
拯救者Y7000黑屏故障排查与维修实战指南
2026/9/18 3:56:12
AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
2026/9/18 13:25:13
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化