存储-5-mount挂载


一、mount参数简介

# mount | grep data
/dev/block/dm-5 on /data type f2fs (rw,lazytime,seclabel,nosuid,nodev,noatime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,
extent_cache,mode=adaptive,active_logs=6,alloc_mode=default,fsync_mode=posix)

这行 mount 输出可以拆成 4 部分:
(1) /dev/block/dm-5:挂载源设备(source)
(2) on /data:挂载点(target)
(3) type f2fs:文件系统类型
(4) ( ... ):挂载参数(mount options)

整体含义:/data 使用 dm-5 这个块设备,格式是 F2FS,并按括号内策略运行。

快速总结这组配置风格:
(1) 安全:seclabel,nosuid,nodev
(2) 减写放大:noatime,lazytime,discard,flush_merge
(3) F2FS 优化:background_gc,inline_*,extent_cache,active_logs=6
(4) 一致性策略:fsync_mode=posix(偏稳妥)
(5) 这是一组 Android /data 上很常见、偏“稳定 + 综合性能”的挂载参数。


下面逐项解释括号里的每个参数:


1. rw

读写挂载(不是只读)。


2. lazytime

inode 的 atime/mtime/ctime 更新时间先缓存在内存,延后落盘,减少写放大。


3. seclabel

启用 SELinux 安全标签支持,Android 必需项之一。


4. nosuid

忽略 suid/sgid 位,防止通过该挂载点提权。


5. nodev

禁止解释设备文件(character/block special files),提升安全性。


6. noatime

访问文件不更新 atime,减少无意义写入。


7. background_gc=on

F2FS 后台垃圾回收开启,空闲时回收无效块。


8. discard

允许向底层设备发送 TRIM/DISCARD,帮助闪存介质回收擦除块。


9. no_heap

F2FS 关闭 heap 分配策略,采用更均衡的块分配方式(常用于降低局部热点)。


10. user_xattr

允许用户扩展属性(xattr)。


11. inline_xattr

小型 xattr 内联到 inode,减少额外块访问。


12. acl

启用 POSIX ACL 权限控制。


13. inline_data

小文件数据可内联到 inode,减少随机读写开销。


14. inline_dentry

小目录项可内联到 inode,提升小目录访问性能。


15. flush_merge

合并 flush 请求,降低 flush 频率和开销。


16. extent_cache

启用 extent 缓存,减少地址映射查找成本,提升顺序/局部访问性能。


17. mode=adaptive

F2FS 自适应模式,按运行状态动态平衡性能与回收策略。


18. active_logs=6

F2FS 使用 6 条活跃日志(多头写入),提高并发写入吞吐与冷热分离能力。


19. alloc_mode=default

默认块分配模式(不是特定的 reuse 等实验/特殊模式)。


20. fsync_mode=posix

fsync 语义采用 POSIX 兼容模式,平衡一致性与性能;比更激进模式稳妥,但可能牺牲部分极限性能。

 

二、疑问解答

1. 同一个设备可被mount到不同位置

/ # mount | grep -E 'dm-4|dm-5|/data|scratch'
/dev/block/dm-5 on /mnt/installer/0/emulated/0/Android/data type f2fs (rw,lazytime,seclabel,nosuid,nodev,noatime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,acl,
inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,alloc_mode=default,fsync_mode=posix) /dev/block/dm-5 on /mnt/user/0/emulated/0/Android/obb type f2fs (rw,lazytime,seclabel,nosuid,nodev,noatime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,
inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,alloc_mode=default,fsync_mode=posix)

这是 Android 的正常行为,你看到的现象本质是:底层只有一个真实文件系统:/dev/block/dm-5(也就是 /data 那个 F2FS)。系统把这个文件系统里的某些目录,再"映射/绑定挂载"到多个路径,给不同组件使用。所以会看到"同一个设备名出现在多个 mount 点"。

两个挂载点:
(1) /mnt/installer/0/emulated/0/Android/data
给安装器/包管理相关流程用的视图路径。主要用于受控访问应用数据目录(安装、迁移、清理等场景)。
(2) /mnt/user/0/emulated/0/Android/obb
给用户 0 的外置存储视图路径。主要用于应用 OBB 资源访问(大资源包)。

这样设计的原因:
权限隔离:不同系统服务拿到不同入口,便于 SELinux 和访问控制####。多用户支持:/mnt/user/0、/mnt/user/10 这种路径对应不同 Android 用户。存储虚拟化:把同一底层数据按不同“视图”暴露给 framework、installer、app。

实测,在挂载点(2)创建的文件在挂载点(1)下看不到。

 

posted on 2026-06-26 21:48  Hello-World3  阅读(9)  评论(0)    收藏  举报

导航