Tổng quan về A/B ảo

Virtual A/B là cơ chế cập nhật chính của Android. Bản dựng A/B ảo dựa trên các bản cập nhật A/B cũ (xem Bản cập nhật hệ thống A/B) và không phải A/B không còn được dùng nữa trong phiên bản 15 để giảm hao tổn không gian của các bản cập nhật.

A/B ảo thực sự không có thêm khe cho các phân vùng động, hãy xem phần phân vùng động. Thay vào đó, delta được ghi vào ảnh chụp nhanh, sau đó được hợp nhất vào phân vùng cơ sở sau khi xác nhận khởi động thành công. Virtual A/B sử dụng định dạng ảnh chụp nhanh dành riêng cho Android. Xem định dạng COW cho bản tổng quan nhanh được nén, để cho phép nén bản tổng quan nhanh và giảm thiểu mức sử dụng dung lượng ổ đĩa. Trên môi trường OTA đầy đủ, kích thước bản tổng quan nhanh sẽ giảm khoảng 45% khi nén và kích thước bản tổng quan nhanh OTA gia tăng giảm khoảng 55%.

Android 12 cung cấp tuỳ chọn nén A/B ảo để nén các phân vùng được chụp nhanh. Thử nghiệm A/B ảo cung cấp những lợi ích sau

  • Các bản cập nhật A/B ảo diễn ra liên tục (quá trình cập nhật diễn ra hoàn toàn ở chế độ nền trong khi thiết bị đang hoạt động) như các bản cập nhật A/B. Tính năng cập nhật A/B ảo giúp giảm thiểu thời gian thiết bị không kết nối mạng và không sử dụng được.
  • Bạn có thể hoàn nguyên nội dung cập nhật A/B ảo. Nếu hệ điều hành mới không khởi động được, thiết bị sẽ tự động quay lại phiên bản trước.
  • Bản cập nhật A/B ảo sử dụng không gian bổ sung tối thiểu bằng cách chỉ sao chép các phân vùng mà trình tải khởi động sử dụng. Các phân vùng có thể cập nhật khác được chụp nhanh.

Thông tin khái quát và thuật ngữ

Phần này xác định thuật ngữ và mô tả công nghệ hỗ trợ thử nghiệm A/B ảo. Trong quá trình cài đặt OTA, dữ liệu hệ điều hành mới sẽ được ghi vào khe mới cho các phân vùng vật lý hoặc thiết bị COW dành riêng cho Android. Sau khi thiết bị khởi động lại, dữ liệu phân vùng động sẽ được hợp nhất trở lại vào thiết bị cơ sở thông qua việc sử dụng dm-user và trình nền snapuserd. Quá trình này diễn ra hoàn toàn trong không gian người dùng.

Trình ánh xạ thiết bị

Trình ánh xạ thiết bị là một lớp khối ảo Linux thường được dùng trong Android. Với phân vùng động, các phân vùng như /system là một ngăn xếp các thiết bị được phân lớp:

  • Ở cuối ngăn xếp là phân vùng super (ví dụ: /dev/block/by-name/super).
  • Ở giữa là một thiết bị dm-linear, chỉ định những khối nào trong phân vùng siêu cấp tạo thành phân vùng động đã cho. Giá trị này sẽ xuất hiện dưới dạng /dev/block/mapper/system_[a|b] trên thiết bị A/B hoặc /dev/block/mapper/system trên thiết bị không phải A/B.
  • Ở trên cùng là một thiết bị dm-verity, được tạo cho các phân vùng đã xác minh. Thiết bị này xác minh rằng các khối trên thiết bị dm-linear được ký đúng cách. Nó xuất hiện dưới dạng /dev/block/mapper/system-verity và là nguồn của điểm gắn /system.

Hình 1 cho thấy ngăn xếp bên dưới điểm gắn /system.

Phân vùng xếp chồng bên dưới hệ thống

Hình 1. Ngăn xếp trong điểm gắn /system

Ảnh chụp nhanh được nén

Trên Android 12 trở lên, do yêu cầu về dung lượng trên phân vùng /data có thể cao, nên bạn có thể bật ảnh chụp nhanh nén trong bản dựng để giải quyết yêu cầu về dung lượng cao hơn của phân vùng /data.

Ảnh chụp nhanh nén A/B ảo được xây dựng dựa trên các thành phần sau đây có trong Android 12 trở lên:

  • dm-user, một mô-đun hạt nhân tương tự như FUSE cho phép không gian người dùng triển khai các thiết bị khối.
  • snapuserd, một trình nền không gian người dùng để triển khai định dạng ảnh chụp nhanh mới.

Các thành phần này cho phép nén. Những thay đổi cần thiết khác để triển khai các tính năng tổng quan nhanh nén được trình bày trong các phần tiếp theo: Định dạng COW cho bản tổng quan nhanh được nén, dm-usersnapuserd.

