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
especificavbmeta
. 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çãovbmeta
da entrada já foi especificada por outra entradafstab
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:
- Os caminhos de nó do dispositivo precisam usar os links simbólicos
by-name
nafstab
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}
. - Caminhos fornecidos para
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
eCUSTOM_IMAGE_VERITY_BLOCK_DEVICE
na configuração do dispositivo para do produto (ou seja, emdevice/oem/project/device.mk
) precisa corresponder ao nós de dispositivos de bloco correspondentes especificadosby-name
nofstab
/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
- 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 arquivofstab
não pode repetir essa entrada. - As partições que exigem
verifyatboot
não podem ser montado antecipadamente (não é possível fazer isso). - O modo/estado da veridade para partições verificadas precisa ser especificado em
kernel_cmdline
usando a opçãoandroidboot.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 comoandroid,fstab
.- Cada nó em
/firmware/android/fstab
é tratado como um única entradafstab
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çãoby-name
type
deve ser o tipo de sistema de arquivos (como nofstab
arquivos)mnt_flags
precisa ser a lista separada por vírgulas de sinalizações de montagem. (como nos arquivosfstab
)fsmgr_flags
precisa ser a lista do Androidfs_mgr flags
, como nos arquivosfstab
.
- 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:
- Os caminhos de nó do dispositivo precisam usar os links simbólicos
by-name
nafstab
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}
. - Variáveis do sistema de build (como
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
eCUSTOM_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 (incluindoBOARD_AVB_ENABLE := true
) precisa ser definida. para um configuração completa, consulte Integração do sistema de build para AVB. - 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 arquivofstab
não pode repetir essa entrada. - O VBoot 2.0 não oferece suporte a
verifyatboot
, seja a montagem antecipada está ativado ou não. - O modo/estado da veridade para partições verificadas precisa ser especificado em
kernel_cmdline
, usandoandroidboot.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 deverify
paraavb
- 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"; }; }; }; }; };