isomage
Browse and extract files from ISO images without mounting them.
No root. No FUSE. No mount points. Just read the bytes.
|
$ isomage movie.iso
d / (24.8 GB)
d BDMV (24.8 GB)
d STREAM (24.7 GB)
- 00000.m2ts (20.1 GB)
- 00001.m2ts (4.6 GB)
d CLIPINF (1.2 KB)
d PLAYLIST (408 B)
- CERTIFICATE (3.1 KB)
$ isomage -c BDMV/PLAYLIST/00000.mpls movie.iso | hexdump -C | head
00000000 4d 50 4c 53 30 32 30 30 00 00 00 ea 00 00 00
00000010 00 00 01 1a 00 00 00 00 00 01 00 00 00 01 00
$ isomage -x BDMV/STREAM/00001.m2ts -o ./extras movie.iso
Extracted: ./extras/00001.m2ts
Extraction completed successfully.
Install
Homebrew (macOS and Linux):
Cargo (any platform with Rust):
Binary — grab a prebuilt binary from releases:
# macOS (Apple Silicon)
|
# macOS (Intel)
|
# Linux (x86_64, static musl)
|
# Linux (ARM64, static musl)
|
From source:
&&
Quick reference
isomage IMAGE # list all files and directories
isomage -c PATH IMAGE # stream a file to stdout
isomage -x PATH IMAGE # extract a file or directory to disk
isomage -x PATH -o DIR IMAGE # extract into a specific directory
isomage -v IMAGE # verbose: show filesystem parsing details
PATH is a path inside the ISO. Leading slash is optional — etc/hostname
and /etc/hostname are equivalent. Use / with -x to extract everything.
All diagnostic output (verbose, progress, errors) goes to stderr.
Only file data goes to stdout, so -c is binary-safe and pipe-friendly.
Usage
List contents
d / (24.8 GB)
d BDMV (24.8 GB)
d STREAM (24.7 GB)
- 00000.m2ts (20.1 GB)
- 00001.m2ts (4.6 GB)
d CLIPINF (1.2 KB)
d PLAYLIST (408 B)
- CERTIFICATE (3.1 KB)
Output legend: d = directory, - = file. Size shown is the total including children for directories.
Stream a file to stdout (-c)
Print any file's raw bytes to stdout — no extraction, no temp files:
# Inspect a text file
# Pipe to other tools
|
# Page through a large file
|
# Play video directly from the ISO (verbose output stays on stderr)
|
# Extract a single file to stdout and redirect to disk
Extract to disk (-x)
Extract a single file, a directory tree, or the whole disc:
# One file (written to current directory)
# A directory (recursively), into a specific output directory
# The entire disc
Extracted files are written to --output (default: current directory).
The output directory is created automatically if it doesn't exist.
Progress is reported on stderr; extracted file paths are printed to stderr as each file completes.
Verbose / debug mode (-v)
See how the filesystem is being parsed — useful when a disc won't read:
File size: 26663725056 bytes (24.84 GB)
Scanning key sectors for filesystem signatures...
Sector 16 (ISO 9660 PVD / UDF VRS): 01 43 44 30 30 31 01 00 |.CD001..|
Sector 256 (UDF AVDP): 02 00 02 00 ...
Attempting ISO 9660 parsing...
Found Primary Volume Descriptor at sector 16
...
Verbose output always goes to stderr, so it's safe to combine with -c:
|
Output format
The list mode (isomage IMAGE) prints one entry per line:
d NAME (SIZE)
- NAME (SIZE)
d= directory,-= file- Entries are indented two spaces per level of depth
- SIZE is human-readable (B, KB, MB, GB, TB)
- Directory sizes include all descendants
- All output goes to stdout; nothing goes to stderr in list mode
Exit codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Error (file not found, parse failure, path not found in ISO, I/O error) |
Supported formats
- ISO 9660 with Joliet (Unicode filenames) and Rock Ridge (POSIX long filenames) extensions
- UDF including metadata partitions and multi-extent files
Covers CDs, DVDs, and Blu-rays.
Why
I got tired of leaving a container just to mount an image just to read one file. isomage runs entirely in userspace — it reads the raw bytes and reconstructs the filesystem tree itself.
Cross-compile
Limitations
- Read-only (by design)
- Some exotic UDF variations might not parse correctly
If you hit a disc that doesn't work, run with -v and open an issue.