Podłącz partycje na wczesnym etapie

Na urządzeniach z wysokością musi być włączone podłączenie pierwszego etapu, aby upewnić się, Przeglądarka init może załadować rozszerzone zabezpieczenia Linuksa (SELinux) fragmenty zasad w obszarach system i Partycje: vendor. Ten dostęp umożliwia też ładowanie jądra systemu i modułów od razu po uruchomieniu jądra.

Aby możliwe było wcześniejsze podłączenie, Android musi mieć dostęp do systemów plików w w których znajdują się poszczególne moduły. Android 8.0 i nowszy obsługuje podłączanie /system, /vendor lub /odm już od pierwszego etapu init (czyli przed zainicjowaniem SElinux).

Wpisy Fstab

W Androidzie 9 i starszych wersjach urządzenia mogą określać wpisy fstab dla wcześnie podłączone partycje za pomocą drzewa urządzenia (DTO). Na Androidzie 10 i nowszych urządzenia muszą mieć określone wpisy fstab dotyczące wcześniej podłączonych partycji używając w pierwszym etapie pliku fstab. ramdisk. Android, 10 wprowadza te flagi fs_mgr do użycia w pliku fstab:

  • first_stage_mount oznacza, że partycja została podłączona. przez jego rozpoczęcie.
  • logical oznacza, że jest to partycji dynamicznej.
  • avb=vbmeta-partition-name określa vbmeta partycja. Pierwszy etap inicjuje tę partycję przed podłączeniem innych partycji. Argument tej flagi można pominąć, jeśli partycja vbmeta wpisu została już określona przez kolejny wpis fstab w poprzednim wierszu.

Poniższy przykład pokazuje wpisy fstab służące do ustawienia Partycje system, vendor i product jako partycje logiczne (dynamiczne).

#<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

W tym przykładzie dostawca określa partycję vbmeta za pomocą parametru flaga fs_mgr avb=vbmeta, ale product pomija argument vbmeta, ponieważ dostawca już go dodał vbmeta.

Na urządzeniach z Androidem 10 lub nowszym musi znajdować się tag fstab w dysku RAM i w folderze vendor partycji danych.

Ramdysk

Lokalizacja pliku fstab w pamięci RAM zależy od tego, jak urządzenie korzysta z dysku ramdisk.

Urządzenia z dyskiem pamięci RAM muszą umieścić fstab w katalogu głównym dysku RAM. Jeśli urządzenie ma zarówno dysk RAM, nie są wymagane żadne zmiany w nim. Przykład:

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

Urządzenia korzystające z przywracania pamięci RAM muszą używać parametr wiersza poleceń jądra androidboot.force_normal_boot=1 do wybrać, czy uruchomić urządzenie z Androidem, czy kontynuować przywracanie. Urządzenia Aplikacje na urządzeniach z Androidem 12 lub nowszym jądro w wersji 5.10 lub nowszej musi używać polecenia rozruchowego do przekazywania androidboot.force_normal_boot=1. W na tych urządzeniach, inicjowanie pierwszego etapu powoduje przejście do /first_stage_ramdisk. więc urządzenia muszą umieszczać plik fstab w $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk Przykład:

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

Dostawca

Wszystkie urządzenia muszą umieścić kopię pliku fstab w /vendor/etc Dzieje się tak, ponieważ rozpoczęcie pierwszego etapu uwalnia ramdisk po zakończeniu wczesnego podłączania partycji i wykonaniu przełącz operację główną, aby przenieść punkt montowania w: /system na / Wszystkie kolejne operacje wymagające dostępu do fstab musisz więc używać kopii w folderze /vendor/etc. Przykład:

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

Wcześniejsze podłączenie partycji, VBoot 1.0

Wymagania dotyczące wczesnego podłączenia partycji za pomocą VBoot 1.0 to między innymi:

  1. Ścieżki węzłów urządzeń muszą używać dowiązania symbolicznego by-name w Wpisy fstab i drzewa urządzeń. Na przykład zamiast określać za pomocą /dev/block/mmcblk0pX, upewnij się, że partycje są a węzeł urządzenia to /dev/block/…./by-name/{system,vendor,odm}
  2. Podano ścieżki dla PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION i CUSTOM_IMAGE_VERITY_BLOCK_DEVICE w konfiguracji urządzenia dla: danego produktu (czyli w device/oem/project/device.mk) musi być zgodny z wartością odpowiednie węzły urządzeń blokowych określone by-name w Wpisy: fstab/devicetree. Przykład:
    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. Wpisy podawane za pomocą nakładek drzewa urządzeń nie mogą się powtarzać w Fragmenty pliku: fstab. Na przykład podczas określania wpisu dla podłączenie /vendor na drzewie urządzeń (plik fstab) nie może powtarzać tego wpisu.
  4. Partycje wymagające uprawnień verifyatboot nie mogą być podłączone wcześniej (nie jest to możliwe).
  5. Tryb/stan poprawności w przypadku zweryfikowanych partycji musi być określony w kernel_cmdline z użyciem opcji androidboot.veritymode (obowiązujące wymagania).

Wcześniejsze zamontowanie drzewa urządzenia, VBoot 1.0

