views:

203

answers:

3

Hello all, this is my first post here.

I want to access the whole hard disk directly from a C program. There's no FS on it and never's gonna be one.

I just want to open /dev/sda (for example) and do I/O at the block/sector level of the disk.

I'm planning to write some programs for learning C programming in the Linux environment (I know C language, Python, Perl and Java) but lack confidence with the Linux environment.

For my learning purposes I'm thinking about playing with kyoto-cabinet and saving the value correspondig to the computed hash directly into a "block/sector" of the hard disk, recording the pair: "hash, block/sector reference" into a kyoto-cabinet hash database file.

I don't know if this is feasible using standard C I/O functions or otherwise I'd have to write a "device driver" or something like...

Thanks for your time.

+4  A: 

As device files for drives (e.g. /dev/sda) are block devices, this means you can open, seek and use the file almost like a normal file.

Delan Azabani
+6  A: 

As mentioned elsewhere, under *NIX systems, block devices like /dev/sda can be accessed as plain files. Note that if file system is mounted from the device, opening it as file for writing would fail.

If you want to play with block devices, I would advise to first use the loop device, which presents a plain file as a block device. For example:

dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K
losetup /dev/loop0 $PWD/loop_file_10MB

After that, /dev/loop0 would behave as if it was a block device, but all information written would be stored in the file.

Dummy00001
Thanks all for the quick answer. I'll give it a try with loop devices first.
Angel C
+1 as well for using loop devices to test.
MarkR
+1  A: 

Yes, as others have noted, you can simply open the block device.

However, it's a really good idea to do IO (writes anyway) on block boundaries and whole blocks. You can use something like pread() and pwrite() to do these IO, or mmap some or all of the device.

There are a bunch of ioctls which can be used, see "man sd" for some more info. They don't seem to all be documented in the same place.

In linux/fs.h BLKROSET and a bunch of other ioctls are defined, you have to look around to find out how to use them. You can do useful things like find out how big the device is, and what the block size is.

The source code of the util-linux-ng package is your friend, it contains examples.

MarkR
Many thanks @MarkR. I'll take this into consideration, but as almost a newbie in Linux programming, maybe too hard to start with...
Angel C
Linux programming is almost exactly like Windows programming, so it should not be a problem ... you look up an API, write a test program to try it out, then use it in your app. Just like Windows.
MarkR