Android ma 2 mechanizmy aktualizacji: aktualizacje A/B (bezproblemowe) i aktualizacje inne niż A/B. Aby uprościć kod i usprawnić proces aktualizacji, w Androidzie 11 2 mechanizmy na potrzeby wirtualnych testów A/B zapewniają płynną aktualizację wszystkich przy jak najniższym koszcie pamięci. Android 12 oferuje opcję wirtualnej kompresji A/B do kompresowania partycji zrzutów. W Androidzie 11 i 12 poniższe elementy zastosuj:
- Wirtualne aktualizacje typu A/B są łatwe, tak jak aktualizacje typu A/B. Wirtualne aktualizacje A/B do zminimalizowania czasu, gdy urządzenie jest offline i bezużyteczne.
- Wirtualne aktualizacje A/B można wycofać. Jeśli nie uda się uruchomić nowego systemu operacyjnego, urządzenia automatycznie przywrócą poprzednią wersję systemu.
- Wirtualne aktualizacje typu A/B wykorzystują minimalną ilość dodatkowego miejsca, ponieważ duplikują tylko na partycjach używanych przez program rozruchowy. Inne partycje, które można zaktualizować, to zapisane.
Informacje ogólne i terminologia
W tej sekcji definiuje się terminologię i opis technologii, która obsługuje wirtualne A/B.
Mapowanie urządzeń
Device-mapper to wirtualna warstwa blokowa w systemie Linux, używana często na Androidzie. Na
partycje dynamiczne, takie jak
/system
to stos urządzeń wielowarstwowych:
- U dołu stosu znajduje się fizyczna partycja super (na przykład
/dev/block/by-name/super
). - Pośrodku znajduje się urządzenie
dm-linear
określające, które bloki w parametrze Super danej partycji. Wygląda to tak/dev/block/mapper/system_[a|b]
na urządzeniu A/B lub/dev/block/mapper/system
na urządzeniu innym niż A/B. - U góry znajduje się urządzenie z
dm-verity
utworzone na potrzeby zweryfikowanych partycji. To urządzenie sprawdza, czy blokady na urządzeniudm-linear
są podpisane . Wygląda on jako/dev/block/mapper/system-verity
i jest źródłem punktu podłączania przez/system
.
Na ilustracji 1 widać stos pod punktem podłączania /system
.
Rysunek 1. Stos w punkcie podłączania /system
migracja-dm
Wirtualne A/B wykorzystuje moduł dm-snapshot
, czyli moduł mapowania urządzeń do tworzenia zrzutów
stanu urządzenia pamięci masowej. Kiedy używasz funkcji dm-snapshot
, w:
odtwarzanie:
- Urządzenie podstawowe to urządzenie, którego kopia została utworzona. Podstawowy element na tej stronie urządzenie jest zawsze partycją dynamiczną, np. systemową lub dostawcą.
- Urządzenie copy-on-zapis (COW) służące do rejestrowania zmian na urządzeniu podstawowym. it może mieć dowolny rozmiar, ale musi być na tyle duży, aby zmieścić wszystkie zmiany urządzenia podstawowego.
- Urządzenie zrzut jest tworzone z użyciem celu
snapshot
. Zapisze w urządzenia z migawkami są zapisywane w urządzeniu COW. Odczyty ze zrzutu z urządzenia podstawowego lub urządzenia COW, w zależności od czy informacje, do których dostęp uzyskał, zostały zmienione przez zrzut. - Urządzenie origin jest tworzone za pomocą środowiska docelowego
snapshot-origin
. Czyta w urządzenie źródłowe odczytuje dane bezpośrednio z urządzenia podstawowego. Zapisuje w punkcie początkowym urządzenia zapisują dane bezpośrednio na urządzeniu podstawowym, ale tworzona jest kopia zapasowa oryginalnych danych. do urządzenia COW.
Rysunek 2. Mapowanie urządzeń na potrzeby zrzutu Dm
Skompresowane zrzuty
W Androidzie 12 i nowszych, ponieważ wymagania dotyczące miejsca
partycja /data
może być wysoka, możesz włączyć skompresowane zrzuty w
kompilować, aby spełnić wymagania dotyczące większej ilości miejsca na partycji /data
.
Wirtualne skompresowane zrzuty A/B są tworzone na podstawie następujących komponentów na Androida 12 lub nowszego:
dm-user
– moduł jądra podobny do FUSE, który umożliwia korzystanie z przestrzeni użytkownika; w celu implementacji urządzeń blokowych.snapuserd
– demon przestrzeni użytkownika implementujący nowy zrzut .
Te komponenty umożliwiają kompresję. Inne niezbędne zmiany wprowadzone w zastosowania funkcji skompresowanych zrzutów ekranu znajdziesz w kolejnych sekcjach: format COW dla skompresowanych zrzutów dysku, dm-user i Snapuserd.
Format COW dla skompresowanych zrzutów
W Androidzie 12 i nowszych skompresowane zrzuty dysku korzystają z Format COW. Format podobny do wbudowanego jądra używanego do nieskompresowania zrzutów, format COW skompresowanych zrzutów ma naprzemienne sekcje metadanych i danych. Metadane oryginalnego formatu są dozwolone tylko na potrzeby zastąpienia. operacje: zastąp blok X w obrazie podstawowym zawartością bloku Y widoczne na zrzucie ekranu. Format skompresowanych zrzutów COW jest bardziej ekspresyjny, obsługuje następujące operacje:
- Kopiowanie: blok X na urządzeniu podstawowym należy zastąpić blokiem Y w urządzenia podstawowego.
- Zastąp: blokada X na urządzeniu podstawowym powinna zostać zastąpiona zawartością. bloku Y na zrzucie ekranu. Każdy z tych bloków jest skompresowany w GZ.
- Zero: blokada X na urządzeniu podstawowym powinna być zastąpiona zerami.
- XOR: urządzenie COW przechowuje skompresowane bajty XOR między blokami X i zablokuj Y. Ta funkcja jest dostępna w Androidzie 13 i nowszych.
Pełne aktualizacje OTA obejmują tylko operacje replace i zero. Przyrostowy Aktualizacje OTA mogą dodatkowo zawierać operacje kopiowania.
użytkownik MDM na Androidzie 12
Moduł jądra systemu zarządzania tożsamością użytkownika umożliwia usłudze userspace
wdrożenie bloku mapowania urządzenia
urządzenia. Wpis w tabeli DM-user tworzy inne urządzenie
/dev/dm-user/<control-name>
Proces userspace
może odpytywać urządzenie
które odbierają od jądra żądania odczytu i zapisu. Z każdą prośbą jest powiązane
bufor dla przestrzeni użytkownika, która ma zostać zapełniona (w przypadku odczytu) lub propagowana (w przypadku zapisu).
Moduł jądra dm-user
zapewnia nowy, widoczny dla użytkownika interfejs jądra.
który nie jest częścią bazy kodu kernel.org nadrzędnego. Do tego momentu Google
zastrzega sobie prawo do modyfikowania interfejsu dm-user
w Androidzie.
Snapuserd
Komponent przestrzeni użytkownika snapuserd
do dm-user
implementuje wirtualne A/B
kompresję.
w nieskompresowanej wersji wirtualnego A/B (na Androidzie 11 lub starszym lub
w Androidzie 12 bez opcji skompresowanego zrzutu),
a urządzenie COW to plik nieprzetworzony. Po włączeniu kompresji funkcja COW
zamiast jako urządzenia dm-user
, które jest połączone z instancją
demon snapuserd
.
Jądro nie używa nowego formatu COW. Zatem komponent snapuserd
tłumaczy żądania między formatem COW Androida a wbudowanym jądrem
format:
Rysunek 3. Schemat blokowy mechanizmu Snapuserd jako translatora między Androidem a jądrem Formaty COW
To tłumaczenie i dekompresja nigdy nie występują na dysku. snapuserd
przechwytuje odczyty i zapisy COW występujące w jądrze;
implementuje je za pomocą formatu COW na Androida.
Kompresja XOR
W przypadku urządzeń z Androidem 13 lub nowszym parametr Funkcja kompresji XOR, która jest domyślnie włączona, umożliwia korzystanie z przestrzeni użytkownika zrzutów do przechowywania skompresowanych bajtów XOR między starymi a nowymi blokami. Kiedy tylko kilka bajtów w bloku zmienia się w aktualizacji wirtualnej A/B, XOR schemat pamięci masowej kompresji wykorzystuje mniej miejsca niż domyślny schemat pamięci masowej ponieważ zrzuty nie przechowują pełnych danych o rozmiarze 4000 bajtów. Zmniejszenie rozmiaru zrzutu wynosi możliwe, ponieważ dane XOR zawierają wiele zer i są łatwiejsze do skompresowania niż nieprzetworzone blokad danych. Na urządzeniach Pixel kompresja XOR zmniejsza rozmiar zrzutu o 25% i o 40%.
Na urządzeniach z Androidem 13 lub nowszym XOR musi być włączona kompresja. Aby dowiedzieć się więcej, zobacz XOR .
Wirtualne procesy kompresji A/B
Ta sekcja zawiera szczegółowe informacje na temat procesu wirtualnej kompresji A/B używanego w Android 13 i Android 12.
Odczytywanie metadanych (Android 12)
Metadane są tworzone przez demona snapuserd
. Metadane to przede wszystkim
mapowania 2 identyfikatorów (po 8 bajtów każdy), które reprezentują sektory do scalania.
W języku: dm-snapshot
nazwa: disk_exception
.
struct disk_exception {
uint64_t old_chunk;
uint64_t new_chunk;
};
Wyjątek dysku jest używany, gdy stary fragment danych został zastąpiony nowym.
Demon snapuserd
odczytuje wewnętrzny plik COW za pomocą biblioteki COW oraz
tworzy metadane dla każdej operacji COW występujących w pliku COW.
Odczyty metadanych są inicjowane z poziomu dm-snapshot
w jądrze po utworzeniu urządzenia dm-
snapshot
.
Na ilustracji poniżej znajdziesz schemat sekwencji ścieżki zamówienia reklamowego dla metadanych budowy.
Rysunek 4. Przepływ sekwencji w ścieżce zamówienia reklamowego w konstrukcji metadanych
Łączenie (Android 12)
Po zakończeniu procesu uruchamiania mechanizm aktualizacji oznaczy to gniazdo jako rozruchowe.
i inicjuje scalanie, przełączając środowisko docelowe dm-snapshot
na
Wartość docelowa: dm-snapshot-merge
.
dm-snapshot
analizuje metadane i inicjuje zamówienie reklamowe scalania dla każdego dysku
wyjątek. Poniżej znajdziesz ogólny przegląd ścieżki scalonego zamówienia reklamowego.
Rysunek 5. Omówienie ścieżki scalania zamówienia reklamowego
Jeśli podczas scalania urządzenie zostanie zrestartowane, scalanie zostanie wznowione po ponownym uruchomieniu i scalanie.
Tworzenie warstw za pomocą mapowania urządzeń
W przypadku urządzeń z Androidem 13 lub nowszym parametr
w ramach kompresji wirtualnej A/B wykonywane są procedury scalania zrzutów oraz zrzutów
przez komponent przestrzeni użytkownika snapuserd
. Urządzenia przechodzące na Androida
w wersji 13 lub nowszej, ta funkcja musi być włączona. Dla:
Więcej informacji znajdziesz w sekcji Obszar użytkownika
Scal.
Poniżej opisujemy proces wirtualnej kompresji A/B:
- Platforma podłącza partycję
/system
na urządzeniudm-verity
, który znajduje się na urządzeniu z systememdm-user
. Oznacza to, że każde I/O z głównego systemu plików jest kierowana na adresdm-user
. dm-user
kieruje wejścia/wyjścia do demonasnapuserd
przestrzeni użytkownika, który obsługuje żądania I/O.- Po zakończeniu operacji scalania platforma zwija
dm-verity
góradm-linear
(system_base
) i usuwadm-user
.
Rysunek 6. Proces wirtualnej kompresji A/B
Proces scalania zrzutów można przerwać. Jeśli urządzenie zostanie zrestartowane podczas procesu scalania, zostanie on wznowiony po ponownym uruchomieniu.
Przejścia inicjowane
W przypadku uruchamiania ze skompresowanymi zrzutami musi rozpoczynać się pierwszy etap
snapuserd
, aby podłączyć partycje. Stwarza to problem: podczas wczytywania interfejsu sepolicy
i wymuszane, snapuserd
trafia w niewłaściwy kontekst, a jego żądania odczytu
z odrzucaniem selinux.
Aby rozwiązać ten problem, interfejs snapuserd
przechodzi w blokadzie z zastosowaniem init
w następujący sposób:
- Pierwszy etap
init
uruchamia pliksnapuserd
z dysku RAM i zapisuje otwartą deskryptora pliku w zmiennej środowiskowej. - Pierwszy etap
init
przełącza główny system plików na partycję systemową, następnie wykonuje kopię systemową skryptuinit
. - Kopia systemowa elementu
init
odczytuje połączoną z nim zasadę sepolicy w ciągu znaków. - Na wszystkich stronach obsługiwanych przez ext4 funkcja
Init
wywołuje metodęmlock()
. Następnie dezaktywuje wszystkie w przypadku urządzeń z migawkami i zatrzymuje funkcjęsnapuserd
. Po tym nie może odczytywać danych z partycji, ponieważ powoduje to ich zakleszczenie. - Używanie otwartego deskryptora do kopii pamięci RAM
snapuserd
,init
ponownie uruchamia demona z prawidłowym kontekstem selinux. Tabele mapowania urządzeń w przypadku urządzeń z migawkami są ponownie aktywowane. - Init wywołuje metodę
munlockall()
– można bezpiecznie wykonać zamówienie reklamowe jeszcze raz.
Wykorzystanie miejsca
W tej tabeli znajdziesz porównanie wykorzystania miejsca przez różne aktualizacje OTA z zastosowaniem rozmiarów systemu operacyjnego i OTA telefonu Pixel.
Wpływ rozmiaru | inne niż A/B | A/B | Wirtualne A/B | Wirtualne A/B (skompresowane) |
---|---|---|---|---|
Oryginalne zdjęcie fabryczne | Super 4,5 GB (obraz 3,8 G + 700 MB zarezerwowane)1 | Super 9 GB (3,8 G + 700 MB zarezerwowane, na 2 przedziały) | Super 4,5 GB (obraz 3,8 G + 700 MB zarezerwowane) | Super 4,5 GB (obraz 3,8 G + 700 MB zarezerwowane) |
Inne partycje statyczne | /cache | Brak | Brak | Brak |
Dodatkowe miejsce na dane podczas aktualizacji OTA (miejsce zwracane po zastosowaniu OTA) | 1,4 GB w trybie /data | 0 | 3,8 GB2 wł. /data | 2,1 GB2 wł. /data |
Łączna ilość miejsca na dane wymagana do stosowania aktualizacji OTA | 5,9 GB3 (super i dane) | 9GB (super) | 8,3 GB3 (super i dane) | 6,6 GB3 (super i dane) |
1 Wskazuje układ przypuszczalny na podstawie mapowania pikseli.
2 Zakładamy, że nowy obraz systemu ma taki sam rozmiar jak oryginalny.
3 Wymagania dotyczące miejsca są tymczasowe do czasu ponownego uruchomienia.
Aby wdrożyć funkcję wirtualnego A/B lub skorzystać z funkcji skompresowanych zrzutów, zapoznaj się z artykułem Wdrożenie wirtualnej wersji A/B