Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
900
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6088
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как сопоставить путь устройства linux с именем диска windows?
Я пишу приложение, которое на каком-то этапе выполняет низкоуровневые дисковые операции в среде 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++. Я не могу это изменить.
Разделы имеют UUIDs, связанные с ними. Я не знаю, как найти их в Windows, но в linux вы можете найти UUID для каждого раздела с помощью:
sudo vol_id-u устройство (например, /dev/sda1)
Если есть эквивилентная функция в Windows, вы можете просто сохранить UUIDs для любого раздела, который они выберут, а затем повторить все известные разделы в linux и сопоставить UUIDs.
Edit: это может быть linux-только вещь, и это может быть speficially volid util, который генерирует их из чего-то (вместо считывания метаданных для диска). Сказав это, ничто не мешает вам получить источник для volid и проверить, что он делает.
Мои знания об этом очень поверхностны,
но я думал, что это справедливо только для меня.
диски, отформатированные с помощью GPT (Guid
Таблица разделов) разделы, скорее
чем старый стиль MBR формат, который
99% из мира все еще застрял с?
Мои знания об этом очень поверхностны, но я думал, что это справедливо только для меня. диски, отформатированные с помощью GPT (Guid Таблица разделов) разделы, скорее чем старый стиль MBR формат, который 99% из мира все еще застрял с?
Не похоже на клише пользователя linux, но это работает для меня.. Я использую его с разделами NTFS и не имел никаких проблем. Как я уже сказал в своем редактировании, vol_id может генерировать их сам. Если бы это было так, то не было бы никакой зависимости от какого-либо конкретного формата раздела, который был бы шикарным.
Разделы имеют UUIDs, связанные с ними. Я не знаю, как найти их в Windows, но в linux вы можете найти UUID для каждого раздела с помощью:
sudo vol_id-u устройство (например, /dev/sda1)
Если есть эквивилентная функция в Windows, вы можете просто сохранить UUIDs для любого раздела, который они выберут, а затем повторить все известные разделы в linux и сопоставить UUIDs.
Разделы имеют UUIDs, связанные с ними. Я не знаю, как найти их в Windows, но в linux вы можете найти UUID для каждого раздела с помощью:
sudo vol_id-u устройство (например, /dev/sda1)
Если есть эквивилентная функция в Windows, вы можете просто сохранить UUIDs для любого раздела, который они выберут, а затем повторить все известные разделы в linux и сопоставить UUIDs.
Это хорошая мысль, спасибо! Я посмотрел на источники vol_id(часть тарбола udev), и похоже, что для FAT (32) и NTFS он генерирует UUUD, используя серийный номер тома, который считывается из предопределенного местоположения на разделе. Поскольку я не ожидаю ничего другого, кроме fat32 и ntfs, я рассматриваю эту информацию в качестве идентификатора раздела.
В 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
Вам нужно либо пометить диск каким-то образом (например, написать файл и т. д.), или найти какой-то идентификатор, который связан только с этим конкретным диском.
Очень трудно, почти невозможно вычислить, какая буква Windows будет присвоена конкретному разделу диска, не запустив на самом деле Windows. Это происходит потому, что Windows всегда связывает диск, с которого он запускается, с C:. Это может быть любой диск, если у вас установлено несколько операционных систем. Windows также позволяет выбрать, какую букву диска он будет пробовать в первую очередь, для конкретного раздела, что вызывает дальнейшие проблемы.
Было бы намного проще сделать GUI вещей внутри Linux, чем попробовать это смешанное решение Window/Linux. Я не говорю, что не пытайтесь сделать это таким образом, я говорю, что есть очень много возможных ловушек с этим подходом. Я уверена, что даже не знаю о них всех.
Другой вариант-посмотреть, действительно ли вы можете сделать часть Linux внутри Windows. Если вы очень хороший программист Windows, вы действительно можете получить доступ к raw-файловой системе. Вероятно, в этом подходе есть столько же подводных камней, потому что Windows будет работать, пока все это работает.
Поэтому для повторной итерации я хотел бы посмотреть, сможете ли вы сделать все изнутри Linux, если сможете. Просто в долгосрочной перспективе все намного проще.