徐天斌
同濟(jì)大學(xué)計算機(jī)科學(xué)及技術(shù)系,上海 201804
ISO9660是由國際標(biāo)準(zhǔn)化組織(International Organization for Standardization, ISO)制定的光盤文件系統(tǒng)格式,它定義了存儲在光盤中文件的邏輯格式以及組織目錄結(jié)構(gòu),從而使光盤中文件數(shù)據(jù)的存放位置、目錄、索引結(jié)構(gòu)的組織有了統(tǒng)一的規(guī)范。
ISO鏡像是指基于ISO9660文件系統(tǒng)格式的文件,用于光盤刻錄環(huán)節(jié),首先要生成ISO鏡像,隨后將ISO鏡像文件刻錄至光盤,其中就需要解決如何去生成基于ISO9660文件系統(tǒng)格式的鏡像文件[1]的問題。
本文我們給出一種用于生成符合ISO9660文件系統(tǒng)格式的鏡像文件的具體實現(xiàn)技術(shù)。在分析ISO9660格式的基礎(chǔ)上,實現(xiàn)一個將當(dāng)前文件系統(tǒng)中的某個目錄(包含其下所有子目錄)打包生成ISO鏡像文件的程序。
ISO9660格式以一種緊湊且連續(xù)的方式組織光盤上的數(shù)據(jù),充分考慮驅(qū)動器機(jī)械特性,對數(shù)據(jù)進(jìn)行順序化的組織,縮短尋道時間。
此外,ISO9660標(biāo)準(zhǔn)定義了3個層次的數(shù)據(jù)交換兼容性。因為需要兼容當(dāng)時所有的操作系統(tǒng),所以只使用各平臺特性的交集部分。ISO9660 Level 1標(biāo)準(zhǔn)[2]規(guī)定文件數(shù)據(jù)必須連續(xù)存放,文件名采用8.3格式,字符集僅限于大寫英文字母、數(shù)字及下劃線。Level 2標(biāo)準(zhǔn)允許長文件和目錄名字,而文件數(shù)據(jù)仍要求連續(xù)存放。Level 3允許數(shù)據(jù)可以以交錯的方式分開存放。
Microsoft在基于ISO9660標(biāo)準(zhǔn)的基礎(chǔ)上設(shè)計實現(xiàn)了與之兼容的Joliet文件系統(tǒng)格式。該格式是對ISO9660格式的一種擴(kuò)展,使得文件和目錄名支持UCS-2字符集,允許長度最大可達(dá)64個寬字符。
對于同時存在兩套或以上文件系統(tǒng)信息,如ISO9660與Joliet共存的情況,將兩套文件系統(tǒng)中的文件記錄信息指向同一塊數(shù)據(jù)區(qū)域。本文中我們將生成一份ISO9660與Joliet共享數(shù)據(jù)的ISO鏡像文件。
一個ISO鏡像文件可以視作為一系列連續(xù)的邏輯扇區(qū),每個扇區(qū)為2048字節(jié)大小,編號從零開始,從0號扇區(qū)到15號扇區(qū)為未定義區(qū)域。
從第16扇區(qū)開始存放的是一系列卷描述符。卷描述符的種類包括:基本卷描述符、擴(kuò)展卷描述符、卷分區(qū)描述符、引導(dǎo)記錄以及卷描述符集中止符這5類。
實際中使用的僅3個:基本卷描述符,擴(kuò)展卷描述符和卷描述符集中止符,每個卷描述符占一個邏輯扇區(qū)。
描述符結(jié)構(gòu)描述整個文件系統(tǒng)的管理信息,如描述符類型、卷標(biāo)識符、卷大小、路徑表的所在扇區(qū)號、大小,文件系統(tǒng)根目錄記錄的扇區(qū)號等信息。
卷標(biāo)識符類型值為1表示基本卷標(biāo)識符,值為2表示擴(kuò)展卷標(biāo)識符,值為255表示卷標(biāo)識符集中止符,卷空間大小記錄整個鏡像文件的大小,以扇區(qū)為單位。
路徑表將光盤中所有目錄都在路徑表中存放一條記錄,可以線性查找的方式直接定位到指定目錄,對嵌套層次較深的目錄,避免逐層遍歷目錄結(jié)構(gòu),多次定位讀取目錄記錄信息耗費的時間表1給出了路徑表記錄的格式。
表1 路徑表記錄
路徑表中的記錄可以跨扇區(qū)存儲,每條記錄長度都是記錄自身描述的,為8 + LEN_DI + (LEN_DI % 2)字節(jié),整個路徑表必須占據(jù)整數(shù)個邏輯扇區(qū)大小。
ISO9660標(biāo)準(zhǔn)對目錄和文件使用相同的數(shù)據(jù)結(jié)構(gòu)來記錄,即是將目錄當(dāng)作文件看待,文件的位置信息指向文件數(shù)據(jù),而目錄文件的數(shù)據(jù)則是該目錄下子目錄和文件的記錄項構(gòu)成。表2給出目錄和文件記錄的格式。
表2 目錄和文件記錄
記錄長度由自身描述,末尾填充域保證記錄為偶數(shù)字節(jié),且不允許記錄跨扇區(qū)存放。同一目錄下所有子目錄和文件的記錄作為同一目錄文件,每個目錄文件的數(shù)據(jù)必須以邏輯扇區(qū)大小對齊,目錄文件不可跨扇區(qū)存儲,扇區(qū)末尾剩余部分用零填充。
構(gòu)造基于ISO9660的鏡像文件之核心在于再造出文件系統(tǒng)控制信息。本質(zhì)上是從數(shù)據(jù)源所在文件系統(tǒng)中獲得目錄結(jié)構(gòu)、文件名及屬性等信息,依此通過計算生成文件系統(tǒng)中卷描述符、目錄項記錄以及路徑表等控制信息的數(shù)據(jù)組織,寫入ISO鏡像文件。
本文的算法用于生成同時包含ISO9660與Joliet格式的共享數(shù)據(jù)區(qū)ISO鏡像文件,兩套文件系統(tǒng)控制信息指向同一份文件數(shù)據(jù)。
算法首先要讀取源文件系統(tǒng)中的目錄層次結(jié)構(gòu),獲取關(guān)于每個目錄或文件的名字、屬性以及樹狀目錄結(jié)構(gòu)中父子節(jié)點關(guān)系。我們通過深度優(yōu)先遍歷獲取從根目錄及以下所有子目錄和文件節(jié)點的屬性,該算法(TraverseFolder)是遞歸實現(xiàn)的,具體描述如下:
將目錄數(shù)據(jù)占據(jù)扇區(qū)數(shù)量的值NSector返回。
根據(jù)3.1中已經(jīng)計算得到的每個子目錄記錄項長度,將用于進(jìn)一步計算每個子目錄數(shù)據(jù)將所處的邏輯塊號。DirRecordLoc()由根目錄開始逐層遍歷計算目錄數(shù)據(jù)邏輯塊號,函數(shù)用遞歸方法實現(xiàn),具體描述如下:
遞歸調(diào)用DirRecordLoc(nodeArray, index + 1, curLoc)計算后續(xù)節(jié)點。
由3.2中計算出來的每個子目錄數(shù)據(jù)邏輯塊號,加上對所有目錄節(jié)點由根開始逐層進(jìn)行編號,編號從1開始(該編號將作為路徑表記錄項中的父目錄編號),依照表1中結(jié)構(gòu)就可以構(gòu)造出含所有目錄節(jié)點的路徑表。
路徑表通常位于目錄記錄之后,將路徑表生成后暫時不實際寫入ISO鏡像文件,記錄下該路徑表大小和起始邏輯塊號,將用于填寫卷描述符中相關(guān)字段。
文件數(shù)據(jù)區(qū)域通常跟在路徑表之后,由3.3中確定的路徑表占據(jù)邏輯扇區(qū)位置之后,才能確定數(shù)據(jù)區(qū)域的起始邏輯塊號。由根目錄開始逐層遍歷所有數(shù)據(jù)文件,依據(jù)每個文件的大小,計算出各文件數(shù)據(jù)的起始邏輯塊號,函數(shù)FileLoc(ref curLoc)具體描述如下:
以上步驟的計算完成寫入前必要數(shù)據(jù)的準(zhǔn)備,之前相關(guān)數(shù)據(jù)結(jié)構(gòu)的計算和生成都是為了以順序而不回溯地方式寫完整個ISO鏡像文件或者光盤,不往回移動寫文件指針很有必要。
寫ISO鏡像過程順序依次為前16個扇區(qū)的空數(shù)據(jù),卷描述符集,分別對應(yīng)ISO9660與Joliet格式的目錄與文件記錄項以及路徑表,最后完成文件數(shù)據(jù)的寫入。
本文通過剖析了ISO9660格式標(biāo)準(zhǔn)中的結(jié)構(gòu)與數(shù)據(jù)組織方式,設(shè)計實現(xiàn)了生成ISO鏡像算法的軟件。軟件實現(xiàn)了將當(dāng)前文件系統(tǒng)中的某個目錄(包含其下所有子目錄)打包成單個ISO鏡像文件的功能,并且可以用Daemon Tools加載讀取ISO文件中的內(nèi)容。
[1]肖飛,王運瓊,李映松,李必謹(jǐn).基于光盤映像文件的CDROM數(shù)據(jù)加密與解密方法,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