W Androidzie 8.x lub nowszym aplikacja init analizuje drzewo urządzeń i tworzy fstab wpisy umożliwiające podłączenie partycji na wczesnym etapie pierwszego etapu. Wpis fstab ma następujący format:

src mnt_point type mnt_flags fs_mgr_flags

Właściwości Devicetree zostały zdefiniowane tak, aby przypominały ten format:

  • fstab pozycji musi być poniżej /firmware/android/fstab w drzewie urządzeń i musi mieć ustaw zgodny ciąg na android,fstab.
  • Każdy węzeł w jednostce organizacyjnej /firmware/android/fstab jest traktowany jako jeden wpis dotyczący wcześniejszego podłączenia fstab. Węzeł musi mieć: zdefiniowane właściwości:
    • dev musi wskazywać węzeł urządzenia reprezentujący partycja by-name
    • type musi być typem systemu plików (jak w fstab plików)
    • mnt_flags musi być rozdzielaną przecinkami listą flag podłączenia (tak jak w fstab plikach)
    • Pole fsmgr_flags musi być listą urządzeń z Androidem fs_mgr flags (tak jak w przypadku plików fstab)
  • Partycje A/B muszą mieć opcję slotselect fs_mgr.
  • Partycje z włączoną obsługą dm-verity muszą mieć verify fs_mgr .

Przykład: /system i /vendor w N6P

Poniższy przykład pokazuje wczesny punkt podłączania drzewa urządzenia dla: system i vendor partycji na Nexusie 6P:

/ {
  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";
        };
      };
    };
  };
};

Przykład: /vendor na urządzeniu Pixel

Poniższy przykład pokazuje wczesny punkt podłączania drzewa urządzenia dla: /vendor na Pixelu (pamiętaj o dodaniu parametru slotselect w przypadku partycji podlegających A/B):

/ {
  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";
        };
      };
    };
  };
};

Wcześniejsze podłączanie partycji, VBoot 2.0

VBoot 2.0 to weryfikacja podczas uruchamiania Androida (AVB). Wymagania wstępne Za pomocą VBoot 2.0 partycje podłączenia to:

  1. Ścieżki węzłów urządzeń muszą używać dowiązania symbolicznego by-name w: Wpisy fstab i drzewa urządzeń. Na przykład zamiast określać partycje za pomocą /dev/block/mmcblk0pX, upewnij się, że partycje mają nazwę, a węzeł urządzenia to /dev/block/…./by-name/{system,vendor,odm}
  2. Kompiluj zmienne systemowe (np. PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION i CUSTOM_IMAGE_VERITY_BLOCK_DEVICE) używane w VBoot 1.0 NIE są wymagane przez VBoot 2.0. Zamiast tego utwórz zmienne wprowadzone w VBoot 2.0. (w tym BOARD_AVB_ENABLE := true) powinien być zdefiniowany; dla pełną konfigurację, zapoznaj się z artykułem Utwórz integrację systemu dla AVB.
  3. Wpisy podawane za pomocą nakładek drzewa urządzeń nie mogą się powtarzać w Fragmenty pliku: fstab. Jeśli na przykład określisz wpis do podłączenie /vendor na drzewie urządzeń (plik fstab) nie może powtarzać tego wpisu.
  4. VBoot 2.0 nie obsługuje elementu verifyatboot (wczesnego podłączenia) jest włączona lub nie.
  5. Tryb/stan poprawności w przypadku zweryfikowanych partycji musi być określony w kernel_cmdline za pomocą: androidboot.veritymode (obecne wymaganie). Pamiętaj o wprowadzeniu tych poprawek w przypadku: AVB:

Wcześniejsze zamontowanie drzewa urządzenia, VBoot 2.0

Konfiguracja w drzewie urządzeń dla VBoot 2.0 jest taka sama jak w VBoot 1.0, z parametrem te wyjątki:

  • fsmgr_flag przełączono z verify na avb
  • Wszystkie partycje z metadanymi AVB muszą być we wpisie VBMeta w Devicetree, nawet jeśli partycja nie jest podłączana wcześniej (na przykład /boot).

Przykład: /system i /vendor w systemie N5X

Poniższy przykład pokazuje wczesny punkt montowania drzewa urządzenia dla Partycje system i vendor na Nexusie 5X. Uwaga:

  • Interfejs /system jest podłączony za pomocą AVB, a /vendor to jest podłączony bez weryfikacji integralności.
  • Nexus 5X nie ma partycji /vbmeta, więc Narzędzie vbmeta znajduje się na końcu partycji /boot (szczegóły zapoznaj się z listą zmian 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";
            };
          };
        };
      };
    };
    

Przykład: /vendor na urządzeniu Pixel

Przykład poniżej pokazuje wczesne mocowanie /vendor na Pixelu. Uwaga:

  • We wpisie vbmeta określono więcej partycji, ponieważ te partycje to chronione przez system AVB.
  • Należy uwzględnić wszystkie partycje AVB, nawet jeśli tylko /vendor z wyprzedzeniem.
  • Pamiętaj, żeby dodać slotselect w przypadku partycji podlegających kontroli A/B.
    / {
      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";
            };
          };
        };
      };
    };