ÂíÉÏ×¢²á£¬»ñÈ¡ÔĶÁ¾«»ªÄÚÈݼ°ÏÂÔØȨÏÞ
ÄúÐèÒª µÇ¼ ²Å¿ÉÒÔÏÂÔØ»ò²é¿´£¬Ã»ÓÐÕʺţ¿×¢²á
x
0. µ¼¶Á×ʼѧϰ Android ¶¯Ì¬·ÖÇøÔ´ÂëµÄʱºò£¬±È½Ï´úÂë·¢ÏÖ system/core/fs_mgr Ŀ¼Ï¶àÁËÒ»¸öÃûΪ fs_mgr_overlayfs.cpp µÄÎļþ£¬Ò»Ö±²»ÖªµÀʲôʱºò»áÓõ½ overlayfs¡£ ºóÀ´ÔÚ Android ¹Ù·½ÎĵµÖÐÒ²Ìáµ½ overlayfs ÓÃÓÚ adb remount ²Ù×÷£¬µ«Ã»ÓÐÖØÊÓ¡£ ×Ü´òËãµÈϵͳѧϰ overlayfs ÒÔºóÔÙ·¢Ò»Æª³¤ÎÄ£¬²»¹ýÒ»Ö±ÔÚ"´òËã"½×¶Î¡£ ×î½üÍ»·¢ÆæÏ룬ÔÚ OTA ÌÖÂÛȺÀïËÑË÷һϠremount Ïà¹ØµÄÁÄÌì¼Ç¼£¬Õâ¸öÎÊÌâÒýÆðµÄ»°ÌâʵÔÚÊÇÌ«¶àÁË£¬ËùÒÔÊÇʱºò¾õµÃÓбØÒªÏêϸ˵Ã÷ overlay ºÍ remount Õâ¸öÎÊÌâÁË¡£ ±¾ÎÄ´Ó overlay ÎļþϵͳµÄ»ù±¾ÔÀí³ö·¢£¬¼òµ¥½éÉÜÁË Linux ºÍ Android ϵͳÖÐµÄ overlay Îļþϵͳ¼°Ïà¹ØÄÚÈÝ£¬ÖصãÔÚ Android ÖÐµÄ remount ²Ù×÷»á´Ó super É豸»ò data ·ÖÇø·ÖÅä¿Õ¼äÓÃÓÚ overlay Îļþϵͳ¡£ ËùÒÔÎÄÕÂÄÚÈݺܳ¤£¬Èç¹ûÖ»¶Ô½áÂÛ¸ÐÐËȤ£¬ÇëÖ±½ÓÌøתµ½µÚ 6 ½Ú£¬×ܽá²é¿´±¾ÎÄÌáµ½µÄһЩ²Ù×÷ºÍ½áÂÛ¡£ ×îºóÒ²ÌṩÁËÒâ˼˼¿¼Ì⣬Èç¹ûÄãÄÜÇëÇåÎúµÄ»Ø´ðÕâЩÎÊÌ⣬ÎÒÏàÐÅÄãÒѾ¶Ô overlay »ò remount ÒѾÓÐÁ˱ȽÏÇåÎúµÄÈÏʶ¡£ ±¾ÎÄ×÷Ϊ¶¯Ì¬·ÖÇøϵÁеĵÚÆßƪ£¬Êµ¼ÊÉÏÔÚ¶¯Ì¬·ÖÇøÒÔºóµÄÐéÄâ A/B ÉÏÒ²ÊÊÓᣠ¶¯Ì¬·ÖÇøϵÁÐÇ°Áùƪ°üÀ¨£º Èç¹ûÄúÒѾ¶©ÔÄÁ˱¾×¨À¸£¬ÇëÎñ±Ø¼ÓÎÒ΢ÐÅ£¬ÀÄã½ø¡°¶¯Ì¬·ÖÇø & ÐéÄâ·ÖÇøרÀ¸ VIP ´ðÒÉȺ¡±¡£ 1. ʲôÊÇ overlayfs?OverlayfsÊÇÒ»ÖÖÀàËÆ aufs (advanced multi-layered unification filesystem) µÄÒ»ÖֶѵþÎļþϵͳ, ÓÚ 2014 ÄêÕýʽºÏÈëLinux-3.18Ö÷ÏßÄÚºË, Ä¿Ç°Æ书ÄÜÒѾ»ù±¾Îȶ¨(ËäÈ»»¹´æÔÚһЩÌØÐÔÉÐδʵÏÖ)ÇÒ±»Öð½¥Íƹã, ÌرðÔÚÈÝÆ÷¼¼ÊõÖиüÊÇÊÆÍ·Äѵ²¡£ Overlayfs ÒÀÀµ²¢½¨Á¢ÔÚÆäËüµÄÎļþϵͳ֮ÉÏ(ÀýÈç ext4fs ºÍ xfs µÈµÈ)£¬²¢²»Ö±½Ó²ÎÓë´ÅÅÌ¿Õ¼ä½á¹¹µÄ»®·Ö£¬½ö½ö½«ÔÀ´µ×²ãÎļþϵͳÖв»Í¬µÄĿ¼½øÐС°ºÏ²¢¡±£¬È»ºóÏòÓû§³ÊÏÖ¡£Òò´Ë¶ÔÓÚÓû§À´Ëµ£¬ËüËù¼ûµ½µÄoverlayÎļþϵͳ¸ùĿ¼ÏµÄÄÚÈݾÍÀ´×Ô¹ÒÔØʱËùÖ¸¶¨µÄ²»Í¬Ä¿Â¼µÄ¡°ºÏ¼¯¡±¡£Èçͼ 1¡£ ͼ1. Overlayfs »ù±¾½á¹¹ ÉÏͼÖÐ Lower Dir A / Lower Dir B Ŀ¼ºÍ Upper Dir Ŀ¼ΪÀ´×ԵײãÎļþϵͳµÄ²»Í¬Ä¿Â¼£¬Óû§¿ÉÒÔ×ÔÐÐÖ¸¶¨, ÄÚ²¿°üº¬ÁËÓû§ÏëÒªºÏ²¢µÄÎļþºÍĿ¼¡£Merge Dir Ŀ¼Ϊ¹ÒÔص㡣 µ±Îļþϵͳ¹ÒÔغó£¬ÔÚ merge Ŀ¼Ï½«»áͬʱ¿´µ½À´×Ô¸÷ lower ºÍ upper Ŀ¼ÏµÄÄÚÈÝ£¬²¢ÇÒÓû§Ò²ÎÞ·¨£¨ÎÞÐ裩¸ÐÖªÕâЩÎļþ·Ö±ðÄÄЩÀ´×Ô Lower Dir£¬ÄÄЩÀ´×Ô Upper Dir£¬Óû§¿´¼ûµÄÖ»ÊÇÒ»¸öÆÕͨµÄÎļþϵͳ¸ùĿ¼¶øÒÑ£¨Lower Dir ¿ÉÒÔÓжà¸öÒ²¿ÉÒÔÖ»ÓÐÒ»¸ö£©¡£ ËäÈ» overlayfs ½«²»Í¬µÄ¸÷²ãĿ¼½øÐкϲ¢£¬µ«ÊÇ Upper Dir ºÍ¸÷ Lower Dir Õ⼸¸ö²»Í¬µÄĿ¼²¢²»ÍêÈ«µÈ¼Û£¬´æÔÚ²ã´Î¹Øϵ¡£Ê×Ïȵ± Upper Dir ºÍ Lower Dir Á½¸öĿ¼´æÔÚͬÃûÎļþʱ£¬Lower Dir µÄÎļþ½«»á±»Òþ²Ø£¬Óû§Ö»ÄÜ¿´¼ûÀ´×Ô Upper Dir µÄÎļþ£¬È»ºó¸÷¸ö Lower Dir Ò²´æÔÚÏàͬµÄ²ã´Î¹Øϵ£¬½ÏÉϲãÆÁ±Î½ÐϲãµÄͬÃûÎļþ¡£ ³ý´ËÖ®Í⣬Èç¹û´æÔÚͬÃûµÄĿ¼£¬ÄǾͼÌÐøºÏ²¢(Lower Dir ºÍ Upper Dir ºÏ²¢µ½¹ÒÔصãĿ¼Æäʵ¾ÍÊǺϲ¢Ò»¸öµäÐ͵ÄÀý×Ó£©¡£ ¸÷²ãĿ¼ÖÐµÄ Upper Dir ÊǿɶÁдµÄĿ¼£¬µ±Óû§Í¨¹ý Merge Dir ÏòÆäÖÐÒ»¸öÀ´×Ô Upper Dir µÄÎļþдÈëÊý¾Ýʱ£¬ÄÇÊý¾Ý½«Ö±½ÓдÈëUpper DirÏÂÔÀ´µÄÎļþÖУ¬É¾³ýÎļþÒ²ÊÇͬÀí£»¶ø¸÷ Lower Dir ÔòÊÇÖ»¶ÁµÄ£¬ÔÚ overlayfs ¹ÒÔغóÎÞÂÛÈçºÎ²Ù×÷ merge Ŀ¼ÖжÔÓ¦À´×Ô Lower Dir µÄÎļþ»òĿ¼£¬Lower Dir ÖеÄÄÚÈݾù²»»á·¢ÉúÈκεĸı䣨ÀíÂÛÉè¼ÆÈç´Ë£¬µ«Êµ¼ÊÔÚһЩ¼«¶Ë³¡¾°´æÔÚÆ«²î£¬ºóÃæÎÒ»áÏêϸ½éÉÜ£©¡£ ¼ÈÈ» Lower Dir ÊÇÖ»¶ÁµÄ£¬Äǵ±Óû§ÏëÒªÍùÀ´×Ô lower ²ãµÄÎļþÌí¼Ó»òÐÞ¸ÄÄÚÈÝʱ£¬overlayfs Ê×ÏÈ»áµÄ¿½±´Ò»·ÝLower Dir ÖеÄÎļþ¸±±¾µ½ Upper Dir ÖУ¬ºóÐøµÄдÈëºÍÐ޸IJÙ×÷½«»áÔÚ Upper Dir Ï嵀 copy-up µÄ¸±±¾ÎļþÖнøÐУ¬Lower Dir ÔÎļþ±»Òþ²Ø¡£ ÒÔÉϾÍÊÇ overlayfs ×î»ù±¾µÄÌØÐÔ£¬¼òµ¥µÄ×ܽáΪÒÔÏÂ3µã£º ÉÏϲãͬÃûĿ¼ºÏ²¢£» ÉÏϲãͬÃûÎļþ¸²¸Ç£» Lower DirÎļþдʱ¿½±´¡£
ÕâÈýµã¶ÔÓû§¶¼ÊDz»¸ÐÖªµÄ¡£ ×ÛºÏÀ´Ëµ£¬overlayfs ÊÇÒ»ÖֶѵþµÄÎļþϵͳ£¬¿ÉÒÔÓÃÒ»¸öĿ¼µÄÄÚÈݵþ¼Óµ½ÁíÍâÒ»¸öĿ¼֮ÉÏ¡£ÌرðÊʺÏÒÔϳ¡¾°£º ¶àÈ˶Ôͬһ¸öĿ¼½øÐжÀÁ¢µÄ·ÃÎÊ£¬µ«ÓÖ²»Ï£ÍûÐ޸Ĺ«¹²Ä¿Â¼ÄÚÈݵÄÇé¿ö£¬´ËʱֻÐèÒª½«¸öÈ˵ÄĿ¼µþ¼Óµ½¹«¹²µÄĿ¼Éϼ´¿É¡£ËùÓÐδ¸Ä¶¯µÄÄÚÈÝÀ´×Ô¹«¹²Ä¿Â¼£¬ËùÓиĶ¯¹ýµÄÊý¾Ý¶¼±£´æÔÚ¸öÈËĿ¼ÖС£ ±ÈÈ磬ϵͳÖеĶà¸ö docker ¾ÍÊôÓÚÕâÖÖÇéÐΣ¬Ã¿¸ö docker ¿´ÆðÀ´¶¼ÊÇÒ»¸ö¶ÀÁ¢µÄ»·¾³£¬Í¨¹ýʹÓà overlayfs£¬¶àÈ˹²Ïí¹«¹²µÄÊý¾Ý£¬¿ÉÒÔ¼«´óµÄ¼õÉÙ¶Ô´æ´¢¿Õ¼äµÄÕ¼Óᣠ¶ÔÖ»¶ÁÎļþϵͳ½øÐÐÐ޸ġ£ ±ÈÈç Android µ÷ÊÔʱ£¬ÁÙʱ¸Ä¶¯ system ·ÖÇøÑéÖ¤ÎÊÌ⣬ֻÐèÒªÔÚÖ»¶ÁµÄ /system Ŀ¼Éϵþ¼ÓÒ»¸ö¿É¶ÁдµÄ overlayfs£¬ËùÓÐ system ¸Ä¶¯¶¼±£´æµ½ overlayfs µÄ¿Õ¼äÖС£
2. Linux Çý¶¯ÖÐµÄ overlayfsLinux Ï overlayfs: Linux ±àÒë overlayfs µÄ¿ª¹Ø: ͼ 2. Linux ÖÐ overlayfs µÄ±àÒ뿪¹Ø ÔÚ linux ÏÂÃæ¿ÉÒÔͨ¹ý /proc/filesystems ²é¿´ÏµÍ³Ö§³ÖµÄÎļþϵͳ: console:/ # cat /proc/filesystems nodev sysfsnodev tmpfsnodev bdevnodev procnodev cgroupnodev cgroup2nodev devtmpfsnodev configfsnodev debugfsnodev tracefsnodev sockfsnodev bpfnodev pipefsnodev ramfsnodev devpts ext3 ext2 ext4 cramfs squashfs vfat msdos iso9660nodev jffs2 fuseblknodev fusenodev fusectlnodev overlaynodev incremental-fs udf f2fsnodev mqueuenodev selinuxfsnodev bindernodev ubifsnodev pstorenodev functionfsconsole:/ #123456789101112131415161718192021222324252627282930313233343536373839ÉÏÃæÊÇÔÚÒ»¸ö Android ºÐ×ÓÉÏͨ¹ýÃüÁî cat /proc/filesystems ²é¿´Ö§³ÖµÄÎļþϵͳÇé¿ö¡£ µÚÒ»ÁÐÏÔʾÊÇ·ñÒѾÓÐÉ豸¹ÒÔØÁ˸ÃÎļþϵͳ£¬¡°nodev¡± ±íʾ»¹Ã»ÓÐÉ豸¹ÒÔØ¡£ µÚ¶þÁÐÏÔʾÎļþϵͳµÄÃû³Æ¡£ ÕâÀï¿ÉÒÔ¿´µ½£¬Õâ¸öÉ豸֧³Ö overlay£¬µ«ÊÇûÓÐÉ豸¹ÒÔØ¡£ 3. Android ϵͳµÄ overlayfsAndroid µÄϵͳ·ÖÇø£¬°üÀ¨ system ºÍ vendor ÔÚÔËÐÐʱ¶¼ÊÇÒÔÖ»¶ÁµÄ·½Ê½¹ÒÔصģ¬µ«ÔÚ¿ª·¢Öг£³£ÓÖÐèÒªÐÞ¸Ä system »ò vendor Ŀ¼¡£ Òò´Ë£¬Android ÔÚ¶¯Ì¬·ÖÇø°æ±¾ÖÐÒýÈëÁË overlayfs£¬ÒÔÏÂÊǹٷ½Îĵµ¶ÔÕâ¸ö¸Ä¶¯µÄ½éÉÜ: ͼ 3. Android ¹Ù·½½éÉÜ overlayfs ÓÃÓÚ adb remount ²Ù×÷ Android ϵͳµÄ overlayfs »ùÓÚ linux µ×²ãÇý¶¯½øÐÐÁËÀ©Õ¹£¬ÆäʵÏÖ´úÂëλÓÚ£º system/core/fs_mgr/fs_mgr_overlayfs.cpp1µ± adb ·¢ËÍ remount ÃüÁîʱ£¬ÏµÍ³»áµ÷ÓÃÃüÁîÐй¤¾ß /system/bin/remount À´Ö´ÐоßÌåµÄ remount ²Ù×÷¡£Õâ¸ö¹¤¾ßÓÉÎļþ system/core/fs_mgr/fs_mgr_remount.cpp ±àÒë¶ø³É£¬ÔÚÖ´ÐоßÌå¹ÒÔزÙ×÷µÄ do_remount º¯ÊýÖд´½¨ overlayfs Îļþϵͳ·ÖÇø²¢¹ÒÔÚµ½ /mnt/scratch Ŀ¼Ï¡£ Ìرð×¢ÒâµÄÊÇ remount Ö»ÓÐÔÚÒÔÏÂÌõ¼þϲÅÄܲÙ×÷: ¸ü¶à¹ØÓÚ Android Ï overlayfs µÄÐÅÏ¢Çë²Î¿¼ fs_mgrĿ¼Ï嵀 overlayfs ×ÔÊöÎÄ£¬Â·¾¶Î»ÓÚ: system/core/fs_mgr/README.overlayfs.md1Èç¹ûÒ»¿ªÊ¼¶Á²»¶®Õâ¸öÎĵµ£¬½¨Òé¶à¶Á¼¸±é¡£ ÔÚ Android Q(10) ¼°ºóÐø°æ±¾ÉÏ£¬ ´Ó´úÂëÖпɼû£¬overlayfs Éú³ÉµÄ·ÖÇø»áдÈë super ·ÖÇøÍ·²¿µÄ metadata ÇøÓòÖС£¸ÃÇøÓò´æ´¢µÄÊÇ super ·ÖÇøµÄ·ÖÇø±í£¬ÕâÒ²¾ÍÒâζ×ÅËù´´½¨µÄ overlayfs Êdz־õģ¬ÏµÍ³ÖØÆôÒÔºóÈÔÈ»´æÔÚ£¬Ö±µ½½« overlayfs ÎļþϵͳËùÔÚ·ÖÇø´Ó metadata ÖÐÇå³ý¡£ 4. overlayfs Ïà¹Ø²Ù×÷ÕâÀï²»ÔÙÏêϸ·ÖÎö Android overlayfs µÄÔ´Â룬Ö÷ÒªÌṩһЩ²Ù×÷ overlayfs ²Ù×÷ÑÝʾ˵Ã÷¡£ 1. Linux ÉÏ overlayfs µÄÑÝʾ²Ù×÷Linux Ͻ«¶à¸öĿ¼¹ÒÔØΪ overlayfs µÄÃüÁîΪ: mount -t overlay overlay -o lowerdir=lowerdir,upperdir=upperdir,workdir=workdir mountpoint1Èç¹û lowerdir Óжà¸ö£¬Ã¿¸öÖ®¼äʹÓÃðºÅ( ·Ö¸ô¡£ ¶ÔÓÚ overlay Ïà¹ØµÄ²ÎÊý£¬ÔÚ mount µÄ man ÊÖ²áÖÐÊÇÕâô˵µÄ: ͼ 4. mount ÃüÁîÖйØÓÚ overlay ÎļþϵͳµÄÑ¡Ïî²ÎÊý ¶ÔÓÚÕâÀïµÄ lowerdir, upperdir, workdir ·Ö±ð±íʾ£º lowerdir=directory Any filesystem, does not need to be on a writable filesystem.upperdir=directory The upperdir is normally on a writable filesystem.workdir=directory The workdir needs to be an empty directory on the same filesystem as upperdir.12345678¼ò¶øÑÔÖ®£¬ lowerdir Êǵײ㱻¸²¸ÇµÄ»ù±¾Ä¿Â¼£¬¹ÒÔغóÕâ¸öĿ¼µÄÄÚÈݻᱻ upper Ŀ¼µÄÄÚÈݸ²¸Ç upperdir ÊÇÉϲãĿ¼£¬¶Ô¶ÑµþÒÔºóĿ¼µÄдÈë»á±£´æÔÚ upper Ŀ¼ÖÐ workdir ÊÇÓÃÓÚ¸÷ÖÖ´¦Àí¹¤×÷µÄĿ¼£¬¶ÔÓû§Í¸Ã÷£¬Óû§Ò²²»ÐèÒª¹ØÐÄ mountpoint ÊÇ×îÖÕ lowerdir ºÍ upperdir ºÏ²¢ºóµÄ¹ÒÔصã
$ mkdir -p lower{1,2}/dir upper/dir worker merge$ touch lower1/foo1 lower2/foo2 upper/foo3$ touch lower1/dir/{aa,bb} lower2/dir/aa upper/dir/bb$ echo "from lower1" > lower1/dir/aa $ echo "from lower2" > lower2/dir/aa $ echo "from lower1" > lower1/dir/bb$ echo "from upper" > upper/dir/bb $ sudo mount -t overlay overlay -o lowerdir=lower1:lower2,upperdir=upper,workdir=worker merge$ tree mergemerge©À©¤©¤ dir©¦ ©À©¤©¤ aa©¦ ©¸©¤©¤ bb©À©¤©¤ foo1©À©¤©¤ foo2©¸©¤©¤ foo31 directory, 5 files$ cat merge/dir/aa from lower1$ cat merge/dir/bb from upper12345678910111213141516171819202122ÏÂÃæÊǽ«ÊµÑéÖн«Ä¿Â¼ lower1, lower2 ºÍ upper ½øÐеþ¼Ó²Ù×÷µ½ merge Ŀ¼µÄʾÒâͼ¡£ ͼ5. overlayfs»ù±¾¹ÒÔØʾÀý Ò²ÔٴθÐл²©Ö÷ luckyapple1028 Éè¼ÆµÄ²Ù×÷ʾÀý¡£ 2. Android É쵀 overlayfs ÑÝʾ²Ù×÷ÔÚ Android ÉÏÖ´ÐÐ remount ²Ù×÷ʱ£¬ÏµÍ³×Ô¶¯Îª system, vendor µÈÖ»¶Á·ÖÇø´´½¨ overlayfs ÎļþϵͳµÄ¹ÒÔص㡣 ¹Ø±Õ dm-verity, Ö´ÐÐ remount°´ÕÕ overlayfs ×ÔÊöÎĵµµÄ˵·¨£¬¿ÉÒÔʹÓÃÒÔÏÂÖ¸Áî˳ÐòÖ´ÐÐ remount ²Ù×÷: $ adb root$ adb disable-verity$ adb reboot$ adb wait-for-device$ adb root$ adb remount123456È»ºóÖ´ÐÐÒÔϲ½Öèºó£¬ÏµÍ³×Ô¶¯ÎªËùÓзÖÇø´´½¨ overlayfs ¹ÒÔØ: $ adb shell stop$ adb sync$ adb shell start$ adb reboot1234ÒÔϲ½ÖèÍùÖ¸¶¨·ÖÇøÍÆËÍÄÚÈÝ£¬Ö»´´½¨ÏàÓ¦·ÖÇøµÄ overlayfs: $ adb push $ adb reboot12ÎĵµÖÐÒ²Ìáµ½£¬¶ÔÓÚÉÏÃæµÄÖ¸Áî $ adb disable-verity$ adb reboot12ºÍ $ adb remount1¶¼¿ÉÒÔÓÃÒ»ÌõÖ¸ÁîÀ´Ìæ´ú: $ adb remount -R1ÉÏÃæÒ»´ó´®Ö¸Áî¿´ÆðÀ´ºÜ·±Ëö£¬Êµ¼Ê²Ù×÷ÖпÉÒÔ¼òµ¥Ê¹ÓÃÒÔÏÂÖ¸Áî½øÐÐ remount: $ adb root$ adb disable-verity$ adb remount$ adb reboot1234ÔÚ disable-verity ÒÔºó¿ÉÒÔͨ¹ýÃüÁî getprop | grep verity ²é¿´µ±Ç°µÄ verity ״̬: $ adb shell getprop | grep verity[ro.boot.veritymode]: [disabled]12¿ÉÒÔͨ¹ýÖ´ÐÐ mount | grep overlay ²é¿´ overlayfs µÄ¹ÒÔØÇé¿ö£¬ÒÔÏÂÊÇÔÚÒ»¸ö Android R µÄÉ豸ÉÏÖ´ÐÐ remount ÒÔºóµÃµ½µÄÊä³ö: $ adb shell mount | grep overlayoverlay on /system type overlay (ro,seclabel,noatime,lowerdir=/system,upperdir=/mnt/scratch/overlay/system/upper,workdir=/mnt/scratch/overlay/system/work,override_creds=off)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)...1234´ÓÉÏÃæµÄÊä³öÖпÉÒÔ¿´µ½£¬´Ëʱ /system ºÍ /vendor ¶¼ÒѾͨ¹ý overlay µÄ·½Ê½ÖØйÒÔØÁË£¬ÆäÐ޸ĵÄÄÚÈÝ»á´æ·ÅÔÚ upperdir Ŀ¼(/mnt/scratch/overlay)ÖС£ ´ò¿ª dm-verity, Ö´ÐÐ unmountÔÚ remount ÒԺ󣬿ÉÒÔͨ¹ý adb enable-verity À´Ð¶ÔØ overlay µÄÎļþϵͳ£¬²¢ÖØдò¿ª verity ״̬¡£ $ adb root$ adb enable-verity$ adb reboot123ÒÔÏÂÊÇÔÚ¹Ø±Õ verity µÄ״̬ÏÂÖØдò¿ª verity ²¢Ö´Ðи÷ÖÖ¼ì²éµÄ²Ù×÷¼Ç¼: $ adb rootrestarting adbd as root# µ±Ç° dm-verity ´¦ÓÚ disable ״̬$ adb shell getprop | grep verity[ro.boot.veritymode]: [disabled]# ÖØдò¿ª dm-verity$ adb enable-veritydisabling overlayfsSuccessfully enabled verityNow reboot your device for settings to take effect# ÖØÆôϵͳÈà dm-verity ´ò¿ªÉúЧ$ adb reboot$ adb rootrestarting adbd as root# µ±Ç° dm-verity ´¦ÓÚ enforcing ״̬$ adb shell getprop | grep verity[ro.boot.veritymode]: [enforcing]# ¼ì²éÒѾ¹ÒÔÚµÄ overlay Îļþϵͳ£¬Ã»ÓÐÊä³ö˵Ã÷ÒѾûÓйÒÔØÈκΠoverlay ÎļþϵͳÁË$ adb shell mount | grep overlay12345678910111213141516171819202122232425overlay ÎļþϵͳµÄ¿Õ¼ä¼øÓÚƪ·ùµÄ¹Øϵ£¬²»¾Í²»ÔÙ³¤ÆªÀÛë¹·ÖÎö overlay ÎļþϵͳµÄ¿Õ¼äÀ´Ô´ÁË¡£ ÔÚ Android Q(10) ¶¯Ì¬·ÖÇøÉÏ£¬µ±´ò¿ª verity ʱ£¬Ä¬ÈÏ»á´Ó super ·ÖÅä¿Õ¼äÓÃÓÚ¹ÒÔØ overlay Îļþϵͳ£¬ÏàÓ¦µÄ scratch ·ÖÇøÐÅϢдÈëµ½ super É豸ͷ²¿ metadata µÄ·ÖÇø±íÖУ¬¿ÉÒÔʹÓà lpdump ¹¤¾ß²é¿´¡£ ÔÚ Android R(11) ¼°ºóÐø°æ±¾´ò¿ªÁË Virtual A/B ÒÔºó£¬Ä¬ÈÏ»áÏÈ´Ó data ·ÖÅä¿Õ¼äÓÃÓÚ¹ÒÔØ overlay Îļþϵͳ£¬°üº¬ scratch ·ÖÇøµÄ metadata Êý¾Ý»áдÈëµ½Îļþ: /metadata/gsi/remount/lp_metadata1
5. Android ÖÐ overlayfs Ïà¹ØµÄÎÊÌ⿶û»áÓÐС»ï°é»áÔÚȺÀïÎÊһЩ OTA Éý¼¶ÖпռäÒì³£µÄÎÊÌ⣬ÕâÀàÎÊÌâ³ýÁ˹滮ʱ¿Õ¼äȷʵ²»¹»Ö®Í⣬ºÜ¿ÉÄÜÒòΪÆôÓÃÁË overlay ÎļþϵͳÔÚ super »ò data ·ÖÇøÉÏ·ÖÅäÊý¾Ý£¬µ¼ÖÂÉý¼¶Ê±¿Õ¼ä²»¹»ÁË¡£ ÕâÀïÎÒ×ܽáÒ»ÏÂÍøÉϹØÓÚÕâÀàÎÊÌâµÄÎÄÕ¡£ 1. MTK ƽ̨, adb remountÖ®ºó£¬OTA Éý¼¶Ê§°Ü 473 473 I update_engine: [1101/114216.247577:INFO:dynamic_partition_control_android.cc(197)] Loaded metadata from slot A in /dev/block/platform/bootdevice/by-name/super 473 473 I update_engine: [1101/114216.247946:INFO:boot_control_android.cc(312)] Removing group main_b 473 473 I update_engine: [1101/114216.248105:INFO:boot_control_android.cc(343)] Added group main_b with size 1844969472 473 473 I /system/bin/update_engine: [liblp]Partition vendor_b will resize from 0 bytes to 327540736 bytes 473 473 I update_engine: [1101/114216.248254:INFO:boot_control_android.cc(360)] Added partition vendor_b to group main_b with size 327540736 473 473 I /system/bin/update_engine: [liblp]Partition product_b will resize from 0 bytes to 252170240 bytes 473 473 I update_engine: [1101/114216.248382:INFO:boot_control_android.cc(360)] Added partition product_b to group main_b with size 252170240 473 473 E /system/bin/update_engine: [liblp]Not enough free space to expand partition: system_b 473 473 E update_engine: [1101/114216.248480:ERROR:boot_control_android.cc(356)] Cannot resize partition system_b to size 1154273280. Not enough space? 473 473 E update_engine: [1101/114216.248544:ERROR:delta_performer.cc(998)] Unable to initialize partition metadata for slot B 473 473 E update_engine: [1101/114216.248630:ERROR:download_action.cc(336)] Error ErrorCode::kInstallDeviceOpenError (7) in DeltaPerformer's Write method when processing the received payload -- Terminating processing 473 473 I update_engine: [1101/114216.249175:INFO:multi_range_http_fetcher.cc(177)] Received transfer terminated. 473 473 I update_engine: [1101/114216.249358:INFO:multi_range_http_fetcher.cc(129)] TransferEnded w/ code 200 473 473 I update_engine: [1101/114216.249451:INFO:multi_range_http_fetcher.cc(131)] Terminating.1236 1524 V FespxProcessor: onMultibfDataReceived: 8 index 0 size 4096 mPreUploadRollbackDataSize 131072 473 473 I update_engine: [1101/114216.253259:INFO:action_processor.cc(116)] ActionProcessor: finished DownloadAction with code ErrorCode::kInstallDeviceOpenError 473 473 I update_engine: [1101/114216.253452:INFO:action_processor.cc(121)] ActionProcessor: Aborting processing due to failure. 473 473 I update_engine: [1101/114216.253521:INFO:update_attempter_android.cc(454)] Processing Done. 473 473 I update_engine: [1101/114216.253568:INFO:dynamic_partition_control_android.cc(151)] Destroying [] from device mapper3254 3272 D clifeOTA: onStatusUpdate status: 0 473 473 I update_engine: [1101/114216.254265:INFO:metrics_repo1234567891011121314151617181920212. Android Q ÉÏ remount ·ÖÇø£¬µ¼Ö OTA Éý¼¶ super ·ÖÇø resize fail[liblp]Partition vendor will resize from 0 bytes to 217198592 bytes[liblp]Not enough free space to expand partition: systemFailed to resize partition system to size 1719984128.script aborted: assert failed: update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list"))E:Error in @/cache/recovery/block.map (status 7)123456. ×ܽá1. ×ÛÊöoverlayfs ÊÇÒ»ÖֶѵþÎļþϵͳ£¬ÓÉ upperdir ºÍÖÁÉÙÒ»¸ö lowerdir ¹¹³É£¬¿´ÆðÀ´¾ÍºÃÏñÊÇ upperdir µþ¼ÓÔÚ lowerdir Ö®ÉÏ£¬ËùÓжԶѵþĿ¼µÄÐ޸Ķ¼»á±£´æµ½ upperdir ÖУ¬¶ø lowerdir ±£³Ö²»±ä¡£ ÊʺÏÒÔϳ¡¾°: ¶àÈ˶Ôͬһ¸öĿ¼½øÐжÀÁ¢µÄ·ÃÎÊ£¬µ«ÓÖ²»Ï£ÍûÐ޸Ĺ«¹²Ä¿Â¼ÄÚÈݵÄÇé¿ö£¬´ËʱֻÐèÒª½«¸öÈ˵ÄĿ¼µþ¼Óµ½¹«¹²µÄĿ¼Éϼ´¿É¡£ËùÓÐδ¸Ä¶¯µÄÄÚÈÝÀ´×Ô¹«¹²Ä¿Â¼£¬ËùÓиĶ¯¹ýµÄÊý¾Ý¶¼±£´æÔÚ¸öÈËĿ¼ÖС£ ¶ÔÖ»¶ÁÎļþϵͳ½øÐÐÐ޸ġ£Android Æô¶¯ºó£¬Ä¬ÈÏ system ·ÖÇøÒÔÖ»¶Á·½Ê½¹ÒÔØ£¬µ÷ÊÔʱÐèÒªÁÙʱ¸Ä¶¯ system ·ÖÇøÑéÖ¤ÎÊÌ⣬ֻÐèÒªÔÚÖ»¶ÁµÄ /system Ŀ¼Éϵþ¼ÓÒ»¸ö¿É¶ÁдµÄ overlayfs£¬ËùÓÐ system ¸Ä¶¯¶¼±£´æµ½ overlayfs µÄ¿Õ¼äÖС£
2. Linux ϵĹÒÔØÃüÁîLinux Ͻ«¶à¸öĿ¼¹ÒÔØΪ overlayfs µÄÃüÁîΪ: mount -t overlay overlay -o lowerdir=lowerdir,upperdir=upperdir,workdir=workdir mountpoint1Èç¹û lowerdir Óжà¸ö£¬Ã¿¸öÖ®¼äʹÓÃðºÅ( ·Ö¸ô¡£ 3. Android overlayfs µÄ¹ÒÔغÍжÔØAndroid Ï¿ÉÒÔͨ¹ýÒÔÏÂÖ¸ÁîÖ´ÐÐ remout£¬´ïµ½¹Ø±Õ verity ²¢¹ÒÔØ overlay Îļþϵͳ£¬Ê¹ÄÜ¶Ô system, vendor µÈĿ¼Ð޸ĵÄÄ¿µÄ: $ adb root$ adb disable-verity$ adb remount$ adb reboot1234¿ÉÒÔͨ¹ýÒÔϲÙ×÷´ò¿ª verity£¬¹Ø±Õ remount£¬²¢Ð¶ÔØ overlay Îļþϵͳ£¬¶Ô system, vendor µÈĿ¼½øÐл¹Ô: $ adb root$ adb enable-verity$ adb reboot1234. Android overlayfs µÄ¹ÒÔصãÔÚ Android Q(10) ¼°ºóÐø°æ±¾ÉÏ£¬ 5. Android overlayfs ¿Õ¼äµÄÀ´Ô´ÔÚ Android Q(10) ¶¯Ì¬·ÖÇøÉÏ£¬µ±´ò¿ª verity ʱ£¬Ä¬ÈÏ»á´Ó super ·ÖÅä¿Õ¼äÓÃÓÚ¹ÒÔØ overlay Îļþϵͳ£¬ÏàÓ¦µÄ·ÖÇøдÈëµ½ super É豸ͷ²¿ metadata µÄ·ÖÇø±íÖУ¬¿ÉÒÔʹÓà lpdump ¹¤¾ß²é¿´¡£ ÔÚ Android R(11) ¼°ºóÐø°æ±¾´ò¿ªÁË Virtual A/B ÒÔºó£¬Ä¬ÈÏ»áÏÈ´Ó data ·ÖÅä¿Õ¼äÓÃÓÚ¹ÒÔØ overlay Îļþϵͳ£¬·ÖÇøµÄ metadata Êý¾Ý»áдÈëµ½Îļþ: /metadata/gsi/remount/lp_metadata16. ˼¿¼ÌâÔÚ±¾ÎÄ¿ìÒª½áÊøµÄʱºò£¬»¹ÊÇÓ¦¸ÃÁôÏÂһЩ˼¿¼Ì⣺ Android ÔÚÖ´ÐÐ remount ¹ÒÔØ overlay Îļþϵͳ£¬ÒÔ¼°¹Ø±Õ overlay ÎļþϵͳʱִÐÐÁËÒ»´ó¶Ñ adb Ö¸ÁÄãÖªµÀÿһ¸öÖ¸Á±³ºó¶¼×öÁËʲô²Ù×÷Â𣿠°üÀ¨:
$ adb root$ adb disable-verity$ adb reboot$ adb wait-for-device$ adb root$ adb remount123456
- $ adb shell stop$ adb sync$ adb shell start123
$ adb root$ adb enable-verity$ adb reboot123ÔÚÉÏÃæµÄÕâЩ²Ù×÷ÖУ¬ÎªÊ²Ã´ÓÐʱºòÐèÒªÖ´ÐÐ adb reboot À´ÖØÆôÉ豸£¬²»ÖØÆô²»ÐÐÂ𣿠ÄãÖªµÀÈçºÎ²é¿´Ò»¸öϵͳµÄ verity£¬ÒÔ¼° overlay ÎļþϵͳµÄ¹ÒÔØÇé¿öÂð?(°üÀ¨´ÓÄÄÀï·ÖÅä¿Õ¼ä£¬¹ÒÔص½ÄÄÀÒÔ¼°¹ÒÔØʱʹÓÃÁËÄÄЩ²ÎÊý)
7. ²Î¿¼ÔĶÁ±¾ÎijýÁË Android ×Ô´øµÄ overlayfs ×ÔÊöÎļþÍ⣬»¹²Î¿¼ÁËÒÔÏÂÎÄÕ£¬Ìرð¸Ðл ÓÈÆäÉîÈëÀí½â overlayfs µÄÎÄÕ£¬Ð´µÃ·Ç³£ºÃ£¬¸É»õÂúÂú¡£ Èç¹ûÄúÒѾ¶©ÔÄÁ˱¾×¨À¸£¬ÇëÎñ±Ø¼ÓÎÒ΢ÐÅ£¬ÀÄã½ø¡°¶¯Ì¬·ÖÇø & ÐéÄâ·ÖÇøרÀ¸ VIP ´ðÒÉȺ¡±¡£ Èç¹ûÄú´ÓÊ Android OTA Éý¼¶Ïà¹Ø¹¤×÷»ò¶Ô OTA Éý¼¶¸ÐÐËȤ£¬»¶Óµ½ Android OTA ½»Á÷ȺһÆðÌÖÂÛ¡£ Èç¹û´ó¼ÒÓÐÈκÎÒÉÎÊ£¬ÓÖ»òÕß·¢ÏÖÃèÊöÓдíÎóµÄµØ·½£¬Ò²»¶Ó¼ÓÎÒ΢ÐÅÌÖÂÛ£¬ÇëÔÚ¹«ÖÚºÅ(¡°ÂåÆæ¿´ÊÀ½ç¡±)ºǫ́»Ø¸´ ¡°wx¡± »ñÈ¡¶þάÂë¡£ |