Как сопоставить путь устройства Linux с именем диска Windows? - PullRequest
3 голосов
/ 21 августа 2008

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

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

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

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

  • Найдя требуемую информацию, написанную приложением Windows, установите фактическое соответствие. Для каждого раздела в / proc / partitions получите серийный номер диска (через системный вызов HDIO_GET_IDENTITY), количество блоков (из / proc / partitions) и смещение диска (/ 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 ++. Я не могу это изменить.

Ответы [ 6 ]

2 голосов
/ 21 августа 2008

С разделами связаны идентификаторы UUID

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

1 голос
/ 21 августа 2008

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

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

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

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

1 голос
/ 21 августа 2008

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

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

1 голос
/ 21 августа 2008

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

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

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

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

0 голосов
/ 03 февраля 2010

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

Возможности получения "NTFS Volume Serial" из Windows :

  • командная строка с XP: fsutil.exe fsinfo ntfsinfo 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 / disk / by-uuid
  • ls -l / dev / disk / by-label
  • blkid / dev / sda1
0 голосов
/ 21 августа 2008

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

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

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

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

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

...