Как программно обнаружить файловую систему без монтирования устройства (например, fdisk -l)

Мне нужно найти системный вызов в Linux, чтобы обнаружить файловую систему подключенной флешки в моем приложении. Я обнаружил, что «fdisk -l» выполняет свою работу, однако теперь мне нужно узнать, как это происходит. Мне не удалось обнаружить чтение кода fdisk, единственное, что я могу сказать точно, так это:

  1. Структуры statfs или statvfs не используются;
  2. fdisk не нужно монтировать устройство, чтобы найти файловую систему;

Замечания: Мое приложение написано на C++ и работает во встроенной системе Linux.


person rodolfo gomes dias    schedule 19.09.2012    source источник
comment
Ответ по этой ссылке объясняет структуру, содержащую искомую информацию: superuser.com/questions/328974/   -  person Germann Arlington    schedule 19.09.2012
comment
Просто примечание: вам нужно смонтировать само устройство (я думаю, что «монтирование» — неправильный термин, когда вы ссылаетесь на устройство, но я использую его здесь, поскольку вы использовали его сами). Вы, наверное, спрашиваете, как это сделать без монтирования файловой системы, которая в итоге хранится на устройстве.   -  person Analog File    schedule 19.09.2012
comment
Вы можете сделать strace -fv fdisk -l, чтобы увидеть, какие системные вызовы он использует.   -  person ott--    schedule 19.09.2012
comment
fdisk -l сообщает только о теге, назначенном разделу, который полностью отличается от фактической файловой системы раздела и не требуется для ее соответствия, как указывает ссылка, предоставленная @GermannArlington. На странице руководства для mount описано, как mount пытается определить, какая файловая система на самом деле находится на разделе, и это не совсем просто.   -  person twalberg    schedule 19.09.2012


Ответы (2)


Команда fdisk -l отображает файловую систему, представленную байтом System ID. Этот байт находится в таблице разделов, которая находится внутри основной загрузочной записи (MBR). MBR обычно хранится на первом цилиндре первого жесткого диска (хотя MBR может быть на любом жестком диске).

Я думаю, вы могли бы просто использовать системные вызовы open и read для чтения MBR с диска, предполагая, что пользователь, запускающий вашу программу, имеет разрешение:

char buf[446];
int fd = open("/dev/hda", O_RDONLY);
read(fd, buf, 446);

Просмотрите формат MBR, а затем прочитайте таблицу разделов, чтобы получить байты идентификатора системы. Вот список типов для байта идентификатора системы.

Я знаю только, как работает fdisk в Linux, и в прошлый раз, когда я проверял, он не поддерживал GPT или любые другие форматы разделов. Так что этот ответ актуален только для классического формата MBR.

person syplex    schedule 19.09.2012
comment
Байта идентификатора системы недостаточно для надежного обнаружения некоторых файловых систем. Например, значение 0x83 используется несколькими различными файловыми системами Linux. - person John Bartholomew; 20.09.2012
comment
@ Джон Варфоломей, это правильно. Но ОП запросил такие результаты, как fdisk -l, который также страдает этим недостатком. - person syplex; 21.09.2012

Вы можете использовать libblkid из util-linux, чтобы сделать это. Исходный дистрибутив включает образец, в котором перечислены разделы на указанном устройстве, включая тип файловой системы.

person John Bartholomew    schedule 19.09.2012