बढ़ते विभाजन जल्दी

ट्रेबल-सक्षम उपकरणों को पहले चरण के माउंट को सक्षम करना होगा ताकि यह सुनिश्चित हो सके कि init सुरक्षा-संवर्धित लिनक्स (SELinux) नीति के टुकड़े लोड कर सके जो system और vendor विभाजन में फैले हुए हैं। यह एक्सेस कर्नेल बूट के बाद जितनी जल्दी हो सके कर्नेल मॉड्यूल को लोड करने में भी सक्षम बनाता है।

प्रारंभिक माउंटिंग करने के लिए, एंड्रॉइड के पास उन फ़ाइल सिस्टम तक पहुंच होनी चाहिए जिन पर मॉड्यूल स्थित हैं। एंड्रॉइड 8.0 और उच्चतर माउंटिंग /system , /vendor , या /odm init के पहले चरण में ही सपोर्ट करता है (अर्थात, SElinux आरंभ होने से पहले)।

Fstab प्रविष्टियाँ

एंड्रॉइड 9 और उससे पहले के संस्करण में, डिवाइस डिवाइस ट्री ओवरले (डीटीओ) का उपयोग करके प्रारंभिक माउंटेड विभाजन के लिए fstab प्रविष्टियां निर्दिष्ट कर सकते हैं। एंड्रॉइड 10 और उच्चतर में, उपकरणों को पहले चरण रैमडिस्क में एक fstab फ़ाइल का उपयोग करके प्रारंभिक माउंटेड विभाजन के लिए fstab प्रविष्टियाँ निर्दिष्ट करनी होंगी। Android 10 fstab फ़ाइल में उपयोग के लिए निम्नलिखित fs_mgr फ़्लैग प्रस्तुत करता है:

  • first_stage_mount इंगित करता है कि पहले चरण init द्वारा एक विभाजन माउंट किया जाएगा।
  • logical इंगित करता है कि यह एक गतिशील विभाजन है।
  • avb= vbmeta-partition-name vbmeta विभाजन निर्दिष्ट करता है। पहला चरण init अन्य विभाजनों को माउंट करने से पहले इस विभाजन को प्रारंभ करता है। इस ध्वज के लिए तर्क को छोड़ा जा सकता है यदि प्रविष्टि के लिए vbmeta विभाजन पिछली पंक्ति में किसी अन्य fstab प्रविष्टि द्वारा पहले से ही निर्दिष्ट किया गया है।

निम्नलिखित उदाहरण system , vendor और product विभाजन को तार्किक (गतिशील) विभाजन के रूप में सेट करने के लिए fstab प्रविष्टियाँ दिखाता है।

#<dev>  <mnt_point> <type>  <mnt_flags options> <fs_mgr_flags>
system   /system     ext4    ro,barrier=1     wait,slotselect,avb=vbmeta_system,logical,first_stage_mount
vendor   /vendor     ext4    ro,barrier=1     wait,slotselect,avb=vbmeta,logical,first_stage_mount
product  /product    ext4    ro,barrier=1     wait,slotselect,avb,logical,first_stage_mount

इस उदाहरण में, विक्रेता fs_mgr ध्वज avb=vbmeta उपयोग करके vbmeta विभाजन निर्दिष्ट करता है, लेकिन product vbmeta तर्क को छोड़ देता है क्योंकि विक्रेता ने पहले ही vbmeta विभाजन की सूची में जोड़ दिया है।

एंड्रॉइड 10 और उच्चतर चलाने वाले उपकरणों को fstab फ़ाइल को रैमडिस्क और vendor विभाजन में रखना होगा।

रैमडिस्क

रैमडिस्क में fstab फ़ाइल का स्थान इस बात पर निर्भर करता है कि कोई डिवाइस रैमडिस्क का उपयोग कैसे करता है।

बूट रैमडिस्क वाले उपकरणों को fstab फ़ाइल को बूट रैमडिस्क रूट में रखना होगा। यदि डिवाइस में बूट रैमडिस्क और रिकवरी रैमडिस्क दोनों हैं, तो रिकवरी रैमडिस्क में किसी बदलाव की आवश्यकता नहीं है। उदाहरण:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RAMDISK)/fstab.$(PRODUCT_PLATFORM)

