Какой самый простой способ получить доступ к файловой системе ext3 на блочном уровне? Меня не интересуют файлы или необработанные байты, мне просто нужно читать FS по одному блоку за раз. Есть ли простой способ сделать это (в C)? Или, может быть, простое приложение, источник которого я мог бы найти для вдохновения? Я не нашел в сети полезных руководств, и я немного боюсь копаться в исходниках ядра, чтобы узнать, как это сделать.
Читать блоки из файловой системы ext3?
Ответы (3)
Да, см. e2fsprogs. Это предоставляет инструменты, которые вы можете использовать, чтобы делать что угодно (!) с файловыми системами ext2, ext3 и ext4. Он также содержит интерфейс библиотеки, поэтому вы можете делать что-нибудь еще.
Посмотрите прилагаемые отладочные файлы, возможно, вам будет достаточно для начала. В противном случае проверьте заголовки и напишите код.
Если вам нужно простое приложение, я предлагаю вам взглянуть на "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, §or_size);
printf("%d\n", sector_size);
lseek(fd, n*sector_size, SEEK_SET);
buf = malloc(sector_size);
read(fd, buf, sector_size);
return 0;
}
Дисковые устройства и разделы внутри них ведут себя как обычные файлы, из которых вы можете читать (и записывать), например:
head -c 2048 /dev/sda1 > first_2048_bytes
Конечно, вам нужно быть root.
dd
... Linux это не волнует, но традиционно блочные устройства разрешали только блочный ввод-вывод.
- person ephemient; 04.11.2009
LPT1
, как с обычными файлами;) На самом деле, Linux позволяет вам выполнять поиск/чтение/запись с выравниванием по байтам на блочных устройствах, но большинство других UNIX запрещают это, поэтому их нельзя рассматривать как обычные файлы.
- person ephemient; 05.11.2009