从Linux上的C程序直接访问没有FS的硬盘

时间:2010-08-19 09:37:16

标签: c linux hard-drive

我想直接从C程序访问整个硬盘。它上面没有FS,永远不会是一个。

我只想打开/ dev / sda(例如)并在磁盘的块/扇区级别执行I / O.

我打算在Linux环境中编写一些用于学习C编程的程序(我知道C语言,Python,Perl和Java),但对Linux环境缺乏信心。

为了我的学习目的,我正在考虑使用kyoto-cabinet并将与计算的哈希相对应的值直接保存到硬盘的“块/扇区”中,记录该对:“哈希,块/扇区引用“进入kyoto-cabinet哈希数据库文件。

我不知道使用标准C I / O功能是否可行,否则我不得不写一个“设备驱动程序”或类似...

3 个答案:

答案 0 :(得分:24)

如其他地方所述,在* NIX系统下,像/dev/sda这样的块设备可以作为普通文件访问。请注意,如果从设备挂载文件系统,则将其作为写入文件打开将失败。

如果你想玩块设备,我建议先使用loop device,它将普通文件作为块设备。例如:

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

之后,/dev/loop0的行为就像是一个块设备,但所有写入的信息都会存储在文件中。

答案 1 :(得分:9)

由于驱动器的设备文件(例如/dev/sda)是块设备,这意味着您可以像普通文件一样打开,搜索和使用该文件。

答案 2 :(得分:6)

是的,正如其他人所说,你可以简单地打开块设备。

然而,在块边界和整个块上执行IO(无论如何写入)是一个非常好的主意。您可以使用pread()和pwrite()之类的东西来执行这些IO,或者对部分或全部设备进行mmap。

有一堆可以使用的ioctl,请参阅“man sd”获取更多信息。似乎并没有将它们全部记录在同一个地方。

在linux / fs.h中定义了BLKROSET和一堆其他的ioctl,你必须环顾四周才能找到如何使用它们。您可以执行有用的操作,例如查看设备的大小以及块大小。

util-linux-ng软件包的源代码是你的朋友,它包含了一些例子。