blob: b9a2458a09f82baeb61d587f111a3912f82d2faf [file] [log] [blame]
/*
* Copyright (C) 2019 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.
*/
#pragma once
/**
* Functions for manipulating disk files given to crosvm or QEMU.
*/
#include <string>
#include <vector>
namespace cuttlefish {
enum ImagePartitionType {
kLinuxFilesystem = 0,
kEfiSystemPartition,
};
struct ImagePartition {
std::string label;
std::string image_file_path;
ImagePartitionType type;
bool read_only;
};
struct MultipleImagePartition {
std::string label;
std::vector<std::string> image_file_paths;
ImagePartitionType type;
bool read_only;
};
uint64_t AlignToPartitionSize(uint64_t size);
/**
* Combine the files in `partition` into a single raw disk file and write it to
* `output_path`. The raw disk file will have a GUID Partition Table and copy in
* the contents of the files mentioned in `partitions`.
*/
void AggregateImage(const std::vector<ImagePartition>& partitions,
const std::string& output_path);
/**
* Generate the files necessary for booting with a Composite Disk.
*
* Composite Disk is a crosvm disk format that is a layer of indirection over
* other disk files. The Composite Disk file lists names and offsets in the
* virtual disk.
*
* For a complete single disk inside the VM, there must also be a GUID Partition
* Table header and footer. These are saved to `header_file` and `footer_file`,
* then the specification file containing the file paths and offsets is saved to
* `output_composite_path`.
*/
void CreateCompositeDisk(std::vector<ImagePartition> partitions,
const std::string& header_file,
const std::string& footer_file,
const std::string& output_composite_path);
/**
* Overloaded function to generate a composite disk with multiple images for a
* single partition.
*/
void CreateCompositeDisk(std::vector<MultipleImagePartition> partitions,
const std::string& header_file,
const std::string& footer_file,
const std::string& output_composite_path);
/**
* Generate a qcow overlay backed by a given implementation file.
*
* qcow, or "QEMU Copy-On-Write" is a file format containing a list of disk
* offsets and file contents. This can be combined with a backing file, to
* represent an original disk file plus disk updates over that file. The qcow
* files can be swapped out and replaced without affecting the original. qcow
* is supported by QEMU and crosvm.
*
* The crosvm binary at `crosvm_path` is used to generate an overlay file at
* `output_overlay_path` that functions as an overlay on the file at
* `backing_file`.
*/
void CreateQcowOverlay(const std::string& crosvm_path,
const std::string& backing_file,
const std::string& output_overlay_path);
}