Crate gpt

Source
Expand description

A pure-Rust library to work with GPT partition tables.

It provides support for manipulating (R/W) GPT headers and partition tables. Raw disk devices as well as disk images are supported.

extern crate gpt;
use std::convert::TryFrom;

fn inspect_disk() {
    let diskpath = std::path::Path::new("/dev/sdz");
    let cfg = gpt::GptConfig::new().writable(false);

    let disk = cfg.open(diskpath).expect("failed to open disk");

    println!("Disk header: {:#?}", disk.primary_header());
    println!("Partition layout: {:#?}", disk.partitions());
}

fn create_partition() {
    let diskpath = std::path::Path::new("/tmp/chris.img");
    let cfg = gpt::GptConfig::new().writable(true).initialized(true);
    let mut disk = cfg.open(diskpath).expect("failed to open disk");
    let result = disk.add_partition(
        "rust_partition",
        100,
        gpt::partition_types::LINUX_FS,
        0,
        None
    );
    disk.write().unwrap();
}

/// Demonstrates how to create a new partition table without anything pre-existing
fn create_partition_in_ram() {
    const TOTAL_BYTES: usize = 1024 * 64;
    let mut mem_device = Box::new(std::io::Cursor::new(vec![0u8; TOTAL_BYTES]));

    // Create a protective MBR at LBA0
    let mbr = gpt::mbr::ProtectiveMBR::with_lb_size(
        u32::try_from((TOTAL_BYTES / 512) - 1).unwrap_or(0xFF_FF_FF_FF));
    mbr.overwrite_lba0(&mut mem_device).expect("failed to write MBR");

    let mut gdisk = gpt::GptConfig::default()
        .initialized(false)
        .writable(true)
        .logical_block_size(gpt::disk::LogicalBlockSize::Lb512)
        .create_from_device(mem_device, None)
        .expect("failed to crate GptDisk");

    // Initialize the headers using a blank partition table
    gdisk.update_partitions(
        std::collections::BTreeMap::<u32, gpt::partition::Partition>::new()
    ).expect("failed to initialize blank partition table");

    // At this point, gdisk.primary_header() and gdisk.backup_header() are populated...
    // Add a few partitions to demonstrate how...
    gdisk.add_partition("test1", 1024 * 12, gpt::partition_types::BASIC, 0, None)
        .expect("failed to add test1 partition");
    gdisk.add_partition("test2", 1024 * 18, gpt::partition_types::LINUX_FS, 0, None)
        .expect("failed to add test2 partition");
    // Write the partition table and take ownership of
    // the underlying memory buffer-backed block device
    let mut mem_device = gdisk.write().expect("failed to write partition table");
    // Read the written bytes out of the memory buffer device
    mem_device.seek(std::io::SeekFrom::Start(0)).expect("failed to seek");
    let mut final_bytes = vec![0u8; TOTAL_BYTES];
    mem_device.read_exact(&mut final_bytes)
        .expect("failed to read contents of memory device");
}

// only manipulates memory buffers, so this can run on any system...
create_partition_in_ram();

Modules§

  • Disk-related types and helper functions.
  • GPT-header object and helper functions.
  • MBR-related types and helper functions.
  • Partition-related types and helper functions.
  • Parition type constants

Structs§

  • Configuration options to open a GPT disk.
  • A GPT disk backed by an arbitrary device.

Traits§

  • A generic device that we can read/write partitions from/to.

Type Aliases§

  • A dynamic trait object that is used by GptDisk for reading/writing/seeking.