Файловые системы оптических носителей данных


       Прошу прощения за "русские" слова типа "директория" и "экстент", но иначе приходится отображать несколько похожих английских слов на несколько похожих русских слов, отчего в голове получается полная каша. А тексты стандартов ISO и в оригинале производят впечатление (адвокаты их что ли пишут ;).

Стандарты


— High Sierra Format (HSF, HSG - High Sierra Group) - предшественник ISO 9660. 1986 год.
— ISO 9660 (ECMA-119) - базовый стандарт файловой системы для CD-ROM. 1987 год.
— Rock Ridge - расширение ISO 9660 для POSIX (длинные имена файлов, права доступа, атрибуты файлов).
— HFS (Hierarchical File System) используется в MacOS фирмы Apple.
— Romeo - расширение ISO 9660 для MS Windows 95 (Adaptec?). Длина имен файлов увеличена до 128 символов.
— Joliet - расширение ISO 9660 от MS. 1995.
— El Torito Bootable CD-ROM. Phoenix и IBM. 1995 г.
— UDF (Universal Data Format). ISO-13346. ECMA-167.

Файловая система ISO 9660


       Стандарт - ISO 9660:1988, ISO/IEC 9660:1999, ECMA-119 - 1986, вторая редакция - 1987, Volume and file structure of CD-ROM for information interchange.
       Тома (физический диск) могут объединяться в наборы томов (volume set), имеющие общий идентификатор набора. Тома внутри набора нумеруются с 1 и используют один кодовый набор. Набор томов может разделяться на группы томов. Предполагается, что каждая группа определяет версию данных, поэтому размеры групп должны совпадать. Дескрипторы и таблицы путей каждого тома набора должны содержать описания всех директорий и файлов набора, находящихся на томах с номерами меньшими или равными размеру набора.
       Том разбивается на логические сектора (может состоять из нескольких физических секторов или использовать не всё место на физическом секторе) с логическими адресами (LSN - Logical Sector Number). Размер логического сектора - 2^n (предположительно 2048 байт). Том делится на системную область (LSN с 0 по 15) и область данных. Содержимое системной области стандартом не определяется. Область данных делится на логические блоки, размером 2^(n+8), где n - натуральное число, но не более логического сектора. Для адресации блоков используется LBN (Logical Block Number) - последовательная нумерация, начиная с 0 (для разнообразия байты нумеруются с 1) для начала тома. По-моему, в реальном мире размеры сектора, логического сектора и блока всегда равны 2048 байт, соответственно область данных начинается с сектора 16 первой дорожки CD-ROM и номер логического блока совпадает с номером физического сектора (для первой сессии физический адрес первого логического блока области данных - дескриптора тома - равен 00:02:16 в абсолютных временых адресах). Числа в большинстве случаев хранятся одновременно в последовательности байт LSB и MSB ("и пусть никто не уйдёт обиженный").
