An ISO 9660 image is a run of 2,048-byte logical sectors. Sectors 0 to 15 are the system
area, which the standard leaves to other uses. From sector 16 (offset
0x8000) comes the volume descriptor set: one 2,048-byte descriptor per
sector, ended by one or more terminators. This page follows ECMA-119, 4th edition (2019),
which matches ISO 9660 with its 2013 amendment (the enhanced volume descriptor). The standard
counts byte positions from 1; the offsets on this page count from 0.
Numbers and text
ISO 9660 stores most numbers twice, once in each byte order, so that any machine can read them directly.
| Clause | Size | Form |
|---|---|---|
| 7.1.1 | 1 | Unsigned 8-bit number |
| 7.1.2 | 1 | Signed 8-bit number (two’s complement) |
| 7.2.1 | 2 | 16-bit, least significant byte first |
| 7.2.2 | 2 | 16-bit, most significant byte first |
| 7.2.3 | 4 | 16-bit, both orders: little-endian then big-endian (shown below as “both 16”) |
| 7.3.1 | 4 | 32-bit, least significant byte first |
| 7.3.2 | 4 | 32-bit, most significant byte first |
| 7.3.3 | 8 | 32-bit, both orders: little-endian then big-endian (“both 32”) |
Text fields are padded on the right with spaces (0x20). Two character
sets are used in the primary descriptor and in file names:
- d-characters (37):
A–Z,0–9and_. - a-characters (57): the d-characters, space, and
! " % & ' ( ) * + , - . / : ; < = > ?.
A supplementary descriptor names other character sets with escape sequences; their characters are called a1- and d1-characters (see Joliet).
Dates
Volume descriptors and extended attribute records use a 17-byte date of digits; directory records use a 7-byte binary form (see directory records).
| Offset | Size | Content |
|---|---|---|
0 | 4 | Year, 1 to 9999, as digits |
4 | 2 | Month, 1 to 12 |
6 | 2 | Day, 1 to 31 |
8 | 2 | Hour, 0 to 23 |
10 | 2 | Minute |
12 | 2 | Second |
14 | 2 | Hundredths of a second |
16 | 1 | Offset from GMT in 15-minute steps, −48 (west) to +52 (east), signed |
Sixteen 0 digits and an offset of 0 mean the date is not given.
Descriptor types
Every descriptor starts with the same 7 bytes: a type byte, the standard identifier
CD001, and a version byte.
| Type | Descriptor |
|---|---|
| 0 | Boot record |
| 1 | Primary volume descriptor; at least one is required |
| 2 | Supplementary volume descriptor (version 1) or enhanced volume descriptor (version 2) |
| 3 | Volume partition descriptor |
| 4–254 | Reserved |
| 255 | Volume descriptor set terminator |
Primary volume descriptor
| Offset | Size | Type | Name | Description |
|---|---|---|---|---|
0 | 1 | uint8 | Volume descriptor type | 1. |
1 | 5 | text | Standard identifier | CD001. |
6 | 1 | uint8 | Volume descriptor version | 1. |
7 | 1 | – | Unused | 0. |
8 | 32 | a-characters | System identifier | The system that can use sectors 0 to 15, such as LINUX or Win32. |
40 | 32 | d-characters | Volume identifier | The volume’s name, the “label” most systems show. |
72 | 8 | – | Unused | Zeros. |
80 | 8 | both 32 | Volume space size | The number of logical blocks in the volume. |
88 | 32 | – | Unused | Zeros. (In a supplementary descriptor: escape sequences.) |
120 | 4 | both 16 | Volume set size | How many volumes (discs) are in the set. |
124 | 4 | both 16 | Volume sequence number | This volume’s number in the set, from 1. |
128 | 4 | both 16 | Logical block size | Bytes per logical block, a power of two of at least 512; nearly always 2,048. |
132 | 8 | both 32 | Path table size | The length of the path table in bytes. |
140 | 4 | uint32 LE | Type L path table | Block number of the little-endian path table. |
144 | 4 | uint32 LE | Optional type L path table | Block of a second copy; 0 if none. |
148 | 4 | uint32 BE | Type M path table | Block number of the big-endian path table. |
152 | 4 | uint32 BE | Optional type M path table | Block of a second copy; 0 if none. |
156 | 34 | record | Root directory record | A directory record for the root directory, with the identifier 00. |
190 | 128 | d-characters | Volume set identifier | The name of the set of volumes. |
318 | 128 | a-characters | Publisher identifier | Who specified the contents. If the first byte is _ (0x5F), the rest names a file in the root directory that holds this text. All spaces: not given. |
446 | 128 | a-characters | Data preparer identifier | Who prepared the data; same rules. |
574 | 128 | a-characters | Application identifier | How the data are recorded, often the program that made the image; same rules. |
702 | 37 | d-characters | Copyright file identifier | The name of a file in the root directory holding a copyright notice. |
739 | 37 | d-characters | Abstract file identifier | The name of a file holding an abstract. |
776 | 37 | d-characters | Bibliographic file identifier | The name of a file holding bibliographic information. |
813 | 17 | date | Volume creation date | See dates. |
830 | 17 | date | Volume modification date | – |
847 | 17 | date | Volume expiration date | When the contents may be regarded as obsolete; not given means never. |
864 | 17 | date | Volume effective date | When the contents may be used; not given means at once. |
881 | 1 | uint8 | File structure version | 1 (2 in an enhanced descriptor). |
882 | 1 | – | Reserved | 0. |
883 | 512 | bytes | Application use | Not specified by the standard. |
1395 | 653 | – | Reserved | Zeros. |
Supplementary and enhanced volume descriptors
Type 2. The layout is that of the primary descriptor, with these differences. A supplementary descriptor (version 1) describes a second directory tree whose names use another character set; Joliet is the best-known use. An enhanced descriptor (version 2, file structure version 2) describes a tree with looser rules: names of up to 207 characters with no version number, and more than eight directory levels.
| Offset | Size | Name | Difference |
|---|---|---|---|
0 | 1 | Volume descriptor type | 2. |
6 | 1 | Volume descriptor version | 1 supplementary, 2 enhanced. |
7 | 1 | Volume flags | Bit 0: 0 if the escape sequences are all registered under ISO 2375, 1 if at least one is not. Bits 1 to 7 reserved, 0. |
8, 40 | 32 each | System and volume identifiers | a1- and d1-characters (by agreement in an enhanced descriptor). |
88 | 32 | Escape sequences | ISO 2022 escape sequences naming the character sets used, padded with zeros. |
190–812 | – | Identifiers | a1- and d1-characters in place of a- and d-characters. |
881 | 1 | File structure version | 1 supplementary, 2 enhanced. |
Boot record
| Offset | Size | Type | Name | Description |
|---|---|---|---|---|
0 | 1 | uint8 | Volume descriptor type | 0. |
1 | 5 | text | Standard identifier | CD001. |
6 | 1 | uint8 | Version | 1. |
7 | 32 | a-characters | Boot system identifier | The system that understands the rest, such as EL TORITO SPECIFICATION; see El Torito. |
39 | 32 | a-characters | Boot identifier | Names the boot system in the next field. |
71 | 1977 | bytes | Boot system use | Not specified by ISO 9660. |
Volume partition descriptor
| Offset | Size | Type | Name | Description |
|---|---|---|---|---|
0 | 1 | uint8 | Volume descriptor type | 3. |
1 | 5 | text | Standard identifier | CD001. |
6 | 1 | uint8 | Version | 1. |
7 | 1 | – | Unused | 0. |
8 | 32 | a-characters | System identifier | The system that understands the system use field. |
40 | 32 | d-characters | Volume partition identifier | – |
72 | 8 | both 32 | Volume partition location | First logical block of the partition. |
80 | 8 | both 32 | Volume partition size | Its length in logical blocks. |
88 | 1960 | bytes | System use | Not specified. The partition’s contents are outside the standard. |
Terminator
Type 255, CD001, version 1, then 2,041 zero bytes. The descriptor set
ends at the first terminator; there may be more than one.
Example
The start of a primary volume descriptor at sector 16. The marked bytes are the type, the identifier and the version.
00008000 01 43 44 30 30 31 01 00 4C 49 4E 55 58 20 20 20 .CD001..LINUX
00008010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00008020 20 20 20 20 20 20 20 20 4D 59 44 49 53 43 20 20 MYDISC
00008030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00008040 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 ........
00008050 30 2A 00 00 00 00 2A 30 00 00 00 00 00 00 00 00 0*....*0........
00008060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00008070 00 00 00 00 00 00 00 00 01 00 00 01 01 00 00 01 ................
00008080 00 08 08 00 0A 00 00 00 00 00 00 0A 13 00 00 00 ................
Reading it: type 1, CD001, version 1; system identifier
LINUX; volume identifier MYDISC at offset 40; volume space
size 30 2A 00 00 then 00 00 2A 30, 10,800 blocks (22,118,400
bytes); volume set size 1 and sequence number 1, each written both ways; logical block
size 00 08 then 08 00, 2,048; path table size 10 bytes; the
type L path table at block 19.