1. 程式人生 > >[日更-2019.5.21] Android 系統的分割槽和檔案系統(一)--Android分割槽的大概框架

[日更-2019.5.21] Android 系統的分割槽和檔案系統(一)--Android分割槽的大概框架

宣告

  • 其實我在剛開始接觸Android時給手機刷機,很好奇Android的刷機包裡面怎麼這麼多img檔案?而且每個img要刷入對應的分割槽,就有點頭大了,就好奇一個破手機分這麼多區幹什麼?;
  • 再加上今天同事問我相關分割槽的事情,我又細研究了下關於這部分東西,同時很多借鑑了網上很多開源知識及相關書籍內容;

0 寫在前面的

    以我的Nexus5手機的cm-14.1的Android AOSP程式碼來說,編譯完成後主要生成的img檔案有:boot.img、cache.img、recovery.img、system.img、userdata.img

     而一般刷機時會寫一個刷機指令碼,執行它刷機就可以了。

#!/bin/bash
echo "Flashing build. If nothing mentions that it flashed anything and it looks stuck, make sure you have the drivers installed."
fastboot flash boot ./boot.img
fastboot flash system ./system.img
fastboot flash recovery ./recovery.img
fastboot flash cache ./cache.img
fastboot flash userdata ./userdata.img

fastboot reboot

    其實,上面列出的就是通常說的Android的五大分割槽,分割槽是檔案系統的基礎,只有在不同分割槽裡才能實現不同的檔案系統(就像電腦磁碟有NTFS和FAT,只能在不同的盤裡面修改檔案系統,而不能在一個盤裡分出兩種檔案系統來,一個道理),手機/平板上的一整塊Flash儲存器被切割成不交叉的部分,每部分都可以單獨格式化,用於不同的使用目的。比如:/system分割槽就是用來安裝作業系統的地方;/data分割槽就是用來給使用者儲存資料用的。     說道Flash就不等不說一個坑,以前買U盤買了個16GB的,買回來插在電腦上一看也就14GB左右,因為我們認為的1GB = 102410241024B,而Flash商家的1GB = 10001000

1000B。

    言歸正傳,正常的手機/平板的分割槽可不止這5個,有的廠商的手機分割槽多達20幾個。雖然分這麼多區,並不是每個區都會被系統mount上來給使用者看到,而且使用者也能且僅能向一個分割槽寫入資料(那就是/data分割槽),以我接觸到的一部聯發科平板來說,它的分割槽如下:

      

1 那麼問題來了--Android系統為何會分這麼多區?

    採用多分割槽方案的原因是移動裝置需要安全和自由,安全方面比如說系統啟動時靠的是/boot分割槽中的核心映象啟動的,在系統升級時,升級包會下載到/cache分割槽,在刷機時系統進入的是/recovery分割槽中的核心映象啟動升級的,各個分割槽各司其職,相互不會沖洗掉彼此。自由方面指的是一些比如像modem或其他元件(比如bootloader)等需要擁有自己獨立儲存空間來儲存配置檔案或映象。

    通過檢視/proc/partitions檔案中的內容,可檢視Android裝置的分割槽對映情況,其中記錄了系統中所有塊裝置:

沒帶手機,回公司再貼上

還可以使用df或mount命令檢視所有的mount點:

沒帶手機,回公司在貼上

2 檔案系統

    目前Flash採用的幾乎都是eMMC和MMC,所以後面的Android4.4以後的檔案系統普遍升級到了Linux ext4,拋棄了弊端很多的YAFFS檔案系統(具體為啥拋棄它就先不管了,感興趣可以自行百度),而且ext4檔案系統自從Linux2.6.27已經成為Linux預設檔案系統,因為它經歷過很多良好測試而穩定的檔案系統。

    但是,ext4並不是針對Flash進行優化的檔案系統,所以三星設計了另外一個檔案系統F2FS(Flash Friendly File System),某些廠商將此檔案系統用在/data分割槽上,此檔案系統專為NAND Flash優化,據說在隨機寫請求上的效能提升超過了Ext4,但目前還是大部分廠商依然採用ext4檔案系統。Linux 3.8已經將F2FS合併入主線版本,高版本核心的Android系統是可以使用的。

    採用檔案系統的好處是隻要它們能夠正常工作,使用者就可以完全不用管到底底層使用的是什麼檔案系統,對於不同的檔案系統,Android提供了對應各自檔案系統的預設檢查/修復的二進位制程式(e2fsck、fsck_msdos和fsck.f2fs),當檔案系統被vold或init程序mount時這些二進位制程式會被自動執行檢查。

3 Android裝置的分割槽

    Android裝置中的各個分割槽都是有名字的(通常看不懂名字啥意思),不同的晶片組和製造商還會使用不同的分割槽,甚至會給功能完全一樣的分割槽取不同的名稱。

3.1 標準Android分割槽

    這類分割槽都有一個共同的特性:它們是被硬編碼到Android系統自身中的, 會出現在原始碼樹的各個不同的位置上。這些分割槽構成了作業系統的核心。

    標準分割槽基本上都是可以mount,僅有boot和recovery分割槽是例外。

分割槽檔案系統作用
bootbootimg核心+ initramfs。含有核心和l預設啟動過程中所需的initramfs
cacheExt4用來進行系統升級或recovery
recoverybootimg用於把系統啟動到recovery模式下,核心將系統啟動至recovery 模式的initramfs
systemExt4用於存放作業系統的二進位制可執行檔案和框架
dataExt4/F2FS存放使用者資料和配置檔案

    Android裝置中有一張檔案系統mount表,位於/system/etc/vold.fstab或/fstab.hardware目錄下,在系統啟動過程中會被vold(卷守護程序)載入並指出了哪些分割槽應該被自動mount上來。

3.2 晶片組專用分割槽

    晶片組製造商經常需要一些分割槽用來儲存支援晶片組工作的程式和資料。以高通為例,它的MSM晶片組分割槽如下所示(網上盜圖):

       

3.3 廠商專用分割槽

    Android裝置上能找到的其他分割槽就是廠商專用的了。它們根據自己的目的(大多用於裝置配置維護和升級操作)來使用這些分割槽。這些分割槽使用的檔案系統格式多為專用格式(再從網上盜圖一張):

       

Enjoy it

    寫的有點粗略,不過分割槽的大概框架就是這個意思了。下一篇寫下各個分割槽裡面存放的都是