প্রারম্ভিক পার্টিশন মাউন্ট

ট্রিবল-সক্রিয় ডিভাইসগুলিকে অবশ্যই প্রথম ধাপে মাউন্ট সক্রিয় করতে হবে যাতে init সিকিউরিটি-এনহ্যান্সড লিনাক্স (SELinux) পলিসি ফ্র্যাগমেন্টগুলি লোড করতে পারে যা system এবং vendor পার্টিশন জুড়ে ছড়িয়ে আছে। এই অ্যাক্সেস কার্নেল বুট করার পরে যত তাড়াতাড়ি সম্ভব কার্নেল মডিউল লোড করতে সক্ষম করে।

প্রথম দিকে মাউন্ট করার জন্য, মডিউলগুলি থাকা ফাইল সিস্টেমগুলিতে অ্যান্ড্রয়েডের অ্যাক্সেস থাকতে হবে। Android 8.0 এবং উচ্চতর গুলি init এর প্রথম পর্যায়ে (অর্থাৎ, SElinux শুরু হওয়ার আগে) /system , /vendor , বা /odm মাউন্ট করা সমর্থন করে।

Fstab এন্ট্রি

অ্যান্ড্রয়েড 9 এবং তার নিচের সংস্করণে, ডিভাইস ট্রি ওভারলে (DTOs) ব্যবহার করে প্রাথমিক মাউন্ট করা পার্টিশনের জন্য fstab এন্ট্রি নির্দিষ্ট করতে পারে। অ্যান্ড্রয়েড 10 এবং উচ্চতর, ডিভাইসগুলিকে অবশ্যই প্রথম পর্যায়ের রামডিস্কে একটি fstab ফাইল ব্যবহার করে প্রাথমিক মাউন্ট করা পার্টিশনের জন্য fstab এন্ট্রি নির্দিষ্ট করতে হবে। Android 10 fstab ফাইলে ব্যবহারের জন্য নিম্নলিখিত fs_mgr ফ্ল্যাগগুলি প্রবর্তন করে:

  • first_stage_mount নির্দেশ করে যে একটি পার্টিশন প্রথম পর্যায়ের init দ্বারা মাউন্ট করা হবে।
  • logical নির্দেশ করে যে এটি একটি গতিশীল পার্টিশন
  • avb= vbmeta-partition-name vbmeta পার্টিশন নির্দিষ্ট করে। প্রথম পর্যায়ের init অন্যান্য পার্টিশন মাউন্ট করার আগে এই পার্টিশনটি শুরু করে। এই পতাকার যুক্তিটি বাদ দেওয়া যেতে পারে যদি পূর্ববর্তী লাইনে অন্য একটি fstab এন্ট্রি দ্বারা এন্ট্রির জন্য vbmeta পার্টিশন ইতিমধ্যেই নির্দিষ্ট করা থাকে।

নিম্নলিখিত উদাহরণে 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 ফাইলটি ramdisk এবং vendor পার্টিশনে রাখতে হবে।

রামডিস্ক

ramdisk-এ fstab ফাইলের অবস্থান নির্ভর করে কিভাবে একটি ডিভাইস ramdisk ব্যবহার করে।

বুট র্যামডিস্ক সহ ডিভাইসগুলিকে অবশ্যই fstab ফাইলটি বুট ramdisk রুটে রাখতে হবে। ডিভাইসটিতে বুট র‍্যামডিস্ক এবং একটি রিকভারি র‍্যামডিস্ক উভয়ই থাকলে, রিকভারি র‍্যামডিস্কে কোনো পরিবর্তনের প্রয়োজন নেই। উদাহরণ:

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

যে ডিভাইসগুলি র‍্যামডিস্ক হিসাবে পুনরুদ্ধার ব্যবহার করে সেগুলিকে অ্যান্ড্রয়েডে বুট করা বা পুনরুদ্ধারে বুট করা চালিয়ে যাওয়ার সিদ্ধান্ত নিতে কার্নেল কমান্ড লাইন প্যারামিটার androidboot.force_normal_boot=1 ব্যবহার করতে হবে। কার্নেল সংস্করণ 5.10 বা তার পরবর্তী সংস্করণের সাথে Android 12 বা তার বেশির সাথে চালু হওয়া ডিভাইসগুলিকে অবশ্যই androidboot.force_normal_boot=1 প্যারামিটার পাস করতে bootconfig ব্যবহার করতে হবে। এই ডিভাইসগুলিতে, প্রাথমিক মাউন্ট পার্টিশনগুলি মাউন্ট করার আগে প্রথম পর্যায়ে 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 পার্টিশনের প্রাথমিক মাউন্টিং সম্পূর্ণ করার পরে ramdisk মুক্ত করে এবং /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 এবং devicetree এন্ট্রিতে তাদের by-name সিমলিঙ্ক ব্যবহার করতে হবে। উদাহরণস্বরূপ, /dev/block/mmcblk0pX ব্যবহার করে পার্টিশনগুলি নির্দিষ্ট করার পরিবর্তে, নিশ্চিত করুন যে পার্টিশনগুলির নাম দেওয়া হয়েছে এবং ডিভাইস নোডটি /dev/block/…./by-name/{system,vendor,odm}
  2. পণ্যটির জন্য ডিভাইস কনফিগারেশনে PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION এবং CUSTOM_IMAGE_VERITY_BLOCK_DEVICE এর জন্য প্রদত্ত পাথগুলি অবশ্যই fstabdevice/ oem / project /device.mk এর 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 ফাইলের টুকরোগুলিতে পুনরাবৃত্তি করা উচিত নয়। উদাহরণ স্বরূপ, devicetree-এ mount /vendor এর জন্য একটি এন্ট্রি উল্লেখ করার সময়, fstab ফাইলটি সেই এন্ট্রি পুনরাবৃত্তি করা উচিত নয়।
  4. verifyatboot এর জন্য প্রয়োজনীয় পার্টিশনগুলিকে আগেভাগে মাউন্ট করা উচিত নয় (এটি করা অসমর্থিত)।
  5. যাচাইকৃত পার্টিশনের জন্য ভেরিটি মোড/স্টেট অবশ্যই androidboot.veritymode বিকল্প ব্যবহার করে kernel_cmdline এ নির্দিষ্ট করতে হবে (বিদ্যমান প্রয়োজনীয়তা)।

