Frage

Ich schreibe eine Anwendung, die irgendwann in einer Linux-Umgebung Festplattenoperationen auf niedriger Ebene ausführt.Die App besteht eigentlich aus zwei Teilen: Einer läuft unter Windows und interagiert mit einem Benutzer und ein anderer ist ein Linux-Teil, der von einer LiveCD läuft.Der Benutzer wählt einen Windows-Laufwerksbuchstaben aus und dann führt ein Linux-Teil Aktionen mit den entsprechenden Partitionen aus.Das Problem besteht darin, eine Übereinstimmung zwischen einem Windows-Laufwerksbuchstaben (wie C:) und einem Linux-Gerätenamen (wie /dev/sda1) zu finden.Dies ist meine aktuelle Lösung, die ich als hässlich bewerte:

  • Partitionsinformationen speichern (d. h.Laufwerksbuchstabe, Anzahl der Blöcke, Seriennummer des Laufwerks usw.) in Windows an einem vordefinierten Ort (z. B.das Stammverzeichnis der Systempartition).

  • Lesen Sie eine Liste der Partitionen aus /proc/partitions.Rufen Sie nur die Partitionen ab, die eine Hauptnummer für SCSI- oder IDE-Festplatten und eine Nebennummer haben, die sie als echte Partitionen identifiziert, und nicht die gesamten Festplatten.

  • Versuchen Sie, jedes davon entweder mit NTFS- oder VFAT-Dateisystemen zu mounten.Überprüfen Sie, ob die bereitgestellte Partition die von der Windows-App gespeicherten Informationen enthält.

  • Nachdem Sie die erforderlichen Informationen gefunden haben, die von der Windows-App geschrieben wurden, stellen Sie die tatsächliche Übereinstimmung her.Erfassen Sie für jede in /proc/partitions gefundene Partition die Seriennummer des Laufwerks (über den Systemaufruf HDIO_GET_IDENTITY), die Anzahl der Blöcke (aus /proc/partitions) und den Laufwerksoffset (/sys/blocks/drive_path/partition_name/start) und vergleichen Sie dies mit Windows Informationen und wenn diese übereinstimmen, speichern Sie einen Windows-Laufwerksbuchstaben zusammen mit einem Linux-Gerätenamen.

Bei diesem Schema gibt es einige Probleme:

  • Das ist hässlich.Das Schreiben von Daten unter Windows und das anschließende Lesen unter Linux macht das Testen zu einem Albtraum.

  • Die Hauptnummer des Linux-Geräts wird nur mit IDE- oder SCSI-Geräten verglichen.Dies würde wahrscheinlich scheitern, d.h.auf USB- oder FireWire-Festplatten.Es ist möglich, diese Festplattentypen hinzuzufügen, aber die App nur auf bekannte Teilmengen möglicher Geräte zu beschränken, scheint eine eher schlechte Idee zu sein.

  • Es sieht so aus, als ob HDIO_GET_IDENTITY nur auf IDE- und SATA-Laufwerken funktioniert.

  • Der /sys/block-Hack funktioniert möglicherweise nur auf IDE- oder SATA-Laufwerken.

Irgendwelche Ideen, wie dieses Schema verbessert werden kann?Gibt es vielleicht eine andere Möglichkeit, Windows-Namen zu ermitteln, ohne alle Daten in die Windows-App zu schreiben?

P.S.Die Sprache der App ist C++.Ich kann das nicht ändern.

War es hilfreich?

Lösung

Partitionen sind UUIDs zugeordnet.Ich weiß nicht, wie ich diese unter Windows finden kann, aber unter Linux können Sie die UUID für jede Partition finden mit:

sudo vol_id -u Gerät (z. B./dev/sda1)

Wenn es in Windows eine entsprechende Funktion gibt, können Sie einfach die UUIDs für die ausgewählte Partition speichern und dann alle bekannten Partitionen unter Linux durchlaufen und die UUIDs abgleichen.

Bearbeiten: Dies kann eine reine Linux-Sache sein, und es kann insbesondere das volid util sein, das diese aus etwas generiert (anstatt Metadaten für das Laufwerk abzulesen).Allerdings hindert Sie nichts daran, die Quelle für volid zu besorgen und herauszufinden, was sie bewirkt.

Andere Tipps

Partitionen sind UUIDs zugeordnet

Mein Wissen darüber ist sehr oberflächlich, aber ich dachte, das gilt nur für Festplatten, die mit GPT-Partitionen (Guid Partition Table) formatiert sind, und nicht für das altmodische MBR-Format, an dem 99 % der Welt immer noch festhalten?

