#partition #table #filesystem #disk #gpt

bin+lib gptman

A GPT manager that allows you to copy partitions from one disk to another

10 releases (5 breaking)

0.7.0 Aug 11, 2020
0.6.5 Jul 20, 2020
0.6.3 May 16, 2020
0.6.2 Mar 8, 2020
0.2.0 Jan 10, 2019

#78 in Command line utilities

Download history 617/week @ 2020-08-04 773/week @ 2020-08-11 912/week @ 2020-08-18 608/week @ 2020-08-25 387/week @ 2020-09-01 284/week @ 2020-09-08 247/week @ 2020-09-15 270/week @ 2020-09-22 442/week @ 2020-09-29 386/week @ 2020-10-06 434/week @ 2020-10-13 456/week @ 2020-10-20 1422/week @ 2020-10-27 1720/week @ 2020-11-03 1208/week @ 2020-11-10 2668/week @ 2020-11-17

1,817 downloads per month
Used in coreos-installer

MIT license

135KB
3K SLoC

Build Status Latest Version License Docs.rs LOC Dependency Status

gptman

A CLI tool for Linux that allows you to copy a partition from one disk to another and more.

A library that allows managing GUID partition tables.

Features

  • Read/Write GPT from 512 and 4096 bytes sector size disks
  • Create a new GPT on a disk (-i, --init)
  • Insert/delete a partition in the table (n, d)
  • Align partitions automatically (a)
  • Resize a partition (r)
  • Copy/clone a partition from one disk and insert it to another (c)
  • Change partition type (and list by category) (t)
  • Fix partitions order (f)
  • Change disk GUID (i)
  • Change partition name (L)
  • Change partition GUID (u)
  • Toggle legacy BIOS bootable (A)
  • Toggle no block IO protocol (B)
  • Toggle required partition flag (R)
  • Toggle attributes (S)
  • Customize columns to print (-o, --output)
  • Print raw data of disklabel (D)
  • Swap partition indexes (s)
  • Randomize disk's GUID and all partition's GUID (Z)
  • Copy/clone all partitions from one disk and insert it to another (C)
  • Write protective MBR

Installation

  • CLI:

    cargo install gptman
    

    Statically linked:

    cargo install --target=x86_64-unknown-linux-musl gptman
    
  • Library:

    Cargo.toml:

    [dependencies]
    gptman = { version = "0.2.0", default-features = false }
    

Library Usage

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(),
};

Dependencies

~1–2.6MB
~55K SLoC