1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| - CreateSnapshotPartitions | - SnapshotManager::NewForFirstStageMount "first stage mount" \ - New(info) "SnapshotManager构造函数,初始化两个目录 gsid_dir_=ota metadata_dir_=/metadata/ota" | - ForceLocalImageManager "构造ImageManager" \ - ImageManager::Open(gsid_dir_) "初始化两个目录 metadata_dir = /metadata/gsi/ota data_dir=/data/gsi/ota" | - sm->NeedSnapshotsInFirstStageMount() "调用上面SnapshotManager的实例的该函数,根据merge state确定是否进行后续步骤" \ - GetCurrentSlot() != Slot::Target " 根据这个判断是不是ota后的切换slot过程,Target=2,Source=1 " " =1说明未进行ota,未进行ota就不需要挂载snapshot,return false" | - ReadUpdateState \ - ReadSnapshotUpdateStatus " /metadata/ota/state文件中获取ota后的merge状态" " Unverified Merging MergeFailed 返回true" | - true - InitRequiredDevices({"userdata"}) "NeedSnapshotsInFirstStageMount 返回true时" \ - InitDeviceMapper "初始化dm框架,创建uevent监听 /sys/devices/virtual/misc/device-mapper" | - return UeventCallback(uevent, &devices); "如果下面有userdata设备创建了,才说明required Device初始化成功了,才返回true。 而lp_metadata_partition_是FirstStageMount早期阶段初始化的/devices/virtual/block/dm-<>/dm/name文件中读出的super partition名字,赋值给/dev/block/mapper/<partition>" | - true - sm->CreateLogicalAndSnapshotPartitions(lp_metadata_partition_) "创建logical device和snapshot device" \ - ReadMetadata(opener, super_device, slot) "读取super device对应slot的metadata描述" | - CreateLogicalPartitionParams (for params.partition:metadata->partitions) "挨个挂接metadata描述的partitions及其对应的snapshot设备" \ - MapPartitionWithSnapshot(std::move(params)) \ - GetSnapshotStatusFilePath(params.GetPartitionName() "/metadata/ota/snapshots/<partition_name>" | - ReadSnapshotStatus(lock, params.GetPartitionName(), &*live_snapshot_status) # /metadata/ota/snapshots/<partition_name>, \ - status->ParseFromFileDescriptor(fd.get()) "解析该文件,获得live_snapshot_status状态" | - # MERGE_COMPLETED | NONE | "cow_partition_size + cow_file_size = 0 代表no live snapshot" | - live_snapshot_status.has_value- "如果有live snapshot" \ - params.device_name = GetBaseDeviceName(params.GetPartitionName()); "devicename变成了<partionname>—base" | - created_devices.EmplaceBack<AutoUnmapDevice>(&dm, params.GetDeviceName()) | - CreateLogicalPartition(params, &base_path) "映射logical device 动态分区的映射,返回的path为/dev/block/dm-<num>" | - live_snapshot_status.has_value- "如果有live snapshot" \ - dm.GetDeviceString(params.GetDeviceName(), &base_device) "返回base_device major:minor设备号" | - CreateLogicalPartitionParams cow_params = params | - MapCowDevices(lock, cow_params, *live_snapshot_status, &created_devices, &cow_name) "映射cow_device写时复制" \ - cow_image_name = GetCowImageDeviceName(partition_name) #<partion_name>-cow-img | - *cow_name = GetCowName(partition_name) #<partition_name>-cow | - EnsureImageManager() | - "因为前面已经执行过ForceLocalImageManager,所以image_不为空,后面的步骤不走了" | - MapCowImage(partition_name, remaining_time) | - has_local_image_manager_- true "image_为之前ForceLocalImageManager时的实例,指向ImageManager" \ - images_->MapImageWithDeviceMapper(opener, cow_image_name, &cow_dev) "cow_image_name为<partion_name>-cow-img" | - MapWithDmLinear(opener, cow_image_name, {}, &ignore_path) \ - metadata = OpenMetadata(metadata_dir_) "metadata_dir_=/metadata/gsi/ota" \ - metadata_file = GetMetadataFile(metadata_dir_) "/metadata/gsi/ota/lp_metadata" | | | - metadata = ReadFromImageFile(metadata_file) "从上述文件中解析出metadata描述" | - super = GetMetadataSuperBlockDevice() "获得super封装" | - block_device = GetBlockDevicePartitionName(super) | - CreateLogicalPartition(params, path) "dm-linear 跟之前的动态分区的逻辑一样,映射设备,获得path /dev/block/dm-<num>" | - WriteStringToFile(status_string, status_file) "/metadata/gsi/ota/<parition_name-cow-img>.status中写入dm:<partition_name-cow-img>" | - dm.GetDeviceString(name, dev) "返回major:minor号给dev" | - created_devices->EmplaceBack<AutoUnmapImage>(images_.get(), cow_image_name) "created_devices再push新的cow_img" | - CreateLogicalPartitionParams cow_partition_params = params (.partition_name=*cow_name;); "cow_name = <partition>_cow" | - CreateDmTable(cow_partition_params, &table) "创建映射表" | - cow_partition_sectors = snapshot_status.cow_partition_size() / kSectorSize "扇区" | - cow_image_sectors = snapshot_status.cow_file_size() / kSectorSize; | - table.Emplace<DmTargetLinear>(cow_partition_sectors, cow_image_sectors, cow_image_device, 0); " 从cow-img的尾部开始算,长度为cow_image_sectors 个扇区,block_device还是用前面挂接的cow-img的device" | - dm.CreateDevice(*cow_name, table, &cow_path, remaining_time) "为<partition_name>-cow创建dm设备" | - created_devices->EmplaceBack<AutoUnmapDevice>(&dm, *cow_name); "push到created_devices中" | - dm.GetDeviceString(cow_name, &cow_device) "<partion_name>-cow获取设备号major /minor" | - MapSnapshot(lock, params.GetPartitionName(), base_device, cow_device, remaining_time, path) "base_device 代表动态分区的base_device, cow_device代表映射partion_name-cow的设备,为这两个设备之间建立映射快照" \ - ReadSnapshotStatus(name, &status) "/metadata/ota/snapshots/<partition_name>读取状态,如果是MERGE_COMPLETED|NONE就退出,不需要快照了" | - snapshot_sectors = status.snapshot_size() / kSectorSize "snapshot快照的扇区数" | - linear_sectors = (status.device_size() - status.snapshot_size()) / kSectorSize "logical本身的扇区数" | - ReadUpdateState() "/metadata/ota/state中读取ota的状态 MergeCompleted| MergeNeedsReboot return false,退出 Merging|MergeFailed mode=merge或者Persistent" | - snap_name = GetSnapshotExtraDeviceName(partition_name) "<parition_name>-inner" | - table.Emplace<DmTargetSnapshot>(0, snapshot_sectors, base_device, cow_device, mode, kSnapshotChunkSize) "创建映射表,单位是4k,即8*sector_size DmTargetSnapshot start=0. length = snapshot_sectors,mode=merge|Persistent" "DmTargetSnapshot::name() mode=merge时返回"snapshot-merge",其他状态下返回"snapshot"" | - dm.CreateDevice(snap_name, table, dev_path, timeout_ms) "创建dm设备" | - linear_sectors>0 - "动态分区里的img不为空 " \ - dm.GetDeviceString(snap_name, &snap_dev) "获取snap_dev的major/minor" | - table.Emplace<DmTargetLinear>(0, snapshot_sectors, snap_dev, 0); "先是snap_device" | - table.Emplace<DmTargetLinear>(snapshot_sectors, linear_sectors, base_device, snapshot_sectors); "再是linear_device追加" | - dm.CreateDevice(name, table, dev_path, timeout_ms) "最终创建<partition_name>的dm设备映射"
|