Наборы символов, используемые в стандарте:
— d-char: [0-9A-Z_]
— a-char: [- !"%&'()*+,./0-9:;<=>?A-Z_]
       В начале области данных хранятся дескрипторы тома (каждый дескриптор тома занимает отдельный логический сектор, 2048 байт, может быть несколько копий для надёжности, байты нумеруются с 1!):
— один PVD (первичный дескриптор тома):
— тип дескриптора равен 1 (байт 1)
— строка "CD001" (байт 2)
— версия дескриптора (1 для PVD и SVD, 2 для EVD)
— идентификатор системы, которой предназначена системная область
— идентификатор тома (байт 41, 32 d-char для PVD и SVD, любые для EVD)
— число логических блоков в томе
— число томов в наборе
— номер тома в наборе
— размер логического блока
— адрес таблицы путей, возможно адрес копии и размер
— дескриптор (не адрес!) корневой директории
— идентификатор набора томов (191, 128 d-char для PVD и SVD, любые для EVD)
— идентификатор публикатора
   — до 128 a-символов
   — или подчеркивание и имя файла в корневой директории
— идентификатор обработчика данных
   — до 128 a-символов
   — или подчеркивание и имя файла в корневой директории
— идентификатор приложения
   — до 128 a-символов
   — или подчеркивание и имя файла в корневой директории
— имя файла в корневой директории, содержащего копирайт
— имя файла в корневой директории, содержащего аннотацию
— имя файла в корневой директории, содержащего библиографию
— время создания тома (YYYYMMDDHHMMSShho, где hh - сотые секунды, o - двоичное смещение от GMT в 15-минутных интервалах)
— время модификации тома
— время окончания хранения тома
— время введения в действие тома - effective time
— версия файловой структуры (1 для PVD и SVD, 2 для EVD)
— нестандартизованая область для приложений
— произвольное число SVD (дополнительных дескрипторов тома), отличается от PVD возможностью задавать кодировку символов через escape-последовательности (ISO 2022, ISO 2735); могут определять дополнительные иерархии директорий (корневые директории и таблицы путей)
— произвольное число EVD (улучшенных дескрипторов тома, введены в ISO 9660:1999), имеет тот же тип дескриптора, что и SVD, но другую версию; отличается от SVD снятием некоторых ограничений на длину и синтаксис идентификаторов и глубину вложенности директорий
— дескриптор раздела тома (идентификатор, число блоков (32-bit), адрес), раздел содержит данные вне файловой системы
— загрузочная запись (идентификатор системы, для которой предназначена эта запись; идентификатор загружаемой системы; 1976 байт остается на загрузчик)
— терминатор дескрипторов тома
       Том также содержит разделы тома, размещаемые в непрерывных областях (ссылка на раздел должна быть в дескрипторах тома), таблицы путей (ссылка должна быть в дескрипторах тома), дескрипторы директорий (ссылка на корневую директорию должна быть в дескрипторе тома, на некорневую - в дескрипторе директории верхнего уровня иерархии, на любую директорию должна быть запись в таблице путей), экстенты (непрерывные области данных и атрибутов) файлов (ссылка на экстент должна быть в дескрипторе директории).
       Директория хранится как файл из одного экстента, должна содержать запись оглавления для родительской директории (корневая директория содержит запись оглавления себя самой) с именем (идентификатором) 0x01, должна также содержать запись оглавления себя самой с именем 0x00, не может входить в несколько иерархий, глубина вложенности для иерархий PVD и SVD не более 8, содержит последовательность записей оглавления для каждого экстента входящих в неё файлов (включая подчинённые директории):
— длина записи расширенных атрибутов в экстенте
— адрес и длина (32-bit) экстента файла (кстати, на VideoCD адреса некоторых файлов указывают на начало дорожки MPEG-1, состоящей из секторов формата CD-ROM XA Mode 2 Form 2 длиной 2324 байт, так что такие "файлы" не читаются)
— время записи экстента
— флаги
— невидимость в оглавлении
— файл является директорией
— ассоциированный файл (имеет тот же идентификатор файла)
— структурированный файл (описание в записи расширенных атрибутов)
— в записи расширенных атрибутов есть информация о владельце и правах доступа
— есть экстент продолжения
— размер File Unit, gap
— номер тома, на котором находится экстент
— идентификатор (имя) файла: d-char*.d-char*;версия (привет от DEC!); или идентификатор директории: d-char+ (не более 31 символа); для иерархии EVD имена не содержат версий, не разбиваются на основное имя и суфикс, длина имени может достигать 207, набор символов ограничиватся только доброй волей записывающего
— System Use стандартом не описывается (например, используетсяв в расширении Rock Ridge)
       Экстент файла занимает целое число блоков и состоит из необязательной записи расширенных атрибутов и секции данных (также может быть нулевой длины). Экстент представляет собой непростую структуру (деление на File Units, interleave, gap и т.п.), но об этом знать не обязательно, как и о делении файла на записи фиксированной и переменной длины). Хотя вот это полезно: части сегмента данных (File Unit) и промежутки между ними (gap) могут быть приписаны сразу нескольким экстентам и/или разделам тома. Файл состоит из одной или более секций данных, их порядок определяется порядком записей оглавления в директории. Секция может входить в состав нескольких файлов в различных директориях или даже несколько раз в состав одного и того же файла. Секция может храниться на другом томе.
       Запись расширенных атрибутов может содержать
