In Android 10, the root file system is no longer
included in ramdisk.img
and is instead merged into
system.img
(that is, system.img
is always created as
if BOARD_BUILD_SYSTEM_ROOT_IMAGE
was set). Devices
launching with Android 10:
- Use a system-as-root partition layout (automatically enforced by the build with no options to change the behavior).
- Must use a ramdisk, which is required for dm-linear.
- Must set
BOARD_BUILD_SYSTEM_ROOT_IMAGE
tofalse
. This setting is used only to differentiate between devices that use a ramdisk and devices that don't use a ramdisk (and instead mountsystem.img
directly).
The meaning of a system-as-root configuration differs between Android 9 and
Android 10. In an Android 9 system-as-root
configuration, BOARD_BUILD_SYSTEM_ROOT_IMAGE
is set to
true
, which forces the build to merge the root file system into
system.img
then mount system.img
as the root file
system (rootfs). This configuration is mandatory for devices
launching with Android 9 but is optional for devices upgrading to
Android 9 and for devices running lower versions of Android. In an Android
10 system-as-root configuration, the build always
merges $TARGET_SYSTEM_OUT
and $TARGET_ROOT_OUT
into
system.img
; this config is the default behavior for all devices
running Android 10.
Android 10 makes further changes to support dynamic partitions, a userspace partitioning system that enables over-the-air (OTA) updates to create, resize, or destroy partitions. As part of this change, the Linux kernel can no longer mount the logical system partition on devices running Android 10, so this operation is handled by the first stage init.
The following sections describe the system-as-root requirements for system-only OTAs, provide guidance on updating devices to use system-as-root (including partition layout changes and dm-verity kernel requirements). For details on changes to ramdisk, see Ramdisk Partitions.
About system-only OTAs
System-only OTAs, which enable Android releases to update
system.img
and product.img
without changing other
partitions, require a system-as-root partition layout. All devices running Android
10 must use a system-as-root partition layout to
enable system-only OTAs.
- A/B devices, which mount the
system
partition as rootfs, already use system-as-root and don't require changes to support system OTAs. - Non-A/B devices, which mount the
system
partition at/system
, must be updated to use a system-as-root partition layout to support system OTAs.
For details on A/B and non-A/B devices, refer to A/B (Seamless) System Updates.
Use vendor overlay (<=AOSP 14)
Vendor overlay allows you to overlay changes to the vendor
partition at device boot time. A vendor overlay is a set of vendor modules in
the product
partition that get overlaid on the vendor
partition when the device boots, replacing and adding to the existing modules.
When the device boots, the init
process completes the first
stage mount and reads the default properties. Then it searches
/product/vendor_overlay/<target_vendor_version>
and mounts
each subdirectory on its corresponding vendor
partition directory,
if the following conditions are met:
/vendor/<overlay_dir>
exists./product/vendor_overlay/<target_vendor_version>/<overlay_dir>
has the same file context as/vendor/<overlay_dir>
.init
is allowed to mount on the file context of/vendor/<overlay_dir>
.
Implement vendor overlay
Install vendor overlay files in
/product/vendor_overlay/<target_vendor_version>
. Those files
overlay the vendor
partition when the device boots, replacing files
of the same name and adding any new files. Vendor overlay can't remove files
from the vendor
partition.
Vendor overlay files must have the same file context as the target files
they replace in the vendor
partition. By default, the files in the
/product/vendor_overlay/<target_vendor_version>
directory
have the vendor_file
context. If there are file context mismatches
between vendor overlay files and the files they replace, specify that in the
device-specific sepolicy. File context is set at the directory level. If the
file context of a vendor overlay directory doesn't match the target directory,
and the correct file context isn't specified in the device-specific sepolicy,
that vendor overlay directory isn't overlaid onto the target directory.
To use vendor overlay, the kernel must enable OverlayFS by setting
CONFIG_OVERLAY_FS=y
. Also, the kernel must be merged from the
common kernel 4.4 or later, or patched with "overlayfs:
override_creds=off option bypass creator_cred"
.
Vendor overlay implementation example
This procedure demonstrates implementing a vendor overlay that overlays the
directories /vendor/lib/*
, /vendor/etc/*
, and
/vendor/app/*
.
-
Add prebuilt vendor files in
device/<vendor>/<target>/vendor_overlay/<target_vendor_version>/
:device/google/device/vendor_overlay/28/lib/libfoo.so device/google/device/vendor_overlay/28/lib/libbar.so device/google/device/vendor_overlay/28/etc/baz.xml device/google/device/vendor_overlay/28/app/qux.apk
-
Install the prebuilt vendor files to
product/vendor_overlay
indevice/google/device/device.mk
:PRODUCT_COPY_FILES += \ $(call find-copy-subdir-files,*,device/google/device/vendor_overlay,$(TARGET_COPY_OUT_PRODUCT)/vendor_overlay)
-
Define file contexts if the target
vendor
partition files have contexts other thanvendor_file
. Because/vendor/lib/*
uses thevendor_file
context, this example doesn't include that directory.Add the following to
device/google/device-sepolicy/private/file_contexts
:/(product|system/product)/vendor_overlay/[0-9]+/etc(/.*)? u:object_r:vendor_configs_file:s0 /(product|system/product)/vendor_overlay/[0-9]+/app(/.*)? u:object_r:vendor_app_file:s0
-
Allow the
init
process to mount the vendor overlay on file contexts other thanvendor_file
. Because theinit
process already has permission to mount on thevendor_file
context, this example doesn't define the policy forvendor_file
.Add the following to
device/google/device-sepolicy/public/init.te
:allow init vendor_configs_file:dir mounton; allow init vendor_app_file:dir mounton;
Validate vendor overlay
To validate the vendor overlay configuration, add files in
/product/vendor_overlay/<target_vendor_version>/<overlay_dir>
and check if the files are overlaid on the files in
/vendor/<overlay_dir>
.
For userdebug
builds, there is a test module for Atest:
$ atest -v fs_mgr_vendor_overlay_test
Update to system-as-root
To update non-A/B devices to use system-as-root, you must update the
partitioning scheme for boot.img
and system.img
, set
up dm-verity, and remove any boot dependencies on the device-specific root
folders.
Update partitions
Unlike A/B devices that repurpose /boot
as the
recovery partition,
non-A/B devices must keep the /recovery
partition
separate as they don't have the fallback slot partition (for example,
from boot_a
to boot_b
). If /recovery
is
removed on non-A/B device and made similar to the A/B scheme, recovery mode
could break during a failed update to the /boot
partition. For
this reason, the /recovery
partition must be a
separate partition from /boot
for non-A/B devices, which implies
that the recovery image continues to be updated in a deferred manner (that
is, the same as in devices running Android 8.1.0 or lower).
The following table lists image partition differences for non-A/B devices before and after Android 9.
Image | Ramdisk (before 9) | System-as-root (after 9) |
---|---|---|
boot.img |
Contains a kernel and a ramdisk.img :
ramdisk.img -/ - init.rc - init - etc -> /system/etc - system/ (mount point) - vendor/ (mount point) - odm/ (mount point) ... |
Contains a normal boot kernel only. |
recovery.img |
Contains a recovery kernel and a recovery
ramdisk.img . |
|
system.img |
Contains the following:
system.img -/ - bin/ - etc - vendor -> /vendor - ... |
Contains the merged content of original system.img and
ramdisk.img :
system.img -/ - init.rc - init - etc -> /system/etc - system/ - bin/ - etc/ - vendor -> /vendor - ... - vendor/ (mount point) - odm/ (mount point) ... |
The partitions themselves don't change; both ramdisk and system-as-root use the following partition scheme:
/boot
/system
/system
/recovery
/vendor
, etc.
Set up dm-verity
In system-as-root, the kernel must mount system.img
under
/
(mount point) with
dm-verity. AOSP supports the following dm-verity
implementations for system.img
.
vboot 1.0
For vboot 1.0, the kernel must parse
Android-specific
metadata on
/system
, then convert to
dm-verity params to set up dm-verity (requires
these kernel patches).
The following example shows dm-verity related settings for system-as-root in
kernel command line:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="system none ro,0 1 android-verity /dev/sda34" veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f
vboot 2.0
For vboot 2.0
(AVB), the bootloader must integrate
external/avb/libavb, which then parses the
hashtree descriptor for /system
, converts
it to
dm-verity params, and finally passes the params to the
kernel through the kernel command line. (Hashtree descriptors of /system
might be on /vbmeta
or on /system
itself.)
vboot 2.0 requires the following kernel patches:
- https://android-review.googlesource.com/#/c/kernel/common/+/158491/
- kernel 4.4 patches, kernel 4.9 patches, etc.
The following example shows dm-verity related settings for system-as-root in kernel command line:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="1 vroot none ro 1,0 5159992 verity 1 PARTUUID=00000016-0000-0000-0000-000000000000 PARTUUID=00000016-0000-0000-0000-000000000000 4096 4096 644999 644999 sha1 d80b4a8be3b58a8ab86fad1b498640892d4843a2 8d08feed2f55c418fb63447fec0d32b1b107e42c 10 restart_on_corruption ignore_zero_blocks use_fec_from_device PARTUUID=00000016-0000-0000-0000-000000000000 fec_roots 2 fec_blocks 650080 fec_start 650080"
Use device-specific root folders
With system-as-root, after the generic system image
(GSI) is flashed on the device (and before running
Vendor Test Suite tests), any
device-specific root folders added with BOARD_ROOT_EXTRA_FOLDERS
are gone because the entire root directory content has been replaced by
the system-as-root GSI. The removal of these folders might cause the device to
become unbootable if a dependency on the device-specific root folders exists
(for example, they're used as mount points).
To avoid this issue, don't use BOARD_ROOT_EXTRA_FOLDERS
to
add device-specific root folders. If you need to specify device-specific mount
points, use /mnt/vendor/<mount point>
(added in these
changelists). These vendor-specific mount points can be
directly specified in both the fstab
device tree (for first-stage
mount) and the /vendor/etc/fstab.{ro.hardware}
file without
additional setup (as fs_mgr
creates them under
/mnt/vendor/*
automatically).