APP下载

基于ISO9660格式的光盘镜像文件生成算法

2011-04-13徐天斌

科技传播 2011年4期
关键词:镜像文件描述符扇区

徐天斌

同济大学计算机科学及技术系,上海 201804

0 引言

ISO9660是由国际标准化组织(International Organization for Standardization, ISO)制定的光盘文件系统格式,它定义了存储在光盘中文件的逻辑格式以及组织目录结构,从而使光盘中文件数据的存放位置、目录、索引结构的组织有了统一的规范。

ISO镜像是指基于ISO9660文件系统格式的文件,用于光盘刻录环节,首先要生成ISO镜像,随后将ISO镜像文件刻录至光盘,其中就需要解决如何去生成基于ISO9660文件系统格式的镜像文件[1]的问题。

本文我们给出一种用于生成符合ISO9660文件系统格式的镜像文件的具体实现技术。在分析ISO9660格式的基础上,实现一个将当前文件系统中的某个目录(包含其下所有子目录)打包生成ISO镜像文件的程序。

1 ISO9660概述

1.1 ISO9660格式

ISO9660格式以一种紧凑且连续的方式组织光盘上的数据,充分考虑驱动器机械特性,对数据进行顺序化的组织,缩短寻道时间。

此外,ISO9660标准定义了3个层次的数据交换兼容性。因为需要兼容当时所有的操作系统,所以只使用各平台特性的交集部分。ISO9660 Level 1标准[2]规定文件数据必须连续存放,文件名采用8.3格式,字符集仅限于大写英文字母、数字及下划线。Level 2标准允许长文件和目录名字,而文件数据仍要求连续存放。Level 3允许数据可以以交错的方式分开存放。

1.2 Joliet扩展[3]与共享数据光盘

Microsoft在基于ISO9660标准的基础上设计实现了与之兼容的Joliet文件系统格式。该格式是对ISO9660格式的一种扩展,使得文件和目录名支持UCS-2字符集,允许长度最大可达64个宽字符。

对于同时存在两套或以上文件系统信息,如ISO9660与Joliet共存的情况,将两套文件系统中的文件记录信息指向同一块数据区域。本文中我们将生成一份ISO9660与Joliet共享数据的ISO镜像文件。

2 ISO9660格式相关数据结构

一个ISO镜像文件可以视作为一系列连续的逻辑扇区,每个扇区为2048字节大小,编号从零开始,从0号扇区到15号扇区为未定义区域。

2.1 卷描述符集

从第16扇区开始存放的是一系列卷描述符。卷描述符的种类包括:基本卷描述符、扩展卷描述符、卷分区描述符、引导记录以及卷描述符集中止符这5类。

实际中使用的仅3个:基本卷描述符,扩展卷描述符和卷描述符集中止符,每个卷描述符占一个逻辑扇区。

描述符结构描述整个文件系统的管理信息,如描述符类型、卷标识符、卷大小、路径表的所在扇区号、大小,文件系统根目录记录的扇区号等信息。

卷标识符类型值为1表示基本卷标识符,值为2表示扩展卷标识符,值为255表示卷标识符集中止符,卷空间大小记录整个镜像文件的大小,以扇区为单位。

2.2 路径表记录

路径表将光盘中所有目录都在路径表中存放一条记录,可以线性查找的方式直接定位到指定目录,对嵌套层次较深的目录,避免逐层遍历目录结构,多次定位读取目录记录信息耗费的时间表1给出了路径表记录的格式。

表1 路径表记录

路径表中的记录可以跨扇区存储,每条记录长度都是记录自身描述的,为8 + LEN_DI + (LEN_DI % 2)字节,整个路径表必须占据整数个逻辑扇区大小。

2.3 目录和文件记录

ISO9660标准对目录和文件使用相同的数据结构来记录,即是将目录当作文件看待,文件的位置信息指向文件数据,而目录文件的数据则是该目录下子目录和文件的记录项构成。表2给出目录和文件记录的格式。

表2 目录和文件记录

