在android R專案中執行adb remount的時候,能看到"Using overlayfs for xxx"的列印,類似如下:
#adb root
restarting adbd as root
#adb remount
Disabling verity for /system
Using overlayfs for /system
Disabling verity for /system_ext
Using overlayfs for /system_ext
Disabling verity for /product
Using overlayfs for /product
Using overlayfs for /vendor
Now reboot your device for settings to take effect
remount succeeded
那這些列印表示什么意思呢?
看列印的內容來看,有overlayfs,先看一下wiki上的描述:https://zh.wikipedia.org/wiki/OverlayFS
截取其中一段描述:
“OverlayFS的主要機制涉及當兩個檔案系統提供同一名稱的目錄時目錄訪問的合并,除此之外,OverlayFS呈現其中一個所產生的物件(如果有),“上層”檔案系統優先,OverlayFS與其他覆寫型檔案系統不同,OverlayFS合并的目錄子樹不一定是來自不同的檔案系統,”
看到這應該明白了,是為了讓lower層的vendor等磁區仍然為read-only只讀,但是又有一個對應的upper層可讀可寫,兩層不同的檔案則放入到work層,
舉個例子,當adb remount重啟設備后,往vendor磁區push內容,這時會在其upper層對應創建相同檔案名的檔案出來,如果修改此檔案名的檔案,則會優先修改upper層的資料,
overlay后,能看到vendor有三層了,lowerdir、upperdir、workdir
# mount |grep overlay
(rw,seclabel,noatime,lowerdir=/vendor,upperdir=/mnt/scratch/overlay/vendor/upper,workdir=/mnt/scratch/overlay/vendor/work,override_creds=off)
google在android專案上引入overlayfs就很巧妙了,如果沒有這個overlayfs,adb remount后vendor磁區本身就需要修改為rw可讀可寫了,而有了overlayfs,vendor磁區還是ro只讀的,原始資料不用修改,
/dev/block/dm-3 on /vendor type ext4 (ro,seclabel,relatime,discard)
overlay on /vendor type overlay (ro,seclabel,noatime,lowerdir=/vendor,upperdir=/mnt/scratch/overlay/vendor/upper,workdir=/mnt/scratch/overlay/vendor/work,override_creds=off)
adb remount執行overlayfs動作的地方在fs_mgr_remount.cpp的do_remount函式,感興趣的可以繼續跟蹤一下如下代碼的詳細實作,
if (fs_mgr_overlayfs_setup(nullptr, mount_point.c_str(), &change, just_disabled_verity)) {
if (change) {
LOG(INFO) << "Using overlayfs for " << mount_point;
reboot_later = can_reboot;
user_please_reboot_later = true;
setup_overlayfs = true;
}
} else if (errno) {
PLOG(ERROR) << "Overlayfs setup for " << mount_point << " failed, skipping";
retval = BAD_OVERLAY;
it = partitions.erase(it);
continue;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377113.html
標籤:其他
