ISO 9660
Filesystems |
---|
Virtual Filesystems |
Disk Filesystems |
CD/DVD Filesystems |
Network Filesystems |
Flash Filesystems |
ISO 9660 is the standard filesystem for CD-ROMs.
Overview and Caveats
ISO 9660 is not a complex file system, but has a few quirks that are worth remembering. It seems that some operating systems also create non-compliant CD's, so beware! The main example of this is the character set that is available for file names. Strictly, this consists of A-Z (upper case only!), digits and underscores. Many operating systems also allow lower case letters and other characters. Linux's VFS displays lower case filenames to the user despite the cd contents actually containing upper case characters.
Another (perhaps little-known and little-utilised) feature of the ISO 9660 file system is that a single file system can span multiple CD's. This is dealt with via "set numbers".
Sector Size
An ISO 9660 sector is normally 2KiB long. Although the specification allows for alternative sector sizes, you will rarely find anything other than 2KiB.
Numerical Formats
Another quirk of the system is that it has several numbering formats and multi-byte numbers are often represented in "both-endian" format (that is, LSB first followed by MSB first). For this reason, 32 bit LBA's often appear in 8 byte fields. ISO 9660 section 7.3, for example, outlines these 32 bit systems and numbers throughout the documents are referred to as being 7.3.1 format (LSB first), 7.3.2 format (MSB first) or 7.3.3 format (both-endian).
Permitted Characters
The specification refers to two sets of characters: 'a-characters' and 'd-characters'. You will see these terms used in the descriptor tables throughout this article. The character sets are:
a-characters: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _ ! " % & ' ( ) * + , - . / : ; < = > ? d-characters: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _
Volume Descriptors
When preparing to mount a CD, your first action will be reading the volume descriptors (specifically, you will be looking for the Primary Volume Descriptor).
Sectors 0x00-0x0F of the CD are reserved for system use. This means that the Volume Descriptors can be found starting at sector 0x10. The format of the volume descriptors is as follows:
Offset | Length (bytes) | Field Name | Description |
---|---|---|---|
0 | 1 | Type | Volume Descriptor type code (see below). |
1 | 5 | Identifier | Always 'CD001'. |
6 | 1 | Version | Volume Descriptor Version (0x01). |
7 | 2041 | Data | Depends on the volume descriptor type. |
This means that each volume descriptor is therefore one sector (2KiB) long.
Volume Descriptor Type Codes
Value | Description |
---|---|
0 | Volume descriptor is a Boot Record |
1 | Primary Volume Descriptor |
2 | Supplementary Volume Descriptor |
3 | Volume Partition Descriptor |
4-254 | Reserved |
255 | Volume Descriptor Set Terminator |
When starting out with a basic CD, we are going to be interested in the Primary Volume Descriptor, which points us to the root directory and path tables, which both allow us to find any file on the CD. Using the path table is ideal for minimal implementations which do not wish to search the directory heirarchy node by node. This is slower (string comparisons across the entire filesystem) but easier to implement.
Volume Descriptor Set Terminator
The Volume Descriptor Set Terminator does not currently define bytes 7-2047 of its Volume Descriptor. This means that the only fields in use for the volume set terminator are the type code (255), the standard identifier ('CD001') and the descriptor version (0x01).
The Boot Record
The first type of Volume Descriptor is the "Boot Record". The descriptor format is as follows:
Offset | Length (bytes) | Field Name | Value | Description |
---|---|---|---|---|
0 | 1 | Type | 0 | Zero indicates a boot record. |
1 | 5 | Identifier | 'CD001' | Always 'CD001'. |
6 | 1 | Version | 0x01 | Volume Descriptor Version (0x01). |
7 | 32 | Boot System Identifier | (string) | ID of the system which can act on and boot the system from the boot record in a-characters. |
39 | 32 | Boot Identifier | (string) | Identification of the boot system defined in the rest of this descriptor in a-characters. |
71 | 1977 | Boot System Use | Unspecified | Custom - used by the boot system. |
The Primary Volume Descriptor
This is a lengthy descriptor, but it contains some very useful information for reading the rest of the file system.
Offset | Length (bytes) | Field Name | Description |
---|---|---|---|
0 | 1 | Type Code | Always 0x01 for a Primary Volume Descriptor. |
1 | 5 | Standard Identifier | Always 'CD001'. |
6 | 1 | Version | Always 0x01. |
7 | 1 | Unused | Always 0x00. |
8 | 32 | System Identifier | The name of the system that can act upon sectors 0x00-0x0F for the volume in a-characters. |
40 | 32 | Volume Identifier | Identification of this volume in d-characters. |
72 | 8 | Unused Field | |
80 | 8 | Volume Space Size | Number of Logical Blocks in which the volume is recorded. This is a 32 bit value in both-endian format. |
88 | 32 | Unused Field | |
120 | 4 | Volume Set Size | The size of the set in this logical volume (number of disks). This is a 16 bit value in both-endian format. |
124 | 4 | Volume Sequence Number | The number of this disk in the Volume Set. This is a 16 bit value in both-endian format. |
128 | 4 | Logical Block Size | The size in bytes of a logical block in both-endian format. NB: This means that a logical block on a CD could be something other than 2KiB! |
132 | 8 | Path Table Size | The size in bytes of the path table in 32 bit both-endian format. |
140 | 4 | Location of Type-L Path Table | LBA location of the path table, recorded in LSB-first (little endian) format. The path table pointed to also contains LSB-first values. |
144 | 4 | Location of the Optional Type-L Path Table | LBA location of the optional path table, recorded in LSB-first (little endian) format. The path table pointed to also contains LSB-first values. Zero means that no optional path table exists. |
148 | 4 | Location of Type-M Path Table | LBA location of the path table, recorded in MSB-first (big-endian) format. The path table pointed to also contains MSB-first values. |
152 | 4 | Location of Optional Type-M Path Table | LBA location of the optional path table, recorded in MSB-first (big-endian) format. The path table pointed to also contains MSB-first values. |
156 | 34 | Directory entry for the root directory. | Note that this is not an LBA address, it is the actual Directory Record, which contains a zero-length Directory Identifier, hence the fixed 34 byte size. |
190 | 128 | Volume Set Identifier | Identifier of the volume set of which this volume is a member in d-characters. |
318 | 128 | Publisher Identifier | The volume publisher in a-characters. If unspecified, all bytes should be 0x20. For extended publisher information, the first byte should be 0x5F, followed by an 8.3 format file name. This file must be in the root directory and the filename is made from d-characters. |
446 | 128 | Data Preparer Identifier | The identifier of the person(s) who prepared the data for this volume. Format as per Publisher Identifier. |
574 | 128 | Application Identifier | Identifies how the data are recorded on this volume. Format as per Publisher Identifier. |
702 | 38 | Copyright File Identifier | Identifies a file containing copyright information for this volume set. The file must be contained in the root directory and is in 8.3 format. If no such file is identified, the characters in this field are all set to 0x20. |
740 | 36 | Abstract File Identifier | Identifies a file containing abstract information for this volume set in the same format as the Copyright File Identifier field. |
776 | 37 | Bibliographic File Identifier | Identifies a file containing bibliographic information for this volume set. Format as per the other File Identifier fields. |
813 | 17 | Volume Creation Date and Time | Date and Time format as specified below. |
830 | 17 | Volume Modification Date and Time | Date and Time format as specified below. |
847 | 17 | Volume Expiration Date and Time | Date and Time format as specified below. After this date and time, the volume should be considered obsolete. If unspecified, then the information is never considered obsolete. |
847 | 17 | Volume Effective Date and Time | Date and Time format as specified below. Date and time from which the volume should be used. If unspecified, the volume may be used immediately. |
881 | 1 | File Structure Version | An 8 bit number specifying the directory records and path table version (always 0x01). |
882 | 1 | Unused | Always 0x00. |
883 | 512 | Application Used | Contents not defined by ISO 9660. |
1395 | 653 | Reserved | Reserved by ISO. |
Date and Time Format
The date / time format used in the Primary Volume Descriptor is:
Offset | Size | Description |
---|---|---|
0 | 4 | Year from 1 to 9999. |
4 | 2 | Month from 1 to 12. |
6 | 2 | Day from 1 to 31. |
8 | 2 | Hour from 0 to 23. |
10 | 2 | Minute from 0 to 59. |
12 | 2 | Second from 0 to 59. |
14 | 2 | Hundedths of a second from 0 to 99. |
16 | 1 | Offset from GMT in 15 minute intervals from -48 (West) to +52 (East) |
All fields except for the offset from GMT are in ASCII digits. An unspecified date and time is represented by 16 '0' digits, followed by a zero in the last field.
See Also
Articles
- El-Torito, a standard for creating bootable CD-ROMs