Gli oggetti e i servizi del file system aggiunti alla build spesso richiedono ID univoci separati, noti come ID Android (AID). Al momento, molte risorse come file e servizi utilizzano inutilmente AID di base (definiti da Android); in molti casi puoi utilizzare invece AID OEM (definiti dall'OEM).
Le versioni precedenti di Android (Android 7.x e versioni precedenti) hanno esteso il meccanismo degli AID utilizzando un file android_filesystem_config.h
specifico del dispositivo per specificare le funzionalità del file system e/o gli AID OEM personalizzati. Tuttavia, questo sistema non era intuitivo perché non supportava l'utilizzo di nomi visualizzabili per gli AID OEM, richiedendo di specificare il valore numerico non elaborato per i campi utente e gruppo senza un modo per associare un nome visualizzabile all'AID numerico.
Le versioni più recenti di Android (Android 8.0 e versioni successive) supportano un nuovo metodo per estendere le funzionalità del file system. Questo nuovo metodo supporta quanto segue:
- Più posizioni di origine per i file di configurazione (consente configurazioni di compilazione estendibili).
- Controllo dell'integrità in fase di build dei valori AID OEM.
- Generazione di un'intestazione AID OEM personalizzata che può essere utilizzata nei file di origine in base alle esigenze.
- Associazione di un nome visualizzato al valore AID OEM effettivo. Supporta gli argomenti di stringa non numerici per utente e gruppo, ad esempio "foo" anziché "2901".
Altri miglioramenti includono la rimozione dell'array android_ids[]
da
system/core/libcutils/include/private/android_filesystem_config.h
. Questo array ora esiste in Bionic come array generato completamente privato, con funzioni di accesso con getpwnam()
e getgrnam()
. (Questo ha come effetto collaterale la produzione di binari stabili man mano che gli AID principali vengono modificati.) Per gli strumenti e un file README con ulteriori dettagli, consulta build/make/tools/fs_config
.
Aggiungere ID Android (AID)
In Android 8.0 l'array android_ids[]
è stato rimosso dall'Android Open Source Project (AOSP). Tutti i nomi compatibili con AID vengono invece generati dal file intestazione system/core/libcutils/include/private/android_filesystem_config.h
quando viene generato l'array android_ids[]
di Bionic. Qualsiasi
define
corrispondente a AID_*
viene rilevato dagli strumenti
e * diventa il nome in minuscolo.
Ad esempio, in private/android_filesystem_config.h
:
#define AID_SYSTEM 1000
Diventa:
- Nome descrittivo: system
- uid: 1000
- gid: 1000
Per aggiungere un nuovo AID di base AOSP, aggiungi semplicemente #define
al file di intestazione android_filesystem_config.h
. L'AID viene generato al momento della compilazione e reso disponibile per le interfacce che utilizzano argomenti di utenti e gruppi. Lo strumento convalida che il nuovo AID non rientri negli intervalli APP o OEM; rispetta inoltre le modifiche a questi intervalli e dovrebbe riconfigurarsi automaticamente in caso di modifiche o nuovi intervalli riservati all'OEM.
Configurare gli AID
Per attivare il nuovo meccanismo AID, imposta TARGET_FS_CONFIG_GEN
nel
BoardConfig.mk
file. Questa variabile contiene un elenco di file di configurazione, che ti consente di aggiungere file in base alle esigenze.
Per convenzione, i file di configurazione utilizzano il nome config.fs
, ma in pratica puoi utilizzare qualsiasi nome. I file config.fs
sono nel
formato ini ConfigParser Python e includono una sezione maiuscole (per la configurazione delle funzionalità del file system) e una sezione AID (per la configurazione degli AID OEM).
Configurare la sezione delle lettere maiuscole
La sezione dei limiti supporta l'impostazione di funzionalità del file system sugli oggetti di file system all'interno della build (anche il file system stesso deve supportare questa funzionalità).
Poiché l'esecuzione di un servizio stabile come root in Android causa un errore del Compatibility Test Suite (CTS), i requisiti precedenti per mantenere una funzionalità durante l'esecuzione di un processo o servizio prevedevano la configurazione delle funzionalità e poi l'utilizzo di setuid
/setgid
per un AID appropriato da eseguire. Con i cap, puoi saltare questi requisiti e lasciare che sia il kernel a occuparsene. Quando il controllo viene trasferito a main()
, il processo ha già le funzionalità necessarie per consentire al servizio di utilizzare un utente e un gruppo non root (questo è il modo preferito per avviare servizi con privilegi).
La sezione sulle maiuscole utilizza la seguente sintassi:
Sezione | Valore | Definizione |
---|---|---|
[path] |
Il percorso del file system da configurare. Un percorso che termina con / è considerato una directory,
altrimenti è un file.
È un errore specificare più sezioni con lo stesso [path] in file diversi. Nelle versioni di Python precedenti o uguali alla 3.2, lo stesso file può contenere sezioni che sostituiscono la sezione precedente; in Python 3.2, è impostato in modalità rigorosa. |
|
mode |
Modalità file octal | Un'opzione di modalità file octal valida di almeno 3 cifre. Se viene specificato 3, viene preposto un 0, altrimenti la modalità viene utilizzata così com'è. |
user |
AID_<user> | Il valore C define per un AID valido o il nome visualizzato
(ad es. sono accettabili sia AID_RADIO che radio ). Per
definire un AID personalizzato, consulta la sezione Configurazione. |
group |
AID_<group> | Uguale a utente. |
caps |
cap* | Il nome dichiarato in
bionic/libc/kernel/uapi/linux/capability.h
senza il CAP_ iniziale. Sono consentiti lettere maiuscole e minuscole. Le lettere maiuscole possono anche essere
in formato non elaborato:
|
Per un esempio di utilizzo, consulta Utilizzare le funzionalità del sistema di file.
Configura la sezione AID
La sezione AID contiene gli AID OEM e utilizza la seguente sintassi:
Sezione | Valore | Definizione |
---|---|---|
[AID_<name>] |
<name> può contenere caratteri nell'insieme di lettere maiuscole, numeri e trattini bassi. La versione in minuscolo viene utilizzata come nome visualizzato. Il file di intestazione generato per l'inclusione del codice utilizza esattamente AID_<name> .
Specificare più sezioni con lo stesso AID_<name> (senza distinzione tra maiuscole e minuscole con gli stessi vincoli di
[path] ) è un errore.
<name> deve iniziare con un nome di partizione per garantire
che non entri in conflitto con origini diverse. |
|
value |
<number> | Una stringa di numeri in stile C valida (esadecimale, ottale, binario e decimale).
È un errore specificare più sezioni con la stessa opzione di valore. Le opzioni di valore devono essere specificate nell'intervallo corrispondente alla partizione utilizzata in <name> . L'elenco di partizioni valide e i relativi intervalli
sono definiti in system/core/libcutils/include/private/android_filesystem_config.h .
Le opzioni sono:
|
Per esempi di utilizzo, consulta Definizione dei nomi AID OEM e Utilizzo degli AID OEM.
Esempi di utilizzo
Gli esempi riportati di seguito descrivono in dettaglio come definire e utilizzare un AID OEM e come attivare le funzionalità del file system. I nomi AID dell'OEM ([AID_name]) devono iniziare con un nome di partizione come "vendor_" per assicurarsi che non entrino in conflitto con i nomi AOSP futuri o con altre partizioni.
Definisci i nomi degli AID OEM
Per definire un AID OEM, crea un file config.fs
e imposta il valore AID. Ad esempio, in device/x/y/config.fs
, imposta quanto segue:
[AID_VENDOR_FOO] value: 2900
Dopo aver creato il file, imposta la variabile TARGET_FS_CONFIG_GEN
e fai riferimento a essa in BoardConfig.mk
. Ad esempio, in
device/x/y/BoardConfig.mk
, imposta quanto segue:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Ora l'AID personalizzato può essere utilizzato dal sistema in generale in una nuova build.
Utilizza AID OEM
Per utilizzare un OEM AID, nel codice C includi oemaids_headers
nel Makefile associato e aggiungi #include "generated_oem_aid.h"
, poi inizia a utilizzare gli identificatori dichiarati. Ad esempio, in my_file.c
, aggiungi quanto segue:
#include "generated_oem_aid.h" … If (ipc->uid == AID_VENDOR_FOO) { // Do something ...
Nel file Android.bp
associato, aggiungi quanto segue:
header_libs: ["oemaids_headers"],
Se utilizzi un file Android.mk
, aggiungi quanto segue:
LOCAL_HEADER_LIBRARIES := oemaids_headers
Utilizza nomi descrittivi
In Android 9, puoi utilizzare il nome visualizzato per qualsiasi interfaccia che supporta i nomi AID. Ad esempio:
- In un comando
chown
insome/init.rc
:chown vendor_foo /vendor/some/vendor_foo/file
- In un
service
insome/init.rc
:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
Poiché la mappatura interna dal nome semplice allo uid viene eseguita da /vendor/etc/passwd
e /vendor/etc/group
, la partizione del fornitore deve essere montata.
Associa nomi descrittivi
Android 9 include il supporto per l'associazione di un nome descrittivo al valore effettivo dell'AID OEM. Puoi utilizzare argomenti di stringa non numerici per utente e gruppo, ovvero "vendor_foo" anziché "2901".
Converti da AID a nome descrittivo
Per
gli AID OEM, Android 8.x richiedeva l'uso di
oem_####
con getpwnam
e funzioni simili, nonché
nei punti che gestiscono le ricerche con getpwnam
(ad esempio
gli script init
). In Android 9, puoi
utilizzare gli amici getpwnam
e getgrnam
in Bionic per
convertire da ID Android (AID) a nomi facili da ricordare e viceversa.
Utilizzare le funzionalità del file system
Per attivare le funzionalità del file system, crea una sezione caps nel
file config.fs
. Ad esempio, in
device/x/y/config.fs
, aggiungi la seguente sezione:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE
Dopo aver creato il file, imposta TARGET_FS_CONFIG_GEN
in modo che rimandi a quel file in BoardConfig.mk
. Ad esempio, in device/x/y/BoardConfig.mk
, imposta quanto segue:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Quando viene eseguito il servizio vendor_foo
, si avvia con le funzionalità CAP_SYS_ADMIN
e CAP_SYS_NICE
senza chiamate setuid
e setgid
. Inoltre, il criterio SELinux del servizio vendor_foo
non richiede più le funzionalità setuid
e setgid
e può essere eliminato.
Configurare le sostituzioni (Android 6.x-7.x)
In Android 6.0, fs_config
e le definizioni della struttura associata
(system/core/include/private/android_filesystem_config.h
) sono state spostate in
system/core/libcutils/fs_config.c
, dove potevano essere aggiornate o sostituite da file binari installati in
/system/etc/fs_config_dirs
e
/system/etc/fs_config_files
. L'utilizzo di regole di corrispondenza e analisi separate per directory e file (che potrebbero utilizzare espressioni glob aggiuntive) ha consentito ad Android di gestire directory e file in due tabelle diverse.
Le definizioni di struttura in system/core/libcutils/fs_config.c
non solo consentivano la lettura di directory e file in fase di runtime, ma l'host poteva utilizzare gli stessi file durante la compilazione per creare immagini del file system come ${OUT}/system/etc/fs_config_dirs
e ${OUT}/system/etc/fs_config_files
.
Anche se il metodo di override per l'estensione del file system è stato sostituito dal sistema di configurazione modulare introdotto in Android 8.0, puoi comunque utilizzare il vecchio metodo se vuoi. Le sezioni seguenti descrivono in dettaglio come generare e includere i file di override e configurare il file system.
Genera file di override
Puoi generare i file binari allineati
/system/etc/fs_config_dirs
e
/system/etc/fs_config_files
utilizzando lo strumento
fs_config_generate
in build/tools/fs_config
. Lo
strumento utilizza una funzione di libreria libcutils
(fs_config_generate()
) per gestire i requisiti del DAC in un buffer
e definisce le regole per un file di inclusione al fine di istituzionalizzare le regole DAC.
Per utilizzarlo, crea un file include in
device/vendor/device/android_filesystem_config.h
che funge da override. Il file deve utilizzare il formato structure fs_path_config
definito in system/core/include/private/android_filesystem_config.h
con le seguenti inizializzazioni della struttura per i simboli di directory e file:
- Per le directory, utilizza
android_device_dirs[]
. - Per i file, usa
android_device_files[]
.
Quando non utilizzi android_device_dirs[]
e
android_device_files[]
, puoi definire
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
e
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES
(vedi il
esempio di seguito). Puoi anche specificare il file di override utilizzando TARGET_ANDROID_FILESYSTEM_CONFIG_H
nella configurazione della scheda, con un nome di base applicato pari a android_filesystem_config.h
.
Includi file di override
Per includere i file, assicurati che PRODUCT_PACKAGES
includa
fs_config_dirs
e/o fs_config_files
in modo da poterli
installare rispettivamente in /system/etc/fs_config_dirs
e
/system/etc/fs_config_files
. Il sistema di compilazione
cerca android_filesystem_config.h
personalizzato in
$(TARGET_DEVICE_DIR)
, dove esiste BoardConfig.mk
.
Se questo file esiste altrove, imposta la variabile di configurazione della scheda
TARGET_ANDROID_FILESYSTEM_CONFIG_H
in modo che punti a quella posizione.
Configura il file system
Per configurare il file system in Android 6.0 e versioni successive:
- Crea il file
$(TARGET_DEVICE_DIR)/android_filesystem_config.h
. - Aggiungi
fs_config_dirs
e/ofs_config_files
aPRODUCT_PACKAGES
nel file di configurazione della scheda (ad es.$(TARGET_DEVICE_DIR)/device.mk
).
Esempio di override
Questo esempio mostra una patch per eseguire l'override del daemon system/bin/glgps
per aggiungere il supporto del blocco sveglia nella directory device/vendor/device
. Tieni presente quanto segue:
- Ogni voce della struttura è la modalità, l'uid, il gid, le funzionalità e il nome.
system/core/include/private/android_filesystem_config.h
viene incluso automaticamente per fornire le #define del manifest (AID_ROOT
,AID_SHELL
,CAP_BLOCK_SUSPEND
). - La sezione
android_device_files[]
include un'azione per eliminare l'accesso asystem/etc/fs_config_dirs
se non specificato, che funge da protezione DAC aggiuntiva per la mancanza di contenuti per le sostituzioni di directory. Tuttavia, questa è una protezione debole: se qualcuno ha il controllo su/system
, in genere può fare ciò che vuole.
diff --git a/android_filesystem_config.h b/android_filesystem_config.h new file mode 100644 index 0000000..874195f --- /dev/null +++ b/android_filesystem_config.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +/* This file is used to define the properties of the file system +** images generated by build tools (eg: mkbootfs) and +** by the device side of adb. +*/ + +#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS +/* static const struct fs_path_config android_device_dirs[] = { }; */ + +/* Rules for files. +** These rules are applied based on "first match", so they +** should start with the most specific path and work their +** way up to the root. Prefixes ending in * denotes wildcard +** and will allow partial matches. +*/ +static const struct fs_path_config android_device_files[] = { + { 00755, AID_ROOT, AID_SHELL, (1ULL << CAP_BLOCK_SUSPEND), "system/bin/glgps" }, +#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS + { 00000, AID_ROOT, AID_ROOT, 0, "system/etc/fs_config_dirs" }, +#endif +}; diff --git a/device.mk b/device.mk index 0c71d21..235c1a7 100644 --- a/device.mk +++ b/device.mk @@ -18,7 +18,8 @@ PRODUCT_PACKAGES := \ libwpa_client \ hostapd \ wpa_supplicant \ - wpa_supplicant.conf + wpa_supplicant.conf \ + fs_config_files ifeq ($(TARGET_PREBUILT_KERNEL),) ifeq ($(USE_SVELTE_KERNEL), true)
Eseguire la migrazione dei file system dalle release precedenti
Quando esegui la migrazione dei file system da Android 5.x e versioni precedenti, tieni presente che: Android 6.x
- Rimuove alcuni include, strutture e definizioni in linea.
- Richiede un riferimento a
libcutils
anziché essere eseguito direttamente dasystem/core/include/private/android_filesystem_config.h
. Eseguibili privati del produttore del dispositivo che dipendono dasystem/code/include/private_filesystem_config.h
per le strutture di file o directory ofs_config
devono aggiungerelibcutils
dipendenze della libreria. - Richiede il trasferimento a
device/vendor/device/android_filesystem_config.h
di copie del ramo privato del produttore del dispositivo disystem/core/include/private/android_filesystem_config.h
con contenuti aggiuntivi sui target esistenti. - Si riserva il diritto di applicare i controlli di accesso obbligatori (MAC) di SELinux ai file di configurazione sul sistema di destinazione. Le implementazioni che includono eseguibili di destinazione personalizzati che utilizzano
fs_config()
devono garantire l'accesso.