LINUX.ORG.RU

Получение информации о файловой системе из суперблока.

 , ,


0

1

Добрый день, мне необходимо прочитать суперблок и извлечь из него информацию о файловой системе, например, к какому каталогу она подмонтирована, число свободных дескрипторов и т.д. (все это сделать на C). Откровенно сказать, не знаю, как это сделать, очень надеюсь на помощь, хотя бы на какие-то ресурсы/разъяснения, как это делать, или через какие системные вызовы. Система Ubuntu, файловая система ext4. Заранее спасибо!


например, к какому каталогу она подмонтирована

mount

В самом суперблоке этого не может быть написано.

rezedent12 ☆☆☆
()

Я пытаюсь сделать так:

int fd = open("/dev/sda0", O_RDONLY, S_IRUSR);
read(fd, &header, 1024);
read(fd, &buffer, sizeof(int));
info = atoi(buffer);
printf("%s \n", info)
И получаю на выходе 0. Почему так может быть?

RMLV
() автор топика
Ответ на: комментарий от anonymous

я просто не хотел весь код перебивать тут, т.к. делаю это с другого компа. С «%s» вместо «%d» опечатался, в коде именно «%d»

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

char header[1024];
char buffer[sizeof(int)];

int main(){
int info;
int fd = open("/dev/sda0", O_RDONLY, S_IRUSR);
read(fd, &header, 1024);
read(fd, &buffer, sizeof(int));
info = atoi(buffer);
printf("%d \n", info)
close(fd);
return 0;
}

RMLV
() автор топика
Ответ на: комментарий от RMLV

ты б хоть ман по ней прочитал, что ли. Не говорю уже о примерах.

И тебе в самом первом ответе ссылкой натыкали на структуру суперблока. Накой тебе вообще int и тем более atoi.

anonymous
()
Ответ на: комментарий от RMLV

Проблема в том, что ты не понимаешь, что делаешь. Других проблем нет совсем.

int main( int argc, char **argv )
{
    struct ext4_super_block sb = {0};
    int fd = open( argv[1], O_RDONLY, 0 );
    if( -1 == fd ) {
        printf( "bad.\n" );
        return 1;
    }
    lseek( fd, 1024, SEEK_SET );
    read(fd, &sb, sizeof(sb));
    printf("s_inodes_count %d \n", sb.s_inodes_count);
    printf("s_blocks_count_lo %d \n", sb.s_blocks_count_lo);
    printf("s_r_blocks_count_lo %d \n", sb.s_r_blocks_count_lo);
    printf("s_free_blocks_count_lo %d \n", sb.s_free_blocks_count_lo);
    close(fd);
    return 0;
}

$ sudo ./test /dev/sda5
s_inodes_count 121200 
s_blocks_count_lo 484608 
s_r_blocks_count_lo 24230 
s_free_blocks_count_lo 408110 
....
$ sudo ./test /dev/sda2
s_inodes_count 6111232 
s_blocks_count_lo 24413952 
s_r_blocks_count_lo 1220697 
s_free_blocks_count_lo 21957435 

Дальше сам.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.