Android 根目錄和sdcard卡路徑分析
一、系統分割槽
# adb shell
# mount
- 1
- 2
rootfs / rootfs ro 0 0
tmpfs /dev tmpfs rw,mode=755 0 0
devpts /dev/pts devpts rw,mode=600 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
none /acct cgroup rw,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,cpu 0 0
/dev/block/mtdblock0 /system yaffs2 ro 0 0
/dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0
/dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0
/dev/block/vold/179:0 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,err ors=remount-ro 0 0
/dev/block/vold/179:0 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,uid= 1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf 8,errors=remount-ro 0 0
tmpfs /mnt/sdcard/.android_secure tmpfs ro,size=0k,mode=000 0 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
以上就是 Android 系統的分割槽結構,可見其掛載方式和 Linux 非常類似
-
/dev/block/mtdblock* 這幾個核心分割槽(寫入 ROM 的),他們都是使用 yaffs2 檔案系統(基於 FLASH 儲存),
- 其中是 /system 這個分割槽只有特殊的 ro 只讀許可權,由此可見 Android 在安全性設計方面所下的一些功夫。
-
/dev/block/vold 據說是設計來替代 udev 的功能,主要用於支援一些熱插拔裝置。
二、目錄概覽
# ls -l
- 1
dr-x------ root root 2011-08-18 10:36 config
drwxrwx--- system cache 2011-06-21 05:32 cache
lrwxrwxrwx root root 2011-08-18 10:36 sdcard -> /mnt/sdcard
drwxr-xr-x root root 2011-08-18 10:36 acct
drwxrwxr-x root system 2011-08-18 10:36 mnt
lrwxrwxrwx root root 2011-08-18 10:36 d -> /sys/kernel/debug
lrwxrwxrwx root root 2011-08-18 10:36 etc -> /system/etc
drwxr-xr-x root root 2010-06-30 21:06 system
drwxr-xr-x root root 1970-01-01 00:00 sys
drwxr-x--- root root 1970-01-01 00:00 sbin
dr-xr-xr-x root root 1970-01-01 00:00 proc
-rwxr-x--- root root 12995 1970-01-01 00:00 init.rc
-rwxr-x--- root root 1677 1970-01-01 00:00 init.goldfish.rc
-rwxr-x--- root root 107412 1970-01-01 00:00 init
-rw-r--r-- root root 118 1970-01-01 00:00 default.prop
drwxrwx--x system system 2011-08-12 06:54 data
drwx------ root root 2010-01-28 00:59 root
drwxr-xr-x root root 2011-08-18 10:36 dev
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
以上是 Android 根目錄下檔案目錄,根據之前的分割槽結構可以大致看出每個目錄的所處位置和大致功能,
以下是幾個重要目錄/檔案的說明:
1、mnt 掛載點目錄
2、etc 系統主要配置檔案
3、system Android 系統檔案
4、sys Linux 核心檔案
5、proc 執行時檔案
6、init.rc 啟動指令碼
7、default.prop 系統屬性配置檔案
8、data 使用者程式目錄
9、dev 裝置檔案
下面來看下system目錄和data目錄:
2.1、system目錄
# ls -l /system
- 1
drwxr-xr-x root root 2010-06-30 21:03 usr
drwxr-xr-x root root 2010-06-30 21:07 app
drwxr-xr-x root root 2010-06-30 21:05 lib
drwxr-xr-x root root 2010-06-30 21:07 etc
drwxr-xr-x root root 2010-06-30 21:06 framework
-rw-r--r-- root root 1532 2010-06-30 20:58 build.prop
drwxr-xr-x root shell 2010-06-30 21:04 xbin
drwxr-xr-x root root 2010-06-30 21:00 tts
drwxr-xr-x root root 2010-06-30 21:00 media
drwxr-xr-x root root 2010-06-30 21:00 fonts
drwxr-xr-x root shell 2010-06-30 21:04 bin
drw-rw-rw- root root 2011-08-18 10:36 lost+found
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
以上是 system 目錄下面的主要檔案目錄下面也簡單介紹一下:
1、usr 使用者資料夾,包含共享、鍵盤佈局、時間區域檔案等
2、app 常規下載的應用程式,這些 apk 包都是受保護的哦
3、lib 系統底層庫,如平臺執行時庫等
4、etc 系統的配置檔案,比如APN接入點設定等核心配置等
5、framework Android 系統平臺核心 framework 的檔案
6、build.prop Android 系統屬性配置檔案
7、xbin 常用開發工具,比如 tcpdump/sqlite3 等
8、bin 系統工具,比如 ps/cp/pm 等
2.2、data目錄:
# ls -l /data
- 1
drwx------ root root 2011-06-22 02:32 property
drwxrwx--t system misc 2011-06-21 05:32 misc
drwxrwx--x shell shell 2011-06-21 05:32 local
drwxrwx--x system system 2011-06-21 05:32 app-private
drwx------ system system 2011-06-21 05:33 backup
drwxrwxr-x system system 2011-08-12 06:54 anr
drwxrwx--x system system 2011-08-20 06:50 app
drwxrwx--x system system 2011-08-20 06:50 data
drwxr-x--- root log 2011-06-21 05:32 dontpanic
drwxrwx--x system system 2011-08-20 06:50 dalvik-cache
drwxrwxr-x system system 2011-08-22 06:40 system
drwxrwx--- root root 2011-06-21 05:32 lost+found
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- /data 目錄下結構都和應用有關,平時安裝的使用者應用/遊戲程式,對應APP的資料,都被安裝在 /data/app 下就可以了。
2.3、檢視系統變數:
# set
- 1
ANDROID_ASSETS=/system/app
ANDROID_BOOTLOGO=1
ANDROID_DATA=/data
ANDROID_PROPERTY_WORKSPACE=9,32768
ANDROID_ROOT=/system
ASEC_MOUNTPOINT=/mnt/asec
BOOTCLASSPATH=/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar
EXTERNAL_STORAGE=/mnt/sdcard
IFS='
'
LD_LIBRARY_PATH=/system/lib
OPTIND=1
PATH=/sbin:/system/sbin:/system/bin:/system/xbin
PS1='# '
PS2='> '
PS4='+ '
PWD=/
_=/system/xbin
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
從系統變數我們也可以看到一些系統使用中的重要目錄。
三、掛載路徑和軟連線
以下兩篇僅供參考:
下面以sdcard的掛載和軟連線為例,分析一下,雖說是在4.2版本的android,但是原理是一樣的。
3.1、根目錄
先來看一下根目錄,可以結合上面的目錄概覽來看看每個資料夾都是什麼(圖片來自網路,所以序號不對應):
3.2、TF卡 路徑分析
不是每個系統路徑都和下面一模一樣,原理都是一樣的,可能資料夾的名稱不一樣
先看一下整體結構
/mnt/shell/emulated/0/
/\
|
|—/storage/emulated/0
|—/storage/emulated/legacy
/\
|—/storage/sdcard0/
|—/sdcard/
|—/mnt/sdcard/
/mnt/sdcard2/->/storage/sdcard1
3.2.1 /storage/路徑分析
上圖紅色框中的路徑/storage/emulated/0/是個軟連線,訪問/storage/emulated/0相當於訪問/mnt/shell/emulated/0(內部儲存)
- /storage/emulated/0/ —>/mnt/shell/emulated/0/
- /storage/emulated/legacy/—>/mnt/shell/emulated/0/
原文中說,“這裡的0代表是第幾個儲存卡,手機沒有外插的記憶體卡,就是0,有的話就會多出來一個/storage/emulated/1的資料夾。”但是經過我的測試,發現不論是否插記憶體卡,都只有一個路徑/storage/emulated/0/(內部儲存)
- /storage/sdcard0/是內部儲存
- /storage/sdcard1/是外部儲存,沒有插sd卡時,這個目錄也是存在,是個空目錄
3.2.2、三個指向storage/emulated/legacy/的路徑
storage/emulated/legacy (故名思議,傳統的)為了相容以前的系統
1、根目錄下的/sdcard/ -> storage/emulated/legacy/,說明/sdcard/ 也是內部儲存。**
2、/storage/sdcard0
3、/mnt/sdcard
3.2.3、我們去看看/mnt/shell/emulated/0/這個資料夾
3.2.4、外部儲存卡掛載
android是基於linux的,linux裡的要使用儲存裝置就要先把它掛載到到linux的目錄樹上(以/為根),android上一般是掛載到/storage/emulated/對應的目錄或者/storage對應目錄裡的。
- 外部儲存卡,被掛在到/storage/目錄下。/storage/sdcard1/是外部儲存,沒有插sd卡時,這個目錄也是存在,是個空目錄