内容


检测可引导的 IBM Power 服务器 ISO 镜像

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分:

敬请期待该系列的后续内容。

此内容是该系列的一部分:

敬请期待该系列的后续内容。

简介

在上世纪 90 年代中期,Microsoft® Windows® 等操作系统由于太大而无法装入软盘中时,引导 CD-ROM 的能力变得至关重要。ISO 9660(来自 Phoenix Technologies 和 IBM 的一项 1994 年的规范)描述了 BIOS 如何读取 CD-ROM 并运行引导过程。一个名为 El Torito 的 ISO 9660 扩展是描述引导信息的数据格式的最常用方式之一。大多数 Intel® 固件都遵循 El Torito 规范。

但是,IBM® Power Systems™ 没有采用 ISO 9660 有关此引导过程的建议。要在 IBM Power® 服务器中引导一个 ISO 镜像,保存数据的介质需要在一个名为 ‘ppc’ 的目录内提供一个名为 bootinfo.txt 的文件。此文件包含将用于引导该镜像的固件的操作说明。

在需要处理多个架构镜像的软件中,这一区别可能增加了复杂性,比如像 Kimchi 这样的 VM 管理器。通过反复试验 来引导镜像不是一种可行的选择。挂载镜像会提示我们存在文件 /ppc/bootinfo.txt,但挂载过程需要至少与 ISO 镜像相同的磁盘大小、特殊特权,而且还会花不少时间。一种替代解决方案是按原样、逐字节地读取 ISO 镜像,并尝试找到该文件。此方法之所以行得通,是因为所有 ISO 文件都需要实现 ISO9660 文件系统,提供一种标准方式来描述介质中的文件。本文剩余部分将通过编码示例分析这个替代方案。

下一节将介绍 ISO 9660 标准,所有 ISO 文件都要使用它,无论其架构如何。后续各节将介绍如何按照 ISO 9660 建议访问 ISO 文件中的所有文件。本文还提供了一个使用 Python 语言编写的编码示例,并讨论了其他备用的编码方案。最后一节将会总结并讨论结果。

ISO 9660 标准

此标准不仅得到了 CD-ROM 的广泛使用、DVD、蓝光光盘以及甚至闪存驱动器也在使用它。尽管它对如今的需要而言具有严重的限制(这已通过其扩展修复),但它描述了一种在介质内存储和读取数据的简单方式。

从 ISO 文件的第一个字节开始,接下来的 32 KB 被标记为系统区域 且未被使用。在系统区域之后,我们有多个扇区(= 2048 字节,也称为逻辑块)描述镜像中存在的卷。每个卷拥有自己的类型和内容,但都采用了同样的布局:

图 1. ISO 9660 中通用的卷描述符格式
图 1.  ISO 9660 中通用的卷描述符格式

最重要的卷描述符是主要卷 (Primary Volume) 和引导记录卷 (Boot Record Volume)。主要卷包含如何读取文件系统的剩余部分的信息,包括目录位置、扇区数量等。引导记录卷告诉 BIOS 如何启动 ISO 镜像。在 El Torito 标准中,引导记录卷保存了引导目录 (Boot Catalog) 的位置,引导目录是可用磁盘镜像的索引。请注意,一个介质中可存在多个引导镜像,因此可能需要这样一种索引。终结卷 (Set Terminator Volume) 标记 ISO 文件的卷记录清单的结束。

图 2. ISO 9660 卷和引导目录
图 2.  ISO 9660 卷和引导目录

在 ISO 9660 文件系统中找到一个文件

如上一节中所述,主要卷记录包含该 ISO 中的文件的信息。一个信息就是路径表的大小和位置。此表包含介质中存在的所有记录的列表。此路径表中的数据的格式如下所示:

图 3. 路径表模型
图 3.  路径表模型
图 3. 路径表模型

标识符的长度为 ‘directory identifier’ 字段的大小,该字段在大多数情况下是该目录的名称。第二个字段提供该目录的额外信息,用在 ISO 9660 的一些扩展中。‘Location of extend’ 是表示此条目的目录记录的逻辑数据块。‘Directory number of parent directory’ 是表示父目录的逻辑地址的指针。如果目录标识符的长度为偶数,则会存在填充字段(值为 0),否则不存在填充字段。这可以确保每个条目都从一个偶数字节数开始。

可在路径表中找到 ISO 9660 文件系统的目录,但是,如果要查找特定文件,则需要搜索相应的目录记录。此记录保存了有关该目录中的每个文件和子目录的所有信息。

图 4. 目录记录模型
图 4.  目录记录模型
图 4. 目录记录模型