Định dạng COW cho ảnh chụp nhanh nén

Trong Android 12 trở lên, ảnh chụp nhanh được nén sử dụng định dạng COW dành riêng cho Android. Định dạng COW chứa siêu dữ liệu về OTA và có các vùng đệm riêng biệt chứa hoạt động COW và dữ liệu mới về hệ điều hành. So với định dạng ảnh chụp nhanh hạt nhân chỉ cho phép các thao tác thay thế (Thay thế khối X trong hình ảnh cơ sở bằng nội dung của khối Y trong ảnh chụp nhanh), định dạng COW của ảnh chụp nhanh nén Android có khả năng biểu đạt cao hơn và hỗ trợ các thao tác sau:

  • Sao chép: Khối X trong thiết bị cơ sở phải được thay thế bằng khối Y trong thiết bị cơ sở.
  • Thay thế: Khối X trong thiết bị cơ sở phải được thay thế bằng nội dung của khối Y trong ảnh chụp nhanh. Mỗi khối này đều được nén gz.
  • 0: Bạn nên thay thế khối X trong thiết bị cơ sở bằng tất cả các số 0.
  • XOR: Thiết bị COW lưu trữ XOR các byte nén giữa khối X và khối Y. (Có trong Android 13 trở lên.)

Bản cập nhật OTA đầy đủ chỉ bao gồm các thao tác thay thếrỗng. Bản cập nhật OTA gia tăng có thể có thêm các hoạt động sao chép.

Bố cục ảnh chụp nhanh đầy đủ trên ổ đĩa sẽ có dạng như sau:

định dạng bò sữa

Hình 2. Định dạng COW của Android trên ổ đĩa

dm-user

Mô-đun nhân hệ điều hành dm-user cho phép userspace triển khai các thiết bị khối cho công cụ liên kết thiết bị. Mục nhập bảng dm-user tạo một thiết bị khác trong /dev/dm-user/<control-name>. Quy trình userspace có thể thăm dò ý kiến thiết bị để nhận yêu cầu đọc và ghi từ hạt nhân. Mỗi yêu cầu đều có một vùng đệm liên kết để không gian người dùng điền sẵn (đối với yêu cầu đọc) hoặc truyền tải (đối với yêu cầu ghi).

Mô-đun nhân dm-user cung cấp giao diện mới mà người dùng nhìn thấy cho nhân không thuộc cơ sở mã kernel.org ngược dòng. Cho đến lúc đó, Google giữ quyền sửa đổi giao diện dm-user trong Android.

chụp nhanh

Thành phần không gian người dùng snapuserd cho dm-user triển khai tính năng nén A/B ảo. Snapuserd là một trình nền không gian người dùng chịu trách nhiệm ghi và đọc các thiết bị COW của Android. Tất cả I/O đến ảnh chụp nhanh phải trải qua dịch vụ này. Trong quá trình cài đặt OTA, dữ liệu hệ điều hành mới được snapuserd ghi vào ảnh chụp nhanh (có nén). Việc phân tích cú pháp siêu dữ liệu và giải nén dữ liệu khối mới cũng được xử lý tại đây.

Nén XOR

Đối với các thiết bị chạy Android 13 trở lên, tính năng nén XOR (được bật theo mặc định) cho phép bản tổng quan nhanh của không gian người dùng lưu trữ các byte nén XOR giữa các khối cũ và khối mới. Khi chỉ một vài byte trong một khối được thay đổi trong bản cập nhật A/B ảo, lược đồ lưu trữ nén XOR sẽ sử dụng ít dung lượng hơn so với lược đồ lưu trữ mặc định vì ảnh chụp nhanh không lưu trữ đầy đủ 4K byte. Kích thước tổng quan nhanh có thể giảm vì dữ liệu XOR chứa nhiều số 0 và dễ nén hơn dữ liệu khối thô. Trên các thiết bị Pixel, tính năng nén XOR giúp giảm kích thước bản tổng quan nhanh từ 25% đến 40%.

Đối với các thiết bị nâng cấp lên Android 13 trở lên, bạn phải bật tính năng nén XOR. Để biết thông tin chi tiết, hãy xem phần Nén XOR.

Hợp nhất ảnh chụp nhanh

Đối với các thiết bị chạy Android 13 trở lên, quá trình tổng hợp ảnh chụp nhanh và ảnh chụp nhanh trong quá trình nén A/B ảo sẽ do thành phần không gian người dùng snapuserd thực hiện. Đối với các thiết bị nâng cấp lên Android 13 trở lên, bạn phải bật tính năng này. Để biết thông tin chi tiết, hãy xem phần Hợp nhất Userspace.

