22 个版本 (6 个稳定版)
1.1.2 | 2024 年 2 月 12 日 |
---|---|
1.1.0 | 2024 年 1 月 15 日 |
1.0.2 | 2023 年 8 月 21 日 |
1.0.1 | 2023 年 7 月 22 日 |
0.2.0 | 2019 年 1 月 10 日 |
#46 在 文件系统
每月 2,881 次下载
在 coreos-installer 中使用
77KB
1K SLoC
gptman
纯 Rust 库,用于读取和修改 GUID 分区表。
您可以做的事情
- 从 512 和 4096 字节扇区大小的磁盘读取/写入 GPT
- 在磁盘上创建新的 GPT
- 在表中插入/删除分区
- 自动对齐分区(到扇区大小)
- 调整分区大小
- 从一个磁盘复制/克隆分区并插入到另一个磁盘
- 更改分区类型
- 修复分区顺序
- 更改磁盘 GUID
- 更改分区名称
- 更改分区 GUID
- 切换传统 BIOS 可引导
- 切换无块 I/O 协议
- 切换所需分区标志
- 切换属性
- 交换分区索引
- 从一个磁盘复制/克隆所有分区并插入到另一个磁盘
- 写入保护 MBR
安装
Cargo.toml
[dependencies]
gptman = "1"
使用方法
读取磁盘的所有分区
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);
}
}
创建新的分区
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(),
};
创建一个包含一个条目并填充整个磁盘的新分区表
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(),
};
依赖项
~0.7–1.8MB
~40K SLoC