Comment faire correspondre linux chemin de périphérique de windows nom de lecteur?

StackOverflow https://stackoverflow.com/questions/18959

  •  09-06-2019
  •  | 
  •  

Question

Je suis en train d'écrire une application qui à un certain stade effectue de bas niveau du disque dans un environnement Linux.L'application est en fait composé de 2 parties, l'une fonctionne sur Windows et interagit avec l'utilisateur et l'autre est une partie linux qui fonctionne à partir d'un LiveCD.L'utilisateur fait un choix de lettres de lecteur Windows puis linux partie effectue des actions avec les partitions correspondantes.Le problème est de trouver une correspondance entre une lettre au lecteur sous Windows (comme C:) et une linux nom du périphérique (par exemple /dev/sda1).C'est ma solution actuelle que j'taux le plus laid:

  • magasin de partitions de l'information (c'est à direlettre de lecteur, le nombre de blocs, numéro de série du disque etc.) dans Windows, dans certains pré-définie (c'est à direla racine de la partition système).

  • lire une liste de partitions de /proc/partitions.Obtenez seulement les partitions qui a un numéro majeur pour SCSI ou IDE disques durs et le numéro mineur qui les identifie comme de véritables partitions et non pas à l'ensemble des disques.

  • Essayez de monter chacun d'eux avec ntfs ou des systèmes de fichiers vfat.Vérifier si le montage de partition contient les informations stockées par l'application Windows.

  • Retrouvez les informations requises écrit par le Windows app rendre le match.Pour chaque partition se trouve dans /proc/partitions acquérir numéro de série du disque (via HDIO_GET_IDENTITY syscall), le nombre de blocs (de /proc/partitions) et lecteur de décalage (/sys/blocs/drive_path/partition_name/start), la comparer à Windows de l'information et si cela correspond magasin une lettre au lecteur sous Windows avec linux nom de l'appareil.

Il ya un couple de problèmes dans ce schéma:

  • C'est laid.L'écriture de données dans Windows et ensuite le lire sous Linux test d'un cauchemar.

  • linux numéro de périphérique majeur est comparé qu'avec l'IDE ou SCSI des périphériques.Ce serait probablement échouer, c'est à diresur USB ou FireWire disques.Il est possible d'ajouter ces types de disques, mais aussi en limitant l'application à seulement connues sous-ensemble de possible dispositifs semble être plutôt une mauvaise idée.

  • ressemble HDIO_GET_IDENTITY ne fonctionne que sur les IDE et les disques SATA.

  • /sys/block hack peut ne pas fonctionner sur d'autres que l'IDE ou SATA lecteurs.

Toutes les idées sur la façon d'améliorer ce schéma?Peut-être il ya une autre façon de déterminer windows noms sans l'écriture de toutes les données dans l'application windows?

P. S.La langue de l'application est le C++.Je ne peux pas changer cela.

Était-ce utile?

La solution

Les Partitions ont Uuid associés avec eux.Je ne sais pas comment trouver ces dans Windows, mais sous linux, vous pouvez trouver l'UUID pour chaque partition avec:

sudo vol_id -u de l'appareil (par ex./dev/sda1)

Si il y a un équivalent de la fonction dans Windows, il vous suffit de stocker les Uuid pour quelle partition choisir ensuite itérer sur tous connu des partitions sous linux et correspondre à l'Uuid.

Edit: Cela peut être un linux de chose, et il peut speficially être le volid util qui génère ces de quelque chose (au lieu de la lecture des méta-données pour le lecteur).Cela dit, il n'y a rien qui vous empêche d'obtenir le code source pour volid et de vérifier ce qu'il fait.

Autres conseils

Les Partitions ont Uuid associés avec eux

Ma connaissance de ce qui est très peu profonde, mais je pensais que c'était seulement vrai pour les disques formatés avec GPT (Guid Partition Table) partitions, plutôt que le style ancien format MBR, dont 99% de la planète est encore coincé avec?

Ma connaissance de ce qui est très peu profonde, mais je pensais que c'était seulement le cas de les disques formatés avec GPT (Guid La Table de Partition) partitions, plutôt que le style ancien format MBR qui 99% du monde est toujours coincé avec?

Pas de sons comme un utilisateur de linux cliche, mais il Fonctionne Pour Moi..Je l'utilise avec des partitions NTFS et n'ai eu aucun problème.Comme je l'ai dit dans mon edit, vol_id peut générer elle-même.Si c'était le cas il n'y aurait pas confiance à n'importe quel format de partition, ce qui serait de la houle.

Les Partitions ont Uuid associés avec eux.Je ne sais pas comment trouver ces dans Windows, mais sous linux, vous pouvez trouver l'UUID pour chaque partition avec:

sudo vol_id -u de l'appareil (par ex./dev/sda1)

Si il y a un équivalent de la fonction dans Windows, il vous suffit de stocker les Uuid pour quelle partition choisir ensuite itérer sur tous connu des partitions sous linux et correspondre à l'Uuid.

C'est un bon point, merci!J'ai regardé les sources de vol_id (une partie de la udev tarball) et il semble que pour les FAT(32) et NTFS il génère UUUD en utilisant le numéro de série du volume qui est lu à partir de l'emplacement prédéfini sur la partition.Comme je n'ai pas s'attendre à autre chose ensuite, fat32 et ntfs-je envisager d'utiliser cette information comme un identifiant de partition.

Vous avez besoin de marquer le lecteur, d'une certaine façon (par ex.écrire un fichier, etc.), ou trouver un identificateur qui est associé uniquement avec ce lecteur particulier.

Il est très difficile, voire presque impossible de comprendre ce que la lettre de Windows pourrait attribuer à une partition de disque, sans exécuter de Windows.C'est parce que Windows associe toujours le lecteur sur lequel il est exécuté à partir de C:.Qui pourrait être n'importe quel lecteur, si vous avez plus d'un système d'exploitation installé.Windows vous permet également de choisir quelle lettre de lecteur, il tentera d'abord, pour une partition spécifique, causant plus de problèmes.

Il serait beaucoup plus facile de faire de la GUI trucs à l'intérieur Linux, que d'essayer ce mixte de la Fenêtre/Linux solution.Je ne suis pas dire ne pas essayer de cette façon, ce que je dis c'est qu'il y a de très nombreux pièges possibles avec cette approche.Je suis sûr que je ne sais même pas sur tous.

Une autre option serait de voir si on pouvait faire la partie Linux, à l'intérieur de Windows.Si vous êtes un très bon programmeur informatique, vous pouvez réellement obtenir l'accès à la crue du système de fichiers.Il y a probablement autant de pièges avec cette approche, parce que Windows va être en cours d'exécution alors que tout cela est en cours de fonctionnement.

Donc à réitérer je voudrais voir si vous pouvez tout faire à partir de l'intérieur de Linux, si vous le pouvez.C'est juste un ensemble beaucoup plus simple dans le long terme.

Dans Windows, vous pouvez lire le NTFS Numéro de Série du Volume" qui les coutures pour correspondre à la UUID sous Linux.

Possibilités pour obtenir le "NTFS Volume de la Série" de l' Windows:

  • en ligne de commande depuis XP: fsutil.exe fsinfo ntfsinfo C:

  • sous 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;
    

Les possibilités d'obtenir de l'UUID, en vertu de Linux:

  • ls -l /dev/disk/by-uuid
  • ls -l /dev/disk/by-label
  • défini blkid /dev/sda1
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top