Читать блоки из файловой системы ext3?

Какой самый простой способ получить доступ к файловой системе ext3 на блочном уровне? Меня не интересуют файлы или необработанные байты, мне просто нужно читать FS по одному блоку за раз. Есть ли простой способ сделать это (в C)? Или, может быть, простое приложение, источник которого я мог бы найти для вдохновения? Я не нашел в сети полезных руководств, и я немного боюсь копаться в исходниках ядра, чтобы узнать, как это сделать.


person kmelvn    schedule 04.11.2009    source источник
comment
dd предлагает такую ​​функциональность. Насколько я помню, вы можете определить смещение, длину и т.д.   -  person Bobby    schedule 04.11.2009


Ответы (3)


Да, см. e2fsprogs. Это предоставляет инструменты, которые вы можете использовать, чтобы делать что угодно (!) с файловыми системами ext2, ext3 и ext4. Он также содержит интерфейс библиотеки, поэтому вы можете делать что-нибудь еще.

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

person Adam Goode    schedule 04.11.2009

Если вам нужно простое приложение, я предлагаю вам взглянуть на "dd" полезность. Я входит в состав GNU Core Utility. Его исходный код доступен для скачивания. Взгляните на его домашнюю страницу здесь.
Если вы хотите добиться того же из кода C, то, пожалуйста, обратитесь к следующему коду. Надеюсь, это поможет вам. :)

#include <stdio.h>
#include <linux/fs.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define SECTOR_NO 10 /*read 10th sector*/

int main()
{
        int sector_size;
        char *buf;
        int n = SECTOR_NO;

        int fd = open("/dev/sda1", O_RDONLY|O_NONBLOCK);
        ioctl(fd, BLKSSZGET, &sector_size);
        printf("%d\n", sector_size);
        lseek(fd, n*sector_size, SEEK_SET);

        buf = malloc(sector_size);
        read(fd, buf, sector_size);

        return 0;
}
person Vinit Dhatrak    schedule 04.11.2009
comment
Почему O_NONBLOCK? Если вы не откроете специальное устройство (например, модем), вам хотелось бы открыть его, чтобы заблокировать что-то занятое или экзистенциально неблагополучное, да? - person Tim Post♦; 04.11.2009
comment
Кроме того, bdev_logical_block_size() в ядре (который фактически устанавливает размер сектора в вашем примере, возвращаемый обработчиком ioctl) возвращает беззнаковое короткое замыкание. - person Tim Post♦; 04.11.2009
comment
Все равно лучший ответ. 'dd' существует с самого начала UNIX именно по этой причине, он чрезвычайно полезен и служит отличным примером того, как управлять операциями блочной разработки. - person Tim Post♦; 04.11.2009
comment
@tinkertim да, bdev_logical_block_size() возвращает unsigned short, но ioctl возвращает int, я вижу put_int в случае BLKSSZGET в функции blkdev_ioctl(), поэтому безопасно использовать int в пользовательском коде. - person Vinit Dhatrak; 04.11.2009
comment
@vinit dhatrak: Теперь ты прав!! :) Я подумал, что ioctl() не вернет подписанный errno, если FD действительно действителен. Недостаточно кофе. - person Tim Post♦; 04.11.2009

Дисковые устройства и разделы внутри них ведут себя как обычные файлы, из которых вы можете читать (и записывать), например:

head -c 2048 /dev/sda1 > first_2048_bytes

Конечно, вам нужно быть root.

person j_random_hacker    schedule 04.11.2009
comment
Я думаю, что обычно вы сначала достигаете dd ... Linux это не волнует, но традиционно блочные устройства разрешали только блочный ввод-вывод. - person ephemient; 04.11.2009
comment
Согласитесь с ephemient, dd — лучший инструмент. - person Tim Post♦; 04.11.2009
comment
Согласен, просто подумал, что было бы полезно указать, что с дисковыми устройствами можно обращаться так же, как с обычными файлами (это было для меня неожиданностью, пришедшей из DOS много лет назад...) - person j_random_hacker; 05.11.2009
comment
DOS позволяет вам обращаться с такими устройствами, как LPT1, как с обычными файлами;) На самом деле, Linux позволяет вам выполнять поиск/чтение/запись с выравниванием по байтам на блочных устройствах, но большинство других UNIX запрещают это, поэтому их нельзя рассматривать как обычные файлы. - person ephemient; 05.11.2009