— идентификатор владельца (uid), не может быть 0
— идентификатор группы (gid), не может быть 0
— запрет на чтение и исполнение для владельца и члена группы, владельца не члена группы, члена группы и прочих (запрет на запись должен быть установлен для всех категорий); к сожалению, авторы стандарта "улучшили" список прав относительно POSIX, поэтому пользоваться этим нельзя
— время создания информации в файле
— время последнего изменения
— время окончания хранения
— время введения в действие (effective time)
— формат записей (поток байт, фиксированной длины, переменной длины)
— длина записи, управление печатью (привет от IBM)
— идентификатор системы, которая сможет понять остальные нестандартные атрибуты
       Таким образом, файлы образуют древовидную структуру каталогов, но для ускорения поиска файлов хранится также таблица путей (path table), которая для каждой директории содержит адрес содержащего её экстента, длину записи расширенных атрибутов, номер родительской директории, идентификатор директории. Таким образом каждая директория получает номер (корневая директория имеет номер 1). Директории в таблице путей сортируются по возрастанию глубины иерархии, далее по возрастанию номера родительской директории и по идентификатору директории в алфавитном порядке (дополняются пробелами справа). Таблицы хранятся в двух вариантах (LSB и MSB), может быть 2 копии.
       Стандарт требует, чтобы оглавление выдавалось в алфавитном порядке, директории в начале, вне зависимости от расположения файлов на диске. Поэтому при создании файловой системы желательно сортировать файлы по именам - головки будут меньше дёргаться. Сортировка внутри директории происходит сначала по именам файлов (предварительно дополненных пробелами справа), затем по суффиксам, затем по версиям в обратном порядке, затем по биту ассоциированности файла в обратном порядке, затем по порядку экстентов. Как сортируются файлы в иерархии EVD (там нет понятия суффикса) непонятно.
       Файлы с образом файловой системы ISO 9660 в архивах обычно имеют суффиксы .iso и содержат одну дорожку данных.
       Уровни совместимости ISO 9660:
— level 1. Имена файлов как в MS-DOS (8.3); глубина вложенности до 8; имена каталогов могут иметь длину до 8 символов; длина полного имени файла не более 256 символов. Файл должен состоять из одного экстента.
— level 2. Разрешается использовать более длинные имена файлов (до 30 символов, не считая точки и версии).
— level 3. Файл может состоять из нескольких экстентов.

Расширение Rock Ridge Interchange Protocol файловой системы ISO 9660


       Стандарт System Use Sharing Protocol (SUSP, IEEE P1281, 1994) определяет cпособ кодирования поля System Use, определенного стандартом ISO 9660 в записи оглавления. Поле System Use может содержать ноль, один или несколько элементов переменной длины. Тип элемента определяется первыми двумя байтами. Возможно несколько элементов одного типа. Элемент, записанный в System Use последнего экстента файла перекрывает все элементы того же типа, записанные в предыдущие сегменты. Третий байт задаёт общую длину элемента, четвёртый - версию (если в System Use осталось менее 4 байт, то этот остаток игнорируется), далее идут данные в зависимости от типа элемента:
