Прочитать один сектор с диска - PullRequest
6 голосов
/ 18 ноября 2009

Я пытаюсь прочитать один конкретный сектор с диска напрямую. В настоящее время у меня закончились идеи и любые предложения, как это сделать, было бы здорово!

Ответы [ 4 ]

7 голосов
/ 18 ноября 2009

Попробуйте что-то вроде этого, чтобы сделать это из CLI:

# df -h .
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              27G   24G  1.6G  94% /
# dd bs=512 if=/dev/sda2 of=/tmp/sector200 skip=200 count=1
1+0 records in
1+0 records out

С man 4 sd:

FILES
   /dev/sd[a-h]: the whole device
   /dev/sd[a-h][0-8]: individual block partitions

И если вы хотите сделать это из программы, просто используйте комбинацию системных вызовов из man 2 ..., таких как open, lseek, и read, с параметрами из примера dd.

3 голосов
/ 18 ноября 2009

Я не уверен, что лучший программный подход, но из командной строки Linux вы можете использовать команду dd в сочетании с необработанным устройством для вашего диска для непосредственного чтения с диска.

Вам необходимо выполнить команду sudo, чтобы получить доступ к необработанному дисковому устройству (например, /dev/rdisk0).

Например, следующий код будет считывать один 512-байтовый блок со смещением 900 блоков с вершины диска 0 и выводить его в стандартный вывод.

sudo dd if=/dev/rdisk0 bs=512 skip=900 count=1

См. Справочную страницу dd, чтобы получить дополнительную информацию о параметрах для dd.

1 голос
/ 14 июня 2018

В C это что-то вроде следующего ... Это потребовало бы root-прав. Я думаю, что вам нужно открыть файл с помощью O_DIRECT, если вы хотите читать отдельные сектора. В противном случае вы получите страницу. Я не уверен, что для чтения требуется выровненный буфер, но это для записи.

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

#define SECTOR_SIZE 512

int main(int argc, char *argv[]) {
        int offset = 0;
    int length = 5;
    int rc = -1;

    char *sector = aligned_alloc(SECTOR_SIZE, SECTOR_SIZE);
    memset(sector, 0, SECTOR_SIZE);
    /* replace XXX with the source block device */
    int fd=open("/dev/XXX", O_RDWR | O_DIRECT);

    lseek(fd, offset, SEEK_SET);
    for (int i = 0; i < length; i++) {
        rc = read(fd, sector, SECTOR_SIZE);
        if (rc < 0)
            printf("sector read error at offset = %d + %d\n %s", offset, i, strerror(errno));
        printf("Sector: %d\n", i);
        for (int j = 0; j < SECTOR_SIZE; j++) {
            printf("%x", sector[i]);
            if ((j + 1) % 16 == 0)
                printf("\n");
        }
    }
    free(sector);
    close(fd);
}
0 голосов
/ 18 ноября 2009

Другие люди в значительной степени покрыли это. Вам нужно

  • доступ к файлу устройства на диске (либо root, либо, что лучше, измените права доступа к нему)

  • использовать функции файлового ввода-вывода для считывания секторов = кусков (обычно) 512 байт с указанного диска.

...