iOS 系统结构:文件与目录
了解 iOS(iPadOS)系统文件及目录,列出一些主要的及重要的文件夹和目录。以下内容是以 iOS 12.4.8 版本进行说明,不同版本目录结构有区别。
iOS 根目录文件
粗体为 iOS 系统特有目录,其它与 Unix 通用
.ba/
.mb/
.fseventsd/
‘.HFS+ Private Directory Data’$’\r’/
Applications/
Developer/
Library/
System/
User -> /var/mobile/
cores/
bin/
boot/
dev/
etc -> private/etc/
lib/
mnt/
private/
sbin/
tmp -> private/var/tmp/
var/
usr/
.mount_rw
.Trashes
.ba/
目录为空。
.mb/
目录为空。
.fseventsd/
在创建、修改或删除文件时会直接查询此日志。
‘.HFS+ Private Directory Data’$’\r’/
可能与外接 USB 设备有关。
Applications/
存放所有的系统 App 和 Cydia 的 App,但不含 AppStore 安装的 APP。
Developer/
供开发者调试使用。
Library/
存放一些提供系统支持的数据文件与帮助文档。
System/
只包含一个名为Library的目录,存放了系统的绝大部分组件。
User -> /var/mobile/
mobile 用户的 home 目录。
cores/
内核转储文件存放目录,进程崩溃时,如果系统允许则会产生转储文件。
bin/
存放提供用户级基础功能的二进制文件,如 ls、ps 等。
boot/
存放能使系统成功启动的所有文件,iOS 中此目录为空。
dev/
访问外部设备文件的接口,每个文件代表系统的一个块或字符设备。
etc -> private/etc/
存放系统脚本及配置文件, 指向 /private/etc/
。
lib/
存放系统库文件、内核模块及设备驱动等。iOS 中此目录为空。
mnt/
存放临时的文件系统挂载点。iOS 中此目录为空。
private/
存放两个目录,分别是 /private/etc
和 /private/var
。
sbin/
存放提供系统级基础功能的二进制文件,如 netstat、reboot 等。
tmp -> private/var/tmp/
临时目录,符号链接,实际指向 /private/var/tmp/
。
var/
安装的 App 应用、日志、用户数据、临时文件等。
usr/
包含了大多数用户工具和程序。
.mount_rw
在un0ver越狱模式下,建立此文件可使用checkra1n越狱。
.Trashes
文件被标记为删除但尚未删除时的去向。
Folders / Files 目录文件详解
.mount_rw
Pwn20wnd 推文:正在运行 unc0ver 越狱,并且想尝试 checkra1n 越狱而又不丢失任何调整,则可以创建一个 /.mount_rw
的空文件,然后安全地运行 checkra1n 越狱。
- 根目录下创建一个名为
.mount_rw
的文件,已有省略; - 运行 checkra1n;
- 完成之后,打开 Terminal,以 root 用户身份登录,然后运行
touch / .mount_rw
。
注:iPad mini3 12.4.8 使用 checkra1n 越狱,没有用过 unc0ver,也没有自建过,但有此文件,应该是 checkra1n 已含此文件。以上过程未经测试。
.HFS+ Private Directory Data’$’\r /
可能与外接USB设备有关。
HFS +文件系统用来分别处理硬链接的文件夹和文件的特殊文件夹。
MFS
-> HFS
-> HFS+
-> APFS
,苹果文件系统的进化,向下兼容。
.fseventsd /
在创建、修改或删除文件时会直接查询此日志目录。
目录不能访问,进入显示内容显示:Operation not permitted
。
猜测:(f)ile (s)ystem (events), logged by the a (d)aemon
。
监视后台进程 fsevents,在创建,修改或删除文件时会直接查询此日志。
文件 .Trashes
及目录 .fseventsd/
见以下文章内容分析。
.Trashes
文件被标记为删除但尚未删除时的去向,详见下文。
Library /
存放一些提供系统支持的数据文件与帮助文档,包括 Tweak 及 App 相关数据。
./Ringtones/
铃声文件
./Wallpaper/
壁纸文件
./Audio/
声音文件
./Keychains -> ../private/var/Keychains/
保存用户名,密码,网络密码,认证令牌等信息的安全容器目录。
./LaunchAgents/
存放第三方程序的代理程序 plist 文件,通常为空。
./LaunchDaemons/
存放第三方程序的守护程序 plist 文件,如 com.openssh.sshd.plist 等。
./MobileSubstrate/DynamicLibraries/
存放了所有基于 CydiaSubstrate 的插件,即 Tweak。
./PreferenceLoader/Preferences/Substrate/
监听目录。
System /
只包含一个名为 Library 的目录,存放了系统的绝大部分组件
./Library/Fonts/
字体。
./Library/CoreServices/SpringBoard.app/
桌面管理器,是用户和系统直接交互的中介。
./Library/Frameworks/
./Library/PrivateFrameworks/
存放了 iOS 公开和私有的 Framework 动态库。
这些库文件中很多找不到对应的二进制文件。这是由于dyld 为了优化启动速度,启用了 shared cache 技术,将常用的动态库打包到一个 cache 文件中预加载。
./Library/Carrier Bundles/
里面是运营商的一些配置。
./Library/PerferenceBundles/
存放系统设置中的一些设置项。
./Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
./Library/Caches/com.apple.kernelcaches/kernelcache
操作系统,只读。
dev /
dev 包含了所有 iOS 系统中使用的外部设备的端口。
设备文件分为两种:块设备文件 b
和字符设备文件 c
File_Permissions Owner Group Name
crw-rw-rw- 1 root wheel aes_0
crw------- 1 root wheel bpf[0-3]
cr--r--r-- 1 root wheel btpoweroff
c------r-- 1 root wheel btwake
crw--w--w- 1 root wheel console
crw-rw-rw- 1 root wheel cu.bluetooth
crw-rw-rw- 1 root wheel cu.debug
crw-rw-rw- 1 root wheel cu.debug-console
crw-rw-rw- 1 root wheel cu.gas-gauge
crw-rw-rw- 1 root wheel cu.iap
crw-rw-rw- 1 root wheel cu.oscar
crw-rw-rw- 1 root wheel cu.stockholm
brw-r----- 1 root operator disk*
crw-r--r-- 1 root wheel fsevents
crw------- 1 root wheel klog
brw------- 1 root operator md0
crw-rw-rw- 1 root wheel null
crw------- 1 root wheel oslog
crw------- 1 root wheel oslog_stream
crw------- 1 root wheel pf
crw------- 1 root wheel pfm
crw-rw-rw- 1 root tty ptmx
crw-rw-rw- 1 root wheel ptyp[0-f]
crw-rw-rw- 1 root wheel random
crw-r----- 1 root operator rdisk*
crw------- 1 root operator rmd0
crw-rw-rw- 1 root wheel tty
crw-rw-rw- 1 root wheel tty.bluetooth
crw-rw-rw- 1 root wheel tty.debug
crw-rw-rw- 1 root wheel tty.debug-console
crw-rw-rw- 1 root wheel tty.gas-gauge
crw-rw-rw- 1 root wheel tty.iap
crw-rw-rw- 1 root wheel tty.oscar
crw-rw-rw- 1 root wheel tty.stockholm
crw-rw-rw- 1 root wheel ttyp[0-f]
crw--w---- 1 root tty ttys000
crw-rw-rw- 1 root wheel uart.bluetooth
crw-rw-rw- 1 root wheel uart.debug
crw-rw-rw- 1 root wheel uart.debug-console
crw-rw-rw- 1 root wheel uart.gas-gauge
crw-rw-rw- 1 root wheel uart.iap
crw-rw-rw- 1 root wheel uart.oscar
crw-rw-rw- 1 root wheel uart.stockholm
crw-rw-rw- 1 root wheel urandom
crw-rw-rw- 1 root wheel zero
tty
*:终端设备;pty
*:虚拟终端;console
:控制台终端uart
*:uart终端,发送和接收字符串
设备分区信息:
/dev/disk0 Root NAND volume/dev/disk0s1 LwVM master volume/dev/disk0s1s1 系统分区 (->/)/dev/disk0s1s2 数据分区 (->/private/var)/dev/disk0s1s3 基带分区 (->/private/var/wireless/baseband_data)//基本分区有的时候不会挂载
//LwVM LightweightVolumeManager 轻量级分区管理器
var /
存放一些经常更改的文件,比如日志、用户数据、临时文件等
./root/
存放了 root 用户的文件
./mobile/
存放了 mobile 用户的文件
./mobile/Media/
存放照片录音短信邮件等媒体数据文件
./mobile//Library/
里面存放的是短信,邮件等
./mobile/Containers/Data/Application/
应用沙盒的起始目录
./mobile/Containers/Data/Application/UUID/
应用目录
./mobile/Library/Accounts/Accounts3.sqlite
该文件将包含连接到 iOS 的不同数量的帐户。即 iCloud 帐户,但也可以包含其他用户信息,如 Facebook 用户 ID,其他已连接的邮件帐户等。
./preferences/SystemConfiguration/com.apple.wifi.plist
Wifi 网络和上次访问日期
./mobile/Applications/ID/Library/Safari/History.plist
Safari 历史记录
./mobile/Containers/Data/Application/UUID/
iOS 沙盒模型目录。目录下有几个文件夹,主要是 documents、Library、tmp、SystemData。
./Documents/
存放应用运行时生成的并且需要保存的用户数据,一般需要持久的数据或者不能重新生成的数据都放在此目录中,可以在当中添加子文件夹。iTunes 或 iCloud 同步设备时会备份该目录。./Library/Caches/
存放应用运行时生成的系统缓存数据及专用的支持文件,保存应用程序再次启动过程中需要的信息,当访问网络时系统自动会把访问的 URL,以数据库的方式存放在此目录下面。iTunes 或 iCloud 不同步。系统不会清理目录中的文件。./Library/Preferences/
存放偏好设置。iOS 的设置(settings)应用也会在该目录查找应用的设置信息。iTunes 或 iCloud 同步设备时备份该目录。./tmp/
存放应用运行时所需的临时数据。当某个应用没运行时,iOS 系统重启会清除该目录下的文件。但不可依赖这种自动清除机制,应该及时手动清除。./SystemData/
存放系统数据,无对外暴露的接口。./StoreKit/
内购库./CloudKit/
基于 iCloud 云端存储,通过 API 存取数据。
usr /
包含了大多数用户工具和程序。
./bin/
包含那些 /bin
和 /sbin
中未出现的基础功能,如 nm、killall 等;./include/
包含所有的标准 C 头文件;./lib/
存放库文件。
/usr/lib/dyld
动态链接器。
在 iOS 系统中,每个程序依赖的动态库都需要通过 dyld 加载到内存,很多系统库几乎是每个程序都会用到的,如果在每个程序运行的时候都重复的去加载一次,势必造成运行缓慢。
为了优化启动速度和提高程序性能,共享缓存机制就应运而生。所有默认的动态链接库被合并成一个大的缓存文件,放到 /Library/Caches/com.apple.dyld/
目录下,按不同的架构保存分别保存着。
private /
存放两个目录,分别是 /private/etc
和 /private/var
。
./var/containers/Shared/
共享数据目录。
./var/mobile/Media/DCIM/
相册。
./var/mobile/Media/Recordings/
录音。
./var/mobile/Containers/Data/Application/
APP数据目录。
./var/containers/Bundle/Application/
APP二进制目录。
./var/Keychains/keychain-2.db
Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌。它是一个sqlite数据库,其保存的所有数据都是加密过的。
./etc/fstab
控制根分区和介质分区的读 / 写访问。只需修改此文件以授予对根分区 /dev/ disk0s1s1
的完全读 / 写访问权限。fstab 文件由于包含文件系统挂载点,这个文件通常被越狱工具替换用于将 root 分区读写打开。
一般越狱后,fstab文件内容为:
/dev/disk0s1s1/hfs rw 0 1 //越狱前 ro/dev/disk0s1s2/private/var hfs,nosuid,nodev rw 0 2
但 checkra1n 并未改变此文件,包括大小。有时越狱检测会检查 fstab 大小,一般越狱后由80K变为65K。
持续更新中~