ব্যবহারকারীর স্পেসে ফাস্টবুট সরানো

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

ফাস্টবুট ও রিকভারি একত্রিত করা

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

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

ADB কমান্ড

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

Command বর্ণনা
reboot fastboot
  • fastbootd (সিস্টেম)-এ রিবুট করে।
  • রিবুট (রিকভারি) না করেই সরাসরি fastbootd-এ প্রবেশ করে।

Fastboot কমান্ড

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

Command বর্ণনা
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> কন্টেন্ট পরিবর্তন না করেই লজিক্যাল পার্টিশনের সাইজ পরিবর্তন করে নতুন সাইজ করে। সাইজ পরিবর্তন করার জন্য পর্যাপ্ত জায়গা না থাকলে এটি কাজ করে না।
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 ইমেজ ফ্ল্যাশ করে তা নির্ভর করে বুট হেডার ভার্সন ৩ নাকি ভার্সন ৪, তার উপর।

আরও জানতে, fastboot flash vendor_boot:default <vendor-ramdisk.img> দেখুন।

fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> Android 12 ও তার পরবর্তী যেকোনও ভার্সনে ব্যবহার করে ভেন্ডর র‍্যামডিস্ক ফ্ল্যাশ করার সুবিধা পান।

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

আরও জানতে, fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> দেখুন

ফাস্টবুট ও বুটলোডার

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

Command বর্ণনা
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 কমান্ডের প্রয়োগকে অবশ্যই এইসব বিশেষ মোড বাইপাস করতে হবে, যাতে ডিভাইসটি এমনভাবে বুট করে যেন ব্যবহারকারী পাওয়ার বোতাম প্রেস করেছেন।

Fastboot OEM HAL

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

ফাস্টবুট HAL-এর সংজ্ঞা নিচে দেওয়া হল:

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.mk-এ PRODUCT_PACKAGES-এ fastbootd যোগ করুন: PRODUCT_PACKAGES += fastbootd.

  2. রিকভারি ইমেজের অংশ হিসেবে fastboot HAL, boot control HAL এবং health HAL প্যাকেজ করা হয়েছে কিনা তা নিশ্চিত করুন।

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

ইউজারস্পেস ফাস্টবুট যাচাই করতে, Vendor Test Suite (VTS) রান করান।

ভেন্ডর র‍্যামডিস্ক ফ্ল্যাশ করুন

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

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

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

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

Fastbootd পরিবর্তন

getvar:max-fetch-size, max-download-size-এর মতো। এটি একটি DATA রেসপন্সে ডিভাইসটি পাঠাতে পারে এমন সর্বাধিক সাইজ নির্দিষ্ট করে। ড্রাইভারকে এই ভ্যালুর চেয়ে বড় সাইজ ফেচ করা চলবে না।

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

  • ডিভাইসটি ডিবাগ করা যায় এমন বিল্ডে চলছে।
  • ডিভাইস আনলক করা আছে (বুট স্টেট কমলা)।
  • ফেচ করা পার্টিশনের নাম হল vendor_boot।
  • size-এর ভ্যালু ০ < 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-এর জন্য এটি হল ০ এবং size-এর জন্য এটি হল partition_size - offset-এর গণনা করা ভ্যালু।

  • অফসেট উল্লেখ করা হয়েছে, সাইজ উল্লেখ করা হয়নি: size = partition_size - offset
  • কোনওটিই নির্দিষ্ট করা নেই: দুটির জন্যই ডিফল্ট ভ্যালু ব্যবহার করা হয়েছে, size = partition_size - ০।

যেমন, fetch:foo অফসেট ০-এ সম্পূর্ণ foo পার্টিশন ফেচ করে।

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

ড্রাইভার পরিবর্তন প্রয়োগ করার জন্য fastboot টুলে কমান্ড যোগ করা হয়েছে। Fastboot কমান্ডের টেবিলে প্রতিটি কমান্ডের সম্পূর্ণ সংজ্ঞা দেওয়া আছে।

  • 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 কল করা হয়েছে।

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

    vendor_boot image ফেচ করে, যেন fastboot fetch কল করা হয়েছে।

    • ভেন্ডর বুট হেডার ভার্সন ৩ হলে, এটি একটি সমস্যা রিটার্ন করে।
    • ভেন্ডর বুট হেডার ভার্সন ৪ হলে, এটি নিম্নলিখিত কাজগুলি করে:

      • ramdisk_<var>&lt;foo></var> নামের ভেন্ডর রামডিস্ক ফ্র্যাগমেন্ট খুঁজে পায়। খুঁজে না পাওয়া গেলে অথবা একাধিক ম্যাচ থাকলে, একটি সমস্যা রিটার্ন করে।
      • প্রদত্ত ছবি দিয়ে ভেন্ডর র‍্যামডিস্ক ফ্র্যাগমেন্ট পরিবর্তন করে।
      • ভেন্ডর র‍্যামডিস্ক টেবিলে প্রতিটি সাইজ ও অফসেট আবার গণনা করে।
      • নতুন vendor_boot ইমেজ ফ্ল্যাশ করে।
    • <foo> উল্লেখ করা না থাকলে, এটি ramdisk_ খোঁজার চেষ্টা করে।

mkbootimg

default নামটি Android 12 ও এর পরের যেকোনও ভার্সনে ভেন্ডর র‍্যামডিস্ক ফ্র্যাগমেন্টের নাম দেওয়ার জন্য সংরক্ষিত। fastboot flash vendor_boot:default শব্দার্থ একই থাকলেও, আপনাকে অবশ্যই নিজের ramdisk ফ্র্যাগমেন্টের নাম default হিসেবে রাখতে হবে না।

SELinux-এ পরিবর্তন

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