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