जो डिवाइस रिकवरी को रैमडिस्क के रूप में उपयोग करते हैं, उन्हें एंड्रॉइड में बूट करना है या रिकवरी में बूट करना जारी रखना है, यह तय करने के लिए कर्नेल कमांड लाइन पैरामीटर androidboot.force_normal_boot=1 उपयोग करना होगा। एंड्रॉइड 12 या उससे अधिक के कर्नेल संस्करण 5.10 या उसके बाद के संस्करण के साथ लॉन्च होने वाले उपकरणों को androidboot.force_normal_boot=1 पैरामीटर को पास करने के लिए बूटकॉन्फिग का उपयोग करना होगा। इन उपकरणों में, पहला चरण init प्रारंभिक माउंट विभाजन को माउंट करने से पहले /first_stage_ramdisk पर एक स्विच रूट ऑपरेशन करता है, इसलिए उपकरणों को fstab फ़ाइल को $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk में रखना होगा। उदाहरण:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)

विक्रेता

सभी डिवाइसों को fstab फ़ाइल की एक प्रति /vendor/etc में रखनी होगी। ऐसा इसलिए है क्योंकि विभाजन के शुरुआती माउंटिंग को पूरा करने के बाद पहला चरण init रैमडिस्क को मुक्त करता है और /system पर / पर माउंट को स्थानांतरित करने के लिए एक स्विच रूट ऑपरेशन करता है। इसलिए किसी भी बाद के संचालन के लिए fstab फ़ाइलों तक पहुंचने के लिए /vendor/etc में प्रतिलिपि का उपयोग करना होगा। उदाहरण:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.$(PRODUCT_PLATFORM)

विभाजन को शीघ्र स्थापित करना, VBoot 1.0

VBoot 1.0 के साथ विभाजन को शीघ्र माउंट करने की आवश्यकताओं में शामिल हैं:

  1. डिवाइस नोड पथों को fstab और डिवाइसट्री प्रविष्टियों में उनके by-name सिम्लिंक का उपयोग करना चाहिए। उदाहरण के लिए, /dev/block/mmcblk0pX का उपयोग करके विभाजन निर्दिष्ट करने के बजाय, सुनिश्चित करें कि विभाजन का नाम दिया गया है और डिवाइस नोड /dev/block/…./by-name/{system,vendor,odm} है।
  2. उत्पाद के लिए डिवाइस कॉन्फ़िगरेशन में PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION और CUSTOM_IMAGE_VERITY_BLOCK_DEVICE के लिए दिए गए पथ (अर्थात device/ oem / project /device.mk में) fstab /devicetree में by-name निर्दिष्ट संबंधित ब्लॉक डिवाइस नोड्स से मेल खाना चाहिए। प्रविष्टियाँ। उदाहरण:
    PRODUCT_SYSTEM_VERITY_PARTITION := /dev/block/…./by-name/system
    PRODUCT_VENDOR_VERITY_PARTITION := /dev/block/…./by-name/vendor
    CUSTOM_IMAGE_VERITY_BLOCK_DEVICE := /dev/block/…./by-name/odm
    
  3. डिवाइस ट्री ओवरले के माध्यम से प्रदान की गई प्रविष्टियाँ fstab फ़ाइल अंशों में दोहराई नहीं जानी चाहिए। उदाहरण के लिए, डिवाइसट्री में माउंट /vendor के लिए एक प्रविष्टि निर्दिष्ट करते समय, fstab फ़ाइल को उस प्रविष्टि को दोहराना नहीं चाहिए।
  4. verifyatboot की आवश्यकता वाले विभाजनों को जल्दी माउंट नहीं किया जाना चाहिए (ऐसा करना असमर्थित है)।
  5. सत्यापित विभाजन के लिए सत्यता मोड/स्थिति को androidboot.veritymode विकल्प (मौजूदा आवश्यकता) का उपयोग करके kernel_cmdline में निर्दिष्ट किया जाना चाहिए।

डिवाइसट्री को जल्दी माउंट करना, वीबूट 1.0

