Montar partições antecipadamente

Os dispositivos com Treble precisam ativar a montagem de primeiro estágio para garantir O init pode carregar Linux Security-Enhanced Linux (SELinux) (link em inglês) que estão espalhados por system e vendor partições. Esse acesso também permite o carregamento módulos assim que possível após a inicialização do kernel.

Para executar a montagem antecipada, o Android precisa ter acesso aos sistemas de arquivos no onde ficam os módulos. O Android 8.0 e versões mais recentes são compatíveis com a montagem /system, /vendor ou /odm a partir de Primeira etapa de init (ou seja, antes da inicialização do SElinux).

Entradas do fstab

No Android 9 e versões anteriores, os dispositivos podem especificar entradas fstab para partições montadas anteriormente usando árvore de dispositivos (DTOs, na sigla em inglês). No Android 10 e versões mais recentes, os dispositivos precisam especificar entradas fstab para partições montadas anteriormente usando um arquivo fstab na primeira etapa. ramdisk (link em inglês). Android A versão 10 introduz as sinalizações fs_mgr a seguir: para uso no arquivo fstab:

  • first_stage_mount indica que uma partição foi montada. na inicialização do primeiro estágio.
  • logical indica que este é um partição dinâmica.
  • avb=vbmeta-partition-name especifica vbmeta. O init do primeiro estágio inicializa esta partição antes de montar outras partições. O argumento dessa sinalização pode ser omitido se a partição vbmeta da entrada já foi especificada por outra entrada fstab em uma linha anterior.

O exemplo a seguir mostra entradas fstab para definir a system, vendor e product partições como partições lógicas (dinâmicas).

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

Neste exemplo, o fornecedor especifica a partição vbmeta usando a sinalização fs_mgr avb=vbmeta, mas product omite o argumento vbmeta porque o fornecedor já adicionou vbmeta à lista de partições.

Dispositivos com o Android 10 e versões mais recentes precisam colocar o Arquivo fstab no ramdisk e no vendor partição.

Ramdisk

O local do arquivo fstab no ramdisk depende de como o dispositivo usa o ramdisk.

Dispositivos com um ramdisk de inicialização precisam colocar o fstab na raiz do ramdisk de inicialização. Se o dispositivo tiver um ramdisk de inicialização e um ramdisk de recuperação, não são necessárias alterações nesse ramdisk. Exemplo:

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

Os dispositivos que usam a recuperação como ramdisk precisam usar a o parâmetro de linha de comando androidboot.force_normal_boot=1 do kernel para decidir se inicializa no Android ou continua com a recuperação. Dispositivos Lançamento com o Android 12 ou versão mais recente com o kernel versão 5.10 ou posterior deve usar bootconfig para passar o parâmetro androidboot.force_normal_boot=1. Em esses dispositivos, o init de primeiro estágio realiza uma operação de switch root para /first_stage_ramdisk antes de montar as partições de montagem antecipadas. portanto, os dispositivos precisam colocar o arquivo fstab $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk Exemplo:

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

Fornecedor

Todos os dispositivos precisam colocar uma cópia do arquivo fstab em /vendor/etc. Isso ocorre porque o init de primeiro estágio libera a no ramdisk após concluir a montagem antecipada das partições e executar mudar a operação raiz para mover a montagem em /system para /. Todas as operações subsequentes que precisem acessar fstab arquivos, portanto, devem usar a cópia em /vendor/etc. Exemplo:

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

Montar partições antecipadamente, VBoot 1.0

Os requisitos para ativar partições antecipadas com o VBoot 1.0 incluem:

  1. Os caminhos de nó do dispositivo precisam usar os links simbólicos by-name na fstab e as entradas devicetree. Por exemplo, em vez de especificar partições usando /dev/block/mmcblk0pX, verifique se elas estão e o nó do dispositivo /dev/block/…./by-name/{system,vendor,odm}.
  2. Caminhos fornecidos para PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION e CUSTOM_IMAGE_VERITY_BLOCK_DEVICE na configuração do dispositivo para do produto (ou seja, em device/oem/project/device.mk) precisa corresponder ao nós de dispositivos de bloco correspondentes especificados by-name no fstab/devicetree de entradas. Exemplo:
    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. As entradas fornecidas pelas sobreposições da árvore de dispositivos não podem se repetir no fstab fragmentos de arquivo. Por exemplo, ao especificar uma entrada para ativar /vendor na árvore de dispositivos, o arquivo fstab não pode repetir essa entrada.
  4. As partições que exigem verifyatboot não podem ser montado antecipadamente (não é possível fazer isso).
  5. O modo/estado da veridade para partições verificadas precisa ser especificado em kernel_cmdline usando a opção androidboot.veritymode (requisito existente).

Montar a árvore de dispositivos antecipadamente, VBoot 1.0

No Android 8.x e versões mais recentes, init analisa a devicetree e cria entradas fstab para ativar a partição no início durante o do primeiro estágio. Uma entrada fstab tem o seguinte formato:

src mnt_point type mnt_flags fs_mgr_flags

As propriedades Devicetree são definidas para imitar esse formato:

  • fstab entradas precisam estar abaixo de /firmware/android/fstab na devicetree e deve ter um string compatível definida como android,fstab.
  • Cada nó em /firmware/android/fstab é tratado como um única entrada fstab de montagem antecipada. Um nó precisa ter as seguintes propriedades definidas pelo usuário:
    • dev precisa apontar para o nó do dispositivo que representa o partição by-name
    • type deve ser o tipo de sistema de arquivos (como no fstab arquivos)
    • mnt_flags precisa ser a lista separada por vírgulas de sinalizações de montagem. (como nos arquivos fstab)
    • fsmgr_flags precisa ser a lista do Android fs_mgr flags, como nos arquivos fstab.
  • As partições A/B precisam ter uma opção slotselect fs_mgr.
  • As partições ativadas para dm-verity precisam ter um verify fs_mgr. é a melhor opção.

Exemplo: /system e /vendor em N6P

O exemplo a seguir mostra a montagem antecipada de devicetree para system. e vendor no Nexus 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";
        };
      };
    };
  };
};

Exemplo: /vendor no Pixel

O exemplo a seguir mostra a montagem antecipada de devicetree para /vendor. no Pixel. Lembre-se de adicionar slotselect para partições sujeitas a 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";
        };
      };
    };
  };
};

Montar partições antecipadamente, VBoot 2.0

A VBoot 2.0 é a Inicialização verificada do Android (AVB, na sigla em inglês). Os requisitos para de montagem com o VBoot 2.0 são:

  1. Os caminhos de nó do dispositivo precisam usar os links simbólicos by-name na fstab e as entradas devicetree. Por exemplo, em vez de especificar partições usando /dev/block/mmcblk0pX, verifique se as partições são nomeados e o nó do dispositivo é /dev/block/…./by-name/{system,vendor,odm}.
  2. Variáveis do sistema de build (como PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION e CUSTOM_IMAGE_VERITY_BLOCK_DEVICE) usados para o VBoot 1.0 NÃO são necessário para o VBoot 2.0. Em vez disso, crie variáveis introduzidas no VBoot 2.0 (incluindo BOARD_AVB_ENABLE := true) precisa ser definida. para um configuração completa, consulte Integração do sistema de build para AVB.
  3. As entradas fornecidas pelas sobreposições da árvore de dispositivos não podem se repetir no fstab fragmentos de arquivo. Por exemplo, se você especificar uma entrada para ativar /vendor na árvore de dispositivos, o arquivo fstab não pode repetir essa entrada.
  4. O VBoot 2.0 não oferece suporte a verifyatboot, seja a montagem antecipada está ativado ou não.
  5. O modo/estado da veridade para partições verificadas precisa ser especificado em kernel_cmdline, usando androidboot.veritymode. opção (requisito existente). Inclua as seguintes correções para Valor médio do pedido:

Montar a árvore de dispositivos antecipadamente, VBoot 2.0

A configuração em devicetree para o VBoot 2.0 é a mesma que aquela em VBoot 1.0, com o seguintes exceções:

  • O fsmgr_flag muda de verify para avb
  • Todas as partições com metadados AVB devem estar na entrada VBMeta da devicetree, mesmo quando a partição não está sendo montada antecipadamente (por exemplo, /boot).

Exemplo: /system e /vendor na N5X

O exemplo a seguir mostra uma ativação antecipada da árvore de dispositivos para o Partições system e vendor no Nexus 5X. Algumas considerações:

  • /system é montado com AVB e /vendor é montados sem verificação de integridade.
  • Como o Nexus 5X não tem partição /vbmeta, então o nível superior A vbmeta fica no final da partição /boot. Para acessar detalhes, consulte a lista de mudanças do 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";
            };
          };
        };
      };
    };
    

Exemplo: /vendor no Pixel

O exemplo abaixo mostra como montar o /vendor antecipadamente em um Pixel. Algumas considerações:

  • Mais partições são especificadas na entrada vbmeta porque essas partições são protegidas pela AVB.
  • Todas as partições AVB precisam ser incluídas, mesmo que apenas /vendor seja montados antecipadamente.
  • Lembre-se de adicionar slotselect para partições sujeitas a 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";
            };
          };
        };
      };
    };