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文件系统

Download history 1825/week @ 2024-04-07 1814/week @ 2024-04-14 1954/week @ 2024-04-21 1713/week @ 2024-04-28 2572/week @ 2024-05-05 1745/week @ 2024-05-12 2371/week @ 2024-05-19 1757/week @ 2024-05-26 2327/week @ 2024-06-02 1710/week @ 2024-06-09 1092/week @ 2024-06-16 1302/week @ 2024-06-23 740/week @ 2024-06-30 776/week @ 2024-07-07 553/week @ 2024-07-14 798/week @ 2024-07-21

每月 2,881 次下载
coreos-installer 中使用

MIT/Apache

77KB
1K SLoC

Rust Latest Version Rust 1.63+ License Docs.rs LOC Dependency Status

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