Phần sau đây mô tả quy trình nén A/B ảo:

  1. Khung này gắn phân vùng /system khỏi thiết bị dm-verity, được xếp chồng lên trên thiết bị dm-user. Điều này có nghĩa là mọi I/O từ hệ thống tệp gốc đều được định tuyến đến dm-user.
  2. dm-user định tuyến I/O đến trình nền snapuserd của không gian người dùng, trình này xử lý yêu cầu I/O.
  3. Khi thao tác hợp nhất hoàn tất, khung sẽ thu gọn dm-verity trên đầu dm-linear (system_base) và xoá dm-user.

Quy trình nén A/B ảo

Hình 3. Quy trình nén A/B ảo

Quá trình hợp nhất ảnh chụp nhanh có thể bị gián đoạn. Nếu thiết bị được khởi động lại trong quá trình hợp nhất, thì quá trình hợp nhất sẽ tiếp tục sau khi khởi động lại.

Khởi chạy hiệu ứng chuyển đổi

Khi khởi động bằng bản tổng quan nhanh được nén, khởi động giai đoạn đầu tiên phải khởi động snapuserd để gắn các phân vùng. Việc này gây ra một vấn đề: Khi sepolicy được tải và thực thi, snapuserd sẽ được đặt vào sai ngữ cảnh và yêu cầu đọc không thành công, kèm theo việc từ chối máy tính selinux.

Để giải quyết vấn đề này, snapuserd chuyển đổi theo bước khoá với init như sau:

  1. init giai đoạn đầu khởi chạy snapuserd từ ramdisk và lưu mô tả tệp mở vào đó trong một biến môi trường.
  2. init giai đoạn đầu chuyển đổi hệ thống tệp gốc sang phân vùng hệ thống, sau đó thực thi bản sao hệ thống của init.
  3. Bản sao hệ thống của init đọc chính sách kết hợp thành một chuỗi.
  4. Init gọi mlock() trên tất cả các trang được hỗ trợ ext4. Sau đó, trình này sẽ huỷ kích hoạt tất cả bảng trình ánh xạ thiết bị cho thiết bị ảnh chụp nhanh và dừng snapuserd. Sau thao tác này, hệ thống sẽ cấm đọc dữ liệu từ các phân vùng, vì việc này sẽ gây ra tắc nghẽn.
  5. Bằng cách sử dụng chỉ số mở cho bản sao ramdisk của snapuserd, init sẽ chạy lại trình nền với ngữ cảnh selinux chính xác. Các bảng Device-mapper (Trình ánh xạ thiết bị) cho thiết bị ảnh chụp nhanh được kích hoạt lại.
  6. Init gọi munlockall() – bạn có thể thực hiện lại IO một cách an toàn.

Mức sử dụng không gian

Bảng sau đây so sánh mức sử dụng dung lượng cho các cơ chế OTA khác nhau bằng cách sử dụng kích thước hệ điều hành và OTA của Pixel.

Tác động về kích thước không phải thử nghiệm A/B A/B Thử nghiệm A/B ảo A/B ảo (đã nén)
Hình ảnh gốc của nhà sản xuất 4,5 GB siêu (hình ảnh 3,8 GB + 700 MB được đặt trước)1 9GB siêu (3,8G + 700M được đặt trước, cho hai khe) 4,5 GB siêu (hình ảnh 3,8 GB + 700 MB được đặt trước) 4,5 GB siêu (hình ảnh 3,8G + 700M được đặt trước)
Các phân vùng tĩnh khác /cache Không có Không có Không có
Dung lượng lưu trữ bổ sung trong quá trình OTA (không gian được trả về sau khi áp dụng OTA) 1,4 GB trên /data 0 3,8 GB2 trên /data 2,1 GB2 trên /data
Tổng dung lượng cần thiết để áp dụng OTA 5,9 GB3 (siêu dữ liệu và dữ liệu) 9 GB (siêu) 8,3 GB3 (super và dữ liệu) 6,6 GB3 (super và dữ liệu)

1Cho biết bố cục được giả định dựa trên liên kết Pixel.

2Giả sử hình ảnh hệ thống mới có cùng kích thước với hình ảnh gốc.

3Yêu cầu về dung lượng là tạm thời cho đến khi khởi động lại.

Chế độ A/B ảo trên Android 11

Android 11 của A/B ảo đã ghi vào phân vùng động bằng cách sử dụng định dạng Kernel COW. Cuối cùng, phương thức này không còn được dùng nữa vì định dạng COW của hạt nhân không hỗ trợ tính năng nén.

Chế độ A/B ảo của Android 12

Trong Android 12, tính năng nén được hỗ trợ ở dạng định dạng COW dành riêng cho Android. Phiên bản Virtual A/B này yêu cầu bản dịch COW dành riêng cho Android sang định dạng COW của Kernel. Cuối cùng, phương thức này đã được thay thế trong Android 13, loại bỏ sự phụ thuộc vào định dạng COW của Kernel và cả dm-snapshot.

Để triển khai A/B ảo hoặc sử dụng các tính năng ảnh chụp nhanh được nén, hãy xem phần Triển khai A/B ảo