ISO 9660
ISO 9660 é o formato de disco por trás de toda imagem ISO com a qual um kernel hobbyist é testado sob o -cdrom do QEMU, incluindo a que Build Systems já descreve produzir com grub-mkrescue, ele mesmo um wrapper em torno do xorriso, a ferramenta que de fato monta um volume ISO 9660. Onde o ext2 e as abstrações de VFS construídas sobre ele presumem um sistema de arquivos que cresce, encolhe, e é modificado no lugar, o ISO 9660 presume exatamente o oposto: um volume escrito uma vez, por completo, e nunca mais tocado, uma suposição que molda quase toda decisão estrutural do formato.
O Primary Volume Descriptor
Seção intitulada “O Primary Volume Descriptor”Todo volume ISO 9660 reserva seus primeiros dezesseis setores de 2.048 bytes (a System Area) não usados pelo sistema de arquivos em si, historicamente deixados livres para um setor de boot específico de plataforma ocupar, e o Primary Volume Descriptor (PVD) começa imediatamente depois, num offset fixo de setor 16. Esse local fixo é deliberado: diferente do superbloco do ext2, cujo offset exato ainda precisa ser consultado em relação ao início de uma partição, software lendo uma imagem ISO não precisa de tabela de partição nem negociação específica de sistema de arquivos alguma para encontrar o PVD, já que todo volume conforme o coloca no mesmo setor independentemente do tamanho total da imagem. O PVD carrega o rótulo identificador do volume, seu tamanho total em blocos lógicos, e, criticamente, o endereço do registro de diretório raiz, o ponto de entrada de onde toda outra busca no volume parte.
struct iso_pvd { uint8_t type; // 1 para Primary Volume Descriptor char id[5]; // "CD001" uint8_t version; // ... reservado ... char volume_id[32]; // ... locais de path table, registro de diretório raiz, ...} __attribute__((packed));Um volume pode carregar mais de um descritor de volume em sequência depois do PVD (um Volume Descriptor Set Terminator marca o fim da lista), o que é o mecanismo que a extensão Joliet usa para adicionar nomes de arquivo Unicode longos ao lado dos nomes restritivos estilo 8.3 do próprio PVD, sem alterar o PVD em si nem quebrar software que só entende a estrutura ISO 9660 comum.
Diretórios como extents contíguos
Seção intitulada “Diretórios como extents contíguos”Onde o ext2 espalha os dados de um arquivo por blocos rastreados por uma árvore de ponteiros indiretos, e entrelaça as entradas de um diretório por uma estrutura comparável, o ISO 9660 armazena tanto dados de arquivo quanto conteúdo de diretório como um único extent: um endereço de bloco lógico inicial e um comprimento, descrevendo uma sequência contígua de setores sem nada espalhado e sem indireção alguma a resolver. Um registro de diretório em si é uma entrada de formato fixo (identificador, local do extent, comprimento do extent, flags marcando se é um diretório ou um arquivo comum) empacotada uma após a outra dentro do próprio extent daquele diretório, então listar um diretório significa ler seu extent do início ao fim e percorrer esses registros de tamanho fixo em sequência, não seguir ponteiros da forma que uma estrutura ligada ou baseada em árvore exigiria.
Registro de diretório:[len][end. ext][compr. ext][data][flags][compr. nome]["FILENAME.TXT;1"]Isso funciona de forma limpa só porque o volume nunca é modificado depois de escrito: um extent contíguo é trivial de organizar de uma vez, numa única passada, quando o conteúdo e os tamanhos do volume inteiro já são conhecidos de antemão, mas caro de manter sob o tipo de crescimento e exclusão no lugar que a árvore de ponteiros de bloco e o alocador de bitmap do ext2 existem especificamente para tratar. Nomes de arquivo também assumem por padrão a convenção restritiva estilo 8.3 (maiúsculas, um conjunto limitado de caracteres, um número de versão ;1 no final) a menos que uma extensão como Joliet ou Rock Ridge esteja presente para relaxá-la, mais uma consequência do formato ser anterior às convenções de nome de arquivo longo que sistemas de arquivos mutáveis posteriores tomam como garantidas.
El Torito e tornar um volume inicializável
Seção intitulada “El Torito e tornar um volume inicializável”Nada da estrutura acima torna um volume inicializável por si só; o El Torito, uma extensão publicada em 1995, é especificamente o que faz isso. Ele adiciona um Boot Record Volume Descriptor entre os descritores de volume depois do PVD, apontando para um Boot Catalog: uma tabela pequena de entradas, cada uma nomeando uma imagem de boot já presente em algum outro lugar no mesmo volume ISO 9660 (ela mesma apenas um arquivo comum, um extent comum, nada estruturalmente especial nela) junto com o ID de plataforma e o endereço de carga que o firmware deveria usar para ela. Firmware BIOS lê a entrada padrão do catálogo e carrega a imagem referenciada exatamente como faria com um setor de boot de disquete ou disco rígido; firmware UEFI em vez disso procura uma entrada marcada com o ID de plataforma UEFI, tipicamente apontando para uma pequena imagem formatada em FAT (motivo pelo qual mtools, não relacionado ao ISO 9660 em si, acaba sendo uma dependência do grub-mkrescue) contendo uma aplicação .efi. Um único Boot Catalog comumente carrega as duas entradas lado a lado, o que é exatamente o que permite a uma única imagem ISO inicializar corretamente sob qualquer um dos dois tipos de firmware sem mudança alguma no volume.
Notas de implementação
Seção intitulada “Notas de implementação”Ler um volume ISO 9660 a partir de um driver de kernel é consideravelmente mais simples do que ler ext2 especificamente porque não há contabilidade de alocação alguma para acertar: nenhum bitmap para consultar antes de escrever, nenhum coalescing, nenhum bloco parcialmente preenchido para se preocupar em dividir, já que o formato é somente leitura em uso comum e toda estrutura descreve exatamente onde seu próprio conteúdo já está. O tamanho de setor de 2.048 bytes, maior que os setores de 512 bytes que a maioria dos drivers de disco espera, é um detalhe que vale a pena checar explicitamente: código que presume um setor fixo de 512 bytes ao computar um offset numa imagem ISO acaba lendo dados inteiramente errados em vez de falhar com erro óbvio algum.
Referências
Seção intitulada “Referências”- ^ ECMA International, ECMA-119: Volume and File Structure of CDROM for Information Interchange: a especificação formal na qual o ISO 9660 se baseia.
- ^ El Torito Bootable CD-ROM Format Specification, Version 1.0, 1995: a extensão de boot catalog coberta acima.
Ver também
Seção intitulada “Ver também”- Build Systems: o pipeline
grub-mkrescue/xorriso que produz uma imagem ISO 9660 a partir de um binário de kernel. - VFS: a camada de abstração atrás da qual um driver somente leitura para este formato ficaria, ao lado de ext2 ou FAT.
- ext2: um sistema de arquivos mutável baseado em ponteiros de bloco, um contraste estrutural útil com os extents write-once deste formato.