एंड्रॉइड 8.x और उच्चतर में, init डिवाइसट्री को पार्स करता है और इसके पहले चरण के दौरान विभाजन को जल्दी माउंट करने के लिए fstab प्रविष्टियाँ बनाता है। एक fstab प्रविष्टि प्रपत्र लेती है:

src mnt_point type mnt_flags fs_mgr_flags

डिवाइसट्री गुणों को उस प्रारूप की नकल करने के लिए परिभाषित किया गया है:

  • fstab प्रविष्टियाँ डिवाइसट्री में /firmware/android/fstab के अंतर्गत होनी चाहिए और android,fstab पर एक संगत स्ट्रिंग सेट होनी चाहिए।
  • /firmware/android/fstab के अंतर्गत प्रत्येक नोड को एकल प्रारंभिक माउंट fstab प्रविष्टि के रूप में माना जाता है। एक नोड में निम्नलिखित गुण परिभाषित होने चाहिए:
    • dev विभाजन by-name प्रतिनिधित्व करने वाले डिवाइस नोड को इंगित करना चाहिए
    • type फ़ाइल सिस्टम प्रकार होना चाहिए (जैसा कि fstab फ़ाइलों में होता है)
    • mnt_flags माउंट फ़्लैग की अल्पविराम से अलग की गई सूची होनी चाहिए (जैसा कि fstab फ़ाइलों में है)
    • fsmgr_flags Android fs_mgr flags की सूची होनी चाहिए (जैसा कि fstab फ़ाइलों में है)
  • ए/बी विभाजन में slotselect fs_mgr विकल्प होना चाहिए।
  • dm-verity सक्षम विभाजन में एक verify fs_mgr विकल्प होना चाहिए।

उदाहरण: N6P पर /सिस्टम और /विक्रेता

निम्नलिखित उदाहरण Nexus 6P पर system और vendor विभाजन के लिए डिवाइसट्री प्रारंभिक माउंट दिखाता है:

/ {
  firmware {
    android {
      compatible = "android,firmware";
      fstab {
        compatible = "android,fstab";
        system {
          compatible = "android,system";
          dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/system";
          type = "ext4";
          mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
          fsmgr_flags = "wait,verify";
        };
        vendor {
          compatible = "android,vendor";
          dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor";
          type = "ext4";
          mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
          fsmgr_flags = "wait";
        };
      };
    };
  };
};

उदाहरण: पिक्सेल पर /विक्रेता

निम्नलिखित उदाहरण पिक्सेल पर /vendor के लिए डिवाइसट्री प्रारंभिक माउंट दिखाता है (ए/बी के अधीन विभाजन के लिए slotselect जोड़ना याद रखें):

/ {
  firmware {
    android {
      compatible = "android,firmware";
      fstab {
        compatible = "android,fstab";
        vendor {
          compatible = "android,vendor";
          dev = "/dev/block/platform/soc/624000.ufshc/by-name/vendor";
          type = "ext4";
          mnt_flags = "ro,barrier=1,discard";
          fsmgr_flags = "wait,slotselect,verify";
        };
      };
    };
  };
};

विभाजन को शीघ्र स्थापित करना, VBoot 2.0

