【发布时间】:2010-09-06 08:18:19
【问题描述】:
我正在编写一个在 Linux 环境中在某个阶段执行低级磁盘操作的应用程序。该应用程序实际上由两部分组成,一个在 Windows 上运行并与用户交互,另一个是从 LiveCD 运行的 linux 部分。用户选择 Windows 驱动器号,然后 linux 部分对相应的分区执行操作。问题是在 Windows 驱动器号(如 C:)和 linux 设备名称(如 /dev/sda1)之间找到匹配项。这是我目前认为丑陋的解决方案:
在 Windows 中的某个预定义位置(即系统分区的根目录)中存储分区信息(即驱动器号、块数、驱动器序列号等)。
从 /proc/partitions 读取分区列表。仅获取具有 SCSI 或 IDE 硬盘驱动器主编号和将其标识为真实分区而非整个磁盘的次编号的分区。
尝试使用 ntfs 或 vfat 文件系统挂载它们中的每一个。检查挂载的分区是否包含Windows应用存储的信息。
找到由 Windows 应用编写的所需信息后,进行实际匹配。对于 /proc/partitions 中找到的每个分区,获取驱动器序列号(通过 HDIO_GET_IDENTITY 系统调用)、块数(来自 /proc/partitions)和驱动器偏移量(/sys/blocks/drive_path/partition_name/start),将其与 Windows信息,如果匹配 - 将 Windows 驱动器号与 linux 设备名称一起存储。
这个方案有几个问题:
这很难看。在 Windows 中写入数据然后在 Linux 中读取数据会使测试成为一场噩梦。
linux 设备主编号仅与 IDE 或 SCSI 设备进行比较。这可能会失败,即在 USB 或 FireWire 磁盘上。可以添加这些类型的磁盘,但将应用程序限制在可能的设备的已知子集似乎是个坏主意。
看起来 HDIO_GET_IDENTITY 仅适用于 IDE 和 SATA 驱动器。
/sys/block hack 可能不适用于 IDE 或 SATA 驱动器以外的其他驱动器。
关于如何改进此架构的任何想法?也许还有另一种方法来确定 Windows 名称,而无需将所有数据写入 Windows 应用程序?
附:应用程序的语言是 C++。我无法改变这一点。
【问题讨论】: