Как сопоставить путь устройства Linux к имени диска Windows?


3

Я пишу приложение, которое на каком-то этапе выполняет низкоуровневые дисковые операции в среде Linux. Приложение фактически состоит из 2 частей, один работает в Windows и взаимодействует с пользователем, а другой - это часть Linux, которая запускается из LiveCD. Пользователь делает выбор букв диска Windows, а затем часть Linux выполняет действия с соответствующими разделами. Проблема заключается в поиске соответствия между буквой диска Windows (например, C :) и именем устройства linux (например,/dev/sda1). Это мое текущее решение, которое я оцениваю, как некрасиво:

  • магазин перегородки информация (т.е. буква диска, количество блоков, диск серийный номер и т.д.) в Windows, в некотором заранее определенном месте (то есть корень системный раздел).

  • прочитайте список разделов из/proc/partition. Получайте только те разделы, которые имеют большое количество для жестких дисков SCSI или IDE и младшего номера, который идентифицирует их как реальные разделы, а не все диски.

  • Попробуйте подключить каждый из них с помощью файловых систем ntfs или vfat. Проверьте, содержит ли смонтированный раздел информацию, хранящуюся в приложении Windows.

  • При обнаружении необходимой информации, написанной приложением Windows, производится фактическое совпадение. Для каждого раздела, найденного в/proc/partitions, приобретается серийный номер накопителя (через системный вызов HDIO_GET_IDENTITY), количество блоков (из/proc/partition) и смещение диска (/ sys/blocks/drive_path/имя_пользователя/начало), сравнивайте это с Windows и если это соответствует - сохраните букву диска Windows вместе с именем устройства Linux.

Есть несколько проблем в этой схеме:

  • Это некрасиво. Запись данных в Windows, а затем чтение в Linux делает тестирование кошмаром.

  • Максимальное число устройств Linux сравнивается только с устройствами IDE или SCSI. Это, вероятно, потерпит неудачу, то есть на дисках USB или FireWire. Можно добавлять эти типы дисков, но ограничение приложения только на известное подмножество возможных устройств кажется довольно плохой идеей.

  • выглядит как HDIO_GET_IDENTITY работает только на дисках IDE и SATA.

  • /sys/block hack может не работать на других устройствах, кроме IDE или SATA.

Любые идеи о том, как улучшить эту схему? Возможно, есть еще один способ определить имена окон без записи всех данных в приложении Windows?

P.S. Язык приложения - C++. Я не могу это изменить.

1

Разделы имеют UUID, связанные с ними. Я не знаю, как найти их в Windows, но в Linux вы можете найти UUID для каждого раздела с:

Судо vol_id -u устройство (например,/DEV/sda1)

Если является эквивалентной функцией в Windows, вы можете просто сохранить UUID для любого раздела, который они выбирают, затем перебирать все известные разделы в Linux и соответствовать UUID.

Редактировать: Это может быть только для Linux, и это может быть утилита volid, которая генерирует их из чего-то (вместо чтения метаданных для диска). Сказав это, нет ничего, что помешает вам получить источник для volid и проверить, что он делает.


2

Перегородки имеют UUID, связанных с ними

Мое знание это очень мелкий, но я думал, что это верно только для дисков, отформатированных с GPT (GUID Partition Table) разделов, а не Староновая стиль MBR, который 99% мира все еще застрял?


1

Мое знание это очень мелкий, , но я думал, что это верно только для дисков, отформатированных с GPT (Guid Partition Table) разделов, а , чем в старом стиле формате MBR, который 99% от мир все еще застрял?

Не звучит как клише пользователя linux, но оно работает для меня .. Я использую его с разделами NTFS и не испытываю проблем. Как я уже сказал в своем редактировании, vol_id может генерировать их самостоятельно. Если бы это было так, то не было бы никакой зависимости от какого-либо определенного формата раздела, который был бы раздутым.


0

Вам нужно либо каким-либо образом маркировать диск (например, записать файл и т. Д.), Либо найти какой-либо идентификатор, который связан только с этим конкретным диском.

Очень сложно, практически невозможно определить, какую букву Windows назначит конкретный раздел диска, без фактического запуска Windows. Это связано с тем, что Windows всегда связывает диск, с которым он запускается, с C :. Какой может быть любой диск, если у вас установлено более одной операционной системы. Windows также позволяет выбрать, какую букву диска она будет пытаться сначала, для определенного раздела, что вызывает дополнительные проблемы.

Было бы намного проще сделать материал GUI внутри Linux, чем попробовать это смешанное решение Window/Linux. Я не говорю, не пробуйте это так, я говорю, что существует очень много возможных ловушек с этим подходом. Я уверен, что даже не знаю о них всех.

Другой вариант - посмотреть, действительно ли вы можете сделать часть Linux внутри Windows. Если вы очень хороший программист Windows, вы можете получить доступ к исходной файловой системе. Вероятно, столько же ошибок при таком подходе, потому что Windows будет работать, пока все это работает.

Так что для повторного итерации я бы посмотрел, можете ли вы сделать все, что угодно, из Linux, если сможете. В конце концов, это намного проще.


1

Разделы имеют ассоциированные с ними UUID. Я не знаю, как найти их в Windows, но в Linux вы можете найти UUID для каждого раздела с:

Судо vol_id -u устройство (например,/DEV/sda1)

Если является эквивалентной функцией в Windows, вы можете просто сохранить UUID для любого раздела, который они выбирают, затем перебирать все известные разделы в Linux и соответствовать UUID.

Это хороший момент, спасибо! Я посмотрел на источники vol_id (часть udev tarball), и кажется, что для FAT (32) и NTFS он генерирует UUUD, используя серийный номер тома, который считывается из предопределенного местоположения в разделе. Поскольку я не ожидаю ничего другого, кроме fat32 и ntfs, я считаю использование этой информации в качестве идентификатора раздела.


0

В Windows вы можете прочитать «Серийный номер тома NTFS», который швы соответствует UUID под Linux.

возможности получить "Volume NTFS Серийный" из Windows,:

  • командной строки начиная с XP: fsutil.exe FSINFO NTFSInfo C:

  • под 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; 
    

Возможности для получения UUID под Linux :

  • Ls -l/DEV/диск/по-UUID
  • Ls -l/DEV/диск/по прямому
  • BLKID/dev/sda1