fstab 檔案保存在哪
按照android檔案,Android 4.3 及更高版本,init、vold和recovery所用到的都是/fstab.<device>檔案,但是在AndroidO 的中,似乎發生了變化,
在fsmgr中,fstab 的來源有兩個,一個是device tree中指定,另一個則是從fstab.<device>檔案中加載,這兩個來源的中的fstab配置最侄訓被合并到一起,

-
fstab 檔案
可以看出,AndroidO中配置
fstab檔案的地方有三個:/odm/etc/、/vendor/etc/和/,優先級由大變小,
fstab.
中的 device 值就是屬性 ro.boot.hardware 的值,如果沒有配置該屬性,就會去/proc/cmdline中讀取hardware的值,還讀不到就去查找 device tree,
在Rockchip平臺上,fstab.rk30board直接保存到了根目錄,不太清楚為啥不按照安卓標準,放在
/vendor/etc目錄下面額,
-
設備樹中的配置
通過查看RK339的設備樹檔案,可以看到
system和vendor磁區的配置是在設備樹中配置的,
決議fstab
fstab的基本格式如下:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src: sysfs(/sys)下可以的設備的路徑,路徑必須以/開頭,設備的實際路徑是/sys$(src),mnt_point: 設備掛載路徑,type: 該設備的上的卷的檔案型別,mnt_flags:Vold會忽略該欄位,所以,對于由vold管理的設備,該欄位可以設定為defaultsfs_mgr_flags:fs_mgr_flags:Vold會忽略此欄位中不包含voldmanaged=標記的統一的 fstab 中的任何行,該標記必須后跟描述卡的標簽,以及磁區號或字詞auto,例如:voldmanaged=sdcard:auto,
fs_msg中,使用 struct fstab來表示fstab檔案中的資料,使用struct fstab_rec來表示fstab中的每一條記錄,
struct fstab {
int num_entries; // fstab中的記錄數
struct fstab_rec* recs; // fstab中的所有條目
char* fstab_filename; // fstab的檔案路徑
};
struct fstab_rec {
char* blk_device; // 對一個 <src>
char* mount_point; // 對應 <mnt_point>
char* fs_type; // 對應 <type>
unsigned long flags; // 對應 <mnt_flags>
char* fs_options; // <mnt_flags>中未記錄在struct flag_list mount_flags中的欄位
int fs_mgr_flags; // 對應 <fs_mgr_flags>
// -----------------------------------------------------
char* key_loc;
char* key_dir;
char* verity_loc;
long long length; // length=
char* label; // voldmanaged=sdcard:3 label=sdcard
int partnum; // voldmanaged=sdcard:3 partnum = 3 auto partnum = 1
int swap_prio; // swapprio=
int max_comp_streams;
unsigned int zram_size;
uint64_t reserved_size;
unsigned int file_contents_mode;
unsigned int file_names_mode;
unsigned int erase_blk_size;
unsigned int logical_blk_size;
};
struct fstab_rec的前6個,就分別對應fstab中記錄項,后面的就是記錄fs_mgr_flags中的引數的值,
struct fstab_rec->fs_options比較特殊,其記錄的是mnt_flags中,未記錄的引數型別,當執行mount的時候,他將直接作為引數傳遞過去,static struct flag_list mount_flags[] = { { "noatime", MS_NOATIME }, { "noexec", MS_NOEXEC }, { "nosuid", MS_NOSUID }, { "nodev", MS_NODEV }, { "nodiratime", MS_NODIRATIME }, { "ro", MS_RDONLY }, { "rw", 0 }, { "remount", MS_REMOUNT }, { "bind", MS_BIND }, { "rec", MS_REC }, { "unbindable", MS_UNBINDABLE }, { "private", MS_PRIVATE }, { "slave", MS_SLAVE }, { "shared", MS_SHARED }, { "defaults", 0 }, { 0, 0 }, };
從fstab檔案決議
實際決議程序就是逐行決議,然后分割字串,沒啥好記錄的,代碼太長就不貼了,可以看一下決議函式:
static struct fstab *fs_mgr_read_fstab_file(FILE *fstab_file) {
// [1] 統計行數
// [2] 分配 fstab 記憶體和 fstab_rec 記憶體
// [3] 逐行決議
}
從設備樹決議
內核DTS中的配置,最終都會在目錄/proc/device-tree下體現,android也有一些自有配置,其目錄是/proc/device-tree/firmware/android,其中fstab就記錄在該目錄下(完整目錄就是/proc/device-tree/firmware/android/fstab),
結合前面的 DTS截圖,最終fstab生成的目錄結構如下:
/proc/device-tree/firmware/android/fstab/
system
status
dev
type
mnt_flags
fsmgr_flags
vendor
status
dev
type
mnt_flags
fsmgr_flags
fs_mgr對其的決議程序就是遍歷/proc/device-tree/firmware/android/fstab/,一次讀取其每個子目錄的所有節點資料,每個目錄構建成一個<dev> <mnt_point> <type> <mnt_flags> <fsmgr_flags>\n形式的字串,然后拼接,

? 最后,將read_fstab_from_dt回傳的字串轉換成FILE*呼叫函式fs_mgr_read_fstab_file完成決議,

合并fstab
前面提到fs_mgr會將fstab檔案和DTS中的配置資訊合并,合并程序也很簡單,就是創建一片記憶體,將兩個部分的資料拷貝過去,

如果 fstab檔案和 DTS 中的 配置項存在重復,fs_mgr 是怎么處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/229044.html
標籤:其他