Mein Wissen darüber ist sehr oberflächlich, aber ich dachte, das gilt nur für mit GPT (Guid Partitionstabelle) Partitionen, eher als das MBR-Format im alten Stil, das 99% der Welt stecken immer noch fest?

Klingt nicht wie ein Linux-Benutzerklischee, aber es funktioniert für mich.Ich verwende es mit NTFS-Partitionen und hatte keine Probleme.Wie ich in meiner Bearbeitung sagte, generiert vol_id sie möglicherweise selbst.Wenn das der Fall wäre, gäbe es keine Abhängigkeit von einem bestimmten Partitionsformat, was gut wäre.

Partitionen sind UUIDs zugeordnet.Ich weiß nicht, wie ich diese unter Windows finden kann, aber unter Linux können Sie die UUID für jede Partition finden mit:

sudo vol_id -u Gerät (z. B./dev/sda1)

Wenn es in Windows eine entsprechende Funktion gibt, können Sie einfach die UUIDs für die ausgewählte Partition speichern und dann alle bekannten Partitionen unter Linux durchlaufen und die UUIDs abgleichen.

Das ist ein guter Punkt, danke!Ich habe mir die Quellen von vol_id (einem Teil des udev-Tarballs) angesehen und es scheint, dass es für FAT(32) und NTFS UUUD mithilfe der Volume-Seriennummer generiert, die von der vordefinierten Position auf der Partition gelesen wird.Da ich nichts anderes als fat32 und ntfs erwarte, überlege ich, diese Informationen als Partitionskennung zu verwenden.

Sie müssen das Laufwerk entweder auf irgendeine Weise markieren (z. B.eine Datei schreiben usw.) oder eine Kennung finden, die nur diesem bestimmten Laufwerk zugeordnet ist.

Es ist sehr schwierig, fast unmöglich, herauszufinden, welchen Buchstaben Windows einer bestimmten Laufwerkspartition zuweisen würde, ohne Windows tatsächlich auszuführen.Dies liegt daran, dass Windows das Laufwerk, von dem aus es ausgeführt wird, immer mit C: verknüpft.Dies kann ein beliebiges Laufwerk sein, wenn Sie mehr als ein Betriebssystem installiert haben.Unter Windows können Sie auch auswählen, welcher Laufwerksbuchstabe zuerst für eine bestimmte Partition versucht wird, was zu weiteren Problemen führt.

Es wäre viel einfacher, die GUI-Sachen unter Linux zu erledigen, als diese gemischte Windows/Linux-Lösung auszuprobieren.Ich sage nicht, dass Sie es nicht auf diese Weise versuchen sollten. Was ich sagen möchte, ist, dass dieser Ansatz sehr viele mögliche Fallstricke birgt.Ich bin mir sicher, dass ich nicht einmal alle kenne.

Eine andere Möglichkeit wäre, zu prüfen, ob Sie den Linux-Teil tatsächlich innerhalb von Windows ausführen könnten.Wenn Sie ein sehr guter Windows-Programmierer sind, können Sie tatsächlich auf das Rohdateisystem zugreifen.Dieser Ansatz birgt wahrscheinlich ebenso viele Fallstricke, da währenddessen Windows läuft.

Um es noch einmal zu wiederholen: Ich würde sehen, ob Sie alles unter Linux erledigen könnten, wenn Sie können.Auf lange Sicht ist es einfach viel einfacher.

Unter Windows können Sie die „NTFS-Volume-Seriennummer“ ablesen, die mit der UUID unter Linux übereinstimmt.

Möglichkeiten, das „NTFS Volume Serial“ zu erhalten Windows:

  • Kommandozeile seit XP: fsutil.exe fsinfo ntfsinfo C:

  • unter c++

    HANDLE fileHandle = CreateFile(L"\\\\.\\C:", // or use syntax "\\?\Volume{GUID}" 
                                   GENERIC_READ,
                                   FILE_SHARE_READ|FILE_SHARE_WRITE,
                                   NULL,
                                   OPEN_EXISTING,
                                   NULL,
                                   NULL);
    DWORD i;
    NTFS_VOLUME_DATA_BUFFER ntfsInfo;
    DeviceIoControl(fileHandle, 
                    FSCTL_GET_NTFS_VOLUME_DATA, 
                    NULL, 
                    0, 
                    &ntfsInfo,
                    sizeof(ntfsInfo), 
                    &i, 
                    NULL));
    cout << "UUID is " << std::hex << ntfsInfo.VolumeSerialNumber.HighPart << std::hex << ntfsInfo.VolumeSerialNumber.LowPart << endl;
    

Möglichkeiten, die UUID unter zu bekommen Linux:

  • ls -l /dev/disk/by-uuid
  • ls -l /dev/disk/by-label
  • blkid /dev/sda1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top