В Linux на C / C ++ как определить тип файловой системы смонтированного или отключенного раздела

# blkid /dev/sdX указывает тип файловой системы раздела, смонтированный или отключенный. Как я могу сделать это из C / C ++ без вызова системного вызова и синтаксического анализа вывода? Как это сделать программно? Есть ли blkid-dev пакет?


person Necktwi    schedule 03.09.2014    source источник


Ответы (3)


Вы всегда можете использовать библиотеки blkid (для ubuntu это так же просто, как установить libblkid-dev). А для реального использования см: https://github.com/fritzone/sinfonifry/blob/master/plugins/disk_status/client/disk_status.cpp (извините за рекламный код из моего собственного репозитория, но он имеет именно эту функциональность, развитую там). И не забывайте, что вам нужно будет запустить приложение с помощью sudo, чтобы иметь полный доступ к диску.

person Ferenc Deak    schedule 03.09.2014

Для смонтированных разделов ваша программа на C ++ может последовательно читать и анализировать псевдо-файл /proc/self/mounts, см. proc (5)

Для размонтированных разделов они могут содержать что угодно (включая полное отсутствие файловой системы, данные подкачки или необработанные данные - например, для некоторой системы баз данных). Так что вопрос может быть даже бессмысленным. Вы могли бы popen какую-нибудь file -s команду.

Вам следует изучить исходный код /bin/mount, поскольку это бесплатное программное обеспечение (и оно делает то же самое в случае auto). Вы можете использовать libmagic (3) (который используется командой file (1))

person Basile Starynkevitch    schedule 03.09.2014
comment
на самом деле я хочу найти тип файловой системы для монтирования раздела, чтобы я мог указать его в функции mount :) - person Necktwi; 03.09.2014
comment
Вы заново изобретаете команду mount с типом auto. Почему вы не можете использовать эту команду? - person Basile Starynkevitch; 03.09.2014
comment
Я не хочу использовать системный вызов. Могу ли я указать auto в mount функции? - person Necktwi; 03.09.2014
comment
Нет, ты не можешь. Но это случай использования функции system(3) на /bin/mount; вы можете изучить его исходный код /bin/mount и посмотреть, как это делается. - person Basile Starynkevitch; 03.09.2014
comment
n также я хочу использовать ntfs-3g. Так что auto мне не показался хорошим вариантом. - person Necktwi; 03.09.2014
comment
OK. Может b src-код для mount показывает мне способ определения fs типа. - person Necktwi; 03.09.2014
comment
mount (8) - это исполняемый файл setuid root, в общем случае вы не можете сделать это в своей собственной программе, если она не запущена как root или также setuid. - person Sam Watkins; 03.09.2014
comment
Но OP хочет вызвать системный вызов mount (2) который уже требует привилегий root. - person Basile Starynkevitch; 03.09.2014

Для смонтированного раздела вместо чтения / proc / self / mounts вы можете это сделать (при условии, что вы знаете путь, по которому смонтирован раздел):

#include <sys/vfs.h>
#include <stdio.h>
#include <linux/magic.h>

static const struct {
    unsigned long magic;
    const char   *type;
} types[] = {
    {EXT4_SUPER_MAGIC, "ext4"},
    {TMPFS_MAGIC, "tmpfs"},
};


const char *get_type(unsigned long magic) {
    static const char * unkown="unkown";
    unsigned int i;

    for (i=0; i < sizeof(types)/sizeof(types[0]); i++)
        if (types[i].magic == magic)
            return types[i].type;

    return unkown;
}

void main() {

    struct statfs buf;

    statfs("/", &buf);
    printf("/ is %s\n", get_type((unsigned long)buf.f_type));

    statfs("/tmp", &buf);
    printf("/tmp is %s\n", get_type((unsigned long)buf.f_type));    
}

В моем случае отображается:

/ is ext4
/tmp is tmpfs

Подробнее см.

man statfs

Очевидно, вы можете добавить все нужные вам типы. Они перечислены на странице руководства statfs. Говорят, что statfs устарел, потому что я не знаю другого вызова, который бы возвращал тип файловой системы.

person user941239    schedule 21.01.2019