我正在尝试直接从磁盘读取单个特定扇区。我目前已经没有想法,任何建议如何去做都会很棒!
答案 0 :(得分:7)
尝试使用以下命令从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 ...
的{{1}}和open, lseek,
的系统调用,以及来自{{1的参数例子。
答案 1 :(得分:3)
我不确定最好的编程方法是什么,但是从Linux命令行可以将dd命令与磁盘的原始设备结合使用,直接从磁盘读取。
您需要sudo此命令才能访问原始磁盘设备(例如/ dev / rdisk0)。
例如,以下内容将从磁盘顶部900块的偏移量中读取一个512字节的块,并将其输出到stdout。
sudo dd if=/dev/rdisk0 bs=512 skip=900 count=1
请参阅dd手册页以获取有关dd参数的其他信息。
答案 2 :(得分:1)
在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);
}
答案 3 :(得分:0)
其他人已经覆盖了它。你需要
访问磁盘的设备文件(或者是root用户,或者更好,更改权限)
使用文件IO函数从所述磁盘读取扇区=(通常)512字节的块。