我在写一个应用程序,在某个阶段在Linux环境下执行低级别的磁盘操作。该应用程序实际上由两部分组成,一部分在Windows上运行并与用户交互,另一部分是从LiveCD运行的Linux部分。用户可以选择Windows驱动器盘符,然后Linux部件执行相应分区的操作。问题是在Windows驱动器盘符(如C :)和Linux设备名称(如/ dev/sda1)之间找到匹配项。这是我认为它是丑陋的我目前的解决方案:如何将Linux设备路径与Windows驱动器名称进行匹配?
存储分区信息(即驱动器盘符,块的数量,驱动器序列号等),在Windows中的一些预先定义的地方(即的根系统分区)。
从/ proc/partitions中读取分区列表。只获取那些主要用于SCSI或IDE硬盘驱动器的分区以及将其标识为实际分区而不是整个磁盘的次要分区。
尝试使用ntfs或vfat文件系统挂载它们中的每一个。检查装入的分区是否包含Windows应用程序存储的信息。
在找到Windows应用程序写入的所需信息后,会进行实际匹配。对于在/ proc/partitions中找到的每个分区,获取驱动器序列号(通过HDIO_GET_IDENTITY syscall),块数(从/ proc /分区)和驱动器偏移量(/ 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应用程序中编写所有数据?
P.S.该应用的语言是C++。我无法改变这一点。