— CE - определяет область продолжения для записи элементов (номер блока, смещение внутри блока, длина)
— PD - заполнение места
— SP - индикатор использования SUSP, должен быть записан в начале области System Use первой записи оглавления корневой директории каждой файловой иерархии тома (для CD-ROM XA первые 14 байт пропускаются); позволяет задать число пропускаемых байт при записи в остальные области System Use
— ST - терминатор цепочки элементов
— ER - описание расширения, должен быть записан в области System Use первой записи оглавления корневой директории каждой файловой иерархии тома, в которой используется описываемое расширение; кстати, дескриптор PVD не может содержать в записи оглавления корневой директории поля System Use; содержит версию расширения, идентификатор расширения (d-char), описание расширения (a-char), источник расширения (a-char); пример расширения - Rock Ridge Interchange Protocol
— ES - выбор расширения, если их определено несколько; задаёт номер ER для последующих элементов
       Стандарт Rock Ridge Interchange Protocol (RRIP, IEEE P1282, 1994) использует SUSP, чтобы обеспечить возможность хранения длинных имен файлов (POSIX), числа жестких ссылок (st_nlink), символьных ссылок, uid (st_uid), gid (st_gid), прав доступа Unix (st_mode: права доступа, setuid, setgid и sticky биты, тип файла), "дырявых" (sparse) файлов, device number (major, minor), временных отметок (время создания, время последней модификации - st_mtime, время последнего доступа - st_atime, время последнего изменения атрибутов - st_ctime, время последнего сохранения, время завершения хранения, время введения в действие - effective time), серийных номеров файлов (st_ino: файлы с одинаковым значением st_ino - inode - являются одним и тем же файлом). Глубина вложенности директорий произвольна (обратите внимание на файлы RRMOVED, возможно скрытые). При этом диск остается совместимым с ISO 9660.
       Стандарт определяет новые типы элементов SUSP (идентификатор расширения указан как "IEEE_P1282", но что-то я такого не вижу, зато вижу строчки RR):
— PX - POSIX атрибуты файла (st_mode, st_nlink, st_uid, st_gid, st_ino)
— PN - POSIX номер устройства (major/Dev_tHigh, minor/Dev_tLow)
— SL - символьная ссылка, каждый элемент хранит один компонент (или часть) или несколько компонент составного имени
— NM - настоящее имя файла (идентификатор в записи оглавления хранит имя, "урезанное" до соответствия стандарту именования файлов в ISO 9660); аналогично SL может собираться из нескольких элементов; сортировка по настоящим именам не производится
— RE - перемещённая директория; первоначальный стандарт ISO 9660 ограничивал максимальную глубину иерархии директорий; для преодоления этого ограничения директория, находящаяся на большей глубине перепривязывается под фиктивную директорию (RR_MOVED для mkisofs), которая в свою очередь привязывается непосредственно под корневую директорию; в фиктивной директории записывается элемент RE в запись оглавления перемещённой директории
— CL - элемент помещается в запись оглавления в родительской директории перемещённой директории и содержит LBN перемещённой директории; сама запись оглавления оформляется как запись о фиктивном файле с тем же именем вместо записи о директории и информация в ней игнорируется, кроме идентификатора и элементов NM и CL; сам экстент файла тоже надо создать (для систем, не понимающих расширение Rock Ridge)(что в нём?); атрибуты перемещённой директории записываются в её записи оглавления "." на новом месте
— PL - т.к. запись о родительской директории ("..") в перемещённой директории указывает на фиктивную директорию, то в неё добавляется элемент PL, содержащий LBN настоящей родительской директории
— TF - отметки локального времени для файла (длинный - 17 байт - или короткий - 7 байт - формат): время создания экстента, st_mtime, st_atime, st_ctime, время последнего сохранения файла, время завершения хранения, время введения в действие
— SF - описание "дырявого" файла; элемент содержит st_size и уровень индексного блока; экстент файла содержит в сжатом виде (иерархия индексных блоков и битовых карт) описание длинных последовательностей нулей в файле (о совместимости с системами, не понимающими RRIP эдесь и речи нет)
       Длина идентификатора файла - до 255 символов (не байт!).

Расширение Joliet файловой системы ISO 9660


       Joliet - расширение файловой системы ISO 9660, предложенное MS. Формат PVD не отличается от описанного в ISO 9660, что обеспечивает совместимость с приложениями, не использующими SVD. При этом нет гарантированного способа произвести соответствие файлов в иерархиях PVD и SVD. Для записи иерархии директорий с именами в кодировке Unicode (точнее UCS-2, UTF-16, MSB) используется SVD с escape-последовательностями:
— UCS-2 Level 1 - "%\@"
— UCS-2 Level 2 - "%\C"
— UCS-2 Level 3 - "%\E"
       Поля дескриптора тома (идентификатор системы, идентификатор тома, идентификатор набора томов, идентификатор публикатора, идентификатор подготовившего данные, идентификатор приложения, копирайт, аннотация, библиография), идентификаторы директорий и файлов в иерархии директорий и идентификатор системы в записи расширенных атрибутов записываются в кодировке UTF-16 с использованием любых символов (соответствующего уровня), кроме "*/:;?\" и интервала 0x0000 - 0x001F. Кстати, максимальные длины полей (выраженные в символах) уменьшились при этом вдвое (например, имя тома в Joliet не может быть более 16 символов!). Имена файлов на диске и на CD опять-таки совпадают не до конца.
       Идентификаторы зарезервированных директорий (ссылка на себя, на родительскую директорию, на корень) записываются также, как в PVD. Разделители частей идентификатора (; и .) записываются в UTF-16 (MSB). Алгоритм сортировки таблиц путей и директорий адаптирован к двухбайтным символам заменой символа-заполнителя с пробела на 0x00. Сортировка обязательна. Локализация сортировки возлагается на приложения. Полная длина имени файла от корня не может превышать 240 байт (120 символов).
       Иерархия директорий, описанная в SVD Joliet, может нарушать ограничения стандарта ISO 9660
— максимальная длина идентификатора файла или директории - 128 байт (64 символа)
— идентификатор директории может содержать любые символы UTF-16, в т.ч. и точку
— глубина вложенности директорий не ограничена
       Особенности мультисессионных дисков:
— адресация логических секторов сквозная по всему диску
— нулевой логический адрес имеет сектор первой сессии с физическим адресом 00:02:00
— записи оглавления могут ссылаться на данные в других сессиях
— дескрипторы томов берутся только с 16-сектора первой дорожки последней сессии
— односессионный том может содержать сектора с данными Mode 1 или Mode 2 Form 1
— многосессионный том может содержать сектора данных только Mode 2 Form 1

Спецификации загружаемого CD-ROM El Torito


       Спецификация загружаемого CD-ROM El Torito определяет формат загрузочной записи, находящейся среди дескрипторов тома файловой системы ISO 9660, и её интерпретацию в BIOS. Позволяет разработчикам создавать CD-ROM, а BIOS использовать для загрузки записанный на нём образ дискеты или жесткого диска. CD-ROM может содержать несколько загружаемых образов, выбор нужного может осуществляться BIOS, программой или вручную. Некоторые BIOS могут обрабатывать только первый образ.
       Загрузочная запись д.б. записана по адресу 17 (т.е. сразу после PVD) последней сессии. Идентификатор системы д.б. "EL TORITO SPECIFICATION". Со смещением 0x47 записывается адрес (LSB) первого сектора загрузочного каталога. Загрузочный каталог содержит набор 32-байтовых записей (по 64 записи на сектор) следующих типов (подозреваю, что большинство BIOS-ов умеют загружать только образ по умолчанию):
