Сведения о вопросе

ЧОВИД

20:51, 8th August, 2020

Теги

c++   linux   drives    

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

Просмотров: 523   Ответов: 6

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

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

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

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

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



  Сведения об ответе

ASSembler

21:06, 1st October, 2020

Разделы имеют UUIDs, связанные с ними

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


  Сведения об ответе

lourence

08:31, 19th August, 2020

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

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

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

Edit: это может быть linux-только вещь, и это может быть speficially volid util, который генерирует их из чего-то (вместо считывания метаданных для диска). Сказав это, ничто не мешает вам получить источник для volid и проверить, что он делает.


  Сведения об ответе

P_S_S

05:41, 7th August, 2020

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

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


  Сведения об ответе

lool

04:25, 29th August, 2020

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

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

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

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


  Сведения об ответе

ITSME

17:27, 5th August, 2020

В Windows вы можете прочитать "NTFS Volume Serial Number", который швы, чтобы соответствовать UUID под Linux.

Возможности получить "NTFS Volume Serial" от 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 :

  • ЛС-л /dev/disk/by-uuid
  • ЛС-л /dev/disk/by-label
  • blkid /dev/sda1


  Сведения об ответе

crush

02:50, 5th August, 2020

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

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться