Plain ISO 9660 allows only short upper-case names. Two extensions give long names:
Joliet adds a second directory tree with Unicode names; Rock Ridge adds Unix names,
permissions, links and times to the records of the main tree. Neither specification was
available to read for this page, so the layouts are taken from two widely used readers
and cited to them: Linux’s ISO 9660 driver (fs/isofs/rock.h,
rock.c, inode.c, joliet.c) and libarchive’s
archive_read_support_format_iso9660.c.
Joliet
Joliet is a supplementary volume descriptor with particular escape sequences, with its own path tables and directory records pointing to the same file data as the primary tree. Linux and libarchive both recognise it by these escape sequences at the start of the descriptor’s escape sequences field (offset 88):
| Escape sequence | Bytes | Linux’s name |
|---|---|---|
%/@ | 25 2F 40 | Microsoft Joliet Level 1 |
%/C | 25 2F 43 | Level 2 |
%/E | 25 2F 45 | Level 3 |
- Linux decodes Joliet names as UTF-16 big-endian, two bytes per character
(
joliet.c); libarchive also keeps them as UTF-16BE. - The Joliet specification’s length limits on names were not checked against a source and are not given here.
- The current and parent entries are still the single bytes
00and01, as in ISO 9660.
System Use Sharing Protocol
The System Use Sharing Protocol (SUSP) divides the system use field at the end of a directory record into entries, each with a 4-byte header:
| Offset | Size | Name | Description |
|---|---|---|---|
0 | 2 | Signature | Two letters naming the entry. |
2 | 1 | Length | Length of the whole entry, header included. |
3 | 1 | Version | Version of the entry, usually 1. |
4 | length − 4 | Data | Depends on the signature. |
| Signature | Name | Data |
|---|---|---|
SP | SUSP indicator | Two check bytes BE EF, then a byte saying how many bytes to skip at the start of the system use fields (Linux reads it from the root directory’s first record). |
CE | Continuation area | Three both-endian 32-bit numbers: the block, the offset in it and the length of more entries. |
PD | Padding | Ignored (libarchive). |
ST | Terminator | No data; marks the end of the SUSP entries, so that other data may follow in the field (libarchive). |
ER | Extensions reference | Identifier length, descriptor length, source length, extension version (1 byte each), then the texts. |
Rock Ridge
The Rock Ridge Interchange Protocol (RRIP) defines these SUSP entries. Layouts are as read by Linux and libarchive; “both 32” means a 32-bit number stored little-endian then big-endian (8 bytes).
| Signature | Name | Data |
|---|---|---|
RR | Rock Ridge in use | One flag byte saying which of PX, PN, SL, NM, CL, PL, RE, TF are present (bits 0 to 7 in that order, Linux’s RR_PX … RR_TF). libarchive calls it obsolete and ignores it. |
PX | POSIX attributes | Both 32: file mode (as in st_mode), number of links, user ID, group ID; libarchive also reads a fifth, the file’s inode number, when the entry is long enough. |
PN | POSIX device number | Both 32: high and low halves of the device number, for device files. |
SL | Symbolic link | A flag byte (bit 0: continues in the next SL), then components: each a flag byte, a length and text. Component flags: 1 continues, 2 the current directory (.), 4 the parent (..), 8 the root (/). |
NM | Alternate name | A flag byte then the name (bytes, no terminator). Flags: 1 continues in the next NM, 2 is ., 4 is ... |
CL | Child link | Both 32: the block where a relocated directory really is. |
PL | Parent link | Both 32: the real parent of a relocated directory. |
RE | Relocated directory | No data; marks a relocated directory (libarchive treats the rr_moved directory that holds them specially). |
TF | Time stamps | A flag byte then one time per set flag, in this order: 1 creation, 2 modification, 4 access, 8 attribute change, 16 backup, 32 expiration, 64 effective. Flag 128 means each time is the 17-byte form; otherwise the 7-byte form. |
Other system use entries
| Signature | Name | Data |
|---|---|---|
ZF | zisofs | Marks a compressed file: a 2-byte algorithm (Linux accepts only pz), 2 bytes of parameters (header size, then the block size as a power of two; Linux refuses more than 217) and the both-32 uncompressed size. |
Other signatures occur in images, such as SF (sparse files),
ES (extension selector), AL, AS,
AA and BA; their layouts were not checked against a source
and are not described here.
Hybrid images and UDF
- Hybrid images that also boot from a USB stick put a master boot record (and often a GPT) in the 32 KB system area before sector 16, so the same file is both a disc image and a hard disk image.
- UDF (ECMA-167, OSTA Universal Disk Format) is the file system of
DVDs and Blu-ray discs. Its volume recognition sequence sits after the ISO 9660
descriptors, with the identifiers
BEA01,NSR02orNSR03andTEA01in the same 2,048-byte descriptor slots, and its anchor volume descriptor pointer is at sector 256. Its structures are described on the UDF page.