isobemak
isobemak is a Rust crate for creating bootable ISO 9660 images with UEFI and BIOS support. It can generate standard ISO images or hybrid isohybrid images that can boot from both optical media and USB drives.
Features
- ISO 9660 Filesystem Creation: Generates standard ISO 9660 filesystem structures
- UEFI Boot Support: Creates UEFI-bootable images with proper ESP (EFI System Partition) handling
- BIOS/El Torito Boot Support: Provides legacy BIOS boot capability
- Boot Information Table: Automatically patches the
-boot-info-tablestructure (PVD LBA, boot image LBA, file length, checksum) into BIOS boot images, required by bootloaders such as ISOLINUX and Limine - Hybrid Isohybrid Images: Generates hybrid images that can boot both as optical media and USB drives with GPT/MBR structures
- FAT12/16/32 ESP Creation: Automatically creates FAT12/16/32-formatted EFI System Partitions for UEFI booting
- Additional EFI Boot Files: Supports including extra EFI binaries (e.g. GRUBX64.EFI) in the ESP FAT image
- Layout Profiles: Configurable
IsoLayoutProfilefor firmware compatibility (hardware vs. emulator), GPT/MBR control, and ESP alignment - Auto-Generated grub.cfg: Can auto-generate a
grub.cfgin the ESP viaUefiBootInfo::grub_cfg_content
Installation
Add this to your Cargo.toml:
[]
= "0.4.3"
Usage
The primary function is build_iso, which takes a configured IsoImage and generates the ISO file.
Basic Example
use ;
use PathBuf;
let kernel_path = from;
let bootx64_efi_path = from;
let iso_output_path = from;
let iso_image = IsoImage ;
// Create a standard UEFI-bootable ISO
let = build_iso?;
Hybrid Isohybrid Example
use ;
use PathBuf;
let isolinux_bin_path = from;
let kernel_path = from;
let bootx64_efi_path = from;
let iso_output_path = from;
let iso_image = IsoImage ;
// Create a hybrid isohybrid ISO that can boot from both CD/DVD and USB
let = build_iso?;
Hybrid Isohybrid with GRUBX64.EFI
use ;
use PathBuf;
let bootx64_path = from;
let grubx64_path = from;
let kernel_path = from;
let iso_output_path = from;
let iso_image = IsoImage ;
// Create a hybrid isohybrid ISO with GRUBX64.EFI in the ESP
let = build_iso?;
How It Works
Standard ISO Creation
- Filesystem Preparation: Creates an ISO 9660 filesystem structure with directories and file records
- Boot Catalog Creation: Generates an El Torito boot catalog pointing to boot images
- Volume Descriptors: Writes Primary Volume Descriptor, Boot Record Volume Descriptor, and Volume Descriptor Set Terminator
- File Copying: Copies all specified files into the ISO at their designated locations
- Boot Information Table: Patches the boot information table (
-boot-info-table) into the BIOS boot image at offsets 8–63, containing the PVD LBA, the boot image's own LBA, file length, and a checksum of bytes 64+
Isohybrid (Hybrid) Creation
For hybrid images, the process additionally includes:
- EFI System Partition Creation: Generates a FAT32-formatted disk image containing the UEFI bootloader and kernel
- Additional EFI Files: Includes any extra EFI binaries (e.g. GRUBX64.EFI) in the ESP
- ESP Embedding: Embeds the EFI System Partition into the ISO at LBA 1024 (2 MiB, ISO 2048-byte sectors)
- MBR/GPT Structures: Adds Master Boot Record and GUID Partition Table structures to make the image USB-bootable
- Hybrid Boot Catalog: Creates boot catalog entries for both BIOS (MBR) and UEFI (ESP) booting
API Overview
Core Functions
build_iso(iso_path: &Path, image: &IsoImage, is_isohybrid: bool)- Main ISO creation function
Configuration Structures
IsoImage- Top-level configuration containing files, boot information, and layout profileIsoImageFile- Specifies source file and destination path in ISOBootInfo- Contains optional BIOS and UEFI boot configurationsBiosBootInfo- BIOS/El Torito boot settingsUefiBootInfo- UEFI boot settings including ESP creation, optional additional EFI files, and auto-generated grub.cfgIsoLayoutProfile- Layout profile controlling GPT/MBR, El Torito mode, ESP alignment, and UEFI boot strategyDiskLayout- Manual disk layout specification for advanced control over partitions and ISO region
Builder Pattern Alternative
For more control, you can use the IsoBuilder:
use ;
use OpenOptions;
use ;
let mut builder = new;
builder.set_isohybrid;
builder.add_file?;
builder.add_file?;
let boot_info = BootInfo ;
builder.set_boot_info;
builder.set_profile;
// NOTE: The file must be opened with both read and write access because the
// builder reads back boot image data to compute the boot information table checksum.
let mut iso_file = new
.read
.write
.create
.truncate
.open?;
builder.build?;
Project Structure
src/lib.rs- Main library exports and definitionssrc/iso/- ISO 9660 filesystem implementationbuilder.rs- Core ISO building logiciso_writer.rs- File writing and descriptor creationfs_node.rs- Filesystem node representationsvolume_descriptor.rs- Volume descriptor structureslayout_profile.rs- Firmware compatibility layout profilesdisk_layout.rs- Declarative disk layout structuresmbr.rs- Protective/hybrid MBR structuresgpt/- GUID Partition Table support for hybrid images
src/fat.rs- FAT32 ESP creation utilitiessrc/utils.rs- Utility functions and constants
Dependencies
crc32fast- CRC32 checksum calculationfatfs- FAT filesystem manipulationrand- Random number generation (FAT volume serial)uuid- UUID generation for GPT partitionstempfile- Temporary file handling
License
Licensed under both MIT and Apache 2.0 licenses.
Contributing
Contributions are welcome! Please see the contributing guide at docs/CONTRIBUTING.md.