出于本文的用途,我们需要分析以下字段:

  • ‘length of directory record’ 是此条目的大小
  • ‘file flags’ 是一个表示寄存器累i系那个的字节,比如子目录、文件或隐藏文件。请注意,一个条目可以有多个标记。
  • ‘length of file identifier’ 和 ‘file identifier’ 用于读取文件/子目录的名称
  • ‘padding’ 仅在记录的长度为偶数时存在

有了此信息,我们就可以定义一个算法来查找 /ppc/bootinfo.txt 文件,确定该 ISO 是否可以在 Power Systems 服务器中进行引导。

图 5. 查找 ‘/ppc/bootinfo.txt’ 文件的算法
图 5.  查找 ‘/ppc/bootinfo.txt’ 文件的算法
图 5. 查找 ‘/ppc/bootinfo.txt’ 文件的算法

请注意,此算法可调整来查找任何文件 - 只需按路径的逆向顺序查找该文件,查找所有目录,直到到达包含我们查找的文件的目录。

我们可以在下一节中的示例代码中看到此概念的实际应用,届时我们将打开一个 IBM Power 服务器 ISO 文件来检测它是否可引导。

一种 Python 实现

以下代码是我们目前为止讨论的概念的实用示例。这段 Python 脚本加载了这个 ISO 文件作为参数,评估该镜像是否可由 Power Systems 固件引导。通过读取它的内部注释,可以了解此工作流。这个 示例 是我提交到 Kimchi 项目的补丁的调整版本。

将内容保存在一个名为 detect_ppc_iso.py 的文件中,然后使用以下命令运行该文件。

$ python detect_ppc_iso.py <pc_iso>

请参阅 下载 部分,以便获取 detect_ppc_iso.py 文件。

其他备用方案

上一节中提供的实现打开了一个 ISO 镜像文件,使用 ISO 9660 标准逐字节地读取它的内容,以便查找可引导的 Power Systems 文件 /ppc/bootinfo.txt

还有一些开源库也能够读取 ISO 文件并提供相同的结果。在一些安装了 cdrkit 的 Linux® 发行版中,可以使用 isoinfo 命令从 ISO 文件检索相关信息,包括是否存在针对 Power Systems 固件的引导文件。

清单 1. 使用 isoinfo 在 ISO 文件中查找 ‘/ppc/bootinfo.txt’ 文件
$ isoinfo -i RHEL-7.0-20140507.0-Server-ppc64-dvd1.iso  -d

CD-ROM is in ISO 9660 format

System id: PPC

Volume id: RHEL-7.0 Server.ppc64

Volume set id: 

Publisher id: 

Data preparer id: 

Application id: GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) 1997-2006 
        J.PEARSON/J.SCHILLING (C) 2006-2007 CDRKIT TEAM

Copyright File id: 

Abstract File id: 

Bibliographic File id: 

Volume set size is: 1

Volume set sequence number is: 1

Logical block size is: 2048

Volume size is: 1512366

Joliet with UCS level 3 found

Rock Ridge signatures version 1 found

$  isoinfo -i /var/lib/libvirt/images/RHEL-7.0-20140507.0-Server-ppc64-dvd1.iso  -x /ppc/bootinfo.txt

<chrp-boot> <description>Linux</description> 

<os-name>Linux</os-name> 

<boot-script>boot &device;:\ppc\chrp\yaboot</boot-script> 

(...)

第一个命令将会读取 ISO 镜像的主要卷描述符并检索其中的信息。第二个命令会查找 /ppc/bootinfo.txt 文件并将其内容转储到标准输出。

尽管使用 isoinfo 命令或其他任何备用方案可能更简单,但该命令是在 OS 中安装额外的包和在未来生成对它们的依赖关系的前提条件。除非您的软件大量使用了这些库所提供的 ISO 操作特性,但检查一个 ISO 文件能否在 Power Systems 服务器上进行引导,这是一个可以使用前一节中的代码完成的任务,该代码可跨操作系统和平台运行,仅依赖于 Python 核心库。

结束语

本文介绍了 Intel® 和 IBM POWER® 在 ISO 镜像的引导过程上的区别,简短解释了如何在 ISO 9660 文件系统中找到一个文件,还提供了演示这些概念的实用代码。最后,我们还提供了一个潜在的备用方案,但该方案需要的库和资源可能不可用。

我们从此工作可得出的一个结论是,对于以原始数据格式广泛使用 ISO 镜像的软件,推荐使用第三方库或软件。对于其他任务(比如检测 ISO 镜像的可引导性),可以创建一个最小的 ISO 9660 协议实现来完成该操作,获得不依赖于第三方库的优势。Kimchi 项目实现了此选项。


下载资源


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=994933
ArticleTitle=检测可引导的 IBM Power 服务器 ISO 镜像
publish-date=01142015