我在寫一個應用程序,在某個階段在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++。我無法改變這一點。