ডিভাইস ট্রি তাড়াতাড়ি মাউন্ট করা, VBoot 1.0

Android 8.x এবং উচ্চতর সংস্করণে, init ডিভাইসট্রি পার্স করে এবং প্রথম পর্যায়ে পার্টিশন মাউন্ট করার জন্য fstab এন্ট্রি তৈরি করে। একটি fstab এন্ট্রি ফর্ম নেয়:

src mnt_point type mnt_flags fs_mgr_flags

ডিভাইসট্রি বৈশিষ্ট্যগুলি সেই বিন্যাসটিকে অনুকরণ করার জন্য সংজ্ঞায়িত করা হয়েছে:

  • fstab এন্ট্রিগুলি অবশ্যই devicetree-এ /firmware/android/fstab এর অধীনে থাকতে হবে এবং অবশ্যই android,fstab এ একটি সামঞ্জস্যপূর্ণ স্ট্রিং সেট থাকতে হবে।
  • /firmware/android/fstab এর অধীনে প্রতিটি নোডকে একটি একক প্রাথমিক মাউন্ট fstab এন্ট্রি হিসাবে বিবেচনা করা হয়। একটি নোডের অবশ্যই নিম্নলিখিত বৈশিষ্ট্যগুলি সংজ্ঞায়িত করা উচিত:
    • dev অবশ্যই ডিভাইস নোডের দিকে নির্দেশ করতে হবে যা by-name পার্টিশনের প্রতিনিধিত্ব করে
    • type অবশ্যই ফাইল সিস্টেমের প্রকার হতে হবে (যেমন fstab ফাইলগুলিতে)
    • mnt_flags মাউন্ট পতাকাগুলির কমা দ্বারা পৃথক করা তালিকা হতে হবে (যেমন fstab ফাইলগুলিতে)
    • fsmgr_flags অবশ্যই Android fs_mgr flags তালিকা হতে হবে (যেমন fstab ফাইলগুলিতে)
  • A/B পার্টিশনে অবশ্যই একটি 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";
        };
      };
    };
  };
};

উদাহরণ: Pixel-এ /বিক্রেতা

নিম্নলিখিত উদাহরণটি পিক্সেল-এ /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 Verified Boot (AVB) । VBoot 2.0 এর সাথে প্রারম্ভিক মাউন্ট পার্টিশনের প্রয়োজনীয়তা হল:

  1. ডিভাইস নোড পাথ অবশ্যই fstab এবং devicetree এন্ট্রিতে তাদের 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 ফাইলের টুকরোগুলিতে পুনরাবৃত্তি করা উচিত নয়। উদাহরণ স্বরূপ, আপনি যদি devicetree-এ mount /vendor এর জন্য একটি এন্ট্রি উল্লেখ করেন, fstab ফাইলটি অবশ্যই সেই এন্ট্রি পুনরাবৃত্তি করবে না।
  4. VBoot 2.0 verifyatboot সমর্থন করে না, প্রারম্ভিক মাউন্ট সক্ষম হোক বা না হোক।
  5. যাচাইকৃত পার্টিশনের জন্য ভেরিটি মোড/স্টেট অবশ্যই androidboot.veritymode বিকল্প ব্যবহার করে kernel_cmdline এ নির্দিষ্ট করতে হবে (বিদ্যমান প্রয়োজনীয়তা)। AVB-এর জন্য নিম্নলিখিত সংশোধনগুলি অন্তর্ভুক্ত করা নিশ্চিত করুন:

ডিভাইস ট্রি তাড়াতাড়ি মাউন্ট করা, VBoot 2.0

VBoot 2.0-এর জন্য devicetree-এর কনফিগারেশন 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";
            };
          };
        };
      };
    };
    

উদাহরণ: Pixel-এ /বিক্রেতা

নিম্নলিখিত উদাহরণটি পিক্সেলের প্রথম দিকে মাউন্টিং /vendor দেখায়। মনে রাখবেন যে:

  • vbmeta এন্ট্রিতে আরও পার্টিশন নির্দিষ্ট করা হয়েছে কারণ এই পার্টিশনগুলি AVB দ্বারা সুরক্ষিত
  • সমস্ত AVB পার্টিশন অবশ্যই অন্তর্ভুক্ত করতে হবে, এমনকি যদি শুধুমাত্র /vendor প্রথম দিকে মাউন্ট করা হয়।
  • A/B সাপেক্ষে পার্টিশনের জন্য 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";
            };
          };
        };
      };
    };