记录长度由自身描述,末尾填充域保证记录为偶数字节,且不允许记录跨扇区存放。同一目录下所有子目录和文件的记录作为同一目录文件,每个目录文件的数据必须以逻辑扇区大小对齐,目录文件不可跨扇区存储,扇区末尾剩余部分用零填充。

3 ISO9660格式镜像文件生成算法

构造基于ISO9660的镜像文件之核心在于再造出文件系统控制信息。本质上是从数据源所在文件系统中获得目录结构、文件名及属性等信息,依此通过计算生成文件系统中卷描述符、目录项记录以及路径表等控制信息的数据组织,写入ISO镜像文件。

本文的算法用于生成同时包含ISO9660与Joliet格式的共享数据区ISO镜像文件,两套文件系统控制信息指向同一份文件数据。

3.1 树形目录层次的构建与目录项长度计算

算法首先要读取源文件系统中的目录层次结构,获取关于每个目录或文件的名字、属性以及树状目录结构中父子节点关系。我们通过深度优先遍历获取从根目录及以下所有子目录和文件节点的属性,该算法(TraverseFolder)是递归实现的,具体描述如下:

将目录数据占据扇区数量的值NSector返回。

3.2 目录数据起始逻辑块号计算

根据3.1中已经计算得到的每个子目录记录项长度,将用于进一步计算每个子目录数据将所处的逻辑块号。DirRecordLoc()由根目录开始逐层遍历计算目录数据逻辑块号,函数用递归方法实现,具体描述如下:

递归调用DirRecordLoc(nodeArray, index + 1, curLoc)计算后续节点。

3.3 生成路径表

由3.2中计算出来的每个子目录数据逻辑块号,加上对所有目录节点由根开始逐层进行编号,编号从1开始(该编号将作为路径表记录项中的父目录编号),依照表1中结构就可以构造出含所有目录节点的路径表。

路径表通常位于目录记录之后,将路径表生成后暂时不实际写入ISO镜像文件,记录下该路径表大小和起始逻辑块号,将用于填写卷描述符中相关字段。

3.4 文件数据起始逻辑块号计算

文件数据区域通常跟在路径表之后,由3.3中确定的路径表占据逻辑扇区位置之后,才能确定数据区域的起始逻辑块号。由根目录开始逐层遍历所有数据文件,依据每个文件的大小,计算出各文件数据的起始逻辑块号,函数FileLoc(ref curLoc)具体描述如下:

3.5 ISO镜像文件的写入

以上步骤的计算完成写入前必要数据的准备,之前相关数据结构的计算和生成都是为了以顺序而不回溯地方式写完整个ISO镜像文件或者光盘,不往回移动写文件指针很有必要。

写ISO镜像过程顺序依次为前16个扇区的空数据,卷描述符集,分别对应ISO9660与Joliet格式的目录与文件记录项以及路径表,最后完成文件数据的写入。

4 试验结果与结论

本文通过剖析了ISO9660格式标准中的结构与数据组织方式,设计实现了生成ISO镜像算法的软件。软件实现了将当前文件系统中的某个目录(包含其下所有子目录)打包成单个ISO镜像文件的功能,并且可以用Daemon Tools加载读取ISO文件中的内容。

[1]肖飞,王运琼,李映松,李必谨.基于光盘映像文件的CDROM数据加密与解密方法,2009,36(5):299-300.

[2]ISO/IEC DIS 9660:1999,Volume and file structure of CD-ROM for information interchange,1999.

[3]Microsoft Developer Relations Group, Joliet Specification CD-ROM Recording Spec ISO9660:1988,1995

猜你喜欢

镜像文件描述符扇区
分阶段调整增加扇区通行能力策略
基于结构信息的异源遥感图像局部特征描述符研究
基于AKAZE的BOLD掩码描述符的匹配算法的研究
Linux单线程并发服务器探索
U盘故障排除经验谈
利用CNN的无人机遥感影像特征描述符学习
一种快速拷贝数据到FAT分区的方法
用RamOS降低公用机的维护工作量
基于贝叶斯估计的短时空域扇区交通流量预测
重建分区表与FAT32_DBR研究与实现