— проверочная запись, д.б. первой, подтверждает, что перед нами действительно загрузочный каталог, определяет тип платформы (x86, Power PC) и название изготовителя CD-ROM
— определяет загрузочный образ по умолчанию, содержащаяся в нём программа должна использовать только интерфейс BIOS INT 13h; запись определяет является ли образ загрузочным, тип эмулируемого устройства (флоппи 1.2 MB, 1.44 MB, 2.88 MB, жёсткий диск, отсутствие эмуляции), в какой сегмент памяти загружать начальный загрузчик, тип системы из виртуальной таблицы разделов на загрузочном образе, число виртуальных секторов образа для начальной загрузки, начальный логический блок образа на CD; загруженная программа может выбрать загрузочный образ исходя из конфигурации оборудования или задав вопрос пользователю и произвести повторную загрузку
— начало группы загрузочных образов, определяет тип платформы (x86, Power PC) и строку идентификации, которая позволяет BIOS решить стоит ли рассматривать эту группу
— элемент группы загрузочных образов; запись определяет является ли образ загрузочным, тип эмулируемого устройства (флоппи 1.2 MB, 1.44 MB, 2.88 MB, жёсткий диск, отсутствие эмуляции), включает ли загрузочный образ ATAPI и/или SCSI драйвер, в какой сегмент памяти загружать начальный загрузчик, тип системы из виртуальной таблицы разделов на загрузочном образе, число виртуальных секторов образа для начальной загрузки, начальный логический блок образа на CD, критерий выбора загрузочного образа из группы (не определён, язык и версия, другое), строка выбора (язык определяется по 3 символам)
— продолжение строки выбора для предыдущего элемента
Если эмулируется дискета, то дальнейшие обращения программы к первому флоппидисководу (A:) с использованием прерывания BIOS INT 13h будут транслироваться в обращения к этой области CD-ROM, обращения ко второму флоппидисководу (B:) будут транслироваться в операции с первым настоящим флоппидисководом, второй настоящий флоппидисковод становится недоступен средствами BIOS.
       Если эмулируется жесткий диск, то дальнейшие обращения программы к первому диску (C:) с использованием прерывания BIOS INT 13h будут транслироваться в обращения к этой области CD-ROM, обращения программы ко второму диску будут транслироваться в операции с первым настоящим диском и т.д.. Можно использовать как CHS, так и LBA адресацию (см. ATA). Таблица разделов в образе должна содержать только 1 раздел и только в первой строке. Геометрия виртуального диска берётся из таблицы разделов.
       Виртуальный образ может загружаться в указанный сегмент памяти с передачей ему управления с эмуляцией или без эмуляции дискеты или диска. Загруженная программа в режиме без эмуляции может обращаться к CD-ROM с помощью дополнительных функций INT 13h (функции 41h-48h, LBA, размер сектора - 2048 байт).
       Если образ описан как незагрузочный, то BIOS переходит к следующему устройству загрузки, но создаёт виртуальное устройство, только не первым, а вслед за последним настоящим жёстким диском.
       Загруженная программа имеет возможность определить, что диск эмулируется (INT 13h Function 48h, EDD specification). Определяются дополнительные функции INT 13h:
— 4Ah - начать эмуляцию указанного образа на указанном устройстве
— 4Bh - завершить эмуляцию указанного устройства или всех
— 4Ch - начать эмуляцию и перезагрузиться
— 4Dh - прочитать указанное число секторов из загрузочного каталога
p.s. все числа в тексте спецификации - шестнадцатеричные, поэтому размер сектора определяется как 800 байт, что поначалу привело меня в шоковое состояние.

Файловая система UDF


       UDF (Universal Data Format) - файловая система для CD-RW, DVD. Приспособлена для модификации файлов. Имена файлов длиной до 127 символов. Используются пакеты переменной длины. Каждый файл (или фрагмент файла) хранится в отдельном пакете вместе со своим описанием. VTOC не требуется, но для совместимости может иметься VTOC ISO 9660 level 3 (UDF Bridge).
       UDF с пакетами фиксированной длины. Диск предварительно форматируется пакетами фиксированной длины. При размере пакета в 4 КБ полезный объем диска в 650 МБ - 494 МБ. Диск при этом не закрывается, поэтому его можно читать лишь на устройстве записи (нужен доступ к PMA). VTOC хранится на диске, но обновление проихводится только при необходимости из-за ограниченного числа циклов перезаписи CD-RW.
       DVD-Video и DVD-Audio используют микро-UDF (подмножество UDF, ISO 13346). Размер файла не более 1 ГБ. Имена файлов до 255 символов, UNICODE. Видеофайлы должны лежать в каталоге VIDEO_TS, аудио - AUDIO_TS. DVD-Video и DVD-Audio шифруются системой CSS. Ключ уникален для каждого диска и хранится в зашифрованном виде на нем (гениальная идея ;). Аналоговый выход защищается Macrovision APS. DVD-Video диски имеют код региона (всего их 8, Россия - 5), который должен совпадать с кодом региона устройства. Устройство уровня защиты RPC-1 позволяет менять код региона произвольное число раз, уровня RPC-2 - не более 5.
       UDF Bridge - комбинация ISO 9660 и MicroUDF.
— ISO-13346 (ECMA-167).
— ISO-13490 (ECMA-168).

Другие форматы записи на CD/DVD


       Ничто не мешает записать файловую систему ext2fs на CD-R/RW. Я так и вовсе иногда записываю архив в формате .cpio.gz вместо iso-образа. Надо только не забыть, что же вы туда запихнули ;)