Crates.io | gptman |
lib.rs | gptman |
version | 1.1.2 |
source | src |
created_at | 2019-01-07 14:15:02.021446 |
updated_at | 2024-02-12 16:47:13.663961 |
description | Pure Rust library to read and modify GUID partition tables |
homepage | https://github.com/rust-disk-partition-management/gptman |
repository | https://github.com/rust-disk-partition-management/gptman |
max_upload_size | |
id | 106046 |
size | 549,775 |
Pure Rust library to read and modify GUID partition tables.
Cargo.toml:
[dependencies]
gptman = "1"
Reading all the partitions of a disk:
let mut f = std::fs::File::open("tests/fixtures/disk1.img")
.expect("could not open disk");
let gpt = gptman::GPT::find_from(&mut f)
.expect("could not find GPT");
println!("Disk GUID: {:?}", gpt.header.disk_guid);
for (i, p) in gpt.iter() {
if p.is_used() {
println!("Partition #{}: type = {:?}, size = {} bytes, starting lba = {}",
i,
p.partition_type_guid,
p.size().unwrap() * gpt.sector_size,
p.starting_lba);
}
}
Creating new partitions:
let mut f = std::fs::File::open("tests/fixtures/disk1.img")
.expect("could not open disk");
let mut gpt = gptman::GPT::find_from(&mut f)
.expect("could not find GPT");
let free_partition_number = gpt.iter().find(|(i, p)| p.is_unused()).map(|(i, _)| i)
.expect("no more places available");
let size = gpt.get_maximum_partition_size()
.expect("no more space available");
let starting_lba = gpt.find_optimal_place(size)
.expect("could not find a place to put the partition");
let ending_lba = starting_lba + size - 1;
gpt[free_partition_number] = gptman::GPTPartitionEntry {
partition_type_guid: [0xff; 16],
unique_partition_guid: [0xff; 16],
starting_lba,
ending_lba,
attribute_bits: 0,
partition_name: "A Robot Named Fight!".into(),
};
Creating a new partition table with one entry that fills the entire disk:
let ss = 512;
let data = vec![0; 100 * ss as usize];
let mut cur = std::io::Cursor::new(data);
let mut gpt = gptman::GPT::new_from(&mut cur, ss as u64, [0xff; 16])
.expect("could not create partition table");
gpt[1] = gptman::GPTPartitionEntry {
partition_type_guid: [0xff; 16],
unique_partition_guid: [0xff; 16],
starting_lba: gpt.header.first_usable_lba,
ending_lba: gpt.header.last_usable_lba,
attribute_bits: 0,
partition_name: "A Robot Named Fight!".into(),
};