isobemak 0.2.1

Create bootable ISO images with FAT32 and UEFI (El Torito) support in Rust.
Documentation
<div align="center">
  <h1>isobemak</h1>
</div>

**isobemak** is a Rust crate designed to create bootable disk images. It's built for generating an ISO file that contains a FAT32 filesystem, tailored for UEFI booting.

## How it works

The crate handles two main tasks to produce a bootable ISO:

1.  **Creating a FAT32 Disk Image**: It creates a new file, sizes it to 32 MiB, and formats it as FAT32. The crate then copies two essential files, a bootloader and a kernel, into the `EFI/BOOT/` directory inside this image. It renames the bootloader to `BOOTX64.EFI` and the kernel to `KERNEL.EFI`, a standard convention for UEFI booting.

2.  **Generating the ISO File**: The crate creates a new ISO file and populates it with the necessary data structures to make it bootable according to the El Torito standard. This includes:

      * A **Primary Volume Descriptor** with information like the volume ID "FULLERENE" and the total number of sectors.
      * A **Boot Record Volume Descriptor** that identifies the image as an El Torito bootable specification.
      * A **Boot Catalog** which specifies the location and size of the boot image.

The FAT32 disk image created in the first step is then added to the ISO at a specific location (LBA 20), making it the bootable payload for the ISO.

## Project Structure

  * `src/lib.rs`: The main entry point that coordinates the creation of both the FAT32 image and the final ISO file.
  * `src/fat32.rs`: Contains the logic for creating and formatting the 32 MiB FAT32 disk image and copying the bootloader and kernel files into it.
  * `src/iso.rs`: Handles the creation of the ISO9660 filesystem with El Torito bootable extensions. It sets up the various volume descriptors and the boot catalog.
  * `src/utils.rs`: Provides utility functions, such as `pad_sector`, which aligns files to the correct sector size (2048 bytes).

## Usage

The `create_disk_and_iso` function in `src/lib.rs` is the primary function to be used. It takes the paths for the output FAT32 and ISO images, as well as file handles for the bootloader and the kernel.

```ignore
pub fn create_disk_and_iso(
    fat32_img: &Path,
    iso: &Path,
    bellows: &mut File,
    kernel: &mut File,
) -> io::Result<()>
```