Lire un seul secteur à partir d’un disque

J’essaie de lire directement un secteur spécifique du disque. Je suis actuellement à court d’idées et toute suggestion pour y parvenir serait géniale!

Essayez quelque chose comme ça pour le faire depuis la 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 

De l’ man 4 sd :

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

Et si vous voulez faire cela depuis un programme, utilisez simplement une combinaison d’appels système de man 2 ... comme open, lseek, et read , avec les parameters de l’exemple dd .

Je ne suis pas sûr de la meilleure approche programmatique, mais à partir de la ligne de commande Linux, vous pouvez utiliser la commande dd en combinaison avec le périphérique brut pour que votre disque lise directement sur le disque.

Vous devez sudo cette commande pour avoir access au périphérique de disque brut (par exemple / dev / rdisk0).

Par exemple, le texte suivant lit un bloc de 512 octets dans un décalage de 900 blocs du haut du disque0 et le renvoie à la sortie standard.

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

Voir la page de manuel dd pour obtenir des informations supplémentaires sur les parameters à dd.

Les autres personnes l’ont pratiquement couvert. Tu dois

  • access au fichier de périphérique du disque (soit root, soit mieux, changez les permissions)

  • utiliser le fichier IO fonctions pour lire les secteurs = morceaux de (habituellement) 512 octets dudit disque.

Dans C c’est quelque chose comme ce qui suit … Cela nécessiterait des permissions root. Je pense que vous devez ouvrir le fichier avec O_DIRECT si vous voulez lire des secteurs uniques. Sinon, vous aurez une page. Je ne suis pas sûr si le tampon aligné est requirejs pour une lecture, mais c’est pour une écriture.

 #include  #include  #include  #include  #include  #include  #include  #include  #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); }