Dateisystemobjekte und Dienste, die dem Build hinzugefügt werden, benötigen häufig separate, eindeutige IDs, sogenannte Android-IDs (AIDs). Derzeit verwenden viele Ressourcen wie Dateien und Dienste unnötigerweise Core-AIDs (von Android definierte AIDs). In vielen Fällen können Sie stattdessen OEM-AIDs (von OEMs definierte AIDs) verwenden.
Bei früheren Android-Versionen (Android 7.x und niedriger) wurde der AID-Mechanismus durch eine gerätespezifische android_filesystem_config.h
-Datei erweitert, um Dateisystemfunktionen und/oder benutzerdefinierte OEM-AIDs anzugeben. Dieses System war jedoch nicht intuitiv, da es keine Aliasse für OEM-AIDs unterstützte. Sie mussten die numerischen Rohwerte für Nutzer- und Gruppenfelder angeben, ohne die Möglichkeit, einen Alias mit der numerischen AID zu verknüpfen.
Neuere Android-Versionen (Android 8.0 und höher) unterstützen eine neue Methode zum Erweitern der Dateisystemfunktionen. Diese neue Methode unterstützt Folgendes:
- Mehrere Quellspeicherorte für Konfigurationsdateien (ermöglicht erweiterbare Build-Konfigurationen).
- Überprüfung der OEM-AID-Werte zur Build-Zeit.
- Generierung eines benutzerdefinierten OEM-AID-Headers, der bei Bedarf in Quelldateien verwendet werden kann.
- Zuordnung eines Anzeigenamens zum tatsächlichen OEM-AID-Wert. Unterstützt nicht numerische String-Argumente für Nutzer und Gruppen, z.B. „foo“ statt „2901“.
Weitere Verbesserungen sind das Entfernen des android_ids[]
-Arrays aus system/core/libcutils/include/private/android_filesystem_config.h
. Dieses Array ist jetzt in Bionic als vollständig privates generiertes Array mit Accessoren mit getpwnam()
und getgrnam()
vorhanden. (Dies hat den Nebeneffekt, dass stabile Binärdateien erstellt werden, wenn die Core-AIDs geändert werden.) Informationen zu den Tools und eine README-Datei mit weiteren Details finden Sie unter build/make/tools/fs_config
.
Android-IDs (AIDs) hinzufügen
In Android 8.0 wurde das android_ids[]
-Array aus dem Open-Source-Projekt für Android (AOSP) entfernt. Alle AID-freundlichen Namen werden stattdessen aus der Header-Datei system/core/libcutils/include/private/android_filesystem_config.h
generiert, wenn das Bionic-Array android_ids[]
generiert wird. Alle define
-Übereinstimmungen AID_*
werden von den Tools erfasst und * wird zum Kleinbuchstabennamen.
Wie zum Beispiel in private/android_filesystem_config.h
:
#define AID_SYSTEM 1000
Wird zu:
- Anzeigename: system
- uid: 1000
- gid: 1000
Wenn Sie eine neue AOSP-Kern-AID hinzufügen möchten, fügen Sie einfach die #define
in die Headerdatei android_filesystem_config.h
ein. Die AID wird beim Erstellen generiert und für Schnittstellen zur Verfügung gestellt, die Nutzer- und Gruppenargumente verwenden. Das Tooling prüft, ob sich die neue AID im APP- oder OEM-Bereich befindet. Es berücksichtigt auch Änderungen an diesen Bereichen und sollte sich bei Änderungen oder neuen OEM-reservierten Bereichen automatisch neu konfigurieren.
AIDs konfigurieren
Wenn Sie den neuen Mechanismus für AIDs aktivieren möchten, legen Sie TARGET_FS_CONFIG_GEN
in der Datei BoardConfig.mk
fest. Diese Variable enthält eine Liste von Konfigurationsdateien, sodass Sie bei Bedarf Dateien anhängen können.
Konfigurationsdateien verwenden standardmäßig den Namen config.fs
, aber in der Praxis können Sie einen beliebigen Namen verwenden. config.fs
-Dateien haben das Python ConfigParser-INI-Format und enthalten einen „caps“-Abschnitt (zum Konfigurieren von Dateisystemfunktionen) und einen „AIDs“-Abschnitt (zum Konfigurieren von OEM-AIDs).
Abschnitt „Obergrenzen“ konfigurieren
Im Abschnitt „caps“ können Dateisystemfunktionen für Dateisystemobjekte innerhalb des Builds festgelegt werden. Das Dateisystem selbst muss diese Funktion ebenfalls unterstützen.
Da das Ausführen eines stabilen Dienstes als Root in Android zu einem Compatibility Test Suite (CTS)-Fehler führt, mussten für die Beibehaltung einer Funktion beim Ausführen eines Prozesses oder Dienstes bisher Funktionen eingerichtet und dann setuid
/setgid
auf eine geeignete AID gesetzt werden. Mit Caps können Sie diese Anforderungen umgehen und den Kernel für Sie erledigen lassen. Wenn die Steuerung an main()
übergeben wird, verfügt Ihr Prozess bereits über die erforderlichen Funktionen, damit Ihr Dienst einen Nicht-Root-Nutzer und eine Nicht-Root-Gruppe verwenden kann. Dies ist die bevorzugte Methode zum Starten privilegierter Dienste.
Im Abschnitt zu den Obergrenzen wird die folgende Syntax verwendet:
Abschnitt | Wert | Definition |
---|---|---|
[path] |
Der zu konfigurierende Dateisystempfad. Ein Pfad, der mit „/“ endet, wird als Verzeichnis betrachtet, andernfalls als Datei.
Es ist ein Fehler, mehrere Abschnitte mit demselben [path] in verschiedenen Dateien anzugeben. In Python-Versionen <= 3.2 kann dieselbe Datei Abschnitte enthalten, die den vorherigen Abschnitt überschreiben. In Python 3.2 ist der strikte Modus festgelegt. |
|
mode |
Oktaler Dateimodus | Ein gültiger oktaler Dateimodus mit mindestens 3 Ziffern. Wenn 3 angegeben ist, wird eine 0 vorangestellt. Andernfalls wird der Modus unverändert verwendet. |
user |
AID_<user> | Entweder die C define für eine gültige AID oder der Anzeigename (z.B. sind sowohl AID_RADIO als auch radio zulässig). Informationen zum Definieren einer benutzerdefinierten AID finden Sie im Abschnitt AID konfigurieren. |
group |
AID_<group> | Gleich wie Nutzer. |
caps |
cap* | Der Name, wie er in bionic/libc/kernel/uapi/linux/capability.h deklariert wurde, ohne das führende CAP_ . Gemischte Groß-/Kleinschreibung ist zulässig. Kappen können auch die Rohdaten sein:
|
Ein Anwendungsbeispiel finden Sie unter Dateisystemfunktionen verwenden.
AID-Bereich konfigurieren
Der AID-Abschnitt enthält OEM-AIDs und verwendet die folgende Syntax:
Abschnitt | Wert | Definition |
---|---|---|
[AID_<name>] |
Die <name> kann Zeichen aus der Menge „Großbuchstaben, Zahlen und Unterstriche“ enthalten. Die Kleinbuchstabenversion wird als Anzeigename verwendet. Die generierte Headerdatei für die Einbindung von Code verwendet genau die AID_<name> .
Es ist ein Fehler, mehrere Abschnitte mit demselben AID_<name> anzugeben (Groß-/Kleinschreibung wird nicht berücksichtigt, es gelten dieselben Einschränkungen wie für [path] ).
<name> muss mit einem Partitionsnamen beginnen, damit keine Konflikte mit anderen Quellen entstehen. |
|
value |
<number> | Eine gültige Zahl als String im C-Stil (hexadezimal, oktal, binär und dezimal).
Es ist ein Fehler, mehrere Abschnitte mit derselben Wertoption anzugeben. Wertoptionen müssen im Bereich angegeben werden, der der in <name> verwendeten Partition entspricht. Die Liste der gültigen Partitionen und der entsprechenden Bereiche ist in system/core/libcutils/include/private/android_filesystem_config.h definiert.
Folgende Optionen sind verfügbar:
|
Beispiele für die Verwendung finden Sie unter OEM-AID-Namen definieren und OEM-AIDs verwenden.
Beispiele für die Verwendung
In den folgenden Beispielen wird beschrieben, wie Sie eine OEM-AID definieren und verwenden und wie Sie Dateisystemfunktionen aktivieren. OEM‑AID‑Namen ([AID_name]) müssen mit einem Partitionsnamen wie vendor_ beginnen, damit sie nicht mit zukünftigen AOSP‑Namen oder anderen Partitionen in Konflikt geraten.
OEM-AID-Namen definieren
Um eine OEM-AID zu definieren, erstellen Sie eine config.fs
-Datei und legen Sie den AID-Wert fest. Legen Sie beispielsweise in device/x/y/config.fs
Folgendes fest:
[AID_VENDOR_FOO] value: 2900
Legen Sie nach dem Erstellen der Datei die Variable TARGET_FS_CONFIG_GEN
fest und verweisen Sie in BoardConfig.mk
darauf. Legen Sie beispielsweise in device/x/y/BoardConfig.mk
Folgendes fest:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Ihre benutzerdefinierte AID kann jetzt in einem neuen Build vom System verwendet werden.
OEM-AIDs verwenden
Wenn Sie eine OEM-AID verwenden möchten, fügen Sie in Ihrem C-Code oemaids_headers
in Ihr zugehöriges Makefile ein und fügen Sie #include "generated_oem_aid.h"
hinzu. Verwenden Sie dann die deklarierten Kennungen. Fügen Sie beispielsweise in my_file.c
Folgendes hinzu:
#include "generated_oem_aid.h" … If (ipc->uid == AID_VENDOR_FOO) { // Do something ...
Fügen Sie in der zugehörigen Datei Android.bp
Folgendes hinzu:
header_libs: ["oemaids_headers"],
Wenn Sie eine Android.mk
-Datei verwenden, fügen Sie Folgendes hinzu:
LOCAL_HEADER_LIBRARIES := oemaids_headers
Nutzerfreundliche Namen verwenden
In Android 9 können Sie den Anzeigenamen für jede Schnittstelle verwenden, die AID-Namen unterstützt. Beispiel:
- In einem
chown
-Befehl insome/init.rc
:chown vendor_foo /vendor/some/vendor_foo/file
- In einem
service
insome/init.rc
:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
Da die interne Zuordnung vom Anzeigenamen zur UID von /vendor/etc/passwd
und /vendor/etc/group
ausgeführt wird, muss die Anbieterpartition eingebunden sein.
Anzeigenamen zuordnen
Android 9 unterstützt die Zuordnung eines Anzeigenamens zum tatsächlichen OEM-AID-Wert. Sie können nicht numerische Stringargumente für Nutzer und Gruppen verwenden, also z. B. „vendor_foo“ anstelle von „2901“.
Von AID zu nutzerfreundlichen Namen wechseln
Für OEM-AIDs war in Android 8.x die Verwendung von oem_####
mit getpwnam
und ähnlichen Funktionen erforderlich, ebenso an Stellen, an denen Suchvorgänge mit getpwnam
verarbeitet werden (z. B. init
-Skripts). In Android 9 können Sie die Freunde getpwnam
und getgrnam
in Bionic verwenden, um Android-IDs (AIDs) in Aliasse und umgekehrt zu konvertieren.
Dateisystemfunktionen verwenden
Wenn Sie Dateisystemfunktionen aktivieren möchten, erstellen Sie in der Datei config.fs
einen Abschnitt „caps“. Fügen Sie beispielsweise in device/x/y/config.fs
den folgenden Abschnitt hinzu:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE
Nachdem Sie die Datei erstellt haben, legen Sie TARGET_FS_CONFIG_GEN
so fest, dass sie in BoardConfig.mk
auf diese Datei verweist. Legen Sie beispielsweise in device/x/y/BoardConfig.mk
Folgendes fest:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Wenn der Dienst vendor_foo
ausgeführt wird, wird er mit den Funktionen CAP_SYS_ADMIN
und CAP_SYS_NICE
ohne setuid
- und setgid
-Aufrufe gestartet. Außerdem benötigt die SELinux-Richtlinie des Dienstes vendor_foo
nicht mehr die Berechtigungen setuid
und setgid
und kann gelöscht werden.
Überschreibungen konfigurieren (Android 6.x–7.x)
In Android 6.0 wurden fs_config
und die zugehörigen Strukturdefinitionen (system/core/include/private/android_filesystem_config.h
) nach system/core/libcutils/fs_config.c
verschoben, wo sie durch Binärdateien, die in /system/etc/fs_config_dirs
und /system/etc/fs_config_files
installiert sind, aktualisiert oder überschrieben werden können. Durch die Verwendung separater Abgleichs- und Parsing-Regeln für Verzeichnisse und Dateien (für die zusätzliche Glob-Ausdrücke verwendet werden könnten) konnte Android Verzeichnisse und Dateien in zwei verschiedenen Tabellen verarbeiten.
Strukturdefinitionen in system/core/libcutils/fs_config.c
erlauben nicht nur das Lesen von Verzeichnissen und Dateien zur Laufzeit, sondern der Host kann dieselben Dateien auch zur Build-Zeit verwenden, um Dateisystem-Images als ${OUT}/system/etc/fs_config_dirs
und ${OUT}/system/etc/fs_config_files
zu erstellen.
Die Überschreibmethode zum Erweitern des Dateisystems wurde durch das modulare Konfigurationssystem ersetzt, das in Android 8.0 eingeführt wurde. Sie können die alte Methode aber bei Bedarf weiterhin verwenden. In den folgenden Abschnitten wird beschrieben, wie Sie Überschreibungsdateien generieren und einfügen und das Dateisystem konfigurieren.
Überschreibungsdateien generieren
Sie können die ausgerichteten Binärdateien /system/etc/fs_config_dirs
und /system/etc/fs_config_files
mit dem Tool fs_config_generate
in build/tools/fs_config
generieren. Das Tool verwendet eine libcutils
-Bibliotheksfunktion (fs_config_generate()
), um DAC-Anforderungen in einem Puffer zu verwalten, und definiert Regeln für eine Include-Datei, um die DAC-Regeln zu institutionalisieren.
Erstellen Sie dazu eine Include-Datei in device/vendor/device/android_filesystem_config.h
, die als Überschreibung dient. Die Datei muss das in system/core/include/private/android_filesystem_config.h
definierte structure fs_path_config
-Format verwenden. Für Verzeichnis- und Dateisymbole müssen die folgenden Strukturinitialisierungen verwendet werden:
- Verwenden Sie
android_device_dirs[]
für Verzeichnisse. - Verwenden Sie
android_device_files[]
für Dateien.
Wenn Sie android_device_dirs[]
und android_device_files[]
nicht verwenden, können Sie NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
und NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES
definieren (siehe Beispiel unten). Sie können die Überschreibungsdatei auch mit TARGET_ANDROID_FILESYSTEM_CONFIG_H
in der Boardkonfiguration angeben. Der Basisname muss android_filesystem_config.h
sein.
Überschreibungsdateien einbeziehen
Wenn Sie Dateien einbeziehen möchten, muss PRODUCT_PACKAGES
fs_config_dirs
und/oder fs_config_files
enthalten, damit sie in /system/etc/fs_config_dirs
bzw. /system/etc/fs_config_files
installiert werden können. Das Build-System sucht nach benutzerdefinierten android_filesystem_config.h
in $(TARGET_DEVICE_DIR)
, sofern BoardConfig.mk
vorhanden ist.
Wenn sich diese Datei an einem anderen Ort befindet, legen Sie die Platinenkonfigurationsvariable TARGET_ANDROID_FILESYSTEM_CONFIG_H
so fest, dass sie auf diesen Ort verweist.
Dateisystem konfigurieren
So konfigurieren Sie das Dateisystem in Android 6.0 und höher:
- Erstellen Sie die Datei
$(TARGET_DEVICE_DIR)/android_filesystem_config.h
. - Fügen Sie
fs_config_dirs
und/oderfs_config_files
in der Boardkonfigurationsdatei (z.B.PRODUCT_PACKAGES
$(TARGET_DEVICE_DIR)/device.mk
).
Beispiel für das Überschreiben
In diesem Beispiel wird ein Patch zum Überschreiben des system/bin/glgps
-Daemons gezeigt, um Unterstützung für Wake Locks im Verzeichnis device/vendor/device
hinzuzufügen. Beachten Sie Folgendes:
- Jeder Struktureintrag besteht aus dem Modus, der UID, der GID, den Berechtigungen und dem Namen.
system/core/include/private/android_filesystem_config.h
wird automatisch eingefügt, um die Manifest-#Defines (AID_ROOT
,AID_SHELL
,CAP_BLOCK_SUSPEND
) bereitzustellen. - Der Abschnitt
android_device_files[]
enthält eine Aktion zum Unterdrücken des Zugriffs aufsystem/etc/fs_config_dirs
, wenn nicht angegeben. Dies dient als zusätzlicher DAC-Schutz bei fehlenden Inhalten für Verzeichnisüberschreibungen. Das ist jedoch ein schwacher Schutz. Wenn jemand die Kontrolle über/system
hat, kann er in der Regel alles tun, was er möchte.
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)
Dateisysteme aus früheren Releases migrieren
Wenn Sie Dateisysteme von Android 5.x und niedriger migrieren, beachten Sie, dass Android 6.x
- Entfernt einige Includes, Strukturen und Inline-Definitionen.
- Erfordert einen Verweis auf
libcutils
, anstatt direkt übersystem/core/include/private/android_filesystem_config.h
ausgeführt zu werden. Private ausführbare Dateien des Geräteherstellers, die vonsystem/code/include/private_filesystem_config.h
für die Datei- oder Verzeichnisstrukturen oderfs_config
abhängen, müssenlibcutils
-Bibliotheksabhängigkeiten hinzufügen. - Erfordert private Branch-Kopien des Geräteherstellers von
system/core/include/private/android_filesystem_config.h
mit zusätzlichen Inhalten zu vorhandenen Zielen, um zudevice/vendor/device/android_filesystem_config.h
zu wechseln. - Behält sich das Recht vor, SELinux Mandatory Access Controls (MAC) auf Konfigurationsdateien auf dem Zielsystem anzuwenden. Implementierungen, die benutzerdefinierte Ziel-Executables mit
fs_config()
enthalten, müssen den Zugriff sicherstellen.