VBoot 2.0 Android सत्यापित बूट (AVB) है। VBoot 2.0 के साथ विभाजन को शीघ्र माउंट करने की आवश्यकताएँ हैं:

  1. डिवाइस नोड पथ को fstab और डिवाइसट्री प्रविष्टियों में उनके by-name सिम्लिंक का उपयोग करना चाहिए। उदाहरण के लिए, /dev/block/mmcblk0pX का उपयोग करके विभाजन निर्दिष्ट करने के बजाय, सुनिश्चित करें कि विभाजन का नाम दिया गया है और डिवाइस नोड /dev/block/…./by-name/{system,vendor,odm} है।
  2. VBoot 1.0 के लिए उपयोग किए जाने वाले बिल्ड सिस्टम वेरिएबल (जैसे PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION और CUSTOM_IMAGE_VERITY_BLOCK_DEVICE ) VBoot 2.0 के लिए आवश्यक नहीं हैं। इसके बजाय, VBoot 2.0 ( BOARD_AVB_ENABLE := true सहित) में पेश किए गए बिल्ड वेरिएबल को परिभाषित किया जाना चाहिए; पूर्ण कॉन्फ़िगरेशन के लिए, AVB के लिए बिल्ड सिस्टम इंटीग्रेशन देखें।
  3. डिवाइस ट्री ओवरले के माध्यम से प्रदान की गई प्रविष्टियाँ fstab फ़ाइल अंशों में दोहराई नहीं जानी चाहिए। उदाहरण के लिए, यदि आप डिवाइसट्री में माउंट /vendor के लिए एक प्रविष्टि निर्दिष्ट करते हैं, तो fstab फ़ाइल को उस प्रविष्टि को दोहराना नहीं चाहिए।
  4. VBoot 2.0 verifyatboot समर्थन नहीं करता है, चाहे प्रारंभिक माउंट सक्षम हो या नहीं।
  5. सत्यापित विभाजन के लिए सत्यता मोड/स्थिति को androidboot.veritymode विकल्प (मौजूदा आवश्यकता) का उपयोग करके kernel_cmdline में निर्दिष्ट किया जाना चाहिए। AVB के लिए निम्नलिखित सुधारों को शामिल करना सुनिश्चित करें:

डिवाइसट्री को जल्दी माउंट करना, वीबूट 2.0

VBoot 2.0 के लिए डिवाइसट्री में कॉन्फ़िगरेशन निम्नलिखित अपवादों के साथ VBoot 1.0 के समान है:

  • fsmgr_flag को verify से avb पर स्विच किया गया है।
  • AVB मेटाडेटा वाले सभी विभाजन डिवाइसट्री में VBMeta प्रविष्टि में होने चाहिए, तब भी जब विभाजन जल्दी माउंट नहीं हो रहा हो (उदाहरण के लिए, /boot )।

उदाहरण: N5X पर /सिस्टम और /विक्रेता

निम्न उदाहरण Nexus 5X पर system और vendor विभाजन के लिए डिवाइसट्री प्रारंभिक माउंट दिखाता है। ध्यान दें कि:

  • /system AVB के साथ माउंट किया गया है और /vendor अखंडता सत्यापन के बिना माउंट किया गया है।
  • चूँकि Nexus 5X में कोई /vbmeta विभाजन नहीं है, इसलिए शीर्ष-स्तरीय vbmeta /boot विभाजन के अंत में रहता है (विवरण के लिए, AOSP चेंजलिस्ट देखें)।
    / {
      firmware {
        android {
          compatible = "android,firmware";
          vbmeta {
            compatible = "android,vbmeta";
            parts = "boot,system,vendor";
          };
          fstab {
            compatible = "android,fstab";
            system {
              compatible = "android,system";
              dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/system";
              type = "ext4";
              mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
              fsmgr_flags = "wait,avb";
            };
            vendor {
              compatible = "android,vendor";
              dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor";
              type = "ext4";
              mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
              fsmgr_flags = "wait";
            };
          };
        };
      };
    };
    

उदाहरण: पिक्सेल पर /विक्रेता

निम्न उदाहरण पिक्सेल पर जल्दी माउंटिंग /vendor दिखाता है। ध्यान दें कि:

  • Vbmeta प्रविष्टि में अधिक विभाजन निर्दिष्ट हैं क्योंकि वे विभाजन AVB द्वारा संरक्षित हैं।
  • सभी AVB विभाजन शामिल होने चाहिए, भले ही केवल /vendor जल्दी माउंट किया गया हो।
  • ए/बी के अधीन विभाजनों के लिए slotselect जोड़ना याद रखें।
    / {
      vbmeta {
        compatible = "android,vbmeta";
        parts = "vbmeta,boot,system,vendor,dtbo";
      };
      firmware {
        android {
          compatible = "android,firmware";
          fstab {
            compatible = "android,fstab";
            vendor {
              compatible = "android,vendor";
              dev = "/dev/block/platform/soc/624000.ufshc/by-name/vendor";
              type = "ext4";
              mnt_flags = "ro,barrier=1,discard";
              fsmgr_flags = "wait,slotselect,avb";
            };
          };
        };
      };
    };