tags:

views:

100

answers:

5
+1  Q: 

Read single sector

Hi,

I am trying to read a single specific sector from the disk directly. I've currently run out of ideas and any suggestions how to go about it would be great! (I'm a linux newbie)

+2  A: 

Try something like this to do it from the 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

From man 4 sd:

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

And if you want to do this from within a program, just use a combination of system calls from man 2 ... like open, lseek,, and read, with the parameters from the dd example.

DigitalRoss
Given the sizes of disks these days, either use `lseek64()`, or `#define _FILE_OFFSET_BITS 64` to ensure that `off_t` is a 64 bit type.
caf
A: 

I'm not sure what the best programmatic approach is, but from the Linux command-line you could use the dd command in combination with the raw device for your disk to directly read from the disk.

You need to sudo this command to get access to the raw disk device (e.g. /dev/rdisk0).

For example, the following will read a single 512-byte block from an offset of 900 blocks from the top of disk0 and output it to stdout.

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

See the dd man page to get additional information on the parameters to dd.

Gene Goykhman
Disc devices are not normally called /dev/rdisk0 under Linux, you probably want something like /dev/sda
MarkR
A: 

The other folks have pretty much covered it. You need to

  • access to the disk's device file (either be root or, better, change the permissions on it)

  • use the file IO functions to read sectors = chunks of (usually) 512 bytes from said disk.

Carl Smotricz
A: 

you would use dd for this, or you could write a c program and use the write sys call.

Recursion
A: 

how would u return some data read by bio to user space ?

karn