डाइनैमिक पार्टिशनिंग को dm-लीनियर डिवाइस-मैपर का इस्तेमाल करके लागू किया जाता है
मॉड्यूल की ज़रूरी शर्तें पूरी करता है. super
विभाजन में ये शामिल हैं
मेटाडेटा में हर डाइनैमिक पार्टीशन के नाम और ब्लॉक रेंज की जानकारी मौजूद है
super
के अंदर. पहले चरण के init
के दौरान, यह
मेटाडेटा को पार्स और उसकी पुष्टि की जाती है. साथ ही, वर्चुअल ब्लॉक डिवाइस बनाए जाते हैं,
हर डाइनैमिक पार्टीशन को दिखाते हैं.
ओटीए लागू करते समय, डाइनैमिक पार्टिशन अपने-आप बन जाते हैं, बदला जा सकता है या ज़रूरत के हिसाब से मिटाया जा सकता है. A/B डिवाइसों के लिए, और बदलाव सिर्फ़ उस कॉपी पर लागू होते हैं जिसमें टारगेट स्लॉट.
यूज़रस्पेस में डाइनैमिक पार्टीशन लागू किए जाते हैं. इसलिए, सेगमेंट बनाने की ज़रूरत होती है
बूटलोडर को डाइनैमिक नहीं बनाया जा सकता. उदाहरण के लिए, boot
,
बूटलोडर ने dtbo
और vbmeta
को पढ़ा है और
इसलिए भौतिक विभाजन के रूप में ही रहना चाहिए.
हर डाइनैमिक पार्टीशन, किसी अपडेट ग्रुप से जुड़ा हो सकता है. ये
ग्रुप उस ज़्यादा से ज़्यादा स्टोरेज को सीमित करते हैं जो उस ग्रुप के पार्टीशन का इस्तेमाल कर सकते हैं.
उदाहरण के लिए, system
और vendor
किसी
वह ग्रुप जो system
और
vendor
.
नए डिवाइसों में डाइनैमिक पार्टिशन लागू करना
इस सेक्शन में, नए डिवाइसों पर डाइनैमिक पार्टिशन लागू करने का तरीका बताया गया है Android 10 और उसके बाद के वर्शन के साथ लॉन्च किया जा सकता है. अपडेट करने के लिए मौजूदा डिवाइस के लिए, Android अपग्रेड करने का तरीका देखें डिवाइस में बदल सकते हैं.
विभाजन में बदलाव
Android 10 के साथ लॉन्च होने वाले डिवाइसों के लिए,
एक विभाजन है जिसे super
कहते हैं. super
पार्टीशन, A/B स्लॉट को अंदरूनी तौर पर हैंडल करता है, इसलिए A/B डिवाइसों को इनकी ज़रूरत नहीं है
super_a
और super_b
सेगमेंट को अलग करें.
बूटलोडर के पास, रीड-ओनली ऐक्सेस वाले ऐसे सभी एओएसपी पार्टीशन को शामिल करना ज़रूरी है जिनका इस्तेमाल नहीं किया जा रहा है
कोड डाइनैमिक होना चाहिए और इसे जीयूआईडी पार्टिशन टेबल (GPT) से हटाना ज़रूरी है.
वेंडर के आधार पर बांटे गए सेगमेंट, डाइनैमिक नहीं होते हैं. इन्हें बांटा जा सकता है
को भी कॉपी कर सकता है.
super
के आकार का अनुमान लगाने के लिए,
विभाजनों को GPT से हटाया जा रहा है. A/B डिवाइसों के लिए, यह
दोनों स्लॉट का साइज़ शामिल होना चाहिए. पहली इमेज में दिखाए गए शो
डाइनैमिक में बदलने से पहले और बाद में मौजूद सेगमेंट का उदाहरण
विभाजन.
इस्तेमाल किए जा सकने वाले डाइनैमिक पार्टीशन हैं:
- सिस्टम
- वेंडर
- प्रॉडक्ट
- सिस्टम एक्सटेंट
- ओडीएम
Android 10 के साथ लॉन्च होने वाले डिवाइसों के लिए,
कर्नेल कमांड लाइन विकल्प androidboot.super_partition
खाली होना चाहिए ताकि कमांड sysprop
ro.boot.super_partition
खाली है.
पार्टीशन अलाइनमेंट
डिवाइस-मैपर मॉड्यूल कम कुशलता से काम कर सकता है, अगर
super
विभाजन ठीक से अलाइन नहीं किया गया है. कॉन्टेंट बनाने
super
विभाजन को कम से कम I/O से अलाइन किया जाना चाहिए
अनुरोध का साइज़ होना चाहिए, जैसा कि ब्लॉक लेयर के हिसाब से तय किया गया है. डिफ़ॉल्ट रूप से,
बिल्ड सिस्टम (lpmake
के ज़रिए) बनाता है, जो
super
पार्टीशन इमेज), तो माना जाता है कि 1 MiB अलाइनमेंट है
हर डाइनैमिक पार्टीशन के लिए काफ़ी होता है. हालांकि, वेंडर को
पक्का करें कि super
पार्टीशन को सही तरीके से अलाइन किया गया हो.
किसी डिवाइस को ब्लॉक करने के लिए, कम से कम अनुरोध साइज़ इन तरीकों से तय किया जा सकता है
sysfs
की जांच की जा रही है. उदाहरण के लिए:
# ls -l /dev/block/by-name/super lrwxrwxrwx 1 root root 16 1970-04-05 01:41 /dev/block/by-name/super -> /dev/block/sda17 # cat /sys/block/sda/queue/minimum_io_size 786432
super
पार्टीशन के अलाइनमेंट की पुष्टि करने के लिए
मिलते-जुलते तरीके:
# cat /sys/block/sda/sda17/alignment_offset
अलाइनमेंट ऑफ़सेट 0 होना चाहिए.
डिवाइस के कॉन्फ़िगरेशन में किए गए बदलाव
डाइनैमिक पार्टीशन को चालू करने के लिए, यहां दिए गए फ़्लैग को
device.mk
:
PRODUCT_USE_DYNAMIC_PARTITIONS := true
बोर्ड के कॉन्फ़िगरेशन में बदलाव
आपको super
पार्टीशन का साइज़ सेट करना होगा:
BOARD_SUPER_PARTITION_SIZE := <size-in-bytes>
A/B डिवाइसों पर, कुल साइज़ होने पर बिल्ड सिस्टम गड़बड़ी दिखाता है
super
के आधे से ज़्यादा हिस्से डाइनैमिक बंटवारे वाली इमेज हैं
सेगमेंट का साइज़.
डाइनैमिक पार्टीशन की सूची को इस तरह कॉन्फ़िगर किया जा सकता है. इसके लिए
अपडेट ग्रुप का इस्तेमाल कर रहे हैं, तो ग्रुप की सूची
BOARD_SUPER_PARTITION_GROUPS
वैरिएबल. हर ग्रुप का नाम
इसके बाद, BOARD_group_SIZE
है
और BOARD_group_PARTITION_LIST
वैरिएबल.
A/B डिवाइसों के लिए, ग्रुप में ज़्यादा से ज़्यादा सिर्फ़ एक साइज़ होना चाहिए
स्लॉट, क्योंकि ग्रुप के नाम आंतरिक रूप से स्लॉट-सफ़िक्स होते हैं.
यहां एक डिवाइस का उदाहरण दिया गया है, जिसमें सभी सेगमेंट को ग्रुप में रखा गया है
example_dynamic_partitions
को कॉल किया गया:
BOARD_SUPER_PARTITION_GROUPS := example_dynamic_partitions BOARD_EXAMPLE_DYNAMIC_PARTITIONS_SIZE := 6442450944 BOARD_EXAMPLE_DYNAMIC_PARTITIONS_PARTITION_LIST := system vendor product
यहां एक उदाहरण डिवाइस दिया गया है, जिसमें सिस्टम और प्रॉडक्ट सेवाओं को शामिल किया जाता है
group_foo
, और vendor
, product
,
और odm
को group_bar
में:
BOARD_SUPER_PARTITION_GROUPS := group_foo group_bar BOARD_GROUP_FOO_SIZE := 4831838208 BOARD_GROUP_FOO_PARTITION_LIST := system product_services BOARD_GROUP_BAR_SIZE := 1610612736 BOARD_GROUP_BAR_PARTITION_LIST := vendor product odmअभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
-
वर्चुअल A/B लॉन्च डिवाइसों के लिए, सभी ग्रुप के ज़्यादा से ज़्यादा साइज़ का योग ऐसा होना चाहिए
ज़्यादा से ज़्यादा इतना होना चाहिए:
BOARD_SUPER_PARTITION_SIZE
- ओवरहेड
वर्चुअल A/B को लागू करना देखें. -
A/B लॉन्च डिवाइसों के लिए, सभी ग्रुप के ज़्यादा से ज़्यादा साइज़ का योग ऐसा होना चाहिए
होना:
BOARD_SUPER_PARTITION_SIZE
/ 2 - ओवरहेड -
नॉन-A/B डिवाइसों और रेट्रोफ़िट A/B डिवाइसों के लिए, सबसे ज़्यादा का योग
सभी ग्रुप के साइज़ इस तरह होने चाहिए:
BOARD_SUPER_PARTITION_SIZE
- ओवरहेड - बिल्ड के समय, हर हिस्से की इमेज के कुल साइज़ का जोड़ अपडेट ग्रुप में, ग्रुप के साइज़ की सीमा से ज़्यादा नहीं होना चाहिए.
- मेटाडेटा के आकलन के लिए, ओवरहेड की ज़रूरत होती है, अलाइनमेंट, और इसी तरह के अन्य काम किए जा सकते हैं. एक उचित ओवरहेड 4 MiB है, लेकिन डिवाइस की ज़रूरत के हिसाब से बड़ा ओवरहेड चुना जा सकता है.
डाइनैमिक पार्टिशन का साइज़ बदलना
डाइनैमिक बंटवारे से पहले, सेगमेंट के साइज़ का बंटवारा सिर्फ़ इनके लिए किया जाता था पक्का कर सकती हैं कि उनमें आगे के अपडेट के लिए ज़रूरत के मुताबिक जगह हो. असल साइज़ को वैसे ही ले लिया था और ज़्यादातर रीड-ओनली पार्टीशन में फ़ाइल सिस्टम में जगह होती है. डायनमिक विभाजनों में, वह ख़ाली स्पेस इसका इस्तेमाल किया जा सकता है और इसका इस्तेमाल ओटीए के दौरान सेगमेंट को बढ़ाने के लिए किया जा सकता है. यह पक्का करना ज़रूरी है कि सेगमेंट को हिस्सों में बांटने से जगह बर्बाद न हो और वे कम से कम संभावित साइज़ में बांटा गया हो.
रीड-ओनली ext4 इमेज के लिए, बिल्ड सिस्टम अपने-आप हार्डकोड किए गए पार्टिशन का साइज़ तय न होने पर, कम से कम साइज़. कॉन्टेंट बनाने बिल्ड सिस्टम के साथ इमेज फ़िट हो जाती है, ताकि फ़ाइल सिस्टम में जितना हो सके उतना स्टोरेज इस्तेमाल करें. इससे यह पक्का होता है कि डिवाइस की बर्बादी न हो का इस्तेमाल ओटीए के लिए किया जा सकता है.
इसके अलावा, ext4 इमेज को ब्लॉक- को चालू करके, और कंप्रेस किया जा सकता है डुप्लीकेट कॉपी हटाने की तकनीक. इसे चालू करने के लिए, नीचे दिए गए कॉन्फ़िगरेशन का इस्तेमाल करें:
BOARD_EXT4_SHARE_DUP_BLOCKS := true
अगर किसी बंटवारे के लिए तय किए गए कम से कम साइज़ का अपने-आप बंटवारा करना पसंद न हो,
सेगमेंट के साइज़ को कंट्रोल करने के दो तरीके हैं. आप
कम से कम खाली जगह
BOARD_partitionIMAGE_PARTITION_RESERVED_SIZE
,
या अपने हिसाब से बदलाव करें
हर हाल में लागू करने के लिए BOARD_partitionIMAGE_PARTITION_SIZE
किसी खास साइज़ के डाइनैमिक सेगमेंट. इनमें से कोई नहीं
का सुझाव दिया जाता है.
उदाहरण के लिए:
BOARD_PRODUCTIMAGE_PARTITION_RESERVED_SIZE := 52428800
इससे product.img
में फ़ाइल सिस्टम को
50 एमआईबी जगह का इस्तेमाल नहीं हुआ है.
रूट के मुताबिक सिस्टम में होने वाले बदलाव
Android 10 के साथ लॉन्च होने वाले डिवाइसों में सिस्टम-ए-रूट इस्तेमाल करता है.
डाइनैमिक पार्टिशन वाले डिवाइस (चाहे वे पहले से लॉन्च हुए हों या पहले से सेट किए गए हों)
डाइनैमिक पार्टिशन) में सिस्टम-एज़-रूट का इस्तेमाल नहीं होना चाहिए. Linux कर्नेल यह नहीं कर सकता
super
विभाजन को समझें और इसलिए माउंट नहीं कर सकता
system
. system
को अब इस डिवाइस पर माउंट किया गया है
पहला चरण init
, जो रैम डिस्क में मौजूद है.
BOARD_BUILD_SYSTEM_ROOT_IMAGE
सेट न करें. तय सीमा में
Android 10,
BOARD_BUILD_SYSTEM_ROOT_IMAGE
फ़्लैग का इस्तेमाल सिर्फ़ इनके लिए किया जाता है
यह पता लगाएं कि सिस्टम, कर्नेल से माउंट किया गया है या
रैम डिस्क में पहला चरण init
.
BOARD_BUILD_SYSTEM_ROOT_IMAGE
को true
पर सेट किया जा रहा है
बिल्ड में गड़बड़ी होती है, जब
PRODUCT_USE_DYNAMIC_PARTITIONS
भी true
है.
जब BOARD_USES_RECOVERY_AS_BOOT
को 'सही है' पर सेट किया जाता है, तो
रिकवरी इमेज कोबूट.img के तौर पर बनाया गया है. इसमें रिकवरी की इमेज
रैम डिस्क. पहले, बूटलोडर ने skip_initramfs
कर्नेल का इस्तेमाल किया था
कमांड लाइन पैरामीटर जोड़कर तय करें कि किस मोड में बूट करना है. इसके लिए
Android 10 डिवाइस, बूटलोडर पास नहीं होने चाहिए
skip_initramfs
को कर्नेल कमांड-लाइन में भेजा जा सकता है. इसके बजाय, बूटलोडर
रिकवरी स्किप करने के लिए, androidboot.force_normal_boot=1
पास होना चाहिए
और सामान्य Android को चालू करते हैं. Android 12 के साथ लॉन्च होने वाले डिवाइस
androidboot.force_normal_boot=1
को पास करने के लिए, बूट कॉन्फ़िगरेशन का इस्तेमाल करना होगा.
एवीबी कॉन्फ़िगरेशन में बदलाव
Android का इस्तेमाल करते समय वेरिफ़ाइड बूट 2.0, अगर डिवाइस चेन वाले पार्टिशन का इस्तेमाल नहीं कर रहा हो डिस्क्रिप्टर का इस्तेमाल करते हैं, तो किसी बदलाव की ज़रूरत नहीं होती है. अगर एक से ज़्यादा चैनलों का इस्तेमाल किया जा रहा है, तो हालांकि, पुष्टि किया गया एक हिस्सा डाइनैमिक होता है. तो परिवर्तन ज़रूरी हैं.
यहां एक ऐसे डिवाइस के कॉन्फ़िगरेशन का उदाहरण दिया गया है जिसके लिए
system
के लिए vbmeta
और
vendor
विभाजन.
BOARD_AVB_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_SYSTEM_ALGORITHM := SHA256_RSA2048 BOARD_AVB_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_SYSTEM_ROLLBACK_INDEX_LOCATION := 1 BOARD_AVB_VENDOR_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VENDOR_ALGORITHM := SHA256_RSA2048 BOARD_AVB_VENDOR_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_VENDOR_ROLLBACK_INDEX_LOCATION := 1
इस कॉन्फ़िगरेशन के साथ, बूटलोडर को vbmeta
system
के आखिर में मौजूद फ़ुटर और
vendor
विभाजन. क्योंकि ये विभाजन अब नहीं हैं
बूटलोडर को दिख रहा है (वे super
में मौजूद हैं), दो
बदलावों की ज़रूरत है.
-
vbmeta_system
औरvbmeta_vendor
जोड़ें डिवाइस के सेगमेंट में बांटी गई टेबल के सेगमेंट. A/B डिवाइसों के लिए, जोड़ेंvbmeta_system_a
,vbmeta_system_b
,vbmeta_vendor_a
औरvbmeta_vendor_b
. अगर आपने इनमें से एक या ज़्यादा सेगमेंट जोड़ने पर, वे एक जैसे साइज़ के होने चाहिएvbmeta
विभाजन के तौर पर. -
VBMETA_
और यह तय करें कि चेन के किन हिस्सों की चेन बढ़ी है:BOARD_AVB_VBMETA_SYSTEM := system BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048 BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1 BOARD_AVB_VBMETA_VENDOR := vendor BOARD_AVB_VBMETA_VENDOR_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VBMETA_VENDOR_ALGORITHM := SHA256_RSA2048 BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX_LOCATION := 1
ऐसा हो सकता है कि डिवाइस इनमें से किसी एक, दोनों या किसी भी पार्टीशन का इस्तेमाल न कर रहा हो. बदलाव लॉजिकल पार्टिशन से जोड़ते समय ही उनकी ज़रूरत होती है.
एवीबी बूटलोडर में बदलाव
अगर बूटलोडर में libavb को एम्बेड किया गया है, में ये पैच शामिल हैं:
- 818cf56740775446285466eda984acedd4baeac0 — "libavb: cmdline की ज़रूरत होने पर सिर्फ़ क्वेरी पार्टीशन GUID उन्हें लॉक कर सकें."
- 5abd6bc2578968d24406d834471adfd995a0c2e9 — "सिस्टम विभाजन मौजूद न होने की अनुमति दें"
- 9ba3b6613b4e5130fa01a11d984c6b5f0eb3af05 — "AvbSlotVerifyData->cmdline को ठीक करने की वैल्यू शून्य हो सकती है"
अगर चेन पार्टिशन का इस्तेमाल किया जा रहा है, तो एक और पैच शामिल करें:
- 49936b4c0109411fdd38bd4ba3a32a01c40439a9 — "libavb: विभाजन की शुरुआत में vbmeta BLOBs का समर्थन करें."
कर्नेल कमांड लाइन में बदलाव
androidboot.boot_devices
नाम का एक नया पैरामीटर जोड़ना ज़रूरी है
कर्नेल कमांड लाइन पर ले जाएं. init
इसका इस्तेमाल इन कामों के लिए करता है
/dev/block/by-name
सिमलिंक चालू करें. यह ऐसा होना चाहिए
नाम से बनाए गए सिमलिंक के लिए, डिवाइस पाथ कॉम्पोनेंट
ueventd
, इसका मतलब है
/dev/block/platform/device-path/by-name/partition-name
.
Android 12 या उसके बाद के वर्शन वाले डिवाइसों में
androidboot.boot_devices
को init
पर पास करने के लिए बूट कॉन्फ़िगरेशन.
उदाहरण के लिए, अगर नाम का सिमलिंक के हिसाब से सुपर पार्टीशन
/dev/block/platform/soc/100000.ufshc/by-name/super
,
आप BoardConfig.mk फ़ाइल में कमांड लाइन पैरामीटर को इस तरह जोड़ सकते हैं:
अनुसरण करता है:
BOARD_KERNEL_CMDLINE += androidboot.boot_devices=soc/100000.ufshcBoardConfig.mk फ़ाइल में बूट कॉन्फ़िगरेशन पैरामीटर को इस तरह से जोड़ा जा सकता है:
BOARD_BOOTCONFIG += androidboot.boot_devices=soc/100000.ufshc
fstab में हुए बदलाव
डिवाइस ट्री और डिवाइस ट्री ओवरले में fstab नहीं होना चाहिए एंट्री. किसी fstab फ़ाइल का इस्तेमाल करें जो ramdisk का हिस्सा होगी.
लॉजिकल पार्टिशन के लिए, fstab फ़ाइल में बदलाव करना ज़रूरी है:
-
fs_mgr फ़्लैग फ़ील्ड में
logical
फ़्लैग शामिल होना चाहिए औरfirst_stage_mount
फ़्लैग, Android 10. इससे पता चलता है कि सदस्यता के टाइप को पहले चरण में माउंट किया जाएगा. -
विभाजन से यह तय हो सकता है
avb=vbmeta partition name
fs_mgr
फ़्लैग और फिर बताया गयाvbmeta
विभाजन को पहले चरण सेinit
पहले शुरू किया जाता है किसी डिवाइस को माउंट करने की कोशिश करना. -
dev
फ़ील्ड, बंटवारे का नाम होना चाहिए.
नीचे दी गई fstab एंट्री, सिस्टम, वेंडर, और प्रॉडक्ट को लॉजिकल के तौर पर सेट करती हैं विभाजन.
#<dev> <mnt_point> <type> <mnt_flags options> <fs_mgr_flags> system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta,logical,first_stage_mount vendor /vendor ext4 ro,barrier=1 wait,slotselect,avb,logical,first_stage_mount product /product ext4 ro,barrier=1 wait,slotselect,avb,logical,first_stage_mountअभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
fstab फ़ाइल को पहले चरण के रैम डिस्क में कॉपी करें.
SELinux बदलाव
सुपर पार्टिशन ब्लॉक डिवाइस पर लेबल लगा होना चाहिए
super_block_device
. उदाहरण के लिए, अगर नाम का सिमलिंक के हिसाब से सुपर पार्टीशन
/dev/block/platform/soc/100000.ufshc/by-name/super
,
file_contexts
में यह लाइन जोड़ें:
/dev/block/platform/soc/10000\.ufshc/by-name/super u:object_r:super_block_device:s0
फ़ास्टबूट
बूटलोडर (या बिना यूज़रस्पेस फ़्लैशिंग टूल) को सही तरीके से समझने में गतिशील विभाजनों के अनुसार बनाया जाता है, ताकि यह उन्हें फ़्लैश न कर सके. इसे ठीक करने के लिए, डिवाइस को फ़ास्टबूट प्रोटोकॉल के यूज़र-स्पेस लागू करने के तरीके का इस्तेमाल करना चाहिए, फ़ास्टबूट.
फ़ास्टबूट को लागू करने के तरीके के बारे में ज़्यादा जानकारी के लिए, फ़ास्टबूट को उपयोगकर्ता के स्पेस में ले जाना लेख देखें.
adb रीमाउंट
इंजीनियरिंग या उपयोगकर्ता डीबग बिल्ड का इस्तेमाल करने वाले डेवलपर के लिए, adb remount
तेज़ी से दोहराने के लिए बहुत उपयोगी है. डाइनैमिक पार्टिशन
adb remount
के लिए समस्या, क्योंकि अब मुफ़्त नहीं है
हर फ़ाइल सिस्टम में स्पेस होता है. इसे ठीक करने के लिए, डिवाइस चालू कर सकते हैं
ओवरलेफ़ज़ के बारे में भी बताएं. सुपर पार्टीशन के अंदर खाली स्पेस होने पर,
adb remount
अपने-आप कुछ समय के लिए डाइनैमिक बनाता है
विभाजन और लिखने के लिए ओवरलेफ़ का उपयोग करता है. अस्थायी विभाजन है
नाम scratch
है, इसलिए अन्य नामों के लिए इस नाम का उपयोग न करें
विभाजन.
ओवरलेफ़ को चालू करने के तरीके के बारे में ज़्यादा जानने के लिए, overlayfs देखें AOSP में README करें.
Android डिवाइसों को अपग्रेड करें
अगर किसी डिवाइस को Android 10 पर अपग्रेड किया जाता है, और आपको ओटीए में डाइनैमिक पार्टीशन की सुविधा शामिल करनी है पहले से मौजूद सेगमेंट में मौजूद टेबल को बदलें. कुछ अतिरिक्त कॉन्फ़िगरेशन यह है आवश्यक.
डिवाइस के कॉन्फ़िगरेशन में किए गए बदलाव
डाइनैमिक पार्टीशन को पहले जैसा करने के लिए, नीचे दिए गए फ़्लैग जोड़ें
device.mk
:
PRODUCT_USE_DYNAMIC_PARTITIONS := true PRODUCT_RETROFIT_DYNAMIC_PARTITIONS := true
बोर्ड के कॉन्फ़िगरेशन में बदलाव
आपको बोर्ड के नीचे दिए गए वैरिएबल को सेट करना होगा:
BOARD_SUPER_PARTITION_BLOCK_DEVICES
को उन डिवाइसों की सूची पर सेट करें जिन्हें ब्लॉक किया गया है का इस्तेमाल करें. यह मौजूदा फ़िज़िकल नामों की सूची है पार्टिशन.BOARD_SUPER_PARTITION_partition_DEVICE_SIZE
को साइज़ पर सेट करेंBOARD_SUPER_PARTITION_BLOCK_DEVICES
में हर ब्लॉक डिवाइस की संख्या मिलती है. यह डिवाइस पर मौजूद भौतिक विभाजनों के आकार की सूची है. आम तौर पर ऐसा होता है मौजूदा बोर्ड मेंBOARD_partitionIMAGE_PARTITION_SIZE
कॉन्फ़िगरेशन.- सभी के लिए, मौजूदा
BOARD_partitionIMAGE_PARTITION_SIZE
को अनसेट करेंBOARD_SUPER_PARTITION_BLOCK_DEVICES
में विभाजन. BOARD_SUPER_PARTITION_SIZE
को कुल योग पर सेट करेंBOARD_SUPER_PARTITION_partition_DEVICE_SIZE
.BOARD_SUPER_PARTITION_METADATA_DEVICE
को ब्लॉक किए गए डिवाइस पर सेट करें, जहां डाइनैमिक पार्टिशन मेटाडेटा सेव है. यह इनमें से एक होना चाहिए:BOARD_SUPER_PARTITION_BLOCK_DEVICES
. आम तौर पर, इसे इस पर सेट किया जाता हैsystem
.BOARD_SUPER_PARTITION_GROUPS
सेट करें,BOARD_group_SIZE
, औरBOARD_group_PARTITION_LIST
. यहां जाएं: नए डिवाइसों पर बोर्ड कॉन्फ़िगरेशन में बदलाव करना देखें.
उदाहरण के लिए, अगर डिवाइस में पहले से ही सिस्टम और वेंडर पार्टीशन मौजूद हैं और आपको और अपडेट के दौरान एक नया प्रॉडक्ट विभाजन जोड़ दें, तो यह बोर्ड कॉन्फ़िगरेशन सेट करें:
BOARD_SUPER_PARTITION_BLOCK_DEVICES := system vendor BOARD_SUPER_PARTITION_METADATA_DEVICE := system # Rename BOARD_SYSTEMIMAGE_PARTITION_SIZE to BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE. BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE := <size-in-bytes> # Rename BOARD_VENDORIMAGE_PARTITION_SIZE to BOARD_SUPER_PARTITION_VENDOR_DEVICE_SIZE BOARD_SUPER_PARTITION_VENDOR_DEVICE_SIZE := <size-in-bytes> # This is BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE + BOARD_SUPER_PARTITION_VENDOR_DEVICE_SIZE BOARD_SUPER_PARTITION_SIZE := <size-in-bytes> # Configuration for dynamic partitions. For example: BOARD_SUPER_PARTITION_GROUPS := group_foo BOARD_GROUP_FOO_SIZE := <size-in-bytes> BOARD_GROUP_FOO_PARTITION_LIST := system vendor product
SELinux बदलाव
सुपर पार्टिशन ब्लॉक डिवाइसों को एट्रिब्यूट के साथ मार्क करना ज़रूरी है
super_block_device_type
. उदाहरण के लिए, अगर डिवाइस में पहले से ही
system
और vendor
पार्टिशन, आपको उन्हें ब्लॉक के तौर पर इस्तेमाल करना है
डायनेमिक पार्टिशन की सीमाओं को संग्रहित करने वाले डिवाइस और उनके नाम के सिमलिंक इस रूप में मार्क किए जाते हैं
system_block_device
:
/dev/block/platform/soc/10000\.ufshc/by-name/system u:object_r:system_block_device:s0 /dev/block/platform/soc/10000\.ufshc/by-name/vendor u:object_r:system_block_device:s0
इसके बाद, इस लाइन को device.te
में जोड़ें:
typeattribute system_block_device super_block_device_type;
अन्य कॉन्फ़िगरेशन के लिए, लागू करना नए डिवाइसों पर डाइनैमिक पार्टिशन.
रेट्रोफ़िट की सुविधा से जुड़े अपडेट के बारे में ज़्यादा जानने के लिए, यहां जाएं बिना डाइनैमिक वाले A/B डिवाइसों के लिए ओटीए सेगमेंट.
फ़ैक्ट्री इमेज
डाइनैमिक पार्टिशन की सुविधा के साथ लॉन्च होने वाले डिवाइस के लिए, इसका इस्तेमाल करने से बचें फ़्लैश फैक्ट्री इमेज के लिए यूज़रस्पेस फ़ास्टबूट, जैसा कि यूज़रस्पेस में बूट करने के लिए किया जाता है फ़्लैश करने के अन्य तरीकों से ज़्यादा धीमा हो जाता है.
इसे ठीक करने के लिए, make dist
अब एक अतिरिक्त
super.img
इमेज जिसे सीधे सुपर चैट में फ़्लैश किया जा सकता है
विभाजन. यह लॉजिकल कॉन्टेंट को अपने-आप बंडल कर देता है
विभाजन, जिसका मतलब है कि इसमें system.img
शामिल हैं,
super
के अलावा, vendor.img
और इसी तरह की अन्य मेट्रिक
विभाजन मेटाडेटा. इस इमेज को सीधे
super
पार्टीशन, जिसमें अलग से कोई टूल या इस्तेमाल नहीं किया गया है
फ़ास्टबूट. बिल्ड के बाद, super.img
को इसमें रखा जाता है
${ANDROID_PRODUCT_OUT}
.
डाइनैमिक पार्टिशन के साथ लॉन्च होने वाले A/B डिवाइसों के लिए,
super.img
में A स्लॉट में इमेज हैं. फ़्लैश करने के बाद
सुपर इमेज है, तो डिवाइस को फिर से चालू करने से पहले, स्लॉट A को 'बूट होने लायक' के तौर पर मार्क करें
डिवाइस.
रेट्रोफ़िट डिवाइसों के लिए, make dist
super_*.img
इमेज जिन्हें सीधे फ़्लैश किया जा सकता है
मिलते-जुलते भौतिक विभाजन. उदाहरण के लिए, make dist
super_system.img
और super_vendor.img
बनाता है
जब BOARD_SUPER_PARTITION_BLOCK_DEVICES
सिस्टम हो
वेंडर. इन इमेज को OTA फ़ोल्डर में
target_files.zip
.
डिवाइस मैपर स्टोरेज-डिवाइस ट्यूनिंग
डाइनैमिक पार्टिशनिंग में कई नॉन-डिटरमिनिस्टिक डिवाइस-मैपर शामिल होते हैं ऑब्जेक्ट हैं. हो सकता है कि ये सभी इंस्टैंशिएट न हों, इसलिए आपको माउंट करता है, और इससे जुड़े सभी सेगमेंट की Android प्रॉपर्टी को अपडेट करता है स्टोरेज की सुविधा वाले डिवाइस होते हैं.
init
में मौजूद सिस्टम, माउंट को और एसिंक्रोनस तरीके से ट्रैक करता है
Android की प्रॉपर्टी अपडेट करता है. इसमें लगने वाले समय की कोई गारंटी नहीं है
एक समयावधि में विज्ञापन दिखाए जा सकते हैं. इसलिए, आपको इसके लिए ज़रूरी है कि
के लिए सभी on property
ट्रिगर का इस्तेमाल किया जा सकता है. प्रॉपर्टी
dev.mnt.blk.<partition>
जहां
<partition>
root
है,
system
, data
या
उदाहरण के लिए, vendor
. हर प्रॉपर्टी
बेस स्टोरेज-डिवाइस का नाम, जैसा कि इन उदाहरणों में दिखाया गया है:
taimen:/ % getprop | grep dev.mnt.blk [dev.mnt.blk.data]: [sda] [dev.mnt.blk.firmware]: [sde] [dev.mnt.blk.metadata]: [sde] [dev.mnt.blk.persist]: [sda] [dev.mnt.blk.root]: [dm-0] [dev.mnt.blk.vendor]: [dm-1] blueline:/ $ getprop | grep dev.mnt.blk [dev.mnt.blk.data]: [dm-4] [dev.mnt.blk.metadata]: [sda] [dev.mnt.blk.mnt.scratch]: [sda] [dev.mnt.blk.mnt.vendor.persist]: [sdf] [dev.mnt.blk.product]: [dm-2] [dev.mnt.blk.root]: [dm-0] [dev.mnt.blk.system_ext]: [dm-3] [dev.mnt.blk.vendor]: [dm-1] [dev.mnt.blk.vendor.firmware_mnt]: [sda]
init.rc
भाषा की मदद से, Android प्रॉपर्टी
नियमों के तहत बढ़ाई गई है. साथ ही, स्टोरेज डिवाइसों को प्लैटफ़ॉर्म से ट्यून किया जा सकता है
इनकी मदद से, नीचे दिए गए निर्देशों का पालन करें:
write /sys/block/${dev.mnt.blk.root}/queue/read_ahead_kb 128 write /sys/block/${dev.mnt.blk.data}/queue/read_ahead_kb 128
दूसरे चरण init
में कमांड प्रोसेसिंग शुरू होने के बाद,
epoll loop
चालू हो जाता है और वैल्यू अपडेट होना शुरू हो जाती हैं. हालांकि,
क्योंकि प्रॉपर्टी ट्रिगर देर से init
तक चालू नहीं होते हैं, इसलिए वे
root
को हैंडल करने के लिए, शुरुआती बूट स्टेज में इसका इस्तेमाल नहीं किया जा सकता,
system
या vendor
. आपको
कर्नेल डिफ़ॉल्ट read_ahead_kb
early-fs
में init.rc
स्क्रिप्ट बदली जा सकती हैं (जब
अलग-अलग डीमन और सुविधाएं शुरू होती हैं. इसलिए, Google का सुझाव है कि
आप on property
सुविधा का इस्तेमाल करते हैं.
ऐसी प्रॉपर्टी जिसे init.rc
कंट्रोल करता है, जैसे कि sys.read_ahead_kb
,
चलाने के लिए सही समय तय करें, जैसे कि
उदाहरण:
on property:dev.mnt.blk.root=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.root}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.system=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.system}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.vendor=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.vendor}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.product=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.system_ext}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.oem=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.oem}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.data=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.data}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on early-fs: setprop sys.read_ahead_kb ${ro.read_ahead_kb.boot:-2048} on property:sys.boot_completed=1 setprop sys.read_ahead_kb ${ro.read_ahead_kb.bootcomplete:-128}