ফাস্টবুটকে ইউজারস্পেসে সরানো

অ্যান্ড্রয়েড 10 এবং উচ্চতর ফাস্টবুট বাস্তবায়নকে বুটলোডার থেকে ইউজারস্পেসে স্থানান্তরিত করার মাধ্যমে আকার পরিবর্তনযোগ্য পার্টিশন সমর্থন করে। এই স্থানান্তরটি একটি হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) দ্বারা বাস্তবায়িত ফাস্টবুটের শুধুমাত্র বিক্রেতা-নির্দিষ্ট অংশগুলির সাথে একটি রক্ষণাবেক্ষণযোগ্য এবং পরীক্ষাযোগ্য সাধারণ অবস্থানে ফ্ল্যাশিং কোডকে স্থানান্তরিত করতে সক্ষম করে। এছাড়াও, Android 12 এবং উচ্চতর একটি অতিরিক্ত ফাস্টবুট কমান্ডের মাধ্যমে ফ্ল্যাশিং র‌্যামডিস্ক সমর্থন করে।

ফাস্টবুট এবং পুনরুদ্ধার একত্রিত করা

যেহেতু ইউজারস্পেস ফাস্টবুট এবং রিকভারি একই রকম, আপনি সেগুলিকে একটি পার্টিশন বা বাইনারিতে মার্জ করতে পারেন। এটি কম জায়গা ব্যবহার করা, সামগ্রিকভাবে কম পার্টিশন থাকা এবং ফাস্টবুট এবং পুনরুদ্ধার তাদের কার্নেল এবং লাইব্রেরি শেয়ার করার মতো সুবিধা প্রদান করে।

fastbootd সমর্থন করার জন্য, বুটলোডারকে boot-fastboot এর একটি নতুন বুট কন্ট্রোল ব্লক (BCB) কমান্ড প্রয়োগ করতে হবে। fastbootd মোডে প্রবেশ করতে, বুটলোডার BCB বার্তার কমান্ড ক্ষেত্রে boot-fastboot লিখে এবং BCB-এর recovery ক্ষেত্র অপরিবর্তিত রাখে (যেকোন বাধাগ্রস্ত পুনরুদ্ধার কাজ পুনরায় চালু করতে সক্ষম করতে)। status , stage এবং reserved ক্ষেত্রগুলিও অপরিবর্তিত রয়েছে। BCB কমান্ড ফিল্ডে boot-fastboot দেখে বুটলোডার রিকভারি ইমেজে লোড হয় এবং বুট করে। রিকভারি তারপর বিসিবি বার্তা পার্স করে এবং fastbootd মোডে স্যুইচ করে।

ADB কমান্ড

এই বিভাগে fastbootd সংহত করার জন্য adb কমান্ড বর্ণনা করে। কমান্ডের বিভিন্ন ফলাফল রয়েছে, এটি সিস্টেম দ্বারা বা পুনরুদ্ধারের মাধ্যমে কার্যকর করা হয়েছে তার উপর নির্ভর করে।

আদেশ বর্ণনা
reboot fastboot
  • fastbootd (সিস্টেম) এ রিবুট করুন।
  • একটি রিবুট (পুনরুদ্ধার) ছাড়াই সরাসরি fastbootd এ প্রবেশ করে।

ফাস্টবুট কমান্ড

এই বিভাগে fastbootd সংহত করার জন্য ফাস্টবুট কমান্ড বর্ণনা করা হয়েছে, যার মধ্যে ফ্ল্যাশিং এবং লজিক্যাল পার্টিশন পরিচালনার জন্য নতুন কমান্ড রয়েছে। কিছু কমান্ডের বিভিন্ন ফলাফল আছে, সেগুলি বুটলোডার দ্বারা বা fastbootd দ্বারা কার্যকর করা হয়েছে তার উপর নির্ভর করে।

আদেশ বর্ণনা
reboot recovery
  • রিকভারিতে রিবুট করুন (বুটলোডার)।
  • রিবুট ছাড়াই সরাসরি পুনরুদ্ধারে প্রবেশ করে ( fastbootd )।
reboot fastboot fastbootd এ রিবুট করুন।
getvar is-userspace
  • yes ( fastbootd ) ফেরত দেয়।
  • রিটার্ন no (বুটলোডার)।
getvar is-logical: <partition> প্রদত্ত পার্টিশনটি একটি যৌক্তিক পার্টিশন হলে yes প্রদান করে, অন্যথায় no । লজিক্যাল পার্টিশন নীচে তালিকাভুক্ত সমস্ত কমান্ড সমর্থন করে।
getvar super-partition-name সুপার পার্টিশনের নাম প্রদান করে। নামটিতে বর্তমান স্লট প্রত্যয় অন্তর্ভুক্ত থাকে যদি সুপার পার্টিশনটি একটি A/B পার্টিশন হয় (এটি সাধারণত হয় না)।
create-logical-partition <partition> <size> প্রদত্ত নাম এবং আকার সহ একটি লজিক্যাল পার্টিশন তৈরি করে। একটি যৌক্তিক বিভাজন হিসাবে নামটি অবশ্যই বিদ্যমান থাকবে না।
delete-logical-partition <partition> প্রদত্ত লজিক্যাল পার্টিশন মুছে দেয় (কার্যকরভাবে পার্টিশনটি মুছে দেয়)।
resize-logical-partition <partition> <size> লজিক্যাল পার্টিশনের বিষয়বস্তু পরিবর্তন না করে নতুন আকারে পরিবর্তন করে। পুনরায় আকার সঞ্চালনের জন্য পর্যাপ্ত স্থান উপলব্ধ না হলে ব্যর্থ হয়৷
update-super <partition> সুপার পার্টিশন মেটাডেটা পরিবর্তনগুলি মার্জ করে। যদি একটি মার্জ সম্ভব না হয় (উদাহরণস্বরূপ, ডিভাইসের বিন্যাসটি একটি অসমর্থিত সংস্করণ), তাহলে এই কমান্ডটি ব্যর্থ হয়। একত্রিত করার পরিবর্তে একটি ঐচ্ছিক wipe প্যারামিটার ডিভাইসের মেটাডেটা ওভাররাইট করে।
flash <partition> [ <filename> ] একটি ফ্ল্যাশ পার্টিশনে একটি ফাইল লেখে। ডিভাইসটি অবশ্যই আনলক অবস্থায় থাকতে হবে।
erase <partition> একটি পার্টিশন মুছে দেয় (নিরাপদ মুছে ফেলার প্রয়োজন নেই)। ডিভাইসটি অবশ্যই আনলক অবস্থায় থাকতে হবে।
getvar <variable> | all একটি বুটলোডার ভেরিয়েবল বা সমস্ত ভেরিয়েবল প্রদর্শন করে। ভেরিয়েবলটি বিদ্যমান না থাকলে, একটি ত্রুটি প্রদান করে।
set_active <slot>

প্রদত্ত A/B বুটিং স্লট active হিসাবে সেট করে। পরবর্তী বুট প্রচেষ্টায়, সিস্টেমটি নির্দিষ্ট স্লট থেকে বুট হয়।

A/B সমর্থনের জন্য, স্লট হল পার্টিশনের নকল সেট যা থেকে স্বাধীনভাবে বুট করা যায়। স্লটগুলির নামকরণ করা হয় a , b , ইত্যাদি, এবং পার্টিশনের নামের সাথে _a , _b , ইত্যাদি প্রত্যয় যোগ করে আলাদা করা হয়।

reboot ডিভাইসটি স্বাভাবিকভাবে রিবুট করে।
reboot-bootloader (বা reboot bootloader ) বুটলোডারে ডিভাইস রিবুট করুন।
fastboot fetch vendor_boot <out.img>

ফ্ল্যাশিং ভেন্ডর র‌্যামডিস্ক সমর্থন করতে Android 12 এবং উচ্চতর সংস্করণে ব্যবহার করুন।

সম্পূর্ণ পার্টিশনের আকার এবং খণ্ডের আকার পায়। প্রতিটি খণ্ডের জন্য ডেটা পায়, তারপর ডেটাকে <out.img> এ সেলাই করে

বিস্তারিত জানার জন্য, দেখুন fastboot fetch vendor_boot <out.img>

fastboot flash vendor_boot:default <vendor-ramdisk.img>

ফ্ল্যাশিং ভেন্ডর র‌্যামডিস্ক সমর্থন করতে Android 12 এবং উচ্চতর সংস্করণে ব্যবহার করুন।

এটি ফ্ল্যাশ কমান্ডের একটি বিশেষ রূপ। এটি একটি fetch vendor_boot ইমেজ ফাংশন সম্পাদন করে, যেন fastboot fetch বলা হয়। নতুন vendor_boot ইমেজ যেটি ফ্ল্যাশ করে তা নির্ভর করে বুট হেডার সংস্করণটি সংস্করণ 3 বা সংস্করণ 4 কিনা তার উপর।

বিস্তারিত জানার জন্য, দেখুন fastboot flash vendor_boot:default <vendor-ramdisk.img>

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> ফ্ল্যাশিং ভেন্ডর র‌্যামডিস্ক সমর্থন করতে Android 12 এবং উচ্চতর সংস্করণে ব্যবহার করুন।

vendor_boot চিত্রটি নিয়ে আসে। ভেন্ডর বুট হেডারটি ভার্সন 3 হলে একটি ত্রুটি দেখায়। যদি এটি 4 সংস্করণ হয়, তাহলে এটি সঠিক ভেন্ডর র‍্যামডিস্ক ফ্র্যাগমেন্ট খুঁজে পায় (যদি উপলব্ধ থাকে)। এটি প্রদত্ত চিত্রের সাথে প্রতিস্থাপন করে, আকার এবং অফসেটগুলি পুনরায় গণনা করে এবং নতুন vendor_boot image ফ্ল্যাশ করে।

বিস্তারিত জানার জন্য, fastboot flash vendor_boot: <foo> <vendor-ramdisk.img>

ফাস্টবুট এবং বুটলোডার

বুটলোডার bootloader , radio , এবং boot/recovery পার্টিশনগুলিকে ফ্ল্যাশ করে, তারপরে ডিভাইসটি ফাস্টবুট (ইউজারস্পেস) এ বুট করে এবং অন্যান্য সমস্ত পার্টিশন ফ্ল্যাশ করে। বুটলোডার নিম্নলিখিত কমান্ড সমর্থন করা উচিত.

আদেশ বর্ণনা
download ফ্ল্যাশ করতে ইমেজ ডাউনলোড করে।
flash recovery <image> / flash boot <image> / flash bootloader <image> / ফ্ল্যাশ recovery/boot পার্টিশন এবং বুটলোডার।
reboot ডিভাইস রিবুট করুন।
reboot fastboot ফাস্টবুটে রিবুট করুন।
reboot recovery পুনরুদ্ধারের জন্য রিবুট করুন।
getvar একটি বুটলোডার ভেরিয়েবল পায় যা পুনরুদ্ধার/বুট ইমেজ ফ্ল্যাশ করার জন্য প্রয়োজনীয় (উদাহরণস্বরূপ, current-slot এবং max-download-size )।
oem <command> OEM দ্বারা সংজ্ঞায়িত কমান্ড।

গতিশীল পার্টিশন

বুটলোডার অবশ্যই গতিশীল পার্টিশনের ফ্ল্যাশিং বা মুছে ফেলার অনুমতি দেবে না এবং এই ক্রিয়াকলাপগুলির চেষ্টা করা হলে অবশ্যই একটি ত্রুটি ফেরত দিতে হবে। রেট্রোফিটেড ডায়নামিক পার্টিশন ডিভাইসের জন্য, ফাস্টবুট টুল (এবং বুটলোডার) বুটলোডার মোডে থাকাকালীন একটি ডায়নামিক পার্টিশনকে সরাসরি ফ্ল্যাশ করার জন্য একটি ফোর্স মোড সমর্থন করে। উদাহরণস্বরূপ, যদি system রেট্রোফিটেড ডিভাইসে একটি গতিশীল পার্টিশন হয়, তাহলে fastboot --force flash system কমান্ডটি বুটলোডারকে ( fastbootd এর পরিবর্তে) পার্টিশনটি ফ্ল্যাশ করতে সক্ষম করে।

অফ-মোড চার্জিং

যদি কোনও ডিভাইস অফ-মোড চার্জিং সমর্থন করে বা অন্যথায় পাওয়ার প্রয়োগ করার সময় একটি বিশেষ মোডে অটোবুট হয়, fastboot oem off-mode-charge 0 কমান্ডের বাস্তবায়নকে অবশ্যই এই বিশেষ মোডগুলিকে বাইপাস করতে হবে, যাতে ডিভাইসটি এমনভাবে বুট হয় যেন ব্যবহারকারী চাপ দিয়েছে। পাওয়ার বোতাম।

ফাস্টবুট OEM HAL

বুটলোডার ফাস্টবুট সম্পূর্ণরূপে প্রতিস্থাপন করতে, ফাস্টবুটকে অবশ্যই বিদ্যমান ফাস্টবুট কমান্ডগুলি পরিচালনা করতে হবে। এই কমান্ডগুলির মধ্যে অনেকগুলি OEM থেকে এসেছে এবং নথিভুক্ত কিন্তু একটি কাস্টম বাস্তবায়ন প্রয়োজন৷ অনেক OEM-নির্দিষ্ট কমান্ড নথিভুক্ত করা হয় না । এই ধরনের কমান্ড পরিচালনা করতে, fastboot HAL প্রয়োজনীয় OEM কমান্ডগুলি নির্দিষ্ট করে। OEM তাদের নিজস্ব কমান্ড বাস্তবায়ন করতে পারে।

ফাস্টবুট এইচএএল এর সংজ্ঞা নিম্নরূপ:

import IFastbootLogger;

/**
 * IFastboot interface implements vendor specific fastboot commands.
 */
interface IFastboot {
    /**
     * Returns a bool indicating whether the bootloader is enforcing verified
     * boot.
     *
     * @return verifiedBootState True if the bootloader is enforcing verified
     * boot and False otherwise.
     */
    isVerifiedBootEnabled() generates (bool verifiedBootState);

    /**
     * Returns a bool indicating the off-mode-charge setting. If off-mode
     * charging is enabled, the device autoboots into a special mode when
     * power is applied.
     *
     * @return offModeChargeState True if the setting is enabled and False if
     * not.
     */
    isOffModeChargeEnabled() generates (bool offModeChargeState);

    /**
     * Returns the minimum battery voltage required for flashing in mV.
     *
     * @return batteryVoltage Minimum battery voltage (in mV) required for
     * flashing to be successful.
     */
    getBatteryVoltageFlashingThreshold() generates (int32_t batteryVoltage);

    /**
     * Returns the file system type of the partition. This is only required for
     * physical partitions that need to be wiped and reformatted.
     *
     * @return type Can be ext4, f2fs or raw.
     * @return result SUCCESS if the operation is successful,
     * FAILURE_UNKNOWN if the partition is invalid or does not require
     * reformatting.
     */
    getPartitionType(string partitionName) generates (FileSystemType type, Result result);

    /**
     * Executes a fastboot OEM command.
     *
     * @param oemCmd The oem command that is passed to the fastboot HAL.
     * @response result Returns the status SUCCESS if the operation is
     * successful,
     * INVALID_ARGUMENT for bad arguments,
     * FAILURE_UNKNOWN for an invalid/unsupported command.
     */
    doOemCommand(string oemCmd) generates (Result result);

};

fastbootd সক্ষম করা হচ্ছে

একটি ডিভাইসে fastbootd সক্ষম করতে:

  1. device.mkPRODUCT_PACKAGESfastbootd যোগ করুন: PRODUCT_PACKAGES += fastbootd

  2. নিশ্চিত করুন যে ফাস্টবুট HAL, বুট কন্ট্রোল HAL, এবং স্বাস্থ্য HAL পুনরুদ্ধার চিত্রের অংশ হিসাবে প্যাকেজ করা হয়েছে।

  3. fastbootd এর জন্য প্রয়োজনীয় যেকোন ডিভাইস-নির্দিষ্ট SEPpolicy অনুমতি যোগ করুন। উদাহরণস্বরূপ, fastbootd এর জন্য সেই পার্টিশন ফ্ল্যাশ করার জন্য একটি ডিভাইস-নির্দিষ্ট পার্টিশনে লেখার অ্যাক্সেস প্রয়োজন। উপরন্তু, fastboot HAL বাস্তবায়নের জন্য ডিভাইস-নির্দিষ্ট অনুমতির প্রয়োজন হতে পারে।

ইউজারস্পেস ফাস্টবুট যাচাই করতে, ভেন্ডর টেস্ট স্যুট (ভিটিএস) চালান।

ফ্ল্যাশিং বিক্রেতা রামডিস্ক

অ্যান্ড্রয়েড 12 এবং উচ্চতর একটি অতিরিক্ত ফাস্টবুট কমান্ডের সাহায্যে র‌্যামডিস্ক ফ্ল্যাশ করার জন্য সমর্থন প্রদান করে যা একটি ডিভাইস থেকে সম্পূর্ণ vendor_boot ইমেজ টানে। কমান্ডটি হোস্ট-সাইড ফাস্টবুট টুলকে ভেন্ডর বুট হেডার, রিইমেজ এবং নতুন ইমেজ ফ্ল্যাশ করতে অনুরোধ করে।

সম্পূর্ণ vendor_boot ইমেজটি টেনে আনতে, fetch:vendor_boot কমান্ডটি fastboot প্রোটোকল এবং Android 12-এ প্রোটোকলের fastbootd বাস্তবায়ন উভয় ক্ষেত্রেই যোগ করা হয়েছে। মনে রাখবেন যে fastbootd এটি বাস্তবায়ন করে , কিন্তু বুটলোডার নিজে নাও হতে পারে। OEMs তাদের প্রোটোকলের বুটলোডার বাস্তবায়নে fetch:vendor_boot কমান্ড যোগ করতে পারে। যাইহোক, যদি বুটলোডার মোডে কমান্ডটি স্বীকৃত না হয়, তাহলে বুটলোডার মোডে পৃথক ভেন্ডর র‌্যামডিস্ক ফ্ল্যাশ করা একটি ভেন্ডর-সমর্থিত বিকল্প নয়।

বুটলোডার পরিবর্তন

getvar:max-fetch-size এবং fetch:name fastbootd এ প্রয়োগ করা হয়। বুটলোডারে ফ্ল্যাশিং ভেন্ডর রামডিস্ক সমর্থন করতে, আপনাকে অবশ্যই এই দুটি কমান্ড প্রয়োগ করতে হবে।

ফাস্টবুট পরিবর্তন

getvar:max-fetch-size হল max-download-size এর মতো। এটি সর্বোচ্চ আকার নির্দিষ্ট করে যা ডিভাইসটি একটি ডেটা প্রতিক্রিয়াতে পাঠাতে পারে। ড্রাইভার অবশ্যই এই মানের থেকে বড় আকার আনবে না।

fetch:name[:offset[:size]] ডিভাইসে একাধিক পরীক্ষা করে। নিচের সবগুলো সত্য হলে, fetch:name[:offset[:size]] কমান্ড ডেটা প্রদান করে:

  • ডিভাইসটি একটি ডিবাগযোগ্য বিল্ড চালাচ্ছে৷
  • ডিভাইসটি আনলক করা আছে (বুট স্টেট কমলা)।
  • আনা পার্টিশনের নাম vendor_boot
  • size মান 0 < size <= max-fetch-size মধ্যে পড়ে।

এগুলি যাচাই করা হলে, fetch:name[:offset[:size]] পার্টিশনের আকার এবং অফসেট প্রদান করে। নিম্নলিখিত নোট করুন:

  • fetch:name fetch:name:0 এর সমতুল্য, যা fetch:name:0:partition_size সমতুল্য।
  • fetch:name:offset fetch:name:offset:(partition_size - offset)

তাই fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset)

যখন offset বা partition_size (বা উভয়ই) অনির্দিষ্ট থাকে, তখন ডিফল্ট মান ব্যবহার করা হয়, যা offset জন্য 0 এবং size জন্য partition_size - offset গণনা করা মান।

  • অফসেট নির্দিষ্ট, আকার অনির্দিষ্ট: size = partition_size - offset
  • কোনটিই নির্দিষ্ট করা হয়নি: উভয়ের জন্য ব্যবহৃত ডিফল্ট মান, size = partition_size - 0।

উদাহরণস্বরূপ, fetch:foo অফসেট 0 এ পুরো foo পার্টিশন নিয়ে আসে।

ড্রাইভার পরিবর্তন

ড্রাইভার পরিবর্তন বাস্তবায়নের জন্য ফাস্টবুট টুলে কমান্ড যোগ করা হয়েছে। প্রতিটি ফাস্টবুট কমান্ডের সারণীতে তার সম্পূর্ণ সংজ্ঞার সাথে লিঙ্ক করা হয়েছে।

  • fastboot fetch vendor_boot out.img

    • খণ্ড আকার নির্ধারণ করতে getvar max-fetch-size কল করে।
    • পুরো পার্টিশনের আকার নির্ধারণ করতে getvar partition-size:vendor_boot[_a] কল করে।
    • প্রতিটি খণ্ডের জন্য fastboot fetch vendor_boot[_a]:offset:size কল করে। (খণ্ডের আকার vendor_boot আকারের চেয়ে বড়, তাই সাধারণত শুধুমাত্র একটি অংশ থাকে।)
    • out.img এ ডেটা একসাথে সেলাই করে।
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    এটি ফ্ল্যাশ কমান্ডের একটি বিশেষ রূপ। এটি vendor_boot ইমেজটি নিয়ে আসে, যেন fastboot fetch বলা হয়েছে।

    • বিক্রেতা বুট হেডার সংস্করণ 3 হলে, এটি নিম্নলিখিতগুলি করে:
      • প্রদত্ত চিত্রের সাথে বিক্রেতা রামডিস্ক প্রতিস্থাপন করে।
      • নতুন vendor_boot ইমেজ ফ্ল্যাশ করে।
    • বিক্রেতা বুট শিরোনাম সংস্করণ 4 হলে, এটি নিম্নলিখিত কাজ করে:
      • প্রদত্ত ইমেজটির সাথে পুরো ভেন্ডর র‍্যামডিস্ক প্রতিস্থাপন করে যাতে প্রদত্ত ইমেজটি vendor_boot ইমেজে একমাত্র ভেন্ডর র‍্যামডিস্ক ফ্র্যাগমেন্ট হয়ে যায়।
      • বিক্রেতা রামডিস্ক টেবিলে আকার এবং অফসেট পুনরায় গণনা করে।
      • নতুন vendor_boot ইমেজ ফ্ল্যাশ করে।
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    vendor_boot image আনে, যেন fastboot fetch বলা হয়েছে।

    • বিক্রেতা বুট শিরোনাম সংস্করণ 3 হলে, এটি একটি ত্রুটি প্রদান করে।
    • বিক্রেতা বুট শিরোনাম সংস্করণ 4 হলে, এটি নিম্নলিখিত কাজ করে:

      • foo নামের সাথে বিক্রেতা র্যামডিস্ক খণ্ডটি খুঁজে পায়। যদি না পাওয়া যায়, বা একাধিক মিল থাকলে, একটি ত্রুটি প্রদান করে।
      • প্রদত্ত চিত্রের সাথে বিক্রেতা রামডিস্ক খণ্ডটি প্রতিস্থাপন করে।
      • বিক্রেতা রামডিস্ক টেবিলে প্রতিটি আকার এবং অফসেট পুনরায় গণনা করে।
      • নতুন vendor_boot ইমেজ ফ্ল্যাশ করে।

mkbootimg

নাম default Android 12 এবং উচ্চতর বিক্রেতা ramdisk টুকরা নামকরণের জন্য সংরক্ষিত। যদিও fastboot flash vendor_boot:default শব্দার্থ একই থাকে, আপনি অবশ্যই আপনার র‌্যামডিস্কের টুকরোকে default হিসেবে নাম দেবেন না

SELinux পরিবর্তন

ফ্ল্যাশিং ভেন্ডর রামডিস্ক সমর্থন করার জন্য fastbootd.te এ একটি পরিবর